我是Windows Forms的新手,我正在努力使我的应用程序可以用英语和德语进行本地化,我想在运行时更改语言。到目前为止,我已经能够通过使用.resx文件和以下代码来实现:
//fired when clicking the german MenuItem
private void deutschToolStripMenuItem_Click(object sender, EventArgs e)
{
ChangeLanguage("de-DE");
}
//fired when clicking the english MenuItem
private void englischToolStripMenuItem_Click(object sender, EventArgs e)
{
ChangeLanguage("en-US");
}
private void ChangeLanguage(string lang)
{
Thread.CurrentThread.CurrentUICulture = new
System.Globalization.CultureInfo(lang);
ComponentResourceManager resources = new ComponentResourceManager(typeof(Main0));
resources.ApplyResources(this, "$this");
ApplyResources(resources, this.Controls);
}
private void ApplyResources(ComponentResourceManager resources, Control.ControlCollection ctls)
{
//all controls
foreach (Control ctl in ctls)
{
resources.ApplyResources(ctl, ctl.Name);
ApplyResources(resources, ctl.Controls);
}
//the menu bar and its items
foreach (ToolStripItem item in mst_Main.Items)
{
if (item is ToolStripDropDownItem)
{
resources.ApplyResources(item, item.Name);
foreach (ToolStripItem dropDownItem in ((ToolStripDropDownItem)item).DropDownItems)
{
resources.ApplyResources(dropDownItem, dropDownItem.Name);
}
}
}
}
这适用于主窗体,其菜单栏及其控件(例如按钮,标签)。
但是,它不适用于以后添加到表单的TabControl:
pan_Main.Controls.Clear();
mainTabControl = new MainTabControl(index);
mainTabControl.Dock = DockStyle.Fill;
pan_Main.Controls.Add(mainTabControl);
pan_Main.Controls.Add(tbl_Main);
如果我现在尝试更改语言(通过主窗体上的菜单栏/ MenuStrip),TabControl及其所有基础控件的语言不会更改。如果我更改语言,在将TabControl添加到表单之前(在调用其InitializeComponent() - 方法之前),TabControl将使用正确的语言进行初始化。
因此,更改语言的方法(如上所述)确实会影响TabControl,但不会更新其元素。
是否有一种简单的方法可以在运行时为TabControl及其底层元素切换语言而无需重新创建它?如果是这样,你能告诉我我的代码在哪里错了或我错过了什么。经过几个小时的代码试验后,我仍然找不到解决这个问题的方法......
提前谢谢