分享两种实现Winform程序的多语言支持的多种解决方案

2019-12-30 16:21:04王旭

因公司业务需要,需要将原有的ERP系统加上支持繁体语言,但不能改变原有的编码方式,即:普通程序员感受不到编码有什么不同。经过我与几个同事的多番沟通,确定了以下两种方案:

方案一:在窗体基类中每次加载并显示窗体时,会自动递归遍历含文本显示的控件(Button,CheckBox,GroupBox,Label,LinkLabel,TextBox,StatusStrip,TabPage,ToolStrip,RadioButton,DateTimePicker,DataGridView,CheckedListBox,TreeView,MenuStrip),并根据不同的控件类型的文本属性调用简繁转换方法进行转换并重新设置新的相应文本属性的内容(比如:繁体内容)

优点:编码简单,对普通程序员的编码无影响(除窗体类的基类由Form类变成MyStyleFormBase类);

缺点:因每次打开窗体都需要遍历控件并进行简繁转换,如果界面上的控件较多,则可能导致打开窗体较慢,影响用户体验,且子控件的文本内容改变时需程序员手动通知,无法自动感知并转换。

具体实现思路如下:

一.对Form类进行二次封装(继承),定义一个MyStyleFormBase类,并在里面加入每次加载并显示窗体类型时,会自动递归遍历含文本显示的控件,并根据不同的控件类型的文本属性调用简繁转换方法进行转换并重新设置新的相应文本属性的内容,这样当所有的窗体都继承MyStyleFormBase类时,均默认就实现了遍历与转换的过程,程序员无需再次编码,甚至都无需知道存在遍历与转换的过程,从而提高了代码的复用性,具体代码如下:


public class MyStyleFormBase : Form

{

 public MyStyleFormBase()

 {

 if (!Thread.CurrentThread.CurrentUICulture.Name.Equals("zh-CHS", StringComparison.OrdinalIgnoreCase)) //如果是简体,则无需转换

 {

 base.TextChanged += MyStyleFormBase_TextChanged;

 base.Shown += MyStyleFormBase_Shown;

 }

 }

 

 private void MyStyleFormBase_TextChanged(object sender, EventArgs e)

 {

 this.Text = LanguageHelper.GetLanguageText(this.Text);

 }

 

 private void MyStyleFormBase_Shown(object sender, EventArgs e)

 {

 LanguageHelper.SetControlLanguageText(this);

 base.ControlAdded += MyStyleFormBase_ControlAdded;

 }

 

 private void MyStyleFormBase_ControlAdded(object sender, ControlEventArgs e)

 {

 LanguageHelper.SetControlLanguageText(e.Control);

 }

 

 /// <summary>

 /// 强制通知子控件改变消息

 /// </summary>

 /// <param name="target"></param>

 protected virtual void PerformChildrenChange(Control target)

 {

 LanguageHelper.SetControlLanguageText(target);

 }

 

 /// <summary>

 /// 弹出消息框

 /// </summary>

 /// <param name="text"></param>

 /// <param name="caption"></param>

 /// <param name="buttons"></param>

 /// <param name="icon"></param>

 /// <param name="defaultButton"></param>

 /// <returns></returns>

 protected DialogResult MessageBoxShow(string text, string caption, MessageBoxButtons buttons = MessageBoxButtons.OK, MessageBoxIcon icon = MessageBoxIcon.None, MessageBoxDefaultButton defaultButton = MessageBoxDefaultButton.Button1)

 {

 return MessageBox.Show(LanguageHelper.GetLanguageText(text), LanguageHelper.GetLanguageText(caption), buttons, icon, defaultButton);

 }

}