博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Winform中多国语言窗体的设计以及.NET中资源文件的使用
阅读量:4116 次
发布时间:2019-05-25

本文共 4830 字,大约阅读时间需要 16 分钟。

最近在做一些多国语言的软件,就学习了一下.NET中的多国语言相应知识,受益不少,下面我就简单介绍一下winform中关于多国语言的实现方法。分为七个部分来讲:
资源文件概述
资源文件的分类
资源文件的创建、利用
IDE
来制作多国语言版本、利用资源文件来做多国语言版本、常用
.NET
资源文件生成器的使用
总结这七个部分。前两个部分都是一些理论性的东西,如果大家不感兴趣可以跳过,直接看三、四、五这三个部分。
 
第一部分:资源文件概述
    资源文件顾名思义就是存放资源的文件。资源文件在程序设计中有着自身独特的优势,他独立于源程序,这样资源文件就可以被多个程序使用。同时在程序设计的时候,有时出于安全或者其它方面因素的考虑,把重要东西存放在资源文件中,也可以达到保密、安全的效果。
    资源文件中一般存三种类型的数据:byte流(byte[])、对象(object)和字符串(string)。对于一些纯文件的信息可以用string类型来保存,对于图片(Image)、图标(Icon)等用object来保存,其它的可以用byte流来保存。
System.Resources命名空间中有大量的类和方法来处理资源文件,我将在下面的篇章中进行介绍。
 
第二部分:资源文件的分类
    资源文件可以分为两类,一类是以.resx为后缀名的文件,一类是以.resources为后缀名的文件。二者的区别在于:
1.    resx虽然是以resx结尾的文件,但是它却是XML格式的文件,你可以用记事本等工具直接打开它修改里面的东西;而resources是二进制的文件,相对来说安全性更好一些。
2.    resources作为内嵌资源,在指定路径正确的前提下,可以在程序中直接引用;而resx虽然也是内嵌资源,但它却是要依附于.CS文件存在的。也就是说它是作为winform窗体的一个描述性资源存在的,要想在程序中直接使用它,在解决方案中必须有与它同名(只是名字相同,后缀名不同)的.CS文件存在(见图一)。这一点我会在下面的示例中作详细说明。
3.    我们可以利用CSC命令把resx文件转换成resources文件。
   RESGEN.EXE LitwareStrings.resx LitwareStrings.resources
   注意变量环境为framework1.1
 
第三部分:资源文件的创建
    这里我介绍两种资源文件的创建方法,一个是利用System.Resources下的ResourceWriter类,另一个是利用资源文件生成器。本节重点讲利用ResourceWriter类来创建资源文件的方法,第二个方法请详见第六部分。
    首先要实例化一个ResourceWriter类型的变量:
ResourceWriter rw = new ResourceWriter ( "My.resources" ) ;其中My.resources就是你要生成的文件名。其次要在磁盘上产生这个文件:调用rw.Generate ( ) ;就可以了。
接下来就要为这个资源文件来增加内容了。在ResourceWriter类中提供了一个AddResource ( )方法,这个方法的作用就是往资源文件中添加资源的。在C#中对不同的资源有着不同的加入方式。
1.加入字节数组,语法格式为:
public void AddResource ( string , byte [ ] ) ;
注释:其中string是在使用资源文件的时候,此字节数组在程序中的的唯一标识符
 
2. 加入对象,语法格式为:
public void AddResource ( string , object );
注释:其中string是在使用资源文件的时候,此对象在程序中的唯一标识符
在本文程序中,我们利用这种调用方式来加入图标和图象,具体如下:
Icon ico = new Icon ( "main.ico" ) ;
Image Turnoff = Image.FromFile ("Turn-off.png") ;
Image Turnon = Image.FromFile ( " Turn -on.png" ) ;
rw.AddResource ( " main.ico" , ico ) ;//在资源文件中加入图标
//以下是在资源文件中加入图象
rw.AddResource ( " Turn -off.png" , Turnoff ) ;
rw.AddResource ( " Turn -on.png" , Turnlon ) ;
 
3. 加入字符串,具体语法如下:
public void AddResource ( string1 , string2) ;
注释:其中string1是在使用资源文件的时候,此字符串在程序中的唯一标识符在本文的程序中,是如此使用的:
rw.AddResource ( "MyStr" , "从资源文件中读取字符串" );
 
至此我们已经创建了一个资源文件,并且在资源文件中加入了若干个资源,当然在这之后,还应该注意,保存此资源文件,并关闭资源文件,具体如下:
rw.Close ( ) ;
 
    以上我介绍了用ResourceWrite类来创建resources文件的方法,对于resx文件,我们可以在vs2003IDE中在解决方案管理中点右键->添加新项目中->控件资源档来添加。
 
第四部分:利用IDE来制作多国语言版本
    终于进入主题了,但是这一节的内容和前几节关系不大,因为我主要讲如何使用VS的IDE来制作多国语言版本。每一个Form1.cs文件都有一或多个相应的resx文件作为附属资源。他们的命名规则为Form1.cs的资源文件为Form1.resx,Form1.zh-CHS.resx,Form1.zh-CHT.resx等,其中Form1.resx是缺省的窗体资源文档,其它是在不同语言环境要使用的资源文档,其中Form1.zh-CHS.resx是中文简体系统,Form1.zh-CHT.resx是中文繁体系统(如下图一)。关于命名可不是随便起的,可以参见msdn中关于不同地区的命名规则。
(图一)
每一个窗体都有Localizable和Language这两个属性,其缺省值如下图:
(图二)
Localizable表示是否使用本地化资源,当其为true时,可以在Language中选择一种语种,例如选繁体中文,如下图:
(图三)
这时,窗体的布局会发现变化,你要重新布局窗体上的控件位置、大小、内容等等。布局好以后,你可以继续选择其它的语种来布局。不用担心,它们之间不会有冲突,因为所有不同语种之间的布局差别都被保存到相应的resx文件中了,如图一。最后保存、编译。
    为了测试结果,我们可以改变机器的语言环境,方法有二:一是在控件面板中的更改语言选项。另一个是用程序来改。下面我介绍一下第二种方法,用程序来改变当前进程的语言环境。
    在程序运行时,会自动检测当前的系统语言环境,我们可以通过修改System.Threading.Thread.CurrentThread.CurrentUICulture这个属性来改变当前UI运行的语言环境,代码如下:
static void Main()
{
        System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo( "zh-CHS" );
        Application.Run(new Form1());
}
效果图如下:
(图四)
更改System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo( "zh-CHT" );后,效果如下:
(图五)
 
第五部分:利用资源文件来做多国语言版本
    在第三节我们已经说过如何利用ResourceWriter类来创建资源文件,本节就讲讲怎么来使用这些资源文件。利用第三节介绍的方法分别建立三个文件MyResource.resources、MyResourceZH_TW.resources和MyResourceEn.resources分别对应缺省、繁体和英文三个系统。每个文件中有两个string和一个object对象,分别对应button,textbox和Icon。
图四、图五中的language的菜单栏对应代码如下:
private void English_Click(object sender, System.EventArgs e)
{
        ResourceManager rm = new ResourceManager( "EmbedResource.MyResourceEn" , Assembly.GetExecutingAssembly() );
        textBox1.Text = rm.GetString( "TextBoxValue" );
        button1.Text = rm.GetString( "ButtonValue" );
        this.Icon = (Icon)rm.GetObject( "Demo.ico" );
}
 
private void ChineseTraditional_Click(object sender, System.EventArgs e)
{
        ResourceManager rm = new ResourceManager( "EmbedResource.MyResourceZH_TW" , Assembly.GetExecutingAssembly() );
        textBox1.Text = rm.GetString( "TextBoxValue" );
        button1.Text = rm.GetString( "ButtonValue" );
        this.Icon = (Icon)rm.GetObject( "Demo.ico" );
}
效果图如下:
 
    在第二部分中,我说过resx和resources调用的方法不同,下面我再说说resx文件如何来调用。由于resx是cs文件的附属文文件,所以项目中一定要有同名的cs文件存在。如图一。
调用resx使用如下代码:
ResourceManager rm = new ResourceManager( "EmbedResource.Form1" ,     Assembly.GetAssembly(typeof(EmbedResource.Form1)));
textBox1.Text = rm.GetObject( "textBox1.Visible" ).ToString();
其中EmbedResource是namespace,Form1为资源文件名(不包含后缀名),第二个参数Assembly.GetAssembly(typeof(EmbedResource.Form1))EmbedResource是namespace,而Form1是resx附属的cs文件的名称。注意区分。
 
第六部分:常用.NET资源文件生成器的使用
    在网上相关的软件已经很多了,我给大家介绍一个Resourcer.exe,它是开源的,可以在
    该软件可以自动保存成text、resx和resources三种格式的文件。前面的资源可以很方便的使用此软件来创建。大家可以自己下载下来试试。我在这里就不多说了。
 
第七部分:总结
    通过上面的介绍我们已经具备了制作多国语言的基础,当然这只是对多国语言制作的初步介绍。有什么不妥的地方,请在评论中指正,我会尽快改过来的。
 
你可能感兴趣的文章
后台服务的变慢排查思路(轻量级应用服务器中测试)
查看>>
MySQL中InnoDB事务的默认隔离级别测试
查看>>
微服务的注册与发现
查看>>
bash: service: command not found
查看>>
linux Crontab 使用 --定时任务
查看>>
shell编程----目录操作(文件夹)
查看>>
机器学习-----K近邻算法
查看>>
HBASE安装和简单测试
查看>>
关于程序员的59条搞笑但却真实无比的编程语录
查看>>
搞笑--一篇有趣的文章编译自一篇西班牙博客。有一位美丽的公主,被关押在一个城堡中最高的塔上,一条凶恶的巨龙看守着她,需要有一位勇士营救她…
查看>>
非常不错 Hadoop 的HDFS (Hadoop集群(第8期)_HDFS初探之旅)
查看>>
Tomcat启动错误,端口占用
查看>>
laravel 修改api返回默认的异常处理
查看>>
高德坐标转换百度坐标 javascript
查看>>
tp5封装通用的修改某列值
查看>>
laravel控制器与模型名称不统一
查看>>
vue登录拦截
查看>>
npm配置淘宝镜像仓库以及electron镜像
查看>>
linux设置开机自启动脚本的最佳方式
查看>>
VUE SPA 单页面应用 微信oauth网页授权
查看>>