在C#winform中在运行时更改语言

时间:2014-01-11 20:30:36

标签: c# .net winforms

我想更改语言但是当我编译时会弹出一个异常。它说

  

“无法找到适合指定文化或的任何资源   中性文化。确保“System.Type.resources”正确无误   在编译时嵌入或链接到程序集“mscorlib”,或者   所需的所有卫星组件都是可装载和完全签名的。“

 private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (comboBox1.SelectedItem.ToString() == "English")
        {
            Thread.CurrentThread.CurrentUICulture = new CultureInfo("En");
            ChangeLanguage("En");
        }
        else if (comboBox1.SelectedItem.ToString() == "German")
        {
            Thread.CurrentThread.CurrentUICulture = new CultureInfo("De");
            ChangeLanguage("De");
        }
    }


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

有什么建议吗?

2 个答案:

答案 0 :(得分:6)

 ComponentResourceManager resources = new ComponentResourceManager(typeof(Type));

构造函数的参数是错误的,您告诉它找到System.Type的资源。这就是为什么它抱怨它无法找到“System.Type.resources”。它永远找不到那些。

您需要传递您实际想要本地化的表单类型。请改用this.GetType()。虽然这可能只是本地化您的选项表单而不是您应用程序中的其余窗口。您可以改为迭代Application.OpenForms()。还必须将本地化应用于所有控件。不仅是表单上的那些,还有位于容器之类的面板。因此:

    private static void ChangeLanguage(string lang) {
        Thread.CurrentThread.CurrentUICulture = new CultureInfo(lang);
        foreach (Form frm in Application.OpenForms) {
            localizeForm(frm);
        }
    }

    private static void localizeForm(Form frm) {
        var manager = new ComponentResourceManager(frm.GetType());
        manager.ApplyResources(frm, "$this");
        applyResources(manager, frm.Controls);
    }

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

小心这样的wiz-bang功能。在他们使用您的程序时,实际上没有人改变他们的母语。

答案 1 :(得分:2)

private void ChangeLanguage(CultureInfo culture)
{
      Application.CurrentCulture = culture;
      CultureInfo.DefaultThreadCurrentCulture = culture;
      CultureInfo.DefaultThreadCurrentUICulture = culture;

      Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(culture.Name);
      Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(culture.Name);
}

您需要为所有语言提供适当的资源。