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();

}

定义窗体基类,实现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

}
主窗体部分代码

/// <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");

}

语言定义:

<?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="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>

 

程序截图
英文版:

简体中文:

繁体中文:

 

 

 

 

 

 

 

 

 

 

 

 

C#如何开发多语言支持的Winform程序的更多相关文章

  1. SAS进阶《深入解析SAS》之开发多语言支持的SAS程序

    SAS进阶<深入解析SAS>之开发多语言支持的SAS程序 1. 多语言支持的应用程序是指该程序在世界给第使用时,其能够处理的数据,以及处理数据的方式.信息展现的方式都符合当地的语言.文化习 ...

  2. 【C# 开发技巧】 C#中WinForm程序退出方法技巧总结

    C#中WinForm程序退出方法技巧总结 一.关闭窗体 在c#中退出WinForm程序包括有很多方法,如:this.Close(); Application.Exit();Application.Ex ...

  3. 分享两种实现Winform程序的多语言支持的解决方案

    因公司业务需要,需要将原有的ERP系统加上支持繁体语言,但不能改变原有的编码方式,即:普通程序员感受不到编码有什么不同.经过我与几个同事的多番沟通,确定了以下两种方案: 方案一:在窗体基类中每次加载并 ...

  4. 使用efwplusScript开发Winform程序【像小程序那样开发PC软件】

    一.前言 本人从事多年医疗管理软件的开发,在医院大多数的软件都还是CS程序,BS程序很少,对于使用者来说CS的操作体验确实比BS的要好. 1.CS的缺点就是升级麻烦,每次有新版本都需要所有客户端操作升 ...

  5. (视频)《快速创建网站》 3.3 国际化高大上 - WordPress多语言支持

    本文是<快速创建网站>系列的第7篇,如果你还没有看过之前的内容,建议你点击以下目录中的章节先阅读其他内容再回到本文. 访问本系列目录,请点击:http://devopshub.cn/tag ...

  6. ios app名字的多语言支持

    经测试,不同版本的xcode会有操作细节不同,本次环境xcode6.4 1)编辑Info.plist,添加一个新的属性Application has localized display name, 设 ...

  7. 【转】解析JDK 7的动态类型语言支持

    http://www.infoq.com/cn/articles/jdk-dynamically-typed-language Java虚拟机的字节码指令集的数量自从Sun公司的第一款Java虚拟机问 ...

  8. 在VS2010下开发C语言程序

    妈蛋,我发现VS下开发C语言,并不是把文件名改成.C的就行了.VS2010不支持C99.  也就是函数局部变量声明必须放在函数的开头.难怪,我从Linux下移植过来的.c工程怎么是编译错误呢,发现是变 ...

  9. Android &Swift iOS开发:语言与框架对比

    转载自:http://www.infoq.com/cn/articles/from-android-to-swift-ios?utm_campaign=rightbar_v2&utm_sour ...

随机推荐

  1. java规范与标准?

    所谓规范,即指由很多人同时遵守的行为或理论. java的规范并不是指其中一种,而是有很多种,比如java编码规范,java命名规范,java虚拟机规范等等,甚至于一个编码规范都有很多种,不同的公司.组 ...

  2. H5 canvas pc 端米字格 写字板

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. 【原创】如何编写c#用户登陆后用户名在前台显示

    这种肯定是判断session啦!!!!! @{ string username = (string)Session["username"]; user user = new use ...

  4. CAD使用SetxDataLong写数据(com接口)

    主要用到函数说明: MxDrawEntity::SetxDataLong 写一个long扩展数据,详细说明如下: 参数 说明 [in] BSTR val 字符串值 szAppName 扩展数据名称 n ...

  5. Maven常用仓库地址以及手动添加jar包到仓库

    http://www.blogjava.net/fancydeepin 共有的仓库 http://repository.sonatype.org/content/groups/public/http: ...

  6. 字符串匹配算法之BM算法

    BM算法,全称是Boyer-Moore算法,1977年,德克萨斯大学的Robert S. Boyer教授和J Strother Moore教授发明了一种新的字符串匹配算法. BM算法定义了两个规则: ...

  7. 诊断:AWR快照停止自动采集

    11.2.0.4数据库中,MMON进程,有时候由于一些莫名其妙的原因挂掉,接下来AWR的快照也就无法正常自动生成.MMON进程应该自动重启,却并没有自动被启动. 那么我们有可能是遇到了bug Bug ...

  8. 【2018百度之星初赛 B】1001并查集 1004二分 1006不等式

    1001 degree 题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=6380 并查集向图中加点,分别记录与初始度数最多的点 直接相连的点数.独立的点数 ...

  9. [Python3网络爬虫开发实战] 6.1-什么是Ajax

    Ajax,全称为Asynchronous JavaScript and XML,即异步的JavaScript和XML.它不是一门编程语言,而是利用JavaScript在保证页面不被刷新.页面链接不改变 ...

  10. Ubuntu系统搭建django+nginx+uwsgi

    1. 在开发机上的准备工作 2. 在服务器上的准备工作 3.安装uwsgi 4.编写uwsgi配置文件,使用配置文件启动uwsgi 5. 安装nginx 6. 收集静态文件 7. 编写nginx配置文 ...