Parece que no puedo hacer que la localización funcione.Cómo utilizar la localización en C#
Tengo una biblioteca de clases. Ahora quiero crear archivos resx y devolver algunos valores basados en el cultivo de hebras.
¿Cómo puedo hacer eso?
Parece que no puedo hacer que la localización funcione.Cómo utilizar la localización en C#
Tengo una biblioteca de clases. Ahora quiero crear archivos resx y devolver algunos valores basados en el cultivo de hebras.
¿Cómo puedo hacer eso?
strings.resx
.System.Threading
y System.Globalization
Ejecutar este código:
Console.WriteLine(Properties.strings.Hello);
Debe imprimir "Hola".
Ahora, agregue un nuevo archivo de recursos, llamado "strings.fr.resx" (observe 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 (Name = "Hello", Value = "Salut"). Ahora, si ejecuta el código siguiente, se debe 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á uno (ya que especificamos "fr" en su archivo "). Luego volverá a buscar" fr ", que encuentra (y usa).
El siguiente código, imprimirá" Hello " ":
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en-US");
Console.WriteLine(Properties.strings.Hello);
eso es debido a que no se encontró ninguna '' recurso, y también hay 'en-US Fuentes de Información', por lo que volverá a caer en el valor predeterminado, que es la que hemos añadido de la start.
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 esos archivos necesitará a agregue los recursos para esas cadenas que difieren del recurso al que recurriría. Por lo tanto, 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 entrar en strings.fr-CA.resx.
Es bastante simple, en realidad. Cree un nuevo archivo de recursos, por ejemplo Strings.resx
. Establezca Access Modifier
en 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 predeterminado
Ahora, cuando desee agregar, por ejemplo, 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 ve 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 "Hallo, Welt!". Y en Strings.de-AT.resx
, agregue "Servus, Welt!". Eso es todo hasta ahora.
Ahora tiene esto generado Strings
clase, y tiene una propiedad con un getter HelloWorld
. Obtener esta propiedad cargará "Servus, Welt!" cuando su configuración regional es de-AT, "Hallo, Welt! cuando su configuración regional es cualquier otra configuración regional (incluidos DE-DE y de-CH), y" Hello, World! "cuando su configuración regional es cualquier otra cosa. Si se trata de una cadena que falta en la versión localizada, el administrador de recursos caminará automáticamente la cadena, desde los más especializados al recurso invariante.
usted puede utilizar la clase ResourceManager
para un mayor control sobre cómo exactamente va a cargar cosas. la clase Strings
generada también lo usa.
Gran respuesta de F.Mörk. Pero si quieres actualizar la traducción o agregar nuevos idiomas una vez que se lanza la aplicación, estás atascado, porque siempre tienes que recompilarla para generar los recursos. .dll.
Aquí hay una solución para compilar manualmente un recurso dll. Utiliza las herramientas resgen.exe y al.exe (instaladas con el SDK).
Digamos que tiene un archivo de recursos Strings.fr.resx, puede compilar una DLL de recursos con los siguientes lotes:
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 originales de los nombres de archivo (en este caso "WpfRibbonApplication1")
Gracias por el comentario sobre la preservación del espacio de nombres (y), que, si se omite, no generará ningún error, sino que simplemente volverá al recurso de reserva. –
Además gran respuesta de @Fredrik Mörk en las cuerdas, para añadir la localización de una forma hacer lo siguiente:
"Localizable"
a true
Language
para el idioma que desee (de un buen desplegable con todos ellos en)Este MSDN article on Localizing Windows Forms da algo más de información sobre el mismo.
Además de @Eric Bole-Feysot respuesta:
Gracias a ensamblados satélite, localización pueden ser creados sobre la base de .dll/.exe archivos.De esta manera:
Hay una pequeña herramienta conocida llamada LSACreator (gratuito para uso no comercial o la opción de comprar), que le permite crear de localización basado en archivos .exe .dll /. De hecho, internamente (en el directorio del proyecto de idioma) crea/gestiona versiones localizadas de archivos resx y compila un ensamblado de forma similar a @Eric Bole-Feysot descrito.
En mi caso
[assembly: System.Resources.NeutralResourcesLanguage("ru-RU")]
en los AssemblyInfo.cs prevenirse cosas para trabajar como de costumbre.
Una corrección y elaboración de @Fredrik Mörk answer.
Strings.resx
de recursos para su proyecto (o un nombre de archivo diferente)Access Modifier
a Public
(en la pestaña Strings.resx
archivo abierto)Hello
, valor Hello
)Visual Studio generará automáticamente s una clase correspondiente Strings
, que en realidad se coloca en Strings.Designer.cs
. La clase está en el mismo espacio de nombres que se puede esperar de un .cs
archivo recién creado para ser colocado en
Este código imprime siempre Hello
, porque este es el recurso predeterminado y no hay recursos específicos del idioma están disponibles:.
Console.WriteLine(Strings.Hello);
Ahora añadir un nuevo recurso específico del lenguaje:
Strings.fr.resx
(para el francés)Hello
, valor Salut
)Los siguientes código imprime Salut
:
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("fr-FR");
Console.WriteLine(Strings.Hello);
Qué recursos se utiliza depende de Thread.CurrentThread.CurrentUICulture
. Se configura según la configuración de idioma de la interfaz de usuario de Windows o se puede configurar manualmente como en este ejemplo. Conozca 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 va a utilizar se determina en este orden de prioridad:
Strings.fr-CA.resx
Strings.fr.resx
Strings.resx
Tenga en cuenta que los recursos específicos del idioma generan satellite assemblies.
También sepa cómo CurrentCulture
difiere de CurrentUICulture
here.
La respuesta podría hacer referencia a la plomería "detrás de escena" que está haciendo Visual Studio aquí: archivo resx.designer.cs, haciendo que el intellisense funcione; ensamblados de satélites compilados con la biblioteca de clases, que deben implementarse con el ensamblado compilado y cualquier proyecto posterior que lo use, etc. La respuesta es simple y agradable, pero no ayuda a explicar dónde podrían salir las cosas, por ejemplo si no usas Visual Studio. – Tao
+1 publicación! En lugar de crear archivos manualmente, intente Zeta Resource Editor (http://www.zeta-resource-editor.com/index.html). Es gratis y te ayuda a hacer este tipo de traducciones MUCHO más rápido que solo en VS. – Killnine
¿Elegirá .net el idioma del sistema operativo y luego configurará automáticamente la información cultural para usted? ... o tenemos que configurar CurrentUICulture en el código para un idioma diferente? – noelicus