2011-09-26 23 views
10

He creado el programa Windows Form en C#. Tengo algunos problemas con la localización. Tengo archivos de recursos en 2 idiomas (uno es para inglés y otro para francés). Quiero hacer clic en cada botón de idioma y cambiar el idioma en tiempo de ejecución.Cómo cambio la cultura de una aplicación WinForms en tiempo de ejecución

Pero cuando hago clic en el botón, no funciona. estoy usando este código

private void btnfrench_Click(object sender, EventArgs e) 
{ 
    getlanguage("fr-FR"); 
} 

private void getlanguage(string lan) 
{ 
    foreach (Control c in this.Controls) 
    { 
     ComponentResourceManager cmp = 
      new ComponentResourceManager(typeof(BanksForm)); 
     cmp.ApplyResources(c, c.Name, new CultureInfo(lan)); 
    } 
} 

serían algunos pls ayudar en esto ......

Muchas Gracias ....

Respuesta

18

Esto funcionó:

private void button1_Click(object sender, EventArgs e) 
{ 
    System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("fr-BE"); 
    ComponentResourceManager resources = new ComponentResourceManager(typeof(Form1)); 
    resources.ApplyResources(this, "$this"); 
    applyResources(resources, this.Controls); 
} 

private void applyResources(ComponentResourceManager resources, Control.ControlCollection ctls) 
{ 
    foreach (Control ctl in ctls) 
    { 
     resources.ApplyResources(ctl, ctl.Name); 
     applyResources(resources, ctl.Controls); 
    } 
} 

Tenga cuidado de evitar agregar silbidos como este que nadie usará nunca.

+0

lo siento, lo he intentado, pero no funciona para mí ... –

+0

necesito agregar cualquier archivo de recursos a la forma, he cambiado la propiedad de localización a verdadero y cambio el idioma inglés a bélgica pero no muestra el idioma que He seleccionado ... y no veo que se hayan agregado archivos de recursos adicionales para formar ... –

+1

¿Ni siquiera comenzó a usarlo y quiere saber cómo cambiar? No tengo idea de qué podría significar "no mostrar el idioma que he seleccionado". Deberá editar las propiedades. Después de cambiar la propiedad de Idioma, configure la propiedad de Texto del formulario, por ejemplo. Eso creará automáticamente el archivo Form1.fr-BE.resx. Abra el nodo al lado del formulario para verlo. –

5

Es posible que tenga que llamar ApplyResources recursivamente en los controles:

private void btnfrench_Click(object sender, EventArgs e) 
{ 
    ApplyResourceToControl(
     this, 
     new ComponentResourceManager(typeof(BanksForm)), 
     new CultureInfo("fr-FR")) 
} 

private void ApplyResourceToControl(
    Control control, 
    ComponentResourceManager cmp, 
    CultureInfo cultureInfo) 
{ 
    cmp.ApplyResources(control, control.Name, cultureInfo); 

    foreach (Control child in control.Controls) 
    { 
     ApplyResourceToControl(child, cmp, cultureInfo); 
    } 
} 
+0

He intentado su código pero no de trabajo .... –

0

La actualización de CultureInfo en el tiempo de ejecución puede restablecer el tamaño del componente. Este código preserva el tamaño y la posición de los controles (todavía habrá parpadeo visible sin embargo, que el uso de SuspendLayout() no podía arreglar)


    private void langItem_DropDownItemClicked(object sender, ToolStripItemClickedEventArgs e) 
    { 
     //I store the language codes in the Tag field of list items 
     var itemClicked = e.ClickedItem; 
     string culture = itemClicked.Tag.ToString().ToLower(); 

     Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(culture); 
     ApplyResourceToControl(
     this, 
     new ComponentResourceManager(typeof(GUI)), 
     new CultureInfo(culture));   
    } 

    private void ApplyResourceToControl(
     Control control, 
     ComponentResourceManager cmp, 
     CultureInfo cultureInfo) 
    { 
     foreach (Control child in control.Controls) 
     { 
      //Store current position and size of the control 
      var childSize = child.Size; 
      var childLoc = child.Location; 
      //Apply CultureInfo to child control 
      ApplyResourceToControl(child, cmp, cultureInfo); 
      //Restore position and size 
      child.Location = childLoc; 
      child.Size = childSize; 
     } 
     //Do the same with the parent control 
     var parentSize = control.Size; 
     var parentLoc = control.Location; 
     cmp.ApplyResources(control, control.Name, cultureInfo); 
     control.Location = parentLoc; 
     control.Size = parentSize; 
    } 
Cuestiones relacionadas