• C#多语言实现(三)


    C# Winform项目多语言实现(支持简/繁/英三种语言)


    有很多种方案实现多语言,我在这里介绍一种最简单最容易理解的,作为教学材题应该从通俗易懂入手。在写这篇文章之前,本来想用枚举窗体对象成员的方式设置语言,但是找不到源代码了,不知存到那个电脑上了。因此用另一种方式实现,如找到了再分享给大家。

    关于多语言处理,本人尝试过以下几种方案:

    1. 使用Form窗体自带的多语言处理。设置Form的Language属性,选择一种语言会自动生成.resx文件。
        但是最大的缺点是不易维护,每个语言对应一个resx文件,第个窗体对应至少5个文件!如项目大窗体
        数量多会生成数以千计的resx文件!vss控制也成问题。另一个缺点是当界面增加控件时要刷新resx
        文件。给我的印象是处理复杂,维护困难,是一次痛苦的尝试!

    2. 使用二维数组存储多语言数据。在用Delphi开发过一个项目,当时用二维数组存储多语言数据。
        枚举窗体内所有控件,使用控件名称获取语言数据。

    3. 使用XML存储多语言数据。抽象出一个接口用于设置语言。以下介绍这种方案:

    支持多语言的接口定义:

        /// <summary>

        /// 支持多语言的接口

        /// </summary>

        public interface ILanguageSupport

        {

            /// <summary>

            /// 语言编号

            /// </summary>

            string LanguageISID { get; set; }

     

            /// <summary>

            /// 设置语言

            /// </summary>

            /// <param name="language"></param>

            void SetLanguage(string language);

            void SetLanguage();

     

            /// <summary>

            /// 设置语言标记。用于自动设置语言

            /// </summary>

            void SetLanguageTag();

        }


    http://www.csframework.com/ 版权所有



    定义窗体基类,实现ILanguageSupport接口


     public partial class frmBase : XtraForm, ILanguageSupport

        {

            protected string _LanguageISID;

     

            public frmBase()

            {

                InitializeComponent();

            }

           

            private void frmBase_Load(object sender, EventArgs e)

            {

                this.SetLanguage();

            }

     

            #region ILanguageSupport 成员

            public string LanguageISID { get { return _LanguageISID; } set { _LanguageISID = value; } }

            public virtual void SetLanguage(string language) { }

            public virtual void SetLanguage() { }

            public virtual void SetLanguageTag() { }

            #endregion      

        }

     


    http://www.csframework.com/ 版权所有


    主窗体部分代码


     /// <summary>

            /// 设置语言按钮事件

            /// </summary>

            private void OnSetLanguage_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)

            {

                LanguageType type = (LanguageType)int.Parse(e.Item.Tag.ToString());

                LanguageProvider.CurrentLanguageType = type;

                this.DoSetLanguage();

            }

     

            /// <summary>

            /// 重新设置所有打开窗体的语言。

            /// </summary>

           private void DoSetLanguage()

            {

                foreach (Form form in Application.OpenForms)

                    if (form is ILanguageSupport) (form as ILanguageSupport).SetLanguage();

            }

     

            /// <summary>

            /// 设置主窗体的多语言

            /// </summary>

            public override void SetLanguage()

            {

                base.SetLanguage();

     

                this.Text = LanguageProvider.GetLanguage(LanguageProvider.CurrentLanguageType, "frmMain");

                btnChild1.Caption = LanguageProvider.GetLanguage(LanguageProvider.CurrentLanguageType,
    "frmMain.btnChild1");

                btnChild2.Caption = LanguageProvider.GetLanguage(LanguageProvider.CurrentLanguageType,
    "frmMain.btnChild2");

                btnAbout.Caption = LanguageProvider.GetLanguage(LanguageProvider.CurrentLanguageType,
    "frmMain.btnAbout");

                btnLanguage.Caption = LanguageProvider.GetLanguage(LanguageProvider.CurrentLanguageType,
    "frmMain.btnLanguage");

                btnUser.Caption = LanguageProvider.GetLanguage(LanguageProvider.CurrentLanguageType,
    "frmMain.btnUser"
    );          

            } 

    http://www.csframework.com/ 版权所有


    语言定义:


    <?xml version="1.0" encoding="utf-8" ?>

    <LanguageLibrary>

     

     <lan ISID="frmMain" ENG="C# Multi-Language Implement (http://www.csframework.com/)"

           CHN_T="C#實現多語言 (WWW.CSFRAMEWORK.COM C/S框架)"

           CHN_S="C#实现多语言 (WWW.CSFRAMEWORK.COM C/S框架)">

     </lan>

     

     <lan ISID="frmMain.btnChild1" ENG="Open Child1 Form" CHN_T="子表單1" CHN_S="子窗体1"></lan>

     <lan ISID="frmMain.btnChild2" ENG="Open Child2 Form" CHN_T="子表單2" CHN_S="子窗体2"></lan>

     <lan ISID="frmMain.btnAbout" ENG="About Us" CHN_T="關於我們" CHN_S="关于我们"></lan>

     <lan ISID="frmMain.btnLanguage" ENG="Select Language" CHN_T="選擇語言" CHN_S="选择语言"></lan>

     <lan ISID="frmMain.btnUser" ENG="Current User" CHN_T="當前用戶" CHN_S="当前用户"></lan>

     

     <lan ISID="frmChild1" ENG="Child Form One" CHN_T="子表單1" CHN_S="子窗体1"></lan>

     <lan ISID="frmChild2" ENG="Child Form Two" CHN_T="子表單2" CHN_S="子窗体2"></lan>

     <lan ISID="gridColumn1" ENG="User Name" CHN_T="姓名" CHN_S="姓名"></lan>

     <lan ISID="gridColumn2" ENG="Tel No." CHN_T="電話" CHN_S="电话"></lan>

     <lan ISID="gridColumn3" ENG="Address" CHN_T="地址" CHN_S="地址"></lan>

     

     <lan ISID="about" ENG="Open About Us Form" CHN_T="打開關於我們表單" CHN_S="打开关于我们窗体"></lan>

     <lan ISID="csframework"

           ENG="http://www.csframework.com/ will become more and more wonderful with you are surpport.

           let’s made a happy family together hand in hand. "

          

           CHN_T="C/S框架網在您的支持下會建設更美好,讓我們攜起手來共同打造一個快樂家園.

           感謝您使用C/S框架網,有任何意見或建議請留言!"

          

           CHN_S="C/S框架網在您的支持下会建设更美好,让我们携起手来共同打造一个快乐家园.

           感谢您使用C/S框架網,有任何意见或建议请留言!">

     </lan>

     

    </LanguageLibrary>


    程序截图

    英文版:

    贴图图片

    简体中文:

    贴图图片

    繁体中文:

    贴图图片


    Source code for VIP:

    点击下载附件 (VIP会员下载) 点击下载附件 (如下载失败,请邮件通知我们寄回给您,或QQ:23404761留言.)
  • 相关阅读:
    谷歌浏览器最新版下载链接
    第二章 算法——程序的灵魂
    第一章:程序设计和C语言
    C语言程序设计·谭浩强(第四版)第二章课后习题的答案,算法——程序的灵魂
    面向对象之类的其他方法
    面向对象之反射、包装、(定制)
    PyCharm使用秘籍视频
    re模块(详解正则)
    ATM购物车程序项目规范(更新到高级版)
    音乐脚本
  • 原文地址:https://www.cnblogs.com/Mayvar/p/wanghonghua201209192303.html
Copyright © 2020-2023  润新知