2009-12-01 9 views
16

Ho un assembly di risorse con testi tradotti in varie lingue. Progetto tipo di simile a questo:C#: come ottenere una stringa di risorse da una determinata coltura

  • FooBar.resx
  • FooBar.nb-NO.resx
  • FooBar.sv-SE.resx
  • ...

posso ottenere i testi utilizzando proprietà statiche come questa:

var value = FooBar.Hello; 

O utilizzando la riflessione come thi s:

var value = resourceAssembly 
     .GetType("Namespace.FooBar") 
     .GetProperty("Hello") 
     .GetValue(null, null) as string; 

Entrambe le modalità mi forniranno il valore che appartiene alla cultura dell'interfaccia utente corrente del thread corrente. Che va bene e totalmente quello che vorrei di solito.

Ma, c'è qualcosa che posso fare se desidero esplicitamente, ad esempio, il valore svedese, senza dover cambiare la cultura dell'interfaccia utente?

risposta

18

È possibile modificare manualmente la proprietà Culture della classe FooBar generata da Visual Studio. Oppure, se stai utilizzando direttamente lo ResourceManager class, puoi utilizzare il sovraccarico di GetString che accetta la cultura desiderata come parametro.

+0

I ResourceManager possono essere creati e buttati via facilmente, o richiedono pulizia e/o dovrebbero essere creati una sola volta e utilizzati per molto? – Svish

+0

Finito utilizzando ResourceManagers :) – Svish

+0

Grazie ......! –

0

È possibile modificare manualmente la cultura nella classe di accesso alle risorse. Ma questo è in qualche modo non raccomandato perché porta a molti altri problemi di internazionalizzazione.

E.g. si dovrebbe:

  • maniglia tutti i numeri di formattazione con la cultura sovraccarica
  • Assicurarsi che altre biblioteche si utilizza un meccanismo simile che avete
  • Nel caso in cui quanto sopra è impossibile (ad esempio BCL) creare wrapper per tutto ciò che potrebbe essere specifico per la cultura (e che è un sacco di cose).

Quindi, se possibile, modificare la cultura dell'interfaccia utente corrente del thread corrente.

0

Ecco un codice che ho usato per afferrare un file di risorse in base al nome della cultura: è vb.net, ma tu hai l'idea.

Dim reader As New System.Resources.ResXResourceReader(String.Format(Server.MapPath("/App_GlobalResources/{0}.{1}.resx"), resourceFileName, culture)) 

E se si desidera tornare come un dizionario:

If reader IsNot Nothing Then 
    Dim d As New Dictionary(Of String, String) 
    Dim enumerator As System.Collections.IDictionaryEnumerator = reader.GetEnumerator() 
    While enumerator.MoveNext 
     d.Add(enumerator.Key, enumerator.Value) 
    End While 
    Return d 
End If 
0

utilizzare il secondo overload di GetValue: -

.GetValue(null, BindingFlags.GetProperty, null, null, CultureInfo.GetCultureInfo("sv-SE")) 
+0

Hm ...Ho provato questo, ma sembrava solo restituire lo stesso valore. Dovrò riprovare ... – Svish

+0

Suppongo che dipenda da come la proprietà è implementata, in realtà non mostri l'implementazione della proprietà. – AnthonyWJones

+0

Questo perché non l'ho implementato. È solo il materiale predefinito generato dallo studio visivo. – Svish

12

provare il seguente codice. Ha funzionato bene almeno per me:

FooBar.ResourceManager.GetString("Hello", CultureInfo.GetCultureInfo("sv-SE")) 
Problemi correlati