C# 运行时本地化
我已经用C#创建了Windows窗体程序。 我在本地化方面有一些问题。 我有3种语言的资源文件。 我想单击每个语言按钮并在运行时更改语言。 当我在C# 运行时本地化,c#,.net,winforms,localization,C#,.net,Winforms,Localization,我已经用C#创建了Windows窗体程序。 我在本地化方面有一些问题。 我有3种语言的资源文件。 我想单击每个语言按钮并在运行时更改语言。 当我在InitializeComponent()之前更改语言时,它会工作。 但当我点击按钮时,它不起作用。 我正在使用这个代码 private void RussianFlag_Click(object sender, EventArgs e) { Thread.CurrentThread.CurrentUICulture = new Culture
InitializeComponent()
之前更改语言时,它会工作。
但当我点击按钮时,它不起作用。
我正在使用这个代码
private void RussianFlag_Click(object sender, EventArgs e)
{
Thread.CurrentThread.CurrentUICulture = new CultureInfo("ru-RU");
}
更改CurrentUICulture不会自动重新加载资源。您需要手动执行它(http://msdn.microsoft.com/en-us/magazine/cc163609.aspx#S8) 您可以从InitializeComponent()复制与本地化相关的代码 进入另一个功能:
void LoadResources(){
this.Title = MyApp.Resources.MainFormCaption;
this.lblWelcomeMessage.Text = MyApp.Resources.UserWelcome;
}
您需要重新加载控件以反映新的区域性值
ComponentResourceManager resources = new ComponentResourceManager(typeof(Form1));
然后您必须使用resources.ApplyResources
请有一个谢谢Vendetta和其他。。 解决办法是
private void RussianFlag_Click(object sender, EventArgs e)
{
if (currentLanguage != "RUS")
{
Thread.CurrentThread.CurrentUICulture = new CultureInfo("ru-RU");
ChangeLanguage("ru-RU");
}
}
。。。。
....
我编写了一个具有以下特性的
RuntimeLocalizer
类:
- 在表单中更改和更新所有
控件和
子控件的本地化
- 还更改所有菜单项的所有子项的本地化
RuntimeLocalizer.ChangeCulture(MainForm,“en-US”)代码>
公共静态类RuntimeLocalizer
{
公共静态void changecurity(表单frm,字符串cultureCode)
{
CultureInfo culture=CultureInfo.GetCultureInfo(cultureCode);
Thread.CurrentThread.CurrentUICulture=区域性;
ComponentResourceManager资源=新的ComponentResourceManager(frm.GetType());
ApplyResourceControl(资源、frm、文化);
资源。应用资源(frm,“$this”,文化);
}
私有静态void ApplyResourceToControl(ComponentResourceManager资源、控件控件、CultureInfo语言)
{
if(control.GetType()==typeof(MenuStrip))//查看这是否是一个MenuStrip
{
MenuStrip strip=(MenuStrip)控件;
ApplyResourceToToolStripItemCollection(strip.Items、res、lang);
}
foreach(Control.Controls中的控件c)//应用于所有子控件
{
ApplyResourceToControl(res、c、lang);
res.ApplyResources(c,c.名称,lang);
}
//适用于自己
res.ApplyResources(control,control.Name,lang);
}
私有静态无效ApplyResourceToToolStripItemCollection(ToolStripItemCollection列、ComponentResourceManager列、CultureInfo列)
{
for(int i=0;i
您是否也尝试过更改线程。CurrentCulture
呢?您是否尝试过在将线程区域设置为另一种语言后调用刷新()
?我怀疑您是否需要组件资源管理器
,并可能通过循环所有运行良好的控件进行应用!非常感谢。运行时本地化更改的最佳解决方案,非常容易实现!非常有帮助!非常感谢。我尝试了很多方法,只有你的作品谢谢!我也使用这个类。一件有趣的事情是,它可能会改变控件的大小,因为维度也是“可本地化”的,它们的值存储在资源文件中。如果表单在应用此类后变得“跳跃”,则从文件中删除不需要的维度值。下面是一个递归解决方案:private void ChangeLanguage(Control ctl,string lang){ComponentResourceManager resources=new ComponentResourceManager(typeof(Form1));resources.ApplyResources(ctl,ctl.Name,new CultureInfo(lang));foreach(ctl.Controls中的控件c)ChangeLanguage(c,lang);}虽然是一个很好的入门教程,但它为一些问题打开了大门
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));
if (c.ToString().StartsWith("System.Windows.Forms.GroupBox"))
{
foreach (Control child in c.Controls)
{
ComponentResourceManager resources_child = new ComponentResourceManager(typeof(Form1));
resources_child.ApplyResources(child, child.Name, new CultureInfo(lang));
}
}
}
}
using System.Windows.Forms;
using System.Globalization;
using System.Threading;
using System.ComponentModel;
public static class RuntimeLocalizer
{
public static void ChangeCulture(Form frm, string cultureCode)
{
CultureInfo culture = CultureInfo.GetCultureInfo(cultureCode);
Thread.CurrentThread.CurrentUICulture = culture;
ComponentResourceManager resources = new ComponentResourceManager(frm.GetType());
ApplyResourceToControl(resources, frm, culture);
resources.ApplyResources(frm, "$this", culture);
}
private static void ApplyResourceToControl(ComponentResourceManager res, Control control, CultureInfo lang)
{
if (control.GetType() == typeof(MenuStrip)) // See if this is a menuStrip
{
MenuStrip strip = (MenuStrip)control;
ApplyResourceToToolStripItemCollection(strip.Items, res, lang);
}
foreach (Control c in control.Controls) // Apply to all sub-controls
{
ApplyResourceToControl(res, c, lang);
res.ApplyResources(c, c.Name, lang);
}
// Apply to self
res.ApplyResources(control, control.Name, lang);
}
private static void ApplyResourceToToolStripItemCollection(ToolStripItemCollection col, ComponentResourceManager res, CultureInfo lang)
{
for (int i = 0; i < col.Count; i++) // Apply to all sub items
{
ToolStripItem item = (ToolStripMenuItem)col[i];
if (item.GetType() == typeof(ToolStripMenuItem))
{
ToolStripMenuItem menuitem = (ToolStripMenuItem)item;
ApplyResourceToToolStripItemCollection(menuitem.DropDownItems, res, lang);
}
res.ApplyResources(item, item.Name, lang);
}
}
}