Cómo utilizar la localización en C#
Parece que no puedo hacer que la localización funcione.
Tengo una biblioteca de clases. Ahora quiero crear archivos resx allí y devolver algunos valores basados en la cultura del hilo.
¿Cómo puedo hacer eso?
- Agregue un archivo de recursos a su proyecto (puede llamarlo "strings.resx") haciendo lo siguiente: haga
clic derecho en Propiedades en el proyecto, seleccione Agregar -> Nuevo elemento... en el menú contextual, luego en la lista de Los elementos de Visual C# seleccionan "Archivo de recursos" y asígnale el nombrestrings.resx
. - Agregue un recurso de cadena en el archivo resx y asígnele un buen nombre (ejemplo: asígnele el nombre "Hola" y asígnele el valor "Hola")
- Guarde el archivo de recursos ( nota: este será el archivo de recursos predeterminado , ya que no tiene un código de idioma de dos letras)
- Agregue referencias a su programa:
System.Threading
ySystem.Globalization
Ejecute este código:
Console.WriteLine(Properties.strings.Hello);
Debería imprimir "Hola".
Ahora, agregue un nuevo archivo de recursos, llamado "strings.fr.resx" (tenga en cuenta la parte "fr"; ésta contendrá recursos en francés). Agregue un recurso de cadena con el mismo nombre que en strings.resx, pero con el valor en francés (Nombre="Hola", Valor="Salut"). Ahora, si ejecuta el siguiente código, debería imprimir Salut:
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("fr-FR");
Console.WriteLine(Properties.strings.Hello);
Lo que sucede es que el sistema buscará un recurso para "fr-FR". No encontrará ninguno (ya que especificamos "fr" en su archivo"). Luego volverá a buscar "fr", que encuentra (y utiliza).
El siguiente código imprimirá "Hola":
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en-US");
Console.WriteLine(Properties.strings.Hello);
Esto se debe a que no encuentra ningún recurso "en-US", ni tampoco ningún recurso "en", por lo que volverá al valor predeterminado, que es el que agregamos desde el principio.
Puede crear archivos con recursos más específicos si es necesario (por ejemplo, strings.fr-FR.resx y strings.fr-CA.resx para francés en Francia y Canadá, respectivamente). En cada uno de estos archivos, deberá agregar los recursos para aquellas cadenas que difieren del recurso al que recurriría. Entonces, si un texto es el mismo en Francia y Canadá, puede colocarlo en strings.fr.resx, mientras que las cadenas que son diferentes en francés canadiense pueden ingresar en strings.fr-CA.resx.
En realidad, es bastante sencillo. Cree un nuevo archivo de recursos, por ejemplo Strings.resx
. Ajustado Access Modifier
a Public
. Utilice la plantilla de archivo adecuada, de modo que Visual Studio genere automáticamente una clase de acceso (el nombre será Strings
, en este caso). Este es su idioma predeterminado.
Ahora, cuando desee agregar, digamos, localización alemana, agregue un archivo resx localizado. Esto será lo habitual Strings.de.resx
en este caso. Si desea agregar localización adicional para, por ejemplo, Austria, deberá crear adicionalmente un archivo Strings.de-AT.resx
.
Ahora vaya a crear una cadena; digamos una cadena con el nombre HelloWorld
. En tu Strings.resx
, agrega esta cadena con el valor "¡Hola, mundo!". En Strings.de.resx
, agregue "¡Hola, Welt!". Y en Strings.de-AT.resx
, añade "¡Servus, Welt!". Eso es todo hasta ahora.
Ahora tienes esta Strings
clase generada y tiene una propiedad con un captador HelloWorld
. Obtener esta propiedad cargará "Servus, Welt!" cuando su configuración regional es de-AT, "¡Hola, Welt! cuando su configuración regional es cualquier otra configuración regional (incluyendo de-DE y de-CH), y "¡Hola, mundo!" cuando su configuración regional es cualquier otra cosa. Si una cadena es Como falta en la versión localizada, el administrador de recursos ascenderá automáticamente en la cadena, desde el recurso más especializado hasta el invariante.
Puede usar la ResourceManager
clase para tener más control sobre cómo exactamente está cargando las cosas. La clase generada Strings
también lo usa.