zoukankan      html  css  js  c++  java
  • 基于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
  • 相关阅读:
    poj 2406 Power Strings【最小循环节】
    hdoj 2087 剪花布条
    hdoj 1054 Strategic Game【匈牙利算法+最小顶点覆盖】
    hdoj 1151 Air Raid
    hdoj 2502 月之数
    hdoj 1862 EXCEL排序
    hdoj 1200 To and Fro
    hdoj 1150 Machine Schedule【匈牙利算法+最小顶点覆盖】
    hdoj 1068 Girls and Boys【匈牙利算法+最大独立集】
    uva1563
  • 原文地址:https://www.cnblogs.com/LifelongLearning/p/1773201.html
Copyright © 2011-2022 走看看