如果使用外部文件方式,必须随程序集部署外部文件(资源),并且保证在运行是可以访问到资源文件。如果资源文件和程序集(.exe)永远也不能相会,则会导致问题。
第一种方式部署相对第二种会稳定且出错的几率更小。
作外嵌入的资源编译(直接嵌入)
步骤:
1、把资源作为嵌入式资源编译
By doing this, you have instructed Visual Studio to embed the file into the physical image of the output assembly .exe file.
2在运行时访问资源的方法










使用资源文件
这是在.net中使用资源的另一种方式,在某些场景下它会更简单。另,vs中提供了便捷的使用方式。
通过非vs方式使用资源
在.net中,资源文件被用来在程序集中嵌入资源,使用资源文件的最重要的益处是:可以使程序集中的语言和本地化元素 从代码中分离出来。 要实现分离需要为每种需要支持的语言建立一个资源文件,资源文件是包含xml的文本文件,以resx为扩展名,下面是一个资源文件的片断:

















RESGEN.EXE LitwareStrings.resx LitwareStrings.resources
被编译成*.resources.
要想使用资源还要把它编译成程序集,命令:
AL.EXE /t:library
/out:LitwareStrings.resources.dll
/link:LitwareStrings.resources
使用方式:





RESGEN.EXE LitwareStrings.resx LitwareStrings.resources /str:vb
这样就可以通过属性访问资源,编译后的资源文件包含LitwareStrings类,此类会用ResourceManager 实现强类型的属性如:






在vs2005中使用资源文件:
步骤:
1、添加一个资源文件
2、vs会编译.resx到.resources ,然后连接程序集的物理镜像(physical image )
vs也会建立一个强类型的资源类,此类在mynamespace下面。(c#不知会在哪?)不要直接访问资源类,而要通过ResourceManager,访问代码:










你可以显式的在vs中增加一个或多个资源文件,但是这通常是没有必要的,因为建立工程时,vs会建立一个项目级别的资源文件。此文件可以通过项目属性对话框访问。
你可以象下面那样访问资源文件中的文本:








例如,假定你增加LitwareLogo.png 和resources.xml到项目级别的资源文件,这些资源会自动的嵌入到项目的输出程序集。你可以用强类型的方式访问他们,代码:






资源设置和本地化:
软件项目被本地化是通用的需求,这样它就能被说不同语言的人群使用。.net提供了方便的方法来本地化程序和Dll库。
首先你要熟悉CultureInfo类,一个CultualInfo对象,跟踪一个Cultual name,一个Cultual Name
标志了一种语言。
英文的cultual name 是“en”,法国是“fr”,也可以包含附加信息,此信息指定了区域性(region),如,美国英语的“en-us”,英国英语的“en-gb”.下面的代码创建并初始化了一个CultureInfo对象






可以通过下面的代码列出两个CultureINfo对象的两个Culture names,










如果你必须用程序修改CurrentCulture ,一定要用包含区域的Culture name,如:“en-us”
。如果没有区域信息,如,"en",则会抛出异常,因为运行时不能确定如何格式化。
名为CurrentUICulture 的第二个CultureINfo对象对本地化来说是很重要的。修改关联到当前线程的CurrentUICulture 将影响.net framework和ResourceManager类如何加载包含内嵌资源的程序集。
本地化的步骤
1、拷贝多份资源文件,一份对应一种要支持的语言。如:做一个项目范围(project-wide) 的资源文件:Resources.resx,然后拷贝多份。
2、重命名拷贝的文件,文件名的格式是,在resx前加Culture name。如:为通用的法文本地化字符集(French localized strings )的资源文件命名为Resources.fr.resx ,为比利时专用的法文本地化字符集命名为Resources.fr-BE.resx 。
Satellite程序集
当编译包含本地化资源文件的工程(此工程含有多个资源文件,如上面的例子)时,vs不会把所有的资源文件编译到一个输出程序集,而是每个资源文件被编译到单独的程序集。这种程序集尽包含资源没有代码。这种仅含有资源的本地化程序集被称为“satellite assembly”。
每个Satellite程序集和称作“neutral assembly”的主程序集相关联。中立程序集在需要时加载Satellite程序集以获取本地化资源。
当Satellite程序集和Neutral程序集部署在AppBase目录下时,部署必须符合程序集加载器的规则。每个Satellite程序集必须部署在已它的本地化Cultual name命名的文件夹下面。如:
AppBase下包含LitwareSmartClient.exe 中立程序集,也必须包含fr-BE 子目录,此子目录包含名为LitwareSmartClient.resources.dll的为比利时法语本地化的Satellite程序集。只要符合规则.net
程序集加载器和辅助的ResourceManager 类就可以在需要的时候加载正确的资源。
幸运的是,Vs知道怎么正确的命名Satellite程序集并正确的部署他们。
加载本地化的资源
当你创建编辑了本地化资源文件并且编译了工程,就是要关注怎么让程序加载用户需要的本地化字符的时候。一种方法是,获取当前线程的引用,并且把CurrentUICulture 属性设置为新创建的CultureInfo对象。在winform的vb代码如下:



注意,net 程序集加载器首先精确匹配(language and region)Satellite程序集,如果不成功则查找可用的只匹配语言的程序集。如果还不匹配就使用Neutual程序集内嵌的资源。
当编译Neutal程序集时,可以通过一个特殊的属性为它指定默认的Cultual 资源。如,在assemblyInfo.vb中加入:



本地化窗体和控件设置
你已经知道了怎么在项目范围(project-wide)的基础上本地化资源,这种技术涉及到拷贝和修改本地化资源文件。vs对本地化窗体和控件提供了额外的帮助,但通过这种方式对以后增加语言支持会很复杂,一种简单的方式是,创建资源文件,这种方式,你不用编译Netual程序集,这是.netframework在本地化程序和Dll库方面最有价值的特色。
结论
本文通过本地化一个简单windows Form-based的程序覆盖了.net资源和本地化的基础。下一篇将讨论asp.net2.0中的资源和本地化。
原文地址:
http://msdn.microsoft.com/msdnmag/issues/06/05/BasicInstincts/
asp2.0的资源与本地化
http://www.microsoft.com/china/MSDN/library/default.mspx?mfr=true
因为要多语言化一个asp程序,看到了上面的资料,本意是简单的记录原文的要点,结果越写越多,几乎整篇都翻译了下来,但是省略了大部分只专注winform的内容。