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

本文介绍.NET框架中的资源管理和本地化技术,包括资源文件的使用、卫星程序集的概念、以及如何根据不同的文化背景加载相应的资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    有两种使用资源(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在运行时访问资源的方法
None.gif ' *** get current Assembly object.
None.gif
Dim  asm  As   Assembly   =   Assembly .GetExecutingAssembly()
None.gif
' *** load embedded resource into stream
None.gif
Dim  ResourceName  As   String   =   " LitwareSmartClient.LitwareLogo.png "
None.gif
Dim   str   As  Stream  =  asm.GetManifestResourceStream(ResourceName)
None.gif    
' *** convert stream into image and load in    '*** picture box
None.gif
     Dim  img  As  Image  =  Image.FromStream( str )
None.gif    PictureBox1.Image 
=  img
None.gif
None.gif
    资源名是大小写敏感的,即使在vb等不敏感的语言中。除了图片,还可以方便的嵌入基于文本的文件,如:xml,js,sql
     使用资源文件
    这是在.net中使用资源的另一种方式,在某些场景下它会更简单。另,vs中提供了便捷的使用方式。
     通过非vs方式使用资源
    在.net中,资源文件被用来在程序集中嵌入资源,使用资源文件的最重要的益处是:可以使程序集中的语言和本地化元素 从代码中分离出来。 要实现分离需要为每种需要支持的语言建立一个资源文件,资源文件是包含xml的文本文件,以resx为扩展名,下面是一个资源文件的片断:
None.gif < root >
None.gif
None.gif 
< data  name ="MainFormCaption" >
None.gif   
< value > Litware Customer Manager </ value >
None.gif 
</ data >
None.gif
None.gif 
< data  name ="UserWelcome" >
None.gif   
< value > Good day </ value >
None.gif 
</ data >
None.gif
None.gif 
< data  name ="ErrorMessage1" >
None.gif   
< value > Oh no, Something went wrong! </ value >
None.gif 
</ data >
None.gif
None.gif
</ root >
None.gif
None.gif
可以用Resgen.exe把资源文件编译成二进制镜像(binary image ),编译命令:
    RESGEN.EXE LitwareStrings.resx LitwareStrings.resources
    被编译成*.resources.
要想使用资源还要把它编译成程序集,命令:
    AL.EXE /t:library 
     /out:LitwareStrings.resources.dll 
     /link:LitwareStrings.resources
使用方式:
None.gif Dim asm As Assembly = Assembly.Load("LitwareStrings.resources")
None.gifDim rm As New System.Resources.ResourceManager("LitwareStrings", asm)
None.gifDim caption As String = rm.GetString("MainFormCaption")
None.gif
None.gif
    下面把资源文件编译成强类型的 资源类,   
     RESGEN.EXE LitwareStrings.resx LitwareStrings.resources /str:vb 
      这样就可以通过属性访问资源,编译后的资源文件包含LitwareStrings类,此类会用ResourceManager 实现强类型的属性如:
ExpandedBlockStart.gif ContractedBlock.gif Shared   ReadOnly   Property MainFormCaption() Property MainFormCaption() As String
InBlock.gif  
Get
InBlock.gif    
Return ResourceManager.GetString("MainFormCaption", resourceCulture)
InBlock.gif  
End Get
ExpandedBlockEnd.gif
End Property
 

    在vs2005中使用资源文件:
    步骤:
1、添加一个资源文件
2、vs会编译.resx到.resources ,然后连接程序集的物理镜像(physical image )
vs也会建立一个强类型的资源类,此类在mynamespace下面。(c#不知会在哪?)不要直接访问资源类,而要通过ResourceManager,访问代码:
ExpandedBlockStart.gif ContractedBlock.gif Sub Main_Load() Sub Main_Load(sender As Object, e As EventArgs) 
InBlock.gif  
Handles MyBase.Load
InBlock.gif  
Me.Text = _
InBlock.gif    My.Resources.LitwareStrings.MainFormCaption
InBlock.gif  
Me.lblUserWelcome.Text = _
InBlock.gif    My.Resources.LitwareStrings.UserWelcome
ExpandedBlockEnd.gif
End Sub

None.gif
None.gif
     项目级别的资源文件
    你可以显式的在vs中增加一个或多个资源文件,但是这通常是没有必要的,因为建立工程时,vs会建立一个项目级别的资源文件。此文件可以通过项目属性对话框访问。
    你可以象下面那样访问资源文件中的文本:
    
ExpandedBlockStart.gif ContractedBlock.gif Private   Sub LoadResources() Sub LoadResources()
InBlock.gif  
'*** load project-level resources
InBlock.gif
  Me.Text = My.Resources.MainFormCaption
InBlock.gif  
Me.lblWelcomeMessage.Text = My.Resources.UserWelcome
ExpandedBlockEnd.gif
End Sub

None.gif
None.gif
    你可以看到,通过强类型访问资源文件中的字符串是多么的简单!更进一不,你可以同样的访问强类型的资源文件,即使这些资源文件包含图片,以xml,sql,js为内容的文件。
    例如,假定你增加LitwareLogo.png 和resources.xml到项目级别的资源文件,这些资源会自动的嵌入到项目的输出程序集。你可以用强类型的方式访问他们,代码:
None.gif Me .picLogo.Image  =  My.Resources.LitwareLogo
None.gif
None.gif
Dim  xmlDoc  As   New  Xml.XmlDocument
None.gifxmlDoc.LoadXml(My.Resources.Customers)
None.gif
None.gif
    你可以看到强类型的资源类自动的转换.png文件为Image对象,并且能被直接加载到PictureBox,强类型的资源类也自动转换.xml文件为字符串,然后字符可以方便的被加载到XmlDocument对象。
    资源设置和本地化:
    软件项目被本地化是通用的需求,这样它就能被说不同语言的人群使用。.net提供了方便的方法来本地化程序和Dll库。
    首先你要熟悉CultureInfo类,一个CultualInfo对象,跟踪一个Cultual name,一个Cultual Name
标志了一种语言。
    英文的cultual name 是“en”,法国是“fr”,也可以包含附加信息,此信息指定了区域性(region),如,美国英语的“en-us”,英国英语的“en-gb”.下面的代码创建并初始化了一个CultureInfo对象
None.gif Dim  culture1  As  CultureInfo  =   New  CultureInfo( " en-US " )
None.gif
Dim  culture2  As  CultureInfo  =   New  CultureInfo( " en-GB " )
None.gif
Dim  culture3  As  CultureInfo  =   New  CultureInfo( " fr " )
None.gif
Dim  culture4  As  CultureInfo  =   New  CultureInfo( " fr-BE " )
None.gif
None.gif
    有两个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,
None.gif ' *** determine current culture and current UI culture
None.gif
Dim  t  As  Thread  =  Thread.CurrentThread
None.gif
Dim  currentCulture  As  CultureInfo  =  t.CurrentCulture
None.gif
Dim  currentUICulture  As  CultureInfo  =  t.CurrentUICulture
None.gif
None.gif
' *** display cultures in console
None.gif
Console.WriteLine( " Current Culture:  "   &  currentCulture.Name)
None.gifConsole.WriteLine(
" Current UI Culture:  "   &  currentUICulture.Name)
None.gif
None.gif
    名为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代码如下:
None.gif My.Application.ChangeUICulture( " fr-BE " )
None.gif
None.gif
    另一种是使用注册键。
    注意,net 程序集加载器首先精确匹配(language and region)Satellite程序集,如果不成功则查找可用的只匹配语言的程序集。如果还不匹配就使用Neutual程序集内嵌的资源。
    当编译Neutal程序集时,可以通过一个特殊的属性为它指定默认的Cultual 资源。如,在assemblyInfo.vb中加入:
None.gif < Assembly : System.Resources.NeutralResourcesLanguage( " en " ) >
None.gif
None.gif
    当如此指定时,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的内容。    

 

 




   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值