net - resource manager c#
C#: cómo obtener una cadena de recursos de una determinada cultura (5)
Tengo un conjunto de recursos con textos traducidos en varios idiomas. El tipo de proyecto se ve así:
- FooBar.resx
- FooBar.nb-NO.resx
- FooBar.sv-SE.resx
- ...
Puedo obtener los textos usando propiedades estáticas como esta:
var value = FooBar.Hello;
O usando una reflexión como esta:
var value = resourceAssembly
.GetType("Namespace.FooBar")
.GetProperty("Hello")
.GetValue(null, null) as string;
Ambas formas me darán el valor que pertenece a la cultura de interfaz de usuario actual del hilo actual. Que está bien y totalmente lo que me gustaría por lo general.
Pero, ¿hay algo que pueda hacer si deseo explícitamente, por ejemplo, el valor sueco, sin tener que cambiar la cultura de la interfaz de usuario?
Aquí hay un código que he usado para capturar un archivo de recursos por nombre de cultura: es vb.net, pero entiendes la idea.
Dim reader As New System.Resources.ResXResourceReader(String.Format(Server.MapPath("/App_GlobalResources/{0}.{1}.resx"), resourceFileName, culture))
Y si quieres devolverlo como 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
Prueba el siguiente código. Funcionó bien para mí al menos:
FooBar.ResourceManager.GetString("Hello", CultureInfo.GetCultureInfo("sv-SE"))
Puede cambiar manualmente la cultura en su clase de acceso a recursos. Pero esto no se recomienda de alguna manera porque conduce a muchos otros problemas de internacionalización.
Por ejemplo, tendrías que:
- Manejar todo el formato de números con las sobrecargas de cultura
- Asegúrese de que las otras bibliotecas que usa tengan un mecanismo similar al que tiene
- En los casos en que lo anterior es imposible (por ejemplo, BCL), cree envoltorios para todo lo que PODRÍA ser específico de la cultura (y eso es MUCHO material).
Entonces, si es posible, cambie la cultura de la interfaz de usuario actual del hilo actual.
Puede cambiar manualmente la propiedad Culture
de la clase FooBar que genera Visual Studio. O si está usando directamente la clase ResourceManager , puede usar la sobrecarga de GetString que toma la cultura deseada como parámetro.
Utilice la segunda sobrecarga de GetValue: -
.GetValue(null, BindingFlags.GetProperty, null, null, CultureInfo.GetCultureInfo("sv-SE"))