2014-01-11 67 views
2

我想更改语言,但编译时会弹出一个异常。它说在C#winform运行时更改语言

“找不到适合指定区域性或 中性文化的任何资源。确保‘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)); 
     } 
    } 

有什么建议?

+0

在comboBox1_SelectedIndexChanged中放入Console.Writeline(comboBox1.SelectedItem.ToString());所以你可以看到错误 – Tinwor

+0

男人这是要解决什么...... – franzp

+0

我知道,但我想知道,如果在窗体中调用comboBox1_SelectedIndexChanged – Tinwor

回答

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

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

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

private static void ChangeLanguage(string 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功能。在他们使用您的程序时,实际上没有人改变他们的母语。

+0

非常感谢!它的工作。如果我可能问你,最好的方法是改变语言。 – franzp

+0

如果它在工作,那么我给你最可取的方法。如果不是,那么我会假装我不知道是谁写的这段代码,并说你最好假设用户的默认文化已经与他的语言相匹配了。开玩笑,我不能保证它可以在任何地方工作在世界上。它应该,没有那样测试。有一天,我会弄清楚中立文化是如何运作的,那一天还没有结束。 –

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

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

+0

怎么做我做到了吗? – franzp

+0

怎么做? – Mayank

+0

我得到了德文版的resx文件,英文版默认是usid。对不起,新手我没有得到这个文化课很多。只是想知道为什么我的代码不工作... – franzp