Pregunta

He estado trabajando en un proyecto de compañía los fines de semana para aprender más sobre C # y he encontrado un extraño problema cuando se trabaja con la localización. Para ser más específicos, el problema que tengo es con System.Threading.Thread.CurrentThread.CurrentUICulture.

He creado mi aplicación para que el usuario puede cambiar rápidamente el idioma de la aplicación haciendo clic en un elemento del menú. El elemento de menú, a su vez, guarda el código de dos letras para el idioma (por ejemplo, "en", "fr", etc.) en un entorno de usuario llamado 'Language' y reinicia la aplicación.

Properties.Settings.Default.Language = "en";
Properties.Settings.Default.Save();
Application.Restart();

Cuando la aplicación se pone en marcha, la primera línea de código en el constructor de la forma (incluso antes de InitializeComponent ()) recupera la cadena de idioma en la configuración y establece el CurrentUICulture este modo:

public Form1()
{
    Thread.CurrentThread.CurrentUICulture = new CultureInfo(Properties.Settings.Default.Language);
    InitializeComponent();
}

El caso es que esto no funciona de forma coherente. A veces, todo funciona bien y se carga la aplicación correcta del lenguaje basado en la cadena guardan en el archivo de configuración. Otras veces, no lo hace, y el idioma sigue siendo la misma después de la aplicación se reinicia.

Al principio pensé que no salvó la lengua antes de reiniciar la aplicación, pero que definitivamente no es el caso. Cuando el idioma correcto no se puede cargar, si tuviera que cerrar la aplicación y ejecutarla de nuevo, el idioma correcto vendría correctamente. Por lo tanto, esto implica que la cadena de idioma se ha guardado, pero la asignación CurrentUICulture en mi forma constructor se tiene ningún efecto a veces.

Cualquier ayuda? ¿Hay algo que me falta de cómo enhebrar obras en C #? Esto podría ser específico del equipo, por lo que si hace alguna diferencia que estoy usando CPU Pentium de doble núcleo.

Actualizar

Vlad me pidió que comprobar lo CurrentUICulture del CurrentThread es. Por lo que añade un cuadro de mensaje en mi constructor para decirme lo que el CurrentUICulture código de dos letras es así como el valor de mi cadena de usuario de la lengua.

MessageBox.Show(string.Format("Current Language: {0}\nCurrent UI Culture: {1}", Properties.Settings.Default.Language, Thread.CurrentThread.CurrentUICulture.TwoLetterISOLanguageName));

Cuando se carga el idioma equivocado, tanto la cadena de Lenguaje y CurrentUICulture tiene un idioma incorrecto. Así que supongo que la CurrentUICulture se ha despejado y mi problema es en realidad con la configuración de idioma.

Así que supongo que el problema es que mi aplicación veces cargas de la cadena de lenguaje previamente guardada en lugar de la última cadena idioma guardado. Si se reinicia la aplicación, a continuación, se carga la cadena real lenguaje salvado.

¿Fue útil?

Solución

Tengo el mismo problema. Me di cuenta de que Application.Restart () realmente no crea un absolutamente reinicie, consulte MSDN .

Así Application.Restart () no llama a las cosas de inicialización en el constructor formas como InitializeComponent (), más las "Aplicaciones se reinician en el contexto en el que se llevaron a cabo inicialmente."

Así que su código es correcto

Properties.Settings.Default.Language = "en";
Properties.Settings.Default.Save();

public Form1()
{
    Thread.CurrentThread.CurrentUICulture = new CultureInfo(Properties.Settings.Default.Language);
    //...
    InitializeComponent();
}

pero no funciona de esta manera con Application.Restart(). Si cierra la aplicación y abrirlo de nuevo se toman su (nueva) configuración.

Así que tenemos que encontrar una manera de inicializar el formulario de nuevo para que la nueva configuración de idioma suceden.

Otros consejos

Podría comprobar lo es CurrentUICulture de su hilo?

Recuerdo haber tenido un problema como el suyo; se resolvió mediante la recarga de la diccionario de recursos que contiene las cadenas a ser localizado:

Thread.CurrentThread.CurrentUICulture = <new culture>;
ResourceDictionary newDict = new ResourceDictionary();
newDict.Source = localizedStrings.Source;
localizedStrings = newDict;

(y este enfoque funcionó de forma dinámica, así, aquí es algo más de información).

Se puede cambiar manualmente el idioma de la forma actual similar a esto:

CultureInfo cInfo = new CultureInfo("en-US");
ResourceManager rm = new ResourceManager(GetType());

// For each control on the form, perform the translation manually (probably better in a loop)
control1.Text = rm.GetString(control1.Name + ".Text", cInfo);

// Now set the culture for all other dialogs
Thread.CurrentThread.CurrentUICulture = cInfo;

Espero que ayude!

Se podría simplemente "reset" su aplicación mediante el cierre de las formas abiertas y volver a crearlos. Posteriormente, se podría establecer directamente la cultura cuando el usuario cambia la configuración.

Además, trate de dar alguna salida de depuración para que veas qué valores están siendo set y si la cultura es en realidad lo que espera.

EDIT: Mi suposición:. Dado que los datos se tiene que escribir en un archivo, y luego cargado de ese archivo, es posible que se reinicie demasiado rápido para la escritura de haberse completado

Mediante el uso de CurrentThread.CurrentUICulture y, a continuación, cambiar la forma, no es necesario reiniciar la aplicación. Ref mi antiguo puesto aquí

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top