typeparam example cref c# localization cultureinfo

cref - summary example c#



Cómo utilizar la localización en C# (7)

Además de la respuesta de @Eric Bole-Feysot :

Gracias a los ensamblajes satelitales, la localización se puede crear en base a los archivos .dll / .exe . De esta manera:

  • El código fuente (proyecto VS) podría estar separado del proyecto de idioma,
  • agregar un nuevo idioma no requiere recompilar el proyecto,
  • La traducción podría ser realizada incluso por el usuario final.

Existe una herramienta poco conocida llamada LSACreator (gratuita para uso no comercial o opción de compra) que le permite crear localización basada en archivos .dll / .exe. De hecho, internamente (en el directorio del proyecto de lenguaje) crea / administra versiones localizadas de archivos resx y compila un ensamblaje de manera similar a como lo describió @Eric Bole-Feysot .

Parece que no consigo que la localización funcione.

Tengo una biblioteca de clase. Ahora quiero crear archivos resx allí y devolver algunos valores basados ​​en la cultura de hilos.

¿Cómo puedo hacer eso?


Además, la gran respuesta de @Fredrik Mörk sobre las cadenas, para agregar localización a un formulario, haga lo siguiente:

  • Establezca la propiedad del formulario "Localizable" en true
  • Cambie la propiedad Language del formulario al idioma que desee (de un menú desplegable con todos ellos en)
  • Traduce los controles de esa forma y muévelos si es necesario (¡aplasta esas oraciones completas en francés realmente largas!

Este artículo de MSDN sobre la localización de formularios de Windows proporciona más información al respecto.


En mi caso

[assembly: System.Resources.NeutralResourcesLanguage("ru-RU")]

en AssemblyInfo.cs impidió que las cosas funcionaran como siempre.


Es bastante simple, en realidad. Cree un nuevo archivo de recursos, por ejemplo, Strings.resx . Establecer el Access Modifier a Public . Utilice la plantilla de archivo correspondiente, de modo que Visual Studio generará automáticamente una clase de acceso (el nombre será Strings , en este caso). Este es tu idioma por defecto.

Ahora, cuando desee agregar, digamos, localización alemana, agregue un archivo resx localizado. Esto será típicamente Strings.de.resx en este caso. Si desea agregar una localización adicional para, por ejemplo, Austria, también creará un Strings.de-AT.resx .

Ahora vaya a crear una cadena; digamos una cadena con el nombre HelloWorld . En su Strings.resx , agregue esta cadena con el valor "¡Hola mundo!". En Strings.de.resx , agregue "¡Hola, Welt!". Y en Strings.de-AT.resx , agregue "Servus, Welt!". Eso es todo hasta ahora.

Ahora tienes esta clase de Strings generada, y tiene una propiedad con un getter HelloWorld . Al obtener esta propiedad se cargará "Servus, Welt!" cuando su locale es de-AT, "¡Hola, Welt! cuando su locale es cualquier otra locale (incluyendo de-DE y de-CH), y" Hello, World! "cuando su locale es cualquier otra cosa. Si una cadena es faltando en la versión localizada, el administrador de recursos recorrerá automáticamente la cadena, desde el recurso más especializado hasta el invariante.

Puede usar la clase ResourceManager para tener más control sobre cómo está cargando las cosas exactamente. La clase Strings generada también lo usa.


Gran respuesta por F.Mörk. Pero si desea actualizar la traducción, o agregar nuevos idiomas una vez que se lance la aplicación, se queda atascado, porque siempre tiene que recompilarla para generar los recursos.dll.

Aquí hay una solución para compilar manualmente un dll de recursos. Utiliza las herramientas resgen.exe y al.exe (instaladas con el sdk).

Supongamos que tiene un archivo de recursos Strings.fr.resx, puede compilar una dll de recursos con el siguiente lote:

resgen.exe /compile Strings.fr.resx,WpfRibbonApplication1.Strings.fr.resources Al.exe /t:lib /embed:WpfRibbonApplication1.Strings.fr.resources /culture:"fr" /out:"WpfRibbonApplication1.resources.dll" del WpfRibbonApplication1.Strings.fr.resources pause

Asegúrese de mantener el espacio de nombres original en los nombres de archivo (aquí "WpfRibbonApplication1")


Una solución y elaboración de la respuesta de @Fredrik Mörk .

  • Agregue un archivo de recursos Strings.resx a su proyecto (o un nombre de archivo diferente)
  • Establezca el Access Modifier como Public (en la pestaña del archivo Strings.resx abierto)
  • Agregue un resultado de cadena en el archivo resx: (ejemplo: nombre Hello , valor Hello )
  • Guardar el archivo de recursos

Visual Studio genera automáticamente una clase de Strings respectiva, que en realidad se coloca en Strings.Designer.cs . La clase está en el mismo espacio de nombres en el que se esperaría que se colocara un archivo .cs recién creado.

Este código siempre se imprime Hello , porque este es el recurso predeterminado y no hay recursos específicos de idioma disponibles:

Console.WriteLine(Strings.Hello);

Ahora agregue un nuevo recurso específico de idioma:

  • Añadir Strings.fr.resx (para francés)
  • Agregue una cadena con el mismo nombre que antes, pero con un valor diferente: (nombre Hello , valor Salut )

El siguiente código imprime Salut :

Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("fr-FR"); Console.WriteLine(Strings.Hello);

El recurso que se utiliza depende de Thread.CurrentThread.CurrentUICulture . Se establece según la configuración de idioma de la interfaz de usuario de Windows, o se puede configurar manualmente como en este ejemplo. Aprenda más sobre esto here .

Puede agregar recursos específicos del país como Strings.fr-FR.resx o Strings.fr-CA.resx .

La cadena que se utilizará se determina en este orden de prioridad:

  • Del recurso específico del país como Strings.fr-CA.resx
  • Desde recursos específicos del idioma como Strings.fr.resx
  • De forma predeterminada Strings.resx

Tenga en cuenta que los recursos específicos del idioma generan ensamblajes de satélite .

También aprenda cómo CurrentCulture diferencia de CurrentUICulture here .


  • Agregue un archivo de recursos a su proyecto (puede llamarlo "strings.resx") haciendo lo siguiente:
    Haga clic con el botón derecho en Propiedades en el proyecto, seleccione Agregar -> Nuevo elemento ... en el menú contextual, luego en la lista de elementos de Visual C #, seleccione "Archivo de recursos" y strings.resx .
  • Agregue un resultado de cadena en el archivo resx y asígnele un buen nombre (ejemplo: nómbralo "Hola" con 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 y System.Globalization

Ejecutar este código:

Console.WriteLine(Properties.strings.Hello);

Se debe imprimir "Hola".

Ahora, agregue un nuevo archivo de recursos, llamado "strings.fr.resx" (observe la parte "fr"; esta 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á una (ya que especificamos "fr" en su archivo "). Luego volverá a verificar" fr ", que encuentra (y usa).

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" y tampoco un 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 difieran del recurso al que recurriría. Entonces, si un texto es el mismo en Francia y Canadá, puede ponerlo en strings.fr.resx, mientras que las cadenas que son diferentes en francés canadiense podrían ir a strings.fr-CA.resx.