您的位置:首页 > 其它

在.net程序中使用资源(翻译msdn/06/05)

2006-08-31 23:13 417 查看
有两种使用资源(resources)的方式:直接嵌入到程序集或者加载外部文件。
如果使用外部文件方式,必须随程序集部署外部文件(资源),并且保证在运行是可以访问到资源文件。如果资源文件和程序集(.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在运行时访问资源的方法

'*** get current Assembly object.
Dim asm As Assembly = Assembly.GetExecutingAssembly()
'*** load embedded resource into stream
Dim ResourceName As String = "LitwareSmartClient.LitwareLogo.png"
Dim str As Stream = asm.GetManifestResourceStream(ResourceName)
'*** convert stream into image and load in '*** picture box
Dim img As Image = Image.FromStream(str)
PictureBox1.Image = img

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

<root>

<data name="MainFormCaption">
<value>Litware Customer Manager</value>
</data>

<data name="UserWelcome">
<value>Good day</value>
</data>

<data name="ErrorMessage1">
<value>Oh no, Something went wrong!</value>
</data>

</root>

可以用Resgen.exe把资源文件编译成二进制镜像(binary image ),编译命令:
RESGEN.EXE LitwareStrings.resx LitwareStrings.resources
被编译成*.resources.
要想使用资源还要把它编译成程序集,命令:
AL.EXE /t:library
/out:LitwareStrings.resources.dll
/link:LitwareStrings.resources
使用方式:

Dim asm As Assembly = Assembly.Load("LitwareStrings.resources")
Dim rm As New System.Resources.ResourceManager("LitwareStrings", asm)
Dim caption As String = rm.GetString("MainFormCaption")

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

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

你可以看到,通过强类型访问资源文件中的字符串是多么的简单!更进一不,你可以同样的访问强类型的资源文件,即使这些资源文件包含图片,以xml,sql,js为内容的文件。
例如,假定你增加LitwareLogo.png 和resources.xml到项目级别的资源文件,这些资源会自动的嵌入到项目的输出程序集。你可以用强类型的方式访问他们,代码:

Me.picLogo.Image = My.Resources.LitwareLogo

Dim xmlDoc As New Xml.XmlDocument
xmlDoc.LoadXml(My.Resources.Customers)

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

Dim culture1 As CultureInfo = New CultureInfo("en-US")
Dim culture2 As CultureInfo = New CultureInfo("en-GB")
Dim culture3 As CultureInfo = New CultureInfo("fr")
Dim culture4 As CultureInfo = New CultureInfo("fr-BE")

有两个CultureInfo对象关联到当前线程,第一个CultureINfo对象列出了当前风俗(Culture)的表示形式,第二个CultureINfo对象表示当前的UI风俗(Culture)。( The first CultureInfo object listed represents the current culture while the second CultureInfo object represents the current UI culture.)
可以通过下面的代码列出两个CultureINfo对象的两个Culture names,

'*** determine current culture and current UI culture
Dim t As Thread = Thread.CurrentThread
Dim currentCulture As CultureInfo = t.CurrentCulture
Dim currentUICulture As CultureInfo = t.CurrentUICulture

'*** display cultures in console
Console.WriteLine("Current Culture: " & currentCulture.Name)
Console.WriteLine("Current UI Culture: " & currentUICulture.Name)

名为CurrentCulture 的第一个CultureInfo对象不能被用来在程序中本地化字符串,它只影响.netFramework格式化日期,数字,货币。因此当本地化程序以适应多语言时也不要修改此属性(static it)。
如果你必须用程序修改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代码如下:

My.Application.ChangeUICulture("fr-BE")

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

<Assembly: System.Resources.NeutralResourcesLanguage("en")>

当如此指定时,NeutralResourcesLanguage 特性将通知程序集加载器:当用户请求本地化为英文的程序时,将使用默认cultual 资源。
本地化窗体和控件设置
你已经知道了怎么在项目范围(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的内容。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: