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

fra*_*nzp 2 .net c# 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));
        }
    }
Run Code Online (Sandbox Code Playgroud)

有什么建议?

Han*_*ant 6

 ComponentResourceManager resources = new ComponentResourceManager(typeof(Type));
Run Code Online (Sandbox Code Playgroud)

构造函数的参数是错误的,您告诉它找到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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

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