WinForms本地化。如何更改菜单语言

时间:2018-09-05 06:01:58

标签: c# winforms menu localization listbox

编辑:尽管有用,但“重复”问题并未给出该问题的答案。首先,这里的主题是菜单,因此请不要将此问题标记为不是。

我一直试图正确理解如何本地化应用程序。 现在,我有一个带有标签,菜单和列表框的表单。 我已经对表单进行了本地化,因此现在有了三个resx文件。

我使用Z.R.T. answer实现了列表框,以便在运行时更改语言。我没有使用他实施的ApplyLocalization

 public void ApplyLocalization(CultureInfo ci)
   {
    //button1.Text = Properties.Resources.button;
    ComponentResourceManager componentResourceManager = new ComponentResourceManager(this.GetType());

    foreach (Control c in this.Controls)
      {
       componentResourceManager.ApplyResources(c, c.Name, ci);
       }

    }

这样我就可以成功地翻译标签。

调试过程中,我看到有三个控件:(列表框,标签和菜单)。对于列表框,ApplyResources不执行任何操作。对于标签,它确实会更改标签的语言。问题出在菜单上。当c是menuStrip时,ApplyResources仅将其应用于menuStrip,而不将其应用于需要翻译的菜单选项。 (实际上,由于列表框的内容也未翻译,因此列表框也会发生相同的事情)

我的问题是如何将资源应用于菜单的内部(子菜单),以便菜单内容也得到翻译?

1 个答案:

答案 0 :(得分:2)

您的函数中存在一些问题:

  • 您的函数只是在窗体的直接子控件上循环。它不是检查控件层次结构中的所有控件。例如,在面板之类的容器中托管的控件不在表单的Controls集合中。

  • 您的函数还丢失了ContextMenu形式的集合中未包含的Controls之类的组件。

  • 该函数以相同的方式处理所有控件,而某些控件需要自定义逻辑。该问题不仅限于MenuListBox。您需要针对ComboBoxListBoxListViewTreeViewDataGridViewToolStripContextMenuStrip,{{1 }},MenuStrip以及其他一些我忘记提及的控件。例如,您可以在this post中找到StatusStrip的逻辑。

  

重要提示:我相信将所选区域性保存到设置中,然后关闭   并重新打开表格或整个应用程序并应用文化   在显示表单之前或在Main方法中是一个更好的选择。

无论如何,我在这里分享一个解决方案。请注意,该解决方案不能解决我上面提到的所有问题,但可以解决ComboBoxMenuStrip的问题。

尽管您可以从以下代码中学到新知识,但我认为这只是出于学习目的。通常,我建议您再次阅读重要说明!

步骤1 -查找ToolStripMenuStrip的所有项目:

ToolStrip

步骤2 -创建一种获取所有控件的方法:

using System.Collections.Generic;
using System.Windows.Forms;
public static class ToolStripExtensions
{
    public static IEnumerable<ToolStripItem> AllItems(this ToolStrip toolStrip)
    {
        return toolStrip.Items.Flatten();
    }
    public static IEnumerable<ToolStripItem> Flatten(this ToolStripItemCollection items)
    {
        foreach (ToolStripItem item in items)
        {
            if (item is ToolStripDropDownItem)
                foreach (ToolStripItem subitem in 
                    ((ToolStripDropDownItem)item).DropDownItems.Flatten())
                        yield return subitem;
            yield return item;
        }
    }
}

第3步-创建using System.Collections.Generic; using System.Windows.Forms; public static class ControlExtensions { public static IEnumerable<Control> AllControls(this Control control) { foreach (Control c in control.Controls) { yield return c; foreach (Control child in c.Controls) yield return child; } } } 方法并为不同控件添加逻辑,例如在以下代码中,我为ChangeLanguage添加了逻辑源自MenuStrip

ToolStrip

步骤4 -调用private void ChangeLanguage(string lang) { var rm = new ComponentResourceManager(this.GetType()); var culture = CultureInfo.CreateSpecificCulture(lang); Thread.CurrentThread.CurrentCulture = culture; Thread.CurrentThread.CurrentUICulture = culture; foreach (Control c in this.AllControls()) { if (c is ToolStrip) { var items = ((ToolStrip)c).AllItems().ToList(); foreach (var item in items) rm.ApplyResources(item, item.Name); } rm.ApplyResources(c, c.Name); } } 方法:

ChangeLanguage