Como faço para alterar a cultura de um aplicativo WinForms em tempo de execução

Eu criei o Windows Form Program em C #. Eu tenho alguns problemas com localização. Eu tenho arquivos de resources em 2 idiomas (um é para inglês e outro é para francês). Eu quero clicar em cada botão de idioma e alterar o idioma em tempo de execução.

Mas quando eu estou clicando no botão, não funciona. Eu estou 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)); } } 

Algum pls ajudaria nisso ……

Muito Obrigado….

Isso funcionou:

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

Tenha cuidado para evitar adicionar assobios como este que ninguém jamais usará. Na melhor das hipóteses é um recurso de demonstração, na prática, os usuários não mudam sua linguagem nativa on-the-fly.

Você pode ter que chamar ApplyResources recursivamente nos 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); } } 

A atualização do CultureInfo no tempo de execução pode redefinir o tamanho do componente. Este código preserva o tamanho e a posição dos controles (ainda haverá oscilação visível, que usando o SuspendLayout () não pôde ser corrigido)

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