2011-10-04 106 views
0

我有一个Windows窗体应用程序项目,并在主窗体上我有一个菜单条。在这个菜单条中的一些地方可以选择各种语言。例如,如果用户选择“英语”,则该主表单上的所有内容(以及未来的其他内容)都应该变成英语。切换语言(的CultureInfo /全球化)不影响ToolStripMenuItems

我把这个教程: click

这正常工作与唱片公司等,但它不与工具条菜单项,在所有的工作。他们只是保留他们的默认文本。

我试图两行添加到ChangeLanguage方法:

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

但它失败,并说:

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

不知道如何进行 - 知道的任何帮助。

回答

2

您必须删除在你的foreach循环的最后2行。 该行表示您正在寻找System.Windows.Forms.ToolStripMenuItem.resx文件中的本地化信息,但您希望查看您的Forms资源文件。

ToolstripMenuItems被添加到ToolStripItems DropDownItems集合,而不是你的窗体的控件集合。这可能会帮助你解决你的问题。

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

    foreach (ToolStripItem item in toolStrip1.Items) { 
     if (item is ToolStripDropDownItem) 
      foreach (ToolStripItem dropDownItem in ((ToolStripDropDownItem)item).DropDownItems) { 
       resources.ApplyResources(dropDownItem, dropDownItem.Name, new CultureInfo(lang)); 
      } 
    } 
} 

如果进一步下拉的项目,你应该考虑一个递归方法。

编辑:我的第一个评论

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

ChangeLanguage(toolStrip1.Items); }

private void ChangeLanguage(ToolStripItemCollection collection) { 
    foreach (ToolStripItem item in collection) { 
     resources.ApplyResources(item, item.Name, new CultureInfo(lang)); 
     if (item is ToolStripDropDownItem) 
      ChangeLanguage(((ToolStripDropDownItem)item).DropDownItems); 
    } 
} 
+0

谢谢,这是有效的。这只会改变菜单栏中下拉项目的语言,而不是菜单条的“标题”,或者如果我在第一个下拉菜单中有一个额外的下拉菜单。 – eightx2

+0

这就是我所说的[递归方法](http://www.dotnetperls.com/recursion)。在我的编辑中调用该方法,而不是第二个foreach循环。这将确保您的菜单结构的所有图层都用于本地化。 – dwonisch

+0

谢谢,我设法使用你的代码,所以它为我工作。 – eightx2