代码改变世界

2.6 语言文化

2011-11-24 14:26  iRead  阅读(319)  评论(0编辑  收藏  举报

  除了版本号之外,程序集还将语言文化(culture)作为其身份标识的一部分。例如,我们可能有一个程序集是只面向德语用户的,另一个程序集是只面向瑞士德语用户的,第三个程序集是只面向美国英语用户的,以此类推。语言文化是用一个字符串来标识的,该字符串包含一个主标记和一个副标记(根据RFC1766)。表2-6展示了一些例子。

  表2-6 程序集语言文化标记的例子

主标记 副标记 语言文化
de (无) 德语
de AT 奥地利德语
de CH 瑞士德语
de (无) 英语
de GB 英国英语
de US 美国英语

  通常,在创建包含代码的一个程序集时,不会为其指定一种语言文化。这是因为代码只讲“逻辑”,一般不涉及语言文化所特有的东西。没有指定具体语言文化的程序集称为语言文化中性(culture neutral)

  如果设计的应用程序包含一些语言文化特有的资源,Microsoft强烈建议专门创建一个程序集,并在其中包含代码和应用程序的默认(或者基本)资源。生成这个程序集时,不要指定一种具体的语言文化。其他程序通过引用这个程序集来创建和操纵它公开的类型。  

  然后,可以创建一个或者多个单独的程序集,只在其中包含语言文化特有的资源--不要包含任何代码。标记了一种具体的语言文化的程序集称为附属程序集(statellite assembly)。为附属程序集指定的语言文化应准确反映程序集中包含的资源的语言文化。针对想要支持的每一种语言文化,都应该创建一个单独的附属程序集。

  我们通常使用AL.exe工具来生成附属程序集。之所以不用编译器,是因为附属程序中不应包含任何代码。使用AL.exe时,可以使用/c[ulture]:text开关来指定一种目标语言文化。其中,text是一个语言文化字符串,比如“en-US”代表的就是美国英语。部署一个附属程序集时,应该把它保存到一个专门的子目录中,子目录的名称应该与语言文化的文本相匹配。例如,假定应用程序的基目录是C:\MyApp,那么与美国英语对应的附属程序集应该放到C:\MyApp\en-US子目录中。在运行时,可以使用System.Resources.ResouceManager类来访问一个附属程序集的资源。

注意:虽然不建议这么做,但创建包含代码的一个附属程序集是完全可以的。如果愿意,可以使用System.Reflection.AssemblyCultureAttribute这个定制attribute来指定语言文化,而不是使用AL.exe的/culture开关。例如:

  // 将程序集的语言文化设为瑞士德语

  [assembly:AssemblyCulture("de-CH")]

  一般不应生成引用了附属程序集的一个程序集。换言之,程序集的AssemblyRef记录项只应引用语言文化中性的程序集。想访问包含在一个附属程序集中的类型或成员,应使用第23章“程序集加载或反射”描述的反射技术。

 

  返回目录