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

在C#winform中运行时更改语言,c#,.net,winforms,C#,.net,Winforms,我想更改语言,但编译时会弹出一个异常。上面说 “找不到任何适合指定区域性或 中性文化。确保“System.Type.resources”正确 在编译时嵌入或链接到程序集“mscorlib”,或 所需的所有附属程序集均可加载并完全签名。” 有什么建议吗 private void ChangeLanguage(CultureInfo culture) { Application.CurrentCulture = culture; CultureInfo.DefaultThre

我想更改语言,但编译时会弹出一个异常。上面说

“找不到任何适合指定区域性或 中性文化。确保“System.Type.resources”正确 在编译时嵌入或链接到程序集“mscorlib”,或 所需的所有附属程序集均可加载并完全签名。”

有什么建议吗

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);
}
不过,您需要为所有语言提供适当的资源

 ComponentResourceManager resources = new ComponentResourceManager(typeof(Type));
不过,您需要为所有语言提供适当的资源

 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功能。在使用你的程序时,没有人真正改变他们的母语

构造函数的参数错误,您正在告诉它查找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功能。在使用您的程序时,没有人真正更改他们的母语。

在comboBox1中,您选择了DexChanged put Console.Writeline(comboBox1.SelectedItem.ToString());所以你可以看到错误在哪里,这不会解决任何问题…我知道,但我想知道是否在FormLoad中调用comboBox1\u SelectedIndexChanged是的,它正在设置Form,但无论如何,它不在Combox1\u SelectedIndexChanged put Console.Writeline(comboBox1.SelectedItem.ToString())的主窗体中;所以你可以看到错误在哪里,这不会解决任何问题…我知道,但我想知道是否在FormLoad中调用comboBox1_SelectedIndexChanged是的,它正在设置Form,但无论如何,它不在主Form中,我得到了德语版本的resx文件,默认情况下使用英语。对不起,我是新手,我不太懂这个文化课。只是想知道为什么我的代码不工作…我得到了德国版本的resx文件,默认情况下英语是usid。对不起,我是新手,我不太懂这个文化课。只是想知道为什么我的代码不起作用…非常感谢!它起作用了。如果我可以问你的话,改变语言最可取的方法是什么?如果有效的话,我会给你最可取的方法。如果不是,我会假装我不知道这段代码是谁写的,然后说你最好假设用户的默认文化已经匹配了他的语言:)开玩笑吧,我不能保证它在世界上任何地方都能工作。它应该,不是那样测试的。总有一天我会弄明白中立文化是如何运作的,这一天还没有结束。传递到ChangeLanguage()中的lang参数发生了什么?“我没有看到它在任何地方使用过。@HansPassant函数中有一些问题:函数只是在窗体的直接子控件上循环。它没有检查控件层次结构中的所有控件。例如,承载在容器(如panel)中的控件不在表单的
controls
集合中。您的函数还缺少
上下文菜单
等组件,这些组件不在表单的
控件
集合中。函数以相同的方式处理所有控件,而有些控件需要自定义逻辑。要获得更好的解决方案,请看下面的答案:这是胡说八道,applyResources()递归并命中所有子控件。非常感谢!它起作用了。如果我可以问你的话,改变语言最可取的方法是什么?如果有效的话,我会给你最可取的方法。如果不是,我会假装我不知道这段代码是谁写的,然后说你最好假设用户的默认文化已经匹配了他的语言:)开玩笑吧,我不能保证它在世界上任何地方都能工作。它应该,不是那样测试的。总有一天我会弄明白中立文化是如何运作的,这一天还没有结束。传递到ChangeLanguage()中的lang参数发生了什么?“我没有看到它在任何地方使用过。@HansPassant函数中有一些问题:函数只是在窗体的直接子控件上循环。它没有检查控件层次结构中的所有控件。例如,承载在容器(如panel)中的控件不在表单的
controls
集合中。您的函数还缺少
上下文菜单
等组件,这些组件不在表单的
控件
集合中。函数以相同的方式处理所有控件,而有些控件需要自定义逻辑。要找到更好的解决方案,请看下面的答案:这是胡说八道,applyResources()递归并命中所有子控件。