C#如何开发多语言支持的Winform程序

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>

 


程序截图
英文版:


简体中文:


繁体中文:

 

 

 

 

 

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/acetaohai123/p/6625722.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/253021.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Alpha 冲刺 (2/10)

Alpha 冲刺 &#xff08;2/10&#xff09; 队名&#xff1a;第三视角 组长博客链接 本次作业链接 团队部分 团队燃尽图 工作情况汇报 张扬&#xff08;组长&#xff09; 过去两天完成了哪些任务&#xff1a; 文字/口头描述&#xff1a; 1、学习qqbot库&#xff1b; 2、实时保存…

Linux学习之第二课时--linux命令格式及命令概述

命令概述 Linux提供了大量的命令&#xff0c;利用它可以有效地完成大量的工作&#xff0c;如磁盘管理&#xff0c;文件存取&#xff0c;目录操作&#xff0c;进程管理&#xff0c;文件权限设定等 Linux命令格式 Linux命令的组成部分&#xff1a;命令字 命令选项参数&#xff…

Linux C语言调用C++动态链接库

Linux C语言调用C动态链接库 标签&#xff1a; C调用C库 2014-03-10 22:56 3744人阅读 评论(0) 收藏 举报 分类&#xff1a; 【Linux应用开发】&#xff08;48&#xff09; 版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 如果你有一个c做的动态…

Android实践 -- 对apk进行系统签名

对apk进行系统签名 签名工具 网盘下载 &#xff0c;需要Android系统的签名的文件platform.x509.pem 和 platform.pk8 这个两个文件在Android源码中的 ./build/target/product/security 目录下 具体的使用方法&#xff1a; java -jar signapk.jar platform.x509.pem platform.…

Java编写基于netty的RPC框架

一 简单概念RPC: ( Remote Procedure Call),远程调用过程,是通过网络调用远程计算机的进程中某个方法,从而获取到想要的数据,过程如同调用本地的方法一样.阻塞IO :当阻塞I/O在调用InputStream.read()方法是阻塞的,一直等到数据到来时才返回,同样ServerSocket.accept()方法时,也…

linux下c和c++互相调用

c调用cpp 创建个目录 创建4个文件 c.c--c文件 cpp.cpp--c文件 cpp.hh--c声明文件 Makefile c.c [javascript] view plaincopy#include "cpp.hh" int main() { cpp_fun(); } cpp.cpp [cpp] view plaincopy#include "cpp.hh" #include <stdi…

Applications Manager Docker监控

Docker 是一个流行的开源容器应用程序&#xff0c;允许您将应用程序、应用程序的内部依赖和关联库打包到一个单元中。Docker 的主要优点在于单台机器上的多个 docker 容器共享同一操作系统内核&#xff0c;这可以帮助提升性能和节省大量内存。监控 docker 容器会很困难&#xf…

find

Linux中find常见用法示例 find path -option [ -print ] [ -exec -ok command ] {} \; find命令的参数&#xff1b; pathname: find命令所查找的目录路径。例如用.来表示当前目录&#xff0c;用/来表示系统根目录。-print&#xff1a; find命令将匹配的文件输出…

PHP将多个文件中的内容合并为新的文件

function test(){$hostdir iconv("utf-8","gbk","C:\Users\原万里\Desktop\日常笔记") ; //iconv()转换编码方式&#xff0c;将UTF-8转换为gbk&#xff0c;若是报错在gbk后加//IGNORE$filesnames scandir($hostdir); …

HTTP Live Streaming直播(iOS直播)技术分析与实现

不经意间发现&#xff0c;大半年没写博客了&#xff0c;自觉汗颜。实则2012后半年&#xff0c;家中的事一样接着一样发生&#xff0c;实在是没有时间。快过年了&#xff0c;总算忙里偷闲&#xff0c;把最近的一些技术成果&#xff0c;总结成了文章&#xff0c;与大家分享。 前些…

中文论文格式【杂】

转自知乎&#xff0c;https://www.zhihu.com/question/23791742/answer/344752056 【纸张】毕业论文一律打印&#xff0c;采取A4纸张&#xff0c;页边距一律采取&#xff1a;上、下2.5cm&#xff0c;左3cm,右1.5cm&#xff0c;行间距取多倍行距(设置值为1.25);字符间距为默认值…

jmeter 非gui 模式跑jmx

D:\study\apache-jmeter-3.0\bin>jmeter -n -t D:\study\apache-jmeter-3.0\基金排行.jmx -l D:\study\apache-jmeter-3.0\result_log\获取基金排行.jtl D:\study\apache-jmeter-3.2\bin>jmeter -n -t D:\study\apache-jmeter-3.2\bin\examples\test\百度新闻首页.jmx -l…

noip模拟赛 遭遇

分析&#xff1a;暴力挺好打的&#xff0c;对于前30%的数据神搜&#xff0c;hi相同的数据将所有的建筑按照c从小到大排序&#xff0c;看最多能跳多少,ci0的数据将所有的建筑按照h从小到大排序&#xff0c;枚举起点和终点&#xff0c;看能否跳这么多,取个max就可以了.这样70分就…

揭开全景相机创业真相:国外一开源国内就自主

今年以来全景相机有了一个大爆发&#xff0c;国外Google、三星、诺基亚等大厂都进入了这个领域&#xff0c;国内也有很多厂商推出了全景相机。 Bubl全景相机国外一开源&#xff0c;国内就自主。这在VR&#xff08;虚拟现实&#xff09;领域体现的淋漓尽致——Google的Cardborad…

福大软工1816 · 团队现场编程实战(抽奖系统)

值得一看的补充版本演示视频 软工锦鲤在这里程序版本链接及说明 按时提交版本 以基础功能为主github链接&#xff1a;first version测试环境说明 本程序在python 3.6以上环境下运行操作说明&#xff1a; 键入抽奖关键词&#xff0c;支持&#xff1a;#我要红包#或“我要换组“或…

LeakCanary——直白的展现Android中的内存泄露

之前碰到的OOM问题&#xff0c;终于很直白的呈现在我的眼前&#xff1a;我尝试了MAT&#xff0c;但是发现不怎么会用。直到今天终于发现了这个新工具&#xff1a; 当我们的App中存在内存泄露时会在通知栏弹出通知&#xff1a; 当点击该通知时&#xff0c;会跳转到具体的页面&am…

老司机做VR视频,需要什么样的全景相机?

做为一个在全景内容领域摸爬滚打一年有余的老司机&#xff0c;经历了太多的坑。最近有不少朋友转行进入这个领域&#xff0c;问我买什么样的相机好。我现在项目太多&#xff0c;根本没空详尽解答。所以写下这篇文章&#xff0c;不懂得自己看吧。 说白了&#xff0c;买什么样子…

域乎曹胜虎:传统互联网“生病”了

11月17日&#xff0c;2018&#xff08;第12届&#xff09;创业周暨全球创业周中国站在上海盛大召开&#xff0c;由上海域乎信息技术有限公司&#xff08;以下简称“域乎”&#xff09;承办的区块链专场论坛——《区块链产业应用赋能精英论坛》成功举办&#xff0c;吸引了众多业…

xml的方式配置AOP:Aspect Oriented Programming

在某些类中, 什么时机, 做什么事情 切入点(point-cut): 在某些类中(Class<?>[] itfc new Class<?>[] { IStudentService.class }) 通知: 什么时机, 做什么事情(InvocationHandler的invoke方法) 切面: 切入点 通知 织入(weaver): Proxy.newProxyInstance: 把切入…

[No0000112]ComputerInfo,C#获取计算机信息(cpu使用率,内存占用率,硬盘,网络信息)...

github地址&#xff1a;https://github.com/charygao/SmsComputerMonitor 软件用于实时监控当前系统资源等情况&#xff0c;并调用接口&#xff0c;当资源被超额占用时&#xff0c;发送警报到个人手机&#xff1b;界面模拟Console的显示方式&#xff0c;信息缓冲大小由配置决定…