使用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);
}
}
结果是标签的文本发生了变化,而组合框项目的文本没有发生变化。
答案 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
,因此您需要ComboBox
,ListBox
,{{1 }},ListView
,TreeView
,DataGridView
,ToolStrip
,ContextMenuStrip
,MenuStrip
,也许还欺骗了我忘记提及的其他控件。 / p>
简而言之,我相信您正在寻找的是将选定的区域性保存到一个环境中,然后StatusStrip
并以Application.Restart()
方法应用区域性。