winForm 国际化的简单实现

来源:未知 责任编辑:智问网络 发表时间:2013-11-08 08:46 点击:

国际化就是要实现多语种的界面切换。首先,我们不可能用if else等语句来根据选择的不同语种对所有的控件一个一个的设值,这样太麻烦了。.Net提供了国际化相关的支持,主要放在System.Globalization命名空间下。下面是一个简单的实现,麻雀虽小,五脏俱全。
这个程序是最近写的一个程序,就在这基础上进行改造,关键是弄懂原理。
1> 首先要加入Resource文件
在VS工程-->添加新项目里加入三个resource文件,Resource文件的作用就是存放我们的界面控件的显示字符串。这里我们要实现3种语言的切换,所有加入了3个,分别命名为:Resource.en-US.resx,Resource.zh-CN.resx,Resource.ja-JP.resx。注意命名规则第一部分要相同,第二部分是不同语言的culture name,我定义的就是英语,中文,日文。
2> 在这3个文件中定义界面相关的字符串信息。
注意定义的名字在3个文件中要一致,否则找不到。
Resource.en-US.resx
tsmi_language_Name Language
tsmi_japanese_Name Japanese
tsmi_english_Name English
tsmi_close_Name Close
tsmi_chiniese_Name Chinese

Resource.zh-CN.resx
tsmi_language_Name 语言
tsmi_chiniese_Name 中文
tsmi_english_Name 英文
tsmi_japanese_Name 日文
tsmi_close_Name 退出

Resource.ja-JP.resx
tsmi_language_Name 言語
tsmi_chiniese_Name 中国語
tsmi_english_Name 英語
tsmi_japanese_Name 日本語
tsmi_close_Name 閉じる
3> 利用ResourceManager类进行读取。
ResourceManager会根据不同的cultrue来读不同的resource文件,所以,实现的关键就是根据不同的语言来改变当前程序线程的cultrue就可以达到目地。而对于界面控件Text的赋值代码将是不变的,当新增加一种语言是,也就是再加一个resource文件,对代码的改动几乎没有影响。
基本代码:
Resource的读取类


class ResourceCluture 

    /// <summary>  
    /// 设定语言环境  
    /// </summary>  
    /// <param name="strClutrue"></param>  
    public static void SetLocalClutrue(string strClutrue) 
    { 
        if(string.IsNullOrEmpty(strClutrue)) 
        { 
            strClutrue = "zh-CN"; 
        } 
        CultureInfo currentClutrue = new CultureInfo(strClutrue); 
        Thread.CurrentThread.CurrentCulture = currentClutrue; 
    } 
 
    /// <summary>  
    /// 取值  
    /// </summary>  
    /// <param name="id"></param>  
    /// <returns></returns>  
    public static string GetString(string id) 
    { 
        string strValue = string.Empty; 
        try 
        { 
            ResourceManager resManager = new ResourceManager("ApplicationActive.Properties.Resource", Assembly.GetExecutingAssembly()); 
            strValue = resManager.GetString(id, Thread.CurrentThread.CurrentCulture); 
        } 
        catch 
        { 
            strValue = "No id:" + id + "please add"; 
        } 
        return strValue;         
    } 

    class ResourceCluture
    {
        /// <summary>
        /// 设定语言环境
        /// </summary>
        /// <param name="strClutrue"></param>
        public static void SetLocalClutrue(string strClutrue)
        {
            if(string.IsNullOrEmpty(strClutrue))
            {
                strClutrue = "zh-CN";
            }
            CultureInfo currentClutrue = new CultureInfo(strClutrue);
            Thread.CurrentThread.CurrentCulture = currentClutrue;
        }

        /// <summary>
        /// 取值
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public static string GetString(string id)
        {
            string strValue = string.Empty;
            try
            {
                ResourceManager resManager = new ResourceManager("ApplicationActive.Properties.Resource", Assembly.GetExecutingAssembly());
                strValue = resManager.GetString(id, Thread.CurrentThread.CurrentCulture);
            }
            catch
            {
                strValue = "No id:" + id + "please add";
            }
            return strValue;       
        }
    }

设定控件文字的代码:

/// <summary>  
/// 根据不同的语言文化,设定界面控件的文字  
/// </summary>  
/// <param name="strClutrue">"en-US","ch-CN","ja-JP" etc..<</param>  
private void SetFormTextByLanguage(string strClutrue) 

    ResourceCluture.SetLocalClutrue(strClutrue); 
    this.lblPath.Text = ResourceCluture.GetString("lblPath_Name"); 
    this.tsmi_language.Text = ResourceCluture.GetString("tsmi_language_Name"); 
    this.tsmi_chiniese.Text = ResourceCluture.GetString("tsmi_chiniese_Name"); 
    this.tsmi_english.Text = ResourceCluture.GetString("tsmi_english_Name"); 
    this.tsmi_japanese.Text = ResourceCluture.GetString("tsmi_japanese_Name"); 
    this.tsmi_close.Text = ResourceCluture.GetString("tsmi_close_Name"); 
    this.gbx_file.Text = ResourceCluture.GetString("gbx_file_Name"); 
    this.lblPath.Text = ResourceCluture.GetString("lblPath_Name"); 
    this.chkExpire.Text = ResourceCluture.GetString("chkExpire_Name"); 
    this.btn_startPgm.Text = ResourceCluture.GetString("btn_startPgm_Name"); 
    this.lbl_Note.Text = ResourceCluture.GetString("lbl_Note_Name"); 
    this.groupBox_shortcut.Text = ResourceCluture.GetString("groupBox_shortcut_Name"); 
    this.lbl_shortcutName.Text = ResourceCluture.GetString("lbl_shortcutName_Name"); 
    this.btn_CreateIcon.Text = ResourceCluture.GetString("btn_CreateIcon_Name"); 

        /// <summary>
        /// 根据不同的语言文化,设定界面控件的文字
        /// </summary>
        /// <param name="strClutrue">"en-US","ch-CN","ja-JP" etc..<</param>
        private void SetFormTextByLanguage(string strClutrue)
        {
            ResourceCluture.SetLocalClutrue(strClutrue);
            this.lblPath.Text = ResourceCluture.GetString("lblPath_Name");
            this.tsmi_language.Text = ResourceCluture.GetString("tsmi_language_Name");
            this.tsmi_chiniese.Text = ResourceCluture.GetString("tsmi_chiniese_Name");
            this.tsmi_english.Text = ResourceCluture.GetString("tsmi_english_Name");
            this.tsmi_japanese.Text = ResourceCluture.GetString("tsmi_japanese_Name");
            this.tsmi_close.Text = ResourceCluture.GetString("tsmi_close_Name");
            this.gbx_file.Text = ResourceCluture.GetString("gbx_file_Name");
            this.lblPath.Text = ResourceCluture.GetString("lblPath_Name");
            this.chkExpire.Text = ResourceCluture.GetString("chkExpire_Name");
            this.btn_startPgm.Text = ResourceCluture.GetString("btn_startPgm_Name");
            this.lbl_Note.Text = ResourceCluture.GetString("lbl_Note_Name");
            this.groupBox_shortcut.Text = ResourceCluture.GetString("groupBox_shortcut_Name");
            this.lbl_shortcutName.Text = ResourceCluture.GetString("lbl_shortcutName_Name");
            this.btn_CreateIcon.Text = ResourceCluture.GetString("btn_CreateIcon_Name");
        }

4> 基本完成,看看效果图

 \
\
\

摘自 xiashengwang的专栏

    发表评论
    请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
    用户名: 验证码:点击我更换图片
    最新评论 更多>>

    推荐热点

    • 浅析.NET下XML数据访问新机制
    • asp.net 面试+笔试题目第1/2页
    • C# 邮件地址是否合法的验证
    • asp.net 设置GridView的选中行的实现代码
    • C#高级编程:数据库连接[1]
    • 经典C++程序1
    • IIS 自动回收导致后台定时器失效的问题解决
    • ASP.NET&#160;GridView列表代码示例
    • Asp.net MVC源码分析--Action Filter的链式调用
    网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
    Copyright © 2008-2015 计算机技术学习交流网. 版权所有

    豫ICP备11007008号-1