2011-09-26 10 views
10

Ho creato il programma Windows Form in C#. Ho alcuni problemi con la localizzazione. Ho file di risorse in 2 lingue (una è per l'inglese e un'altra per il francese). Voglio fare clic sul pulsante di ciascuna lingua e cambiare lingua in fase di esecuzione.Come modificare la cultura di un'applicazione WinForms in fase di esecuzione

Ma quando faccio clic sul pulsante, non funziona. sto usando questo codice.

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)); 
    } 
} 

sarebbero tutti i pls aiutare su questo ......

Molte grazie ....

risposta

18

Funzionava:

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); 
    } 
} 

Fai attenzione ad evitare di aggiungere fischi come questo che nessuno userà mai.

+0

scusa ho provato questo, ma non funziona per me .. –

+0

ho bisogno di aggiungere qualsiasi file di risorse per formare, ho cambiato la proprietà di localizzazione su true e cambiare la lingua inglese in Belgio ma non mostra la lingua che ho selezionato ... e ho visto che non sono stati aggiunti altri file di risorse al modulo ... –

+1

Non hai nemmeno iniziato su di esso e vuoi sapere come passare? Nessuna idea di cosa significhi "non mostrare la lingua che ho selezionato". Avrai bisogno di modificare le proprietà. Dopo aver modificato la proprietà Language, imposta la proprietà Text del modulo, ad esempio. Ciò creerà automaticamente il file Form1.fr-BE.resx. Apri il nodo accanto al modulo per vederlo. –

5

Potrebbe essere necessario chiamare ApplyResources ricorsivamente sui controlli:

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

Ho provato il codice ma non di lavoro .... –

0

L'aggiornamento di CultureInfo in fase di runtime potrebbe ripristinare le dimensioni del componente. Questo codice conserva la dimensione e la posizione dei comandi (ci sarà ancora sfarfallio visibile, però, che utilizzando SuspendLayout() non avrebbe potuto risolvere)


    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; 
    } 
Problemi correlati