C#如何在所有Windows窗体中更改多语言?

时间:2014-07-06 13:53:57

标签: c# windows multilingual

C#如何在所有窗体中更改多语言?

我使用此方法更改其他语言,但它只更改当前的窗体。

我想为所有Windows窗体选择一种语言。谢谢你回答。

这是我的代码:

        private void ChineseTToolStripMenuItem_Click(object sender, EventArgs e)
    {
        ChangeLanguage("zh-tw"); ;
    }

    private void englishToolStripMenuItem_Click(object sender, EventArgs e)
    {
        ChangeLanguage("en");
    }

    private void ChineseSToolStripMenuItem_Click(object sender, EventArgs e)
    {
        ChangeLanguage("zh-cn");
    }

    private void ChangeLanguage(string lang)
    {
        foreach (Control c in this.Controls)
        {
            ComponentResourceManager resources = new ComponentResourceManager(typeof(FormMain));
            resources.ApplyResources(c, c.Name, new CultureInfo(lang));
        }
    }

2 个答案:

答案 0 :(得分:1)

首先,您应该使用ChangeLanguage方法在任何控件或表单上调用它。 这是一个递归的版本,它以Control为参数。

注意:Forms也是Controls

所以你可以调用这个方法来改变你有句柄的所有形式..

public ComponentResourceManager resources;

private void ChangeLanguage(Control ctl, string lang)
{
    resources.ApplyResources(ctl, ctl.Name, new CultureInfo(lang));
    foreach (Control c in ctl.Controls) ChangeLanguage(c, lang);
}

接下来,您需要以某种方式保留打开表单的列表。 List<Form>是个好方法。

不是仅在当前窗口上调用ChangeLanguage函数,而是调用ChangeLanguageOnAllforms函数。因此,如果您有一个名为List<Form>的{​​{1}},您可以这样做:

myFormsList

您还应该保留一个公共变量来保存当前语言!

void ChangeLanguageOnAllforms(  string lang )
{
  foreach (Form f in myFormsList) 
  {
     if (f != null)
     { 
        resources = new ComponentResourceManager(typeof(f));
        ChangeLanguage(f, languageString);
     }
  }
}

你还应该在打开任何新表格时说出form7

  • 将其添加到列表中
  • 调用ChangeLanguage(form7,语言)

您应该考虑通过从中删除封闭表单来保持表单列表的最新状态。 如果你把它作为一个公共财产,那么关闭表格可以从中删除它,如果它有你的主表格的引用..

答案 1 :(得分:0)

如果可能,您应该在启动代码中设置应用程序的语言。

CultureInfo.CurrentUICulture = new CultureInfo("zh-cn");

在.Net 4.5中,还有一个名为DefaultThreadCurrentUICulture的新属性。您可以使用它为所有新线程设置默认文化。

如果两者都不适用于您的使用方案,请创建一个BaseLangForm类,该类派生自Form,并从ChangeLanguage事件中调用OnLoad方法。您的所有表单必须从BaseLangForm开始。