.Net程序实现多语言
最近工作中要用到一个小工具,出于快速开发的目的,使用c#作为开发语言,放弃了c++,功能简单,当然是怎么方便怎么来。其它的功能这里就不说了,衣服自己洗这里要分享的就是其中的一个功能,对全球化多语言的支持。
.Net中要实现全球化,是把不同的语言放在不同的字典中,然后运行时动态选择。具体实现来说,可以有2种方式:
1、系统自带的Resources.resx文件
Resources.resx 是.Net提供的一个资源文件,可以提供对字符串,图片、二进制数据的存储,Resources.resx 本质上是一个xml 文件。比如,我们通过 VS 在文件中添加一个字符串,键为 Name,值为 唠叨下。
接下来,是考虑如何在程序中调用,非常简单,我们可以这样写 string name = Properties.Resources.Name;
注意这里的Name即为我们在Resources.resx里定义的键。之所以可以这么来调用,是由于VS自动帮助我们在 Resources.Designer.cs文件中定义了相关的方法。如果细心点,你会发现还可以使用Resources.ResourceManager 的GetString()方法和GetObject()方法,也可以达到相同的目的。拿到了值后,我们就可以做对应的显示了。
上面是第一步,接着我们来进行第二步。我们直接复制Resources.resx文件,并粘贴后改名,例如Resources.en-US.resx。这里需要说2点,一个是文件名格式,en-US是语言。另外一个是重命名后,Resources.en-US.Designer.cs里的内容给清空了,这个是没有关系的。事实上如果不清空,编译会报错。
这个时候,编译我们的工程,会发现在bin目录下生成一个en-US目录,里面有一个dll文件。默认的Resources.resx不会生存额外的文件夹,会直接编译到主程序中。
最后,我们需要添加显示,不然程序运行始终显示的是里的字符串。在程序的入口添加下面的代码,表示以当前系统的显示语言作为程序的语言。
Thread.CurrentThread.CurrentUICulture = new CultureInfo(System.Globalization.CultureInfo.CurrentUICulture.Name);
有的软件可能想要提供一个菜单,供用户主动选择语言,那么在初始化的时候,可以传入语言参数,例如 new CultureInfo(“zh-CN”)等等。
经过上面的处理,程序在运行的时候,就会得到我们需要的语言。
2、自定义的方式
上面的方式在编译后,会根据不同的语言生成对应的文件夹。例如我要做的小工具,就要生成28个国家的文件夹。看起来是不是很猥琐?我这里做过尝试,把所有的语言文件夹移动同目录下的一个新文件夹中,例如 Language 是不可行的。
还比如说,多语言的翻译和开发是同步进行的,希望以后再不重新编译版本的情况下新增别的语言等等各种需求,我们可以自定义。
不想要那么多文件夹,可以把所有的多语言翻译都放在Resources.resx文件里,并添加语言前缀,例如zh-cn_Name等等,利用Resources.resx会被编译到主程序的原理,就解决了过多的文件夹的问题。
对于想要动态新增语言,就只好将多语言放到数据库或者xml配置文件里,按语言取名,程序读取的时候来解析数据库或者xml。好处是只要新增了xml,程序不需要编译就支持了。缺点是由于可以修改,如果用户手动修改的话,可能会导致一些意外产生,不过额外做一些加密操作应该可以过滤掉大部分误操作。
衣服自己洗在上面介绍了2种方式,各位同学可以根据实际情况灵活采用不同的方式。满足了老板的需求,剩下的就是喝啤酒泡妹子去了。