2009-07-17 19 views
230

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?

Respuesta

491
  • añadir un archivo de recursos para su proyecto (se le puede llamar "Strings.resx") de la siguiente manera:
    Haga clic en Propiedades en el proyecto, seleccione Agregar -> Nuevo elemento ... en el menú contextual, luego en la lista de Elementos de Visual C# elija "Archivo de recursos" y llámelo strings.resx.
  • Añadir un resouce cadena en el resx y darle un buen nombre (ejemplo: el nombre de "Hola" con y darle el valor "Hola")
  • Guardar el archivo de recursos (nota: esto será el archivo de recursospor defecto, ya que no tiene un código de idioma de dos letras)
  • Añadir referencias a su programa: 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.

+20

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

+13

+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

+1

¿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

35

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.

11

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")

+1

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. –

13

Además gran respuesta de @Fredrik Mörk en las cuerdas, para añadir la localización de una forma hacer lo siguiente:

  • Conjunto la forma 's propiedad "Localizable" a true
  • Cambio de propiedades del formulario Language para el idioma que desee (de un buen desplegable con todos ellos en)
  • traducir los controles en esa forma y se mueven sobre si es necesario ser (aplastar las muy largas frases francesas completo en!)

Este MSDN article on Localizing Windows Forms da algo más de información sobre el mismo.

0

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:

  • código fuente (proyecto VS) puede separarse de proyecto de lenguaje,
  • añadir un nuevo idioma no requiere volver a compilar el proyecto,
  • traducción podría hacerse incluso por el usuario final.

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.

0

En mi caso

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

en los AssemblyInfo.cs prevenirse cosas para trabajar como de costumbre.

5

Una corrección y elaboración de @Fredrik Mörk answer.

  • añadir un archivo Strings.resx de recursos para su proyecto (o un nombre de archivo diferente)
  • Establecer Access Modifier a Public (en la pestaña Strings.resx archivo abierto)
  • Añadir un resouce cadena en el resx: (ejemplo: nombrar Hello, valor Hello)
  • Guardar el archivo de recursos

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:

  • Añadir Strings.fr.resx (para el francés)
  • Añadir una cadena con el mismo nombre que pre viamente, pero diferente valor: (nombre 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:

  • partir de recursos específica para cada país como Strings.fr-CA.resx
  • De los 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 satellite assemblies.

También sepa cómo CurrentCulture difiere de CurrentUICulturehere.

Cuestiones relacionadas