2009-12-01 10 views
16

Tengo un conjunto de recursos con textos traducidos en varios idiomas. Proyecto tipo de ve así:C#: Cómo obtener una cadena de recursos de una cierta cultura

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

que pueda obtener los textos usando propiedades estáticas como esta:

var value = FooBar.Hello; 

O mediante el uso de la reflexión como thi s:

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

Ambas formas me va a obtener el valor que pertenece a la cultura de interfaz de usuario actual del subproceso actual. Lo cual está bien y totalmente lo que generalmente me gustaría.

Pero, ¿hay algo que pueda hacer si quiero explícitamente, por ejemplo, el valor sueco, sin tener que cambiar la cultura de la interfaz de usuario?

Respuesta

18

Puede cambiar manualmente la propiedad Culture de la clase FooBar que genera Visual Studio. O si está utilizando directamente el ResourceManager class, puede usar la sobrecarga de GetString que toma la cultura deseada como parámetro.

+0

se pueden crear ResourceManagers y se desecha fácilmente, o requieren limpiar y/o en caso de que sólo se creará una vez y se utiliza para tanto? – Svish

+0

Terminó usando ResourceManagers :) – Svish

+0

¡Gracias ......! –

0

Puede cambiar manualmente la referencia cultural en su clase de acceso a recursos. Pero esto no se recomienda porque lleva a muchos otros problemas de internacionalización.

E.g. usted tendría que:

  • manija todo el número de formato con la cultura sobrecarga
  • Asegurar que las otras bibliotecas que utilizamos tienen un mecanismo similar que tiene
  • En los casos en que lo anterior no es posible (por ejemplo, BCL) cree envoltorios para todo lo que PODRÍA ser específico de la cultura (y eso es MUCHAS cosas).

De ser posible, cambie la cultura de IU actual del hilo actual.

0

Aquí hay un código que he usado para tomar un archivo de recursos por nombre de la cultura: es vb.net, pero se entiende.

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

Y si desea volver como un diccionario:

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

utilizar la segunda sobrecarga de GetValue: -

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

Hm ...Intenté esto, pero parecía devolver el mismo valor. Tendré que intentarlo de nuevo ... – Svish

+0

Supongo que dependerá de cómo se implemente la propiedad, en realidad no se muestra la implementación de la propiedad. – AnthonyWJones

+0

Eso es porque no lo he implementado. Es solo el material generado por el estudio visual predeterminado. – Svish

12

Prueba el siguiente código. Funcionó bien para mí, al menos:

FooBar.ResourceManager.GetString("Hello", CultureInfo.GetCultureInfo("sv-SE")) 
Cuestiones relacionadas