现在开发多语言的软件方法比较多,使用资源或自定义的XMl文件来存储菜单字符串信息都是比较好的形式。现在我就来分享一下,我最近在做多语言开发的一些经验。
对于Winfrom程序开发中,如果当前打开多个窗口,就关系到在选中语言变化时,怎样来通知所有窗口语言已经变化,应该重新刷新界面。
我在实践采取思路是,让所有打开的窗体都去语言管理服务注册一个事件,当界面语言变化时,由语言管理来进行通知所有窗体,下面给出语言管理的帮助类:
public class LanguageHelper
{
static LanguageHelper()
{
}
// ReSharper disable InconsistentNaming
private static event EventHandler<LanguageChangedEventArgs> _languageChanged;
// ReSharper restore InconsistentNaming
public 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中注销事件,这样只要继承此窗体的子类,都很好的实现了语言修改时通知,每个子窗体只要简单的实现一个虚拟方法就可以了。
下次说一下,怎样使用资源文件来进行资源加载
多语言资源工具(vs2005 、2008、2010插件)下载: