2012-06-30 8 views
7

Una cosa molto semplice, e non riesco a farlo funzionare. Voglio globalizzare la mia DLL quindi sto usando i file di risorse + il ResourceManager.Resourcemanager sta restituendo la stessa risorsa, anche se CultureInfo è specificato

io chiamo il ResourceManager come questo:

var p = new ResourceManager("Appname.Default", Assembly.GetExecutingAssembly()); 

Ottenere le corde come questo

System.Diagnostics.Debug.WriteLine(p.GetString("greeting")); 
System.Diagnostics.Debug.WriteLine(p.GetString("greeting", new CultureInfo("nl"))); 
System.Diagnostics.Debug.WriteLine(p.GetString("greeting", new CultureInfo("nl-NL"))); 
System.Diagnostics.Debug.WriteLine(p.GetString("greeting", new CultureInfo("en"))); 

e restituisce 4 volte la stessa stringa. I miei file sono chiamati

Default.resx 
Default.en.resx 
Default.nl.resx 
Default.nl-NL.resx 

Tutti file delle impostazioni sono le stesse, ma come detto - solo la risorsa nel file predefinito viene utilizzato.

Cosa sto trascurando qui?

+2

Sono il file RESX in realtà sempre compilati in assembly satellite? Cerca nella cartella bin \ Debug e cerca le sottodirectory con i nomi en, nl e nl-NL. –

+0

Provare a ottenere le traduzioni tramite 'Default.ResourceManager.GetString'. Molto probabilmente il gestore risorse che stai creando riceve alcuni parametri sbagliati. –

risposta

10

Esistono alcuni modi per utilizzare i file di risorse, uno dei quali utilizza i file .resx. Questi file vengono localizzati automaticamente, in base al valore di Thread.CurrentThread.CurrentUICulture. Il file .resx predefinito viene compilato nell'assieme di cui fa parte (ad esempio il file eseguibile principale), mentre le risorse localizzate (Default.nl-NL.resx) vengono compilate nella propria directory (in base all'identificatore di cultura, nl-NL in questo caso) in un assembly, chiamato <AssemblyName>.resources.dll.

Indirizzare i valori da tali risorse è semplice come <ResourceName>.<KeyName>, ad esempio Default.Greeting. Per provarlo, si cambia la cultura, utilizzando:

Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en-US"); 
Console.WriteLine(Default.Greeting); 

Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("nl-NL"); 
Console.WriteLine(Default.Greeting); 

che sarà uscita

Hello 
Hallo 

All'avvio del programma, la lingua dell'interfaccia utente è impostato per la cultura del computer su cui sta girando, in modo hai vinto Devi specificare tu stesso la lingua per presentare sempre le risorse localizzate. Quindi, i file .resx sembrano la strada da percorrere.

Quando si utilizza ResourceManager da var p = new ResourceManager("Appname.Default", Assembly.GetExecutingAssembly());, sarà necessario leggere i file .resources. Se non c'è (nel tuo caso) il file Appname.Default.resources, il p.GetString avrà esito negativo. Quindi immagino che tu abbia creato un file .resources in precedenza, ma non hai convertito i file localizzati .resx in file .resources.

Se si desidera utilizzare il ResourceManager per essere in grado di specificare la cultura, è possibile utilizzare:

Default.ResourceManager.GetString("Greeting", new CultureInfo("en-US")); 
+1

Grazie - Non so perché non ho appena usato Resources.Default. Deve essere il fine settimana! –

+0

@CodeCaster potresti per favore dare un'occhiata alla mia domanda per favore. http://stackoverflow.com/questions/24070892/resources-dont-load-current-culture – Marc

Problemi correlati