此文未经作者同意,不能转摘
==========================================================================
1.要想使用多语言环境(区域性),可以先简单了解以下知识:
a.什么是区域性 Culture
如 主标记 副标记 对应的语言文化
en (无) 英语
en US 美国英语
zh CN 中华人民共和国中文
例如: 中华人民共和国中文 通常可表示为 "zh-CN"
b. 资源文件 xx.resources xx.resx xx.txt xx.avi......
啥叫资源文件啊,就是里面的内容 只是把它当数据来用的文件就叫 资源文件
常见的资源文件 里可以是 文本(对)、图片、视频、声音、图标、甚至是 只当成数据用的 代码
c.资源文件 与程序的组合形式
最笨的方式就是自己在代码里自己来实现对资源文件的读写了。
当然,因为这种用法太常见了,所以大家想出了某些机制来“简化”对它的读写了,但是对于初学者当然就头大了
常见的机制,就是建立起某种格式的资源文件,然后
a) 编译后直接嵌到程序集中 即你不容易看到它了,
b) 不嵌入式的引用它 这里你使用程序时,可得保证它一定存在,当然好处就是 可以通过折腾这些资源文件而达到比如换肤,换语言等功效了
d. 假如按一定关系建立好程序和资源文件后,程序如何切换资源文件
a) 最简单的就是 程序自动感知 运行环境的操作系统的区域性,然后自动选择正确的资源文件
b) 通过读取配置文件的自定义信息,然后改变代码里的区域性,从而加载正确的资源文件 ,这个好处就是灵活
c) 对于B/S的应用,可以通过取得客户端的环境信息来加载,本质上,只是b)的变形
2.在.net里 建立多语言支持环境是很容易的事,因为它提供了较为简单的机制,下面我们以 CUI(控制台程序)方式来讲解如何使用:
a. 打开vs2005,新建一CUI的工程,假设 名称为 MyApp
b.选中MyApp工程,点右键-->属性
在弹出属性页中 选中 资源标签,如果没有任何项目的资源文件时,它会提示你要不要创建(废话,当然要建了)
点击此话,会自动在工程项目里的 Properties 目录里多出一个(实际是两个)叫 Resources.resx的文件
好了,按资源文件名的机制,你还可以建立另外的语言下的资源文件:
如 美语: Resources.en-US.resx
简体中文 Resources.zh-CN.resx
这里有个技巧,就是复制 Resources.resx文件 然后改名,好了,所需文件已建好。如下图所示
c. 接下来以按语言 替换 文字为例来说明资源文件的使用
双击 Resources.resx 文件,进入 默认的文本对 编辑状态 ,如下图所示
文本对是以 key = value的形式 进行编辑,上例中 为 Hello= ffgggHHHi~
因为此为中性语言(即默认语言),所以我的 值为乱写的,呵
好,依次双击
美语: Resources.en-US.resx
简体中文 Resources.zh-CN.resx
需要废话的是: key 记得都要一样(包括大小写),
如此例中 key为 Hello (小技巧: key可以用中文起名)
d.好了,万事俱备,只欠调用了
接下来,利用 主程序 来测试,
哟,资源文本的使用好简单啊,原来 资源文件其实可以由两个文件构成,在你编写资源文本的时候,IDE会自动生成该资源的C#代码,如 这个Hello,就会在 Resources.designer.cs文件里生成以下代码:
原来资源文件 会生成 Resources类, Hello 键 为该类的 静态属性
好了,运行一下吧
咦!,似乎有点怪,,呵,是的,,默认语言中的文字没显示,它自己用了中文,好,看一下编译之后,都生成了哪些文件
哈哈,原来 两个资源文件 会生成 两个 目录,点一下en-US 的目录看看
原来 资源文件 会生成一个叫 MyApp.resources.dll 的文件,我们通常 称它为 资源附属程序集 ,里面没有任何代码,只有资源而已
好了,突然产生一个邪恶念头,,如果我把 zh-CN目录里的那个 资源附属程序集 文件删除后,再运行程序会怎样?
呵呵,这回变成了 默认语言了,原来,我的操作系统的区域性为 简体中文(又是废话,呵)
好了,,要是想试试 美语,你可以试试 将作系统的区域性为 调整为 美国,算了,这个艰巨的任务就留给读者来完成吧。
-----------------------------------------------------------------------------------------------------------------------------
进阶学习
3.上面留了个小尾巴(7月份的尾巴,你是湿纸坐....),就是如果我想手动切换语言就不太方便了,好,接下来我们来看看这个问题如何解决,其实要解决它很简单,就是 想法 控制 Resources类的区域性就行了,怎么控制呢?
好,编译后,运行一下看看
ok,美语出来了,所以只需要能动态替换掉 CultureInfo构造里的 “en-US”这个字符串,就能切换语言了
进阶2学习
-------------------------------------------------------------------------------------------------------------------------------
4. 好,要想动态取得 字符串,可以把这个字符串放到程序集的配置文件里,这里不多说了,直接上代码
因为代码用到了 ConfigurationManager 类,所以记得 添加引用 System.Configuration.dll文件
好,还有得记新建 App.config配置文件,然后如图所示
注意,你得分别按 三种 情况 来测试!!!(为了省事把三种情况全部写在了一起)
----------------------------------------------------------------------------------------------------------------------------------------
进阶3学习
5. 到此,似乎很完美了,呵
还有什么要学的么? 想想,,,, 还有一个不方便 的地方的就开发方式,,在实际开发中,不可能一次就编写完所有的语言下的 资源文件。而是根据需要客户的需要,逐步完善的一个过程。
总结上面的话,得到需要解决的步骤:
1. 区域性的目录 根据 需要增加,创建一个目录不难,所以不再讨论
2. 区域性的目录里的 资源附加程序集 重点解决这个
分析: 资源附加程序集 不用包含任何代码,只需资源即可,利用反射工具可以看到
zh-CN: MyApp.resources.dll文件的结构,如图所示:
所以 关闭原来的工程,重新新建一个同名的工程 MyApp来测试
建立的文件如下所示
可以看到,除了一个 简体中文件的资源文件外,没有任何有意义的代码了,好,双击该资源文件
为了能确认测试成功,故意使值 不同,这里打成了“好想你!!!”(呵,,不知想谁)
好了,编译一下,生成的文件如图所示
这时,千万注意,我们并不需要你看到的这个MyApp.dll文件,而是 zh-CN里的文件,如果你进去,同样可以看到它
好了,为了省事,直接把zh-CN目录全部复制到 原来的旧工程下,改配置文件为: zh-CN ,
测试结果:
-----------------------------------------------------------------------------------------------------------
完