梦想与现实的落差,就是我们离成功的距离!!

博客园 首页 新随笔 联系 订阅 管理

 原文地址:http://msdn.microsoft.com/msdnmag/issues/06/05/basicinstincts/default.aspx#contents#contents                 
资源与本地化(一):http://sifang2004.cnblogs.com/archive/2006/05/16/401641.html
                     资源与本地化(二)

Visual Studio 2005中的资源文件

现在我开始把实现转移至在基于Windows Form的应用程序中使用资源文件。许多我解释的概念将也将同样应用在类库DLL中使用资源文件。Visual Studio 2005通过提供一个可视化编辑器使得处理资源文件更加容易。使用增加新项(Add New Item命令并选择资源文件(Resource file你可以新建一个资源文件,如4所示。


Figure 4 New Item Template for Adding Resource Files

一旦你向工程中添加了一个资源文件,就没有必要在一个.resx文件中直接以需要的XML格式进行处理,Visual Studio提供了一个友好的可视化资源设计器,如图5所示。该资源文件设计器使得增加和维护字符串或者其它基于文件的资源类型例如XML文档。


Figure 5 Visual Studio Resource Editor

当你编译一个包含资源文件的的工程时,Visual Studio .resx文件编译成一个.resource文件,并且在作为输出结果的程序集的物理映像内部连接该.resource文件。这意味着所有在编译资源文件和把它嵌入目标程序集的映像涉及到的细节,都被Visual Studio处理了。

Visual Studio也编译强类并使用在Visual Basic 2005中引入的My名称空间把它在Visual Basic工程中公开。这意味你能从中受益,因为有.NET ResourceManager类加载你的资源,然而你从来不必直接针对该类进行编程。例如,如果你想访问你已经加入LitwareString.resx的资源字符串,只要简单地写下如下代码:

Sub Main_Load(sender As Object, e As EventArgs)

  Handles MyBase.Load

  Me.Text = _

    My.Resources.LitwareStrings.MainFormCaption

  Me.lblUserWelcome.Text = _

    My.Resources.LitwareStrings.UserWelcome

End Sub

工程级别资源文件

虽然你能够显式地向一个Visual Studio工程中添加一个或更多资源文件,但是通常这是没有必要的,因为每次创建一个新的工程时Visual Studio自动包含了一个工程级别的资源文件。这个工程级别的资源文件能够在Visual Studio编辑器中通过工程属性对话框来访问。

当你想从工程级别的资源文件中访问例如字符串的资源,你能直接从My.Resource类中访问:

Private Sub LoadResources()

  '*** load project-level resources

  Me.Text = My.Resources.MainFormCaption

  Me.lblWelcomeMessage.Text = My.Resources.UserWelcome

End Sub

如你所见,使用强类型资源类从一个资源文件中访问字符串是相当容易的,当你已经向一个资源文件中添加了图片映像和包含诸如XML,SQL,还有JavaScript之类的文件时,你可以让事情更进一步得到同样的强类型访问这种基于文件的资源。例如,假设你已经向你的工程级别的资源文件中添加了名称为LitwareLogo.png的图片文件和名称为Customers.xmlXML文件。这些资源将被自动嵌入工程输出的程序集中并且你能以一种强类型的方式访问他们,代码如下:

Me.picLogo.Image = My.Resources.LitwareLogo

Dim xmlDoc As New Xml.XmlDocument

xmlDoc.LoadXml(My.Resources.Customers)

你可以观察到,强类型资源类自动把一个.png文件转换成一个Image对象,该对象能被直接加载入一个PictureBox控件。这个强类型资源类也能把嵌入的XML文件转换成一个字符串,该字符串能被轻易地加载入一个XmlDocument对象。

文化设置和本地化

对于软件工程来说本地化是一个普通的要求,这些软件就能被说不同语言的人使用。例如,想像你正使用Visual BaiscVisual Studio开发Litware Customer Manager 应用程序,要求你为那些使用英语、法语、用户写本地化版本。非常幸运,Microsoft .NET框架与Visual Studio有许多特性把本地化应用程序和类库DLL连接起来。

当你是第一次设计和编写需要支持本地化的基于.NET的软件工程,你应该很快的熟悉CultureInfo类,该类定义在System.Globalization名称空间下。一个CultureInfo对象追踪一个文化名称以便识别一种使用的语言。

对英文来说,文化名称为“en”,而法语是“fr”。一个CultureInfo对象的文化名称也能携带附加的信息,用来识别一个特殊的地区,例如“en-US”就是美国英语,“en-GB”就是英国英语,“fr-BE”比利时法语。这儿有个例子,新建和使用合法的文化名称初始化一个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对象表示当前的文化,而第二个CultureInfo对象表示现在的UI文化,你能够为每个CultureInfo对象指定文化名称,代码如下:

'*** 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)

第一个CultureInfo对象被认为是CurrentCulture,在程序中没有用来本地化字符串。然而,它影响.NET框架怎样格式化日期,数字,货币。例如,如果你在后台把CurrentCulture对象改成en-US,而前台是en-GB,这将导致奇怪的单边影响,例如单个货币值变成了在后台是美国美元($100.00,而在前台却是英国英镑($100.00)。如你所见,对货币转换货币格式会导致错误的结果,由于这个原因,通常的实践就是即使在你为不同语言本地化你应用程序时也要保持CurrentCulture为静态。

如果你确认,你的确需要通过编程改变CurrentCulture,你应该记住必需使用一个包含区域标识的文化名称。你可以使用这样的名称en-US,EN-GB,或者fr-BE。然而,如果你试图改变CurrentCulture,使它有像en或者fr这样的文化名称,你将收到一个运行时错误,因为没有区域信息使得格式需求变得太不明确了。

第二个被当作CurrentUICultureCultureInfoThe对象对于.NET程序本地化的讨论是更加重要的。对与当前线程相关的CurrentUICultre的修改,会影响.NET框架和ResourceManager类如何加载包含嵌入资源的程序集。特别是它对加载针对当前用户首选的语言已做了本地化的一组资源时有影响。

为了开始本地化工作,你为资源文件做了多份拷贝,每份拷贝针对你想支持的某种语言。例如,从产生名称为Resource.resx的工程范围的资源文件并产生一份拷贝开始,你能在Visual Studio资源浏览器中简单地拷贝-粘贴操作就可以完成。

一旦你已经拷贝了例如Resource.resx资源文件,仅仅通过在.resx扩展名前加上文化名称,就可以重命名这资源副本。如图6所示。例如,你应该把针对一般的法语本地化字符串的资源文件命名为Resource.fr.resx。而针对比利时特殊本地化的法语字符串的资源文件命名为Resource.fr-BE.resx


Figure 6 Separate Resource Files for Each Language

未完待续

posted on 2006-05-17 18:23  叶漂  阅读(1805)  评论(3编辑  收藏  举报