[原创].NET应用程序的资源开发 Part 1-基本概念(2006.01.19修订)

我们知道,如果要国际化和本地化一个软件,就必须涉及到资源的处理,这些资源包括了在不同文化区域中具有不同表现形式的文字、图片、窗体或其它类型的资源。在传统的Win32程序中,通常可以使用纯资源dll的办法实现,但我们现在要讨论的是在.NET环境下如何实现这一目标,你将会发现,在.NET下,实现资源的本地化及部署过程是非常自然、方便的。

 .NET资源模型

.NET使用一种叫做轮辐式模型的方式来打包和部署资源。其中包括一个主程序集,它包含已经国际化了的可执行代码以及某个单个区域性(称作非特定区域性默认区域性)的资源。另外还有可选的若干个附属程序集,每个附属程序集包含某个单个的本地化的区域性的资源,但不包含任何代码。在VS.NET编程环境中,会根据你添加的区域自动为你创建每个附属程序集,在后面我们会介绍如何在项目中添加不同区域性的资源。

 资源命名规则

.NET中,资源有特定的命名规则,首先,资源的区域性分为三种:固定区域性非特定区域性特定区域性
固定区域性(也称恒定区域性),一般用空字符串(””)表示,它与英语语言相关联,但不与任何国家/地区相关联,它必须仅由不依赖区域性的结果的进程(如系统服务)使用。
非特定区域性由两个表示语言类型的小写字母组成,它与某种语言关联但不与国家/地区关联。例如en表示英语,fr表示法语,注意zh-CHSzh-CHT是非特定区域性,分别表示简体中文和繁体中文两种语言。
特定区域性由两个表示语言类型的小写字母和两个表示国家/地区的大写字母(也称子区域性)组成,它既与某种语言关联也与某个国家/地区关联。例如en-US表示英语-美国,en-GB表示英语-英国,zh-CN表示中文-中国大陆,zh-TW表示中文-台湾地区。
区域性是分层次的:特定区域性的父级是非特定区域性,非特定区域性的父级是固定区域性。
 .NET中使用的区域性名称列表和示例可以参见:http://msdn2.microsoft.com/en-us/library/system.globalization.cultureinfo.aspx

 资源的定位

.NET中,运行库是按下述顺序定位用户应用程序所请求的指定资源(指定资源包括指定的区域性和资源的名称字符串等信息),如果在某一步中找到了指定资源,则返回:

1、在全局程序集缓存中检查,如果找到被用户应用程序引用的程序集,就在该程序集中搜索资源,如果没找到,将继续搜索。
2、在当前执行的程序集的目录下搜索符合指定区域性的有效附属程序集,然后在找到的附属程序集中搜索资源,如果没找到,将继续搜索。
3、再次回到全局程序集缓存,搜索指定区域性资源的父程序集(例如对于区域性en-USen-GB,运行库会搜索区域性en的程序集),如果没找到,将继续搜索。
4、再次检查当前执行的程序集的目录,以查看该目录中是否包含父目录。如果存在父目录,运行库会搜索该目录以找到符合父区域性的有效附属程序集。如果它找到了有效附属程序集,运行库搜索该程序集以找到请求的资源,如果没找到,将继续搜索。
5运行库接下来在许多可能的级别搜索父程序集。每一区域性只有一个父区域性,但一个父区域性可能还有其自己的父区域性。
6、在主程序集中搜索默认区域性的资源。
7、如果还是找不到指定资源,运行库要投降了,它不得不抛出一个异常。
由此可见,运行库搜索一个指定的资源的过程是复杂而又完整的。

依据上面介绍的基本概念,我们可以得到一个典型的包含中文简体、中文繁体和英语(美国)的国际化的应用程序的目录结构应该是这样的:



其中Primary.exe是主程序集,子目录en-US,zh-CHS,zh-CHT中分别放着上述三个区域性的附属程序集,在VS.NET编程环境下,它们都是自动生成的。

你如果觉得本文对你来说有点用处的话,请继续阅读 [原创].NET应用程序的资源开发 Part 2-实战演练

posted on 2006-01-18 14:27  I.AM.Wright  阅读(1888)  评论(3编辑  收藏  举报

导航