Cómo utilizar la localización en C#

Resuelto JL. asked hace 15 años • 9 respuestas

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?

JL. avatar Jul 17 '09 18:07 JL.
Aceptado
  • 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 nombre strings.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.ThreadingySystem.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.

Fredrik Mörk avatar Jul 17 '2009 12:07 Fredrik Mörk

En realidad, es bastante sencillo. Cree un nuevo archivo de recursos, por ejemplo Strings.resx. Ajustado Access Modifiera 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.resxen 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 Stringsclase 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 ResourceManagerclase para tener más control sobre cómo exactamente está cargando las cosas. La clase generada Stringstambién lo usa.

OregonGhost avatar Jul 17 '2009 12:07 OregonGhost