2010-07-14 12 views
9

Im creando una aplicación C# basada en WinForms/KryptonForms, y como la aplicación está a medio camino de desarrollo, pensé para mí mismo que era mejor ordenar la localización.Localización en la aplicación C#

Como programador de PHP nacido y criado (y sé que C# es un nivel completamente nuevo), crearía una clase para detectar el idioma y asignar automáticamente el paquete de idioma a la aplicación. y luego usa los objetos de lenguaje para acceder a los valores.

Me pregunto si puedo conseguir algunos ejemplos en los más fácil/ métodos mejores de hacer esto.

Personalmente me gustaría algo en la línea de las Opciones de la aplicación

Donde generalmente que haría MyApplication.Properties.Settings.Default.SomeKey Tenía la esperanza de un MyApplication.Languages.Current.ApplicationTitle y MyApplication.Languages.en.ApplicationTitle por ejemplo.

También al cargar solo un recurso por archivo de idioma para mejorar la velocidad sería beneficioso también.

Así que el idioma se carga en inglés, se promueve que el usuario español esté en inglés, le gustaría cambiarlo al español, hace clic en SÍ, la configuración se actualiza y la aplicación se reinicia y carga el idioma español paquete.

¿Qué piensas de esto?


Editar:

La aplicación se basa en los protocolos XMPP y utiliza agsXMPP Bibliotecas. Según tengo entendido, cada usuario que me envíe su presencia también debe enviar el idioma en el que se encuentra su sistema.

Así que, básicamente, si hay alguna forma de "captar" el hecho de almacenar una sola palabra y usar el __("some string") en mi aplicación sería posible, pero por el momento estoy mirando el texto de la GUI.

+0

Lo que "los recursos lingüísticos de las ventanas" Qué quiere decir? – garik

+0

Bueno, bajo la suposición de que Windows normalmente almacenaría líneas de idioma dentro de un archivo dll en el sistema, ¿podría importarlas a mi aplicación para ahorrar tiempo escribiendo, solo texto de forma general como 'Archivo',' Ayuda', 'Opciones', 'Error', etc. ¿Sería eso factible? – RobertPitt

+1

No tiene sentido, creo. Pasará más tiempo para investigar todos los recursos de Windows y por qué? Los clientes tienen sus propios marcos (inglés, españa, alemania ...) y framework muestra sus mensajes del sistema (advertencia, error) utilizando esos mensajes localizados. Tu aplicación tiene sus propios recursos de texto. Así que estén listos para traducirlos todos. No hay magia, solo trabajo ... trabajo ... trabajo ... :). – garik

Respuesta

7

La forma en que hacemos localización es:

  • Establecer el "localizable"-Propiedades de un WinForm a verdadero (lo que generará un nuevo archivo de recursos para esa forma, por ejemplo, sostiene el texto de las etiquetas, botones, pero también orden z, etc.)
  • Cree un archivo FormName.de.resx ("de" porque somos alemanes) y luego almacene las cadenas que necesitarán ser localizadas allí (el acceso a este recurso-archivo funciona a través de la clase ResourceManager)
  • En cuanto al código no WinForms que debe ser localizado, simplemente creamos archivos de recursos separados

Al compilar su aplicación, se crea AppName.resources.dll. Este dll contiene todos los recursos de su aplicación y luego puede usarse con herramientas como Visual Localize para traducir las cadenas a otro idioma como inglés o español, etc.

+0

OK, pero no quiero cargar todos los recursos de idioma, si es posible, solo se debe importar un solo idioma, así que puedo tener 'lang.en.dll' y' lang.de.dll' en el que se cargará desde el idioma en el espacio de nombre de configuración? o al hacerlo de esta manera, ¿no hace ninguna diferencia en la velocidad de las aplicaciones? – RobertPitt

+0

Solo se cargará un recurso dll. En mi máquina alemana, AppName.de.dll se cargará, en una máquina inglesa, AppName.en.dll. – Christian

+0

Parece interesante, en este caso no veo qué puedo hacer con él. Gracias por tu ayuda. – RobertPitt

1

Usamos Resources.MyResources.SomeString que se traduce automáticamente en lenguaje correcto. Los archivos de recursos se denominan MyResources.de-DE.resx, MyResources.nl-BE.resx etc. El mismo método que las propiedades del proyecto, básicamente.

Muestra código de traducción:

public void TranslateForm() 
{ 
     menuItem11.Text = Resources.MyResources.Nieuw; 
     menuItem12.Text = Resources.MyResources.Verwijderen; 
     menuItem13.Text = Resources.MyResources.Kopieren; 
} 

O puede hacerlo de forma manual como:

menuItem11.Text = Translator.GetString("New", "de-DE"); 

...

public static string GetString(string varname) 
    { 
     string resourceName = typeof(Vertaling).Namespace + ".Resources.MyResources"; 
     ResourceManager rm = new ResourceManager(resourceName, Assembly.GetExecutingAssembly()); 
     return rm.GetString(varname); 
    } 

    public static string GetString(string varname, string taalCode) 
    { 
     string resourceName = typeof(Vertaling).Namespace + ".Resources.MyResources"; 
     ResourceManager rm = new ResourceManager(resourceName, Assembly.GetExecutingAssembly()); 
     return rm.GetString(varname, new CultureInfo(taalCode)); 
    } 
+0

ver esto para mí no es eficiente si tengo muchos elementos que necesitan ser traducidos, básicamente quiero en mi código de diseñador 'this.LoginLabel.Text = Language.Current.LoginLabel;' así que no tiene que preocuparse por las cosas ya que el sistema cargará el idioma necesario? – RobertPitt

+0

No entiendo. ¿Cuál es la diferencia entre esto.LoginLabel.Text = Language.Current.LoginLabel; y menuItem11.Text = Resources.MyResources.Nieuw; ?? Ya no realizamos traducciones en el diseñador, ya que eso genera muchos (temidos) errores de diseño. –

+0

bueno, el problema no está en la forma en que está el código, solo quiero que las etiquetas de texto se carguen con el texto del paquete de idiomas y no para que cree un nuevo método y asigne de forma individual todos los elementos nuevos valores de texto. – RobertPitt

2

Debe utilizar los recursos.

Puede cambiar el idioma de forma dinámica:

1) en la aplicación de consola:

Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US"); 
double a = 100.12; 
Console.WriteLine("{0} - {1}", Thread.CurrentThread.CurrentCulture, a); 

Thread.CurrentThread.CurrentCulture = new CultureInfo("ru-RU"); 
Console.WriteLine("{0} - {1}", Thread.CurrentThread.CurrentCulture, a); 
Console.ReadLine(); 

2) en winforms aplicación podemos abrir de nuevo formulario para solicitar recursos de localización (utilizan localizable y Idioma propiedades en el diseñador de formularios para generar recursos automáticamente para cada idioma):

if (Thread.CurrentThread.CurrentCulture.Name == "en-US") 
{ 
    Thread.CurrentThread.CurrentCulture = new CultureInfo("ru-RU"); 
    Thread.CurrentThread.CurrentUICulture = new CultureInfo("ru-RU"); 
} 
else 
{ 
    Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US"); 
    Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US"); 
} 

double a = 100.12; 
textBox1.Text = a.ToString(Thread.CurrentThread.CurrentCulture); 

Form1 f = new Form1(); 
f.ShowDialog(); 

3) el uso de muchos hilos con la propia localización

private void button1_Click(object sender, EventArgs e) 
{ 
    // for example main thread language is en-US   

    Thread t = new Thread(StartForm); 
    t.CurrentUICulture = new CultureInfo("ru-RU"); 
    t.Start(); 
    //t.Join(); 
} 

public static void StartForm() 
{ 
    Form1 f = new Form1(); 
    f.ShowDialog(); 
} 
+0

¿Cómo se detecta automáticamente la configuración regional de los usuarios, y puedo usar los recursos de idioma de Windows? – RobertPitt

+0

Cuando su aplicación inicia el Thread.CurrentThread.CurrentCulture tiene un valor de acuerdo con la configuración de su ventana (Mi sistema operativo tiene Ukrainian UK-UA), pero puedo cambiar el valor Thread.CurrentThread.CurrentCulture y luego, por ejemplo, puedo guardar este valor a alguna configuración de aplicación para usar en la siguiente sesión. – garik

+0

3) usando muchos hilos con localización propia (ver mi respuesta actualizada) – garik

Cuestiones relacionadas