基于WinForm的多语言软件开发

本文介绍了在WinForm程序开发中实现多语言切换的方法。通过创建一个静态的语言管理类,让窗体注册和注销语言变化事件,简化了多窗口语言更新的处理。在窗体基类中自动完成事件注册和注销,子窗体只需实现简单的虚拟方法即可响应语言变更。文章还预告了如何使用资源文件加载多语言资源,并提供了多语言资源工具的下载链接。
摘要由CSDN通过智能技术生成

      现在开发多语言的软件方法比较多,使用资源或自定义的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更新)

<script type="text/javascript">var addthis_pub="scottisafool";</script> Bookmark and Share<script type="text/javascript" src="http://s7.addthis.com/js/200/addthis_widget.js"></script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值