在VS中做了一个winform程序,现在准备添加多语系,问了度娘,使用了ResourceManager,可以实现制作不同语言的界面,但是出现两个问题,弄了很久没有解决。
问题一:本人在属性中切换language到英语,然后将界面上面的label的text属性修改成对应的英语,原因是中文比较简洁,label的长度很短,英文比较长,中文界面中的位置根本不能完整的显示出来,所以本人调整了label的大小和位置。但是,在运行时候,发现英文语系下的lablel显示的位置和大小都没有发生改变,还是按照中文语序下的位置和大小,为什么?可以实现改变吗?
问题二:在没有做语系切换和修改language属性时候,form的size属性是1366*768,也是适合本人屏幕的分辨率。当本人为了做多语系,在form的属性中切换language到英语后,出现了form的size属性自动更改的情况,自动改变成为1362*742,这也是本人第一次遇到这样的情况。并且,本人再次手动修改为1366*768之后,只要进行language切换,form的size就会自动改变。
功力比较菜,本人解决不了,希望大家帮忙,稍微详细点!
问题一:本人在属性中切换language到英语,然后将界面上面的label的text属性修改成对应的英语,原因是中文比较简洁,label的长度很短,英文比较长,中文界面中的位置根本不能完整的显示出来,所以本人调整了label的大小和位置。但是,在运行时候,发现英文语系下的lablel显示的位置和大小都没有发生改变,还是按照中文语序下的位置和大小,为什么?可以实现改变吗?
问题二:在没有做语系切换和修改language属性时候,form的size属性是1366*768,也是适合本人屏幕的分辨率。当本人为了做多语系,在form的属性中切换language到英语后,出现了form的size属性自动更改的情况,自动改变成为1362*742,这也是本人第一次遇到这样的情况。并且,本人再次手动修改为1366*768之后,只要进行language切换,form的size就会自动改变。
功力比较菜,本人解决不了,希望大家帮忙,稍微详细点!
解决方案
30
你这是通过代码手动绑定,.Net中只有特殊情况才用
本人上面说的,只需要通过界面设计器来设置完成
唯一可能需要写代码的地方,就是代码中切换语言(其实就是切换前台线程的UI CultureInfo到相应的语言)
例如,可以在Program.cs中加个静态属性
/// <summary>
/// 获取或设置程序的UI线程为指定的语言文化
/// </summary>
public static Language Language
{
get
{
return _language;
}
set
{
_language = value;
var cultureName = _language.ToString().Replace(“_”, “-“);
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(cultureName);
}
}
public enum Language
{
zh_CN = 0,
en_US = 1
}
//切换语言,通常放在主窗口显示之前
Program.Language = Language.en_US;
要在运行的过程中随时切换,有些复杂控件可能要写点代码来适配
本人上面说的,只需要通过界面设计器来设置完成
唯一可能需要写代码的地方,就是代码中切换语言(其实就是切换前台线程的UI CultureInfo到相应的语言)
例如,可以在Program.cs中加个静态属性
/// <summary>
/// 获取或设置程序的UI线程为指定的语言文化
/// </summary>
public static Language Language
{
get
{
return _language;
}
set
{
_language = value;
var cultureName = _language.ToString().Replace(“_”, “-“);
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(cultureName);
}
}
public enum Language
{
zh_CN = 0,
en_US = 1
}
//切换语言,通常放在主窗口显示之前
Program.Language = Language.en_US;
要在运行的过程中随时切换,有些复杂控件可能要写点代码来适配
30
/// <summary> /// 动态加载资源文件 /// </summary> /// <param name="form"></param> public static ComponentResourceManager ApplyResource(this Form form) { var resources = new System.ComponentModel.ComponentResourceManager(form.GetType()); form.SuspendLayout(); resources.ApplyResources(form, "$this"); ApplyChildrenResources(resources, form); //主菜单 if (form.MainMenuStrip != null) { form.MainMenuStrip.ApplyMenuItemsResources(resources); } //右键菜单 if (form.ContextMenuStrip != null) { form.ContextMenuStrip.ApplyMenuItemsResources(resources); } form.ResumeLayout(); return resources; } public static void ApplyChildrenResources(ComponentResourceManager resources, Control parent) { foreach (Control ctrl in parent.Controls) { if (ctrl is UserControl) { //加载用户控件的资源 ctrl.SuspendLayout(); var ucResources = new System.ComponentModel.ComponentResourceManager(ctrl.GetType()); ucResources.ApplyResources(ctrl, "$this"); ApplyChildrenResources(ucResources, ctrl); ctrl.ResumeLayout(); } else { var menu = ctrl as ToolStrip; if (menu != null) { menu.ApplyMenuItemsResources(resources); } else { var dgv = ctrl as DataGridView; if (dgv != null) { foreach (DataGridViewColumn col in dgv.Columns) { resources.ApplyResources(col, col.Name); } } else { var combox = ctrl as ComboBox; if (combox != null && combox.Items.Count != 0) { combox.Items[0] = Resources.DefaultSelectedItem; } } } } resources.ApplyResources(ctrl, ctrl.Name); ApplyChildrenResources(resources, ctrl); } } public static void ApplyMenuItemsResources(this ToolStrip menu, ComponentResourceManager resources) { foreach (ToolStripItem item in menu.Items) { resources.ApplyResources(item, item.Name); var dropDownItem = item as ToolStripDropDownItem; if (dropDownItem != null) { dropDownItem.ApplyDropDownItemsResources(resources); } } } static void ApplyDropDownItemsResources(this ToolStripDropDownItem parentItem, ComponentResourceManager resources) { if (parentItem.HasDropDownItems) { foreach (ToolStripDropDownItem subItem in parentItem.DropDownItems) { resources.ApplyResources(subItem, subItem.Name); subItem.ApplyDropDownItemsResources(resources); } } }
上面考虑了用户控件和常用的控件,基本够用了。最好是在Form抽象层加两个事件
Program.Language = Language.en_US;
foreach(var form in Application.OpenForms)
{
form.OnLanguageChanging(form, EventArgs.Empty);
form.ApplyResource();
form.OnLanguageChanged(form, EventArgs.Empty);
}
这样就可以了