现在开发多语言的软件方法比较多,使用资源或自定义的XMl文件来存储菜单字符串信息都是比较好的形式。现在我就来分享一下,我最近在做多语言开发的一些经验。
对于Winform程序开发中,如果当前打开多个窗口,就关系到在选中语言变化时,怎样来通知所有窗口语言已经变化,应该重新刷新界面。
我在实践采取思路是,让所有打开的窗体都去语言管理服务注册一个事件,当界面语言变化时,由语言管理来进行通知所有窗体,下面给出语言管理的帮助类:
public class LanguageHelper
{ static LanguageHelper() { }
// ReSharper disable InconsistentNamingprivate static event EventHandler<LanguageChangedEventArgs> _languageChanged;
// ReSharper restore InconsistentNamingpublic static event EventHandler<LanguageChangedEventArgs> LanguageChanged
{ add { _languageChanged += value;}
remove { _languageChanged -= value;}
}
public static void ChangeLanguage(string oldLanguage, string newLanguage)
{if (string.IsNullOrEmpty(newLanguage))
{ return;}
if (string.Compare(oldLanguage, newLanguage, true) == 0)
{ return;}
try {Properties.Resources.Culture = new CultureInfo(newLanguage);
}
catch (Exception)
{ return;}
var languageChanged = _languageChanged;if (languageChanged != null)
{languageChanged(null, new LanguageChangedEventArgs(oldLanguage, newLanguage));
}
}
}
这个是一个静态类,让所有打开的窗体都来注册这个语言改变的事件(LanguageChanged),当有窗体要修改语言要求时,就调用静态方法
“public static void ChangeLanguage(string oldLanguage, string newLanguage)”。但如果在新建立窗体时,都去注册这个事件也是比较麻烦的,另外还要在窗体关闭时注销这个事件。在实际我是使用窗体基类的方式来实现事件的自动注册和注销,窗体基本的代码如下:
public class FormBase : Form
{protected override void OnLoad(EventArgs e)
{ base.OnLoad(e); if (!DesignMode) {this.Icon = Properties.Resources.MainIcon;
LanguageHelper.LanguageChanged += LanguageHelper_LanguageChanged;LanguageHelper_LanguageChanged(null, null);
}
}
void LanguageHelper_LanguageChanged(object sender, LanguageChangedEventArgs e)
{ if (!DesignMode) {//加载刷新窗体的代码,这里可以调用一个虚拟方法,让子类来处理刷新
}
}
protected override void OnClosed(EventArgs e)
{ if (!DesignMode) { LanguageHelper.LanguageChanged -= LanguageHelper_LanguageChanged;}
base.OnClosed(e);}
}
为了简化这个操作,在上面基类中,在onload中注册事件,在onclosed中注销事件,这样只要继承此窗体的子类,都很好的实现了语言修改时通知,每个子窗体只要简单的实现一个虚拟方法就可以了。
浙公网安备 33010602011771号