C#应用程序的国际化

来源:互联网 发布:python values 编辑:程序博客网 时间:2024/05/17 01:42

当应用程序需要在不同语言版本的OS上运行的时候,程序中原本存在的语言文字信息比如说Message和窗体上的文字信息需要翻译成新的语言显示出来。如果因为这样把所有的程序重写一遍显然是不明智的。好在C#.NET提供了在不改变程序执行逻辑的基础上换掉程序中的文字语言信息的接口。
这种接口就是资源文件,资源文件中记录了程序中用到的资源的名称(name),类型(type) ,值(value)等信息。资源文件是xml格式的文件它的后缀是“.resx”,文件名里还会跟上地域信息,例如中文的资源文件名是“*.zh-CHS.resx”日文的资源文件是“*.ja.resx”依此类推英文的是“*.en.resx”,注意有一种文件名是这样的“*.resx”没有地域信息,这种资源文件记录的资源是在找不到对应资源文件的情况下使用的默认资源文件,比如说在阿拉伯语的OS上安装了一个只有“*.resx”和“*.zh-CHS.resx”资源文件的程序,程序所用的资源是“*.resx”内的资源。只要应用程序中有对应的资源文件。编译生成的dll或者exe都会生成地域信息相关的文件夹,文件夹里会有一个与应用程序集名称相同的dll文件“*.resources.dll”(*就是应用程序集名称)。例如:编译一个含有“*.zh-CHS.resx”资源文件的信息,bin/debug(release)文件夹下会有“en”这样的文件夹出现,打开这个文件夹就会看到“*.resources.dll”,应用程序运行的时候就是载入对应语言的“*.resources.dll”生成对应语言的画面。国际化最主要的就是做成对应语言的资源文件。
简单的了解一下资源文件的作用,接着说说资源文件是如何生成的。资源文件的生成分两种:1.Form类继承的子类(也就是WinForm)的资源文件。2.Form类以外的情况。
Form上的资源文件做成是这样的:
1.用属性浏览器察看这个form的language属性,把language属性设置成想要的地域语言信息。一旦指定了form的language属性就会生成一个资源文件,这个资源文件的后缀名与指定的language属性相关。
2.把form上面的文字写成要翻译的文字。画面的大小和风格也可以调整一下。
3.一切调成妥当,保存一下。对form上元素的调整会自动写入刚才生成的资源文件。
4.重复第一步至第三步选择别的语言,直至所有想对应的语言环境都完成为止。
5.编译。程序在你选择的地域的OS上运行的时候就会找到对应的资源文件中的资源,form就是刚才调整过的样子。
6.如果想要删除其中一些地域的资源文件比如说我现在不想要日语的资源文件了。在删除的时候要注意先把form上的language信息设置成日语以外的语言环境,保存,然后再删(VS2003上一定要这么做)。否则可能会出现这样的情况,明明已经删除的资源文件会自己冒出来,用同事的话来说变成“狗皮膏药”。其实在默认的资源文件(不带地域信息的资源文件)里有这样一个资源,名称是:$this.Language,值是:当前指定的地域信息也就是对应form上的language属性的值。例如:“Japanese”,如果不改变这个值就直接删除掉日语的资源文件,那么下次打开工程察看这个form的属性时,删除掉的日语资源文件会再次生成(不过是空的)。确定所有想要删除的资源文件都删干净的办法是编译一下看看有没有删除的语言信息相对应的文件夹被生成。如果没有就是删除完了,如果有就是没删完,打开那个文件夹看看是有哪个工程的“*.resources.dll”,就把那个工程没删干净的再删一下。
form上的工作大概就是这样。Form以外也会存在很多跟地域相关的信息需要改变,比如说画面上的message内容等等。
1.在工程上手动添加一个资源文件,这个文件需要与地域信息相关。比如叫(a.zh-CHS.resx)。
2.在这个文件里添加资源名称以及内容。可以在VS2005(vs2003)环境上添加,在“名称”项目里填上资源的名称,在“值”项目里填上对应的内容。
3.声明一个ResourceManager实例。比如对应于前文的“a.zh-CHS.resx”文件,我们可以这样实例化一个ResourceManager: ResourceManager manager = new ResourceManager("a", Assembly.GetExecutingAssembly());最好是静态的因为这样的话一个工程只需用声明一个实例。一般的做法是一个资源文件对应一个ResourceManager实例。
4.在程序需要读取资源的地方使用上步中的ResourceManager实例获取对应资源名的值。比如有一个叫"ERROR"的资源它的值是"错误"。那么在程序中需要用到"错误"这个单词的地方调用manager.GetString("ERROR");就可以了。
5.编译。
6.form以外的资源文件的删除很简单直接从工程上删除就可以了。确认的方法和form上的确认方法一样。

   生成资源文件也可以这样做,只要生成过一个资源文件,在生成其他的语言环境的资源文件时可以拷贝存在的那个资源文件,把拷贝出来的文件更改后缀名(当然是改成你要的语言对应的那种后缀),然后把翻译的结果直接导入(跟写xml文件相同,其实我在做的时候写了个小程序直接从excel里面读取翻译的结果,然后写到对应的xml文件里,你可能会想出更好的办法。)资源文件。然后直接在工程上添加这些资源文件就可以了。这样会快一点。

   这篇文章简单的说了一下如何让一个应用程序对应多语言OS,只是我个人工作的一点总结。写点东西真不容易呀,原来总是看别人的文章获益匪浅,但是自己想写点东西回报网络才发现挺难的,这文章中可能有很多说得不明白甚至是错误的地方,请有时间的高手指正(BlueZealot1982@hotmail.com)。如果有幸您想转载请注明出处。

原创粉丝点击