2009-08-20 2 views
9

Voglio creare un file di risorse per Singaporean English (en-sg) denominato "shopping.en-sg.resx" nella cartella App_GlobalResources.Creare cultura personalizzata in ASP.NET

Errore durante la compilazione.

Error 1 Lo spazio dei nomi 'Risorse' contiene già una definizione per 'di shopping' C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ Temporary ASP.NET Files \ web \ 2cd6afe9 \ 737b0a13 \ App_GlobalResources.vomuzavz.1.cs 26

dopo la ricerca di Google, scopro che "en-sg" non è una cultura di default e devo fare cultura personalizzato per esso. Non conosco i passaggi dettagliati di questo.

Cosa devo fare per creare la cultura e rimuovere l'errore di compilazione?

seguo l'esempio di MSDN, creare un file chiamato "shopping.x-en-US-sample.resx" e inserire il seguente codice nella funzione di BasePage (InitializeCulture protected override void()):

CultureAndRegionInfoBuilder cib = null; 

cib = new CultureAndRegionInfoBuilder(
    "x-en-US-sample", CultureAndRegionModifiers.None); 

CultureInfo ci = new CultureInfo("en-US"); 
cib.LoadDataFromCultureInfo(ci); 
RegionInfo ri = new RegionInfo("US"); 
cib.LoadDataFromRegionInfo(ri); 

cib.Register(); 

ci = new CultureInfo("x-en-US-sample"); 

Tuttavia, l'errore di compilazione è ancora presente.

aggiornamento:

Si può facilmente riprodurre il problema con la creazione di un sito web vuota e due file "shopping.en-sg.resx" e "shopping.resx" nella cartella App_GlobalResources.

risposta

15

È possibile creare una nuova cultura basata su una cultura esistente:

string culture = "en-sg"; 
string name = "Singaporean English"; 

CultureInfo cultureInfo = new CultureInfo("en-GB"); 
RegionInfo regionInfo = new RegionInfo(cultureInfo.Name); 

CultureAndRegionInfoBuilder cultureAndRegionInfoBuilder = new CultureAndRegionInfoBuilder(culture, CultureAndRegionModifiers.None); 

cultureAndRegionInfoBuilder.LoadDataFromCultureInfo(cultureInfo); 
cultureAndRegionInfoBuilder.LoadDataFromRegionInfo(regionInfo); 

// Custom Changes 
cultureAndRegionInfoBuilder.CultureEnglishName = name; 
cultureAndRegionInfoBuilder.CultureNativeName = name; 

cultureAndRegionInfoBuilder.Register(); 

Aggiunto: appena controllato i riferimenti: ho:

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Globalization; 
using System.IO; 
using System.Reflection; 
using System.Runtime.CompilerServices; 

Aggiunto (Aggiornato, sulla base dei commenti):

Per quanto riguarda il messaggio di errore:

L'errore che vedete è il risultato di alcune risorse denominazione conflitto. Controlla i nomi delle risorse, queste vengono compilate in dll per poter controllare che i nomi dei namespace non siano in conflitto. È possibile controllare questo utilizzando lo strumento riflettore: http://www.red-gate.com/products/reflector/

+0

Dove dovrei inserire questo codice per evitare l'errore? – Billy

+0

Questo codice deve essere eseguito solo una volta sulla macchina in cui è necessaria la cultura aggiuntiva. Forse stai ricevendo l'errore perché esiste già? –

+0

Inserisci il codice in global.asax? Se cambio "en-sg" in "en-us", allora va bene. Voglio solo un pezzo di codice che posso semplicemente mettere da qualche parte e dopo posso usare lo shopping.en-sg.resx – Billy

1
+0

Ho provato e non funziona. Ulteriori informazioni. è aggiunto. – Billy

+1

Collegamento fisso: http://msdn.microsoft.com/en-us/library/ms172469(v=vs.100).aspx – Sprintstar

+0

Grazie a @Sprintstar: Ho aggiornato il collegamento anche nel mio post. –

3

Ecco i passaggi e il codice necessari per creare la cultura en-sg.

  1. Creare un'app console.
  2. Aggiungere un riferimento a sysglobl (C: \ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ sysglobl.dll)
  3. Aggiungere il codice di seguito.
  4. Eseguirlo sul server Web e sui computer di sviluppo come amministratore.

Creerà una cultura basata su ciò che ho trovato essere la sua corrispondenza più vicina (en-au). Ho quindi sovrascritto i nomi ecc per renderlo unico.

Si dovrebbe solo eseguire questa volta. Rimuove quelli esistenti prima di crearlo nel caso in cui si desideri apportare modifiche dopo averlo eseguito.

public static void Main() 
    { 
     CultureAndRegionInfoBuilder cib = null; 

     try 
     { 
      Console.Clear(); 
      Console.WriteLine("Unregister the \"en-SG\" " + "custom culture if it already exists..."); 
      CultureAndRegionInfoBuilder.Unregister("en-SG"); 
      Console.WriteLine("The custom culture was unregistered successfully."); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine("Error while unregistering..."); 
      Console.WriteLine(e); 
     } 

     try 
     { 
      cib = new CultureAndRegionInfoBuilder("en-SG", CultureAndRegionModifiers.None); 

      // Populate the new CultureAndRegionInfoBuilder object with culture information. 
      CultureInfo ci = new CultureInfo("en-AU"); 
      cib.LoadDataFromCultureInfo(ci); 

      // Populate the new CultureAndRegionInfoBuilder object with region information. 
      RegionInfo ri = new RegionInfo("SG"); 
      cib.LoadDataFromRegionInfo(ri); 

      cib.CultureEnglishName = "English (Singapore)"; 
      cib.CultureNativeName = "English (Singapore)"; 
      cib.IsMetric = true; 

      // Display some of the properties of the CultureAndRegionInfoBuilder object. 
      Console.WriteLine("CultureName:. . . . . . . . . . {0}", cib.CultureName); 
      Console.WriteLine("CultureEnglishName: . . . . . . {0}", cib.CultureEnglishName); 
      Console.WriteLine("CultureNativeName:. . . . . . . {0}", cib.CultureNativeName); 
      Console.WriteLine("GeoId:. . . . . . . . . . . . . {0}", cib.GeoId); 
      Console.WriteLine("IsMetric: . . . . . . . . . . . {0}", cib.IsMetric); 
      Console.WriteLine("ISOCurrencySymbol:. . . . . . . {0}", cib.ISOCurrencySymbol); 
      Console.WriteLine("RegionEnglishName:. . . . . . . {0}", cib.RegionEnglishName); 
      Console.WriteLine("RegionName: . . . . . . . . . . {0}", cib.RegionName); 
      Console.WriteLine("RegionNativeName: . . . . . . . {0}", cib.RegionNativeName); 
      Console.WriteLine("ThreeLetterISOLanguageName: . . {0}", cib.ThreeLetterISOLanguageName); 
      Console.WriteLine("ThreeLetterISORegionName: . . . {0}", cib.ThreeLetterISORegionName); 
      Console.WriteLine("ThreeLetterWindowsLanguageName: {0}", cib.ThreeLetterWindowsLanguageName); 
      Console.WriteLine("ThreeLetterWindowsRegionName: . {0}", cib.ThreeLetterWindowsRegionName); 
      Console.WriteLine("TwoLetterISOLanguageName: . . . {0}", cib.TwoLetterISOLanguageName); 
      Console.WriteLine("TwoLetterISORegionName: . . . . {0}", cib.TwoLetterISORegionName); 
      Console.WriteLine(); 

      // Register the custom culture. 
      Console.WriteLine("Register the custom culture..."); 
      cib.Register(); 

      // Display some of the properties of the custom culture. 
      ci = new CultureInfo("en-SG"); 

      Console.WriteLine("Name: . . . . . . . . . . . . . {0}", ci.Name); 
      Console.WriteLine("EnglishName:. . . . . . . . . . {0}", ci.EnglishName); 
      Console.WriteLine("NativeName: . . . . . . . . . . {0}", ci.NativeName); 
      Console.WriteLine("TwoLetterISOLanguageName: . . . {0}", ci.TwoLetterISOLanguageName); 
      Console.WriteLine("ThreeLetterISOLanguageName: . . {0}", ci.ThreeLetterISOLanguageName); 
      Console.WriteLine("ThreeLetterWindowsLanguageName: {0}", ci.ThreeLetterWindowsLanguageName); 

     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e); 
     } 
     Console.ReadKey(); 
    }