ComboBoxes如何将字符串资源用于项目文本?

时间:2018-06-22 11:56:10

标签: c# .net winforms localization

使用C#和WinForms,我可以将表单设置为可本地化的,在其上放置标签,并根据需要使用多种语言为标签设置文本。文本将作为字符串资源存储在每种语言的一个资源文件中。然后,用户可以选择一种语言,并且表单上的所有标签都将更改为正确的语言。

这似乎不适用于组合框。我可以将项目添加到组合框以获取可本地化的表单,并且它们将使用诸如ComboBox1.Item,ComboBox1.Item1和ComboBox1.Item2之类的名称存储在资源文件中,但是当组合框更改时,显示的文本不会更改。

基于将组合框绑定到字典或元组列表上,我已经看到了各种有关如何定位组合框的建议,但是在我看来,如果项目存储在资源字符串中,则应该有一些更自动的使用方式这些资源字符串。有吗?

编辑:这应该是一个最小的示例。表单具有一个文本框,一个按钮,一个标签和一个组合框。标签和组合框均具有法语(fr-FR)和西班牙语(es-ES)的资源。在文本框中输入语言名称,然后该按钮使用以下方法更改表单的语言:

private void ChangeLanguage(string lang)
{
    ComponentResourceManager crm = new ComponentResourceManager(typeof(Form2));
    CultureInfo culture = CultureInfo.CreateSpecificCulture(lang);
    Thread.CurrentThread.CurrentCulture = culture;
    Thread.CurrentThread.CurrentUICulture = culture;

    foreach (Control c in this.Controls)
    {
        crm.ApplyResources(c, c.Name, culture);
    }

}

结果是标签的文本发生了变化,而组合框项目的文本没有发生变化。

1 个答案:

答案 0 :(得分:1)

如果关闭并重新打开表格,一切都会正常。但是,如果您想在不关闭表单的情况下更改区域性,则需要为ComboBox添加额外的处理:

if (c is ComboBox)
{
    var combo = (ComboBox)c;
    var count = combo.Items.Count;
    combo.Items.Clear();
    combo.BeginUpdate();
    for (int i = 0; i < count; i++)
    {
        var number = i == 0 ? "" : $"{i}";
        var item = crm.GetString($"{c.Name}.Items{number}");
        combo.Items.Add(item);
    }
    combo.EndUpdate();
}
crm.ApplyResources(c, c.Name);

还请记住,您的函数只是将资源应用于窗体上的控件,而忽略了嵌套控件。例如,如果某些控件托管在面板上,它将忽略它们。要解决此问题,请查看this post

注意:

通常,我建议重新启动表单以应用新的语言,因为自定义逻辑不限于ComboBox,因此您需要ComboBoxListBox,{{1 }},ListViewTreeViewDataGridViewToolStripContextMenuStripMenuStrip,也许还欺骗了我忘记提及的其他控件。 / p>

简而言之,我相信您正在寻找的是将选定的区域性保存到一个环境中,然后StatusStrip并以Application.Restart()方法应用区域性。