基于WinForm的多语言软件开发

      现在开发多语言的软件方法比较多,使用资源或自定义的XMl文件来存储菜单字符串信息都是比较好的形式。现在我就来分享一下,我最近在做多语言开发的一些经验。

对于Winform程序开发中,如果当前打开多个窗口,就关系到在选中语言变化时,怎样来通知所有窗口语言已经变化,应该重新刷新界面。

     我在实践采取思路是,让所有打开的窗体都去语言管理服务注册一个事件,当界面语言变化时,由语言管理来进行通知所有窗体,下面给出语言管理的帮助类:

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插件)下载:

多语言制作工具之VS插件(2010-07-07更新)

Bookmark and Share
原文地址:https://www.cnblogs.com/LifelongLearning/p/1773201.html