2010-08-24 29 views
9

Tengo una aplicación de winforms que los usuarios deben poder cambiar el idioma en tiempo de ejecución.Cómo cambiar el idioma en tiempo de ejecución sin problemas de diseño

generalizar el interruptor y evitar tener que nombres de control de código lo intentara la siguiente extensión:

internal static void SetLanguage(this Form form, CultureInfo lang) 
    { 
     ComponentResourceManager resources = new ComponentResourceManager(form.GetType()); 

     ApplyResourceToControl(resources, form, lang); 
     resources.ApplyResources(form, "$this", lang); 
    } 

    private static void ApplyResourceToControl(ComponentResourceManager resources, Control control, CultureInfo lang) 
    { 
     foreach (Control c in control.Controls) 
     { 
      ApplyResourceToControl(resources, c, lang); 
      resources.ApplyResources(c, c.Name, lang); 
     } 
    } 

Esto cambia todas las cuerdas.

Sin embargo, un efecto secundario de esto es que todo el contenido de la ventana se redimensiona al tamaño de inicio original de Windows, sin importar el tamaño actual.

¿Cómo puedo evitar que el diseño cambie o inicie un nuevo cálculo de disposición?

+0

¡Deseo poder votar más de una vez! – Bosak

Respuesta

5

Mire el archivo .resx para ver qué se está reasignando. Propiedades como Size y Form.AutoScaleDimensions son propiedades localizables. Reasignarlos tiene el tipo de efecto que estás viendo. Especialmente deshacer el escalado automático sería bastante desagradable.

No hay consejos específicos para solucionar este problema, esto simplemente no está hecho para ejecutarse en ningún otro lugar que el constructor del formulario. Reconstruye el formulario. Señalar que el usuario real de su formulario nunca siente la necesidad de cambiar su idioma nativo sobre la marcha nunca parece causar una impresión.

5

Este es el código completo que estoy usando ahora.

El cambio consiste en cambiar manualmente la propiedad de texto solamente. Si logro localizar otras propiedades, el código tendrá que expandirse después.

/// <summary> 
    /// Change language at runtime in the specified form 
    /// </summary> 
    internal static void SetLanguage(this Form form, CultureInfo lang) 
    { 
     //Set the language in the application 
     System.Threading.Thread.CurrentThread.CurrentUICulture = lang; 

     ComponentResourceManager resources = new ComponentResourceManager(form.GetType()); 

     ApplyResourceToControl(resources, form.MainMenuStrip, lang); 
     ApplyResourceToControl(resources, form, lang); 

     //resources.ApplyResources(form, "$this", lang); 
     form.Text = resources.GetString("$this.Text", lang); 
    } 

    private static void ApplyResourceToControl(ComponentResourceManager resources, Control control, CultureInfo lang) 
    { 
     foreach (Control c in control.Controls) 
     { 
      ApplyResourceToControl(resources, c, lang); 
      //resources.ApplyResources(c, c.Name, lang); 
      string text = resources.GetString(c.Name+".Text", lang); 
      if (text != null) 
       c.Text = text; 
     } 
    } 

    private static void ApplyResourceToControl(ComponentResourceManager resources, MenuStrip menu, CultureInfo lang) 
    { 
     foreach (ToolStripItem m in menu.Items) 
     { 
      //resources.ApplyResources(m, m.Name, lang); 
      string text = resources.GetString(m.Name + ".Text", lang); 
      if (text != null) 
       m.Text = text; 
     } 
    } 
Cuestiones relacionadas