ASP.NET 2.0 本地化入门指南






4.73/5 (16投票s)
2006年10月16日
9分钟阅读

169944

2880
本文介绍了一种通过在 ASP.NET 2.0 应用程序(Visual Basic 2005)中使用资源字符串来实现本地化的快速简便方法。
引言
本文介绍了一种通过在 ASP.NET 2.0 应用程序(Visual Basic 2005)中使用资源字符串来实现本地化的快速简便方法。本文和代码示例并非完全代表 .NET 框架提供的工具和结构在应用程序本地化方面可以实现的所有功能,但是,如果您从未接触过本地化,本文旨在作为该主题的入门介绍。
2005 年的本地化支持令人印象深刻;凭借提供的支持,可以自动检测用户的区域设置,并根据检测结果响应适当格式的日期、货币和其他数字值、正确配置的控件(例如,日历控件显示当前和已检测区域设置的正确月份和日期文本)等。
本应用程序仅专注于使用本地化字符串根据用户选择的区域设置替换网页上的文本。尽管这绝非本地化的终极解决方案,但它是一个不错的起点,通过本文介绍的方法,读者将能够根据用户选择的特定区域设置来翻译网页。
演示应用程序将尝试向读者展示如何使用其他区域设置的字符串替换 Web 应用程序中使用的字符串;这完全通过托管资源和用户选择的区域设置信息来处理。此演示可在运行时将标签控件中包含的六个不同的占位符字符串翻译成英语、法语、德语或西班牙语。请参阅图 1 和图 2 的屏幕截图示例,了解 Web 应用程序的使用情况。
图 1: 示例 Web 应用程序(英语字符串)
图 2: 示例 Web 应用程序(德语字符串)
入门
首先,解压缩下载的文件并打开提供的项目。在项目中,您会发现一个用 VB.NET 编写的简单 ASP.NET 2.0 应用程序;该 Web 应用程序包含一个单独的网页(Default.aspx)。该网页没有任何其他目的,只是为了演示基于资源的本地化使用。除了 Default.aspx 页面,您会注意到项目中添加了几个文件夹;一个是 App_GlobalResources 文件夹,另一个是 graphics 文件夹。
graphics 文件夹包含四个图标:一个德国国旗 GIF、一个西班牙国旗 GIF、一个法国国旗 GIF 和一个美国国旗 GIF。这些图标用作应用程序中图像按钮的图像,该图像按钮用于将页面的区域设置信息设置为正确的区域设置。国旗图标来自一个 公共网站。这些图标是马克·詹姆斯(Mark James,来自伯明翰,一位居住在英国的开发人员)的作品,他免费提供了一系列非常高质量的图标(这在我看来无疑使其更具吸引力)。如果您需要国旗图标或其他图标,我强烈推荐访问这位先生的网站。
App_GlobalResources 文件夹用于包含资源文件,这些文件又包含本地化字符串。文件名是特定的且有意为之;为了从正确的资源文件中捕获正确的字符串,文件名的命名应遵循所示的格式。例如,如果您想在文件中添加加拿大法语字符串,您应该计划创建一个 Strings.fr-CA.resx 文件,并与图 3 中显示的对照。
图 3: IDE 解决方案资源管理器中的项目
此时,在 IIS 中创建一个虚拟目录,并将其指向此 Web 应用程序,然后用 Visual Studio 2005 打开项目。
代码:Default.aspx
在 2005 IDE 中打开 default.aspx 页面,在文件开头,您会注意到已添加了一些导入语句
Imports System
Imports System.Globalization
Imports System.Threading
Imports System.Resources
Imports System.Reflection
添加的导入语句对于支持应用程序中使用的区域设置信息和资源文件是必要的。实际上,System 导入不是必需的,但其他导入对于任务至关重要,您将在检查默认类中剩余代码时注意到它们的使用。
类的声明符合默认配置;未进行修改,您会注意到类继承自 page 类。
Partial Class _Default
Inherits System.Web.UI.Page
Private rm As ResourceManager
紧跟在类声明之后,创建了一个 ResourceManager
类的实例。通过资源管理器,应用程序可以与应用程序资源(App_GlobalResources 文件夹中包含的资源字符串文件)的内容进行交互。ResourceManager
的声明仅为在该位置提供窗体范围的对象;您会注意到它在此位置未声明为“New
”。
接下来是 Page Load 事件处理程序;代码如下
Protected Sub Page_Load(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Me.Load
Dim ci As CultureInfo
If Not Page.IsPostBack Then
Thread.CurrentThread.CurrentCulture = New CultureInfo("en-US")
'get the culture info to set the language
rm = New ResourceManager("Resources.Strings", _
System.Reflection.Assembly.Load("App_GlobalResources"))
ci = Thread.CurrentThread.CurrentCulture
LoadStrings(ci)
Else
'get the culture info to set the language
rm = New ResourceManager("Resources.Strings", _
System.Reflection.Assembly.Load("App_GlobalResources"))
ci = Thread.CurrentThread.CurrentCulture
LoadStrings(ci)
End If
End Sub
您会注意到,在页面加载事件期间,第一件事是声明 CultureInfo
类的实例。区域设置信息类实例用于包含当前用户的区域设置。此值可以设置为通过自动检测填充,但由于我没有准备好处理所有可能的语言,因此我选择手动将初始区域设置设置为美国英语,定义为“en-US”;我选择此作为默认设置仅仅因为我住在 US;对于可能在其他地方使用的页面,或者在我不确定适当的区域设置的应用实例中,我更有可能自动选择该值和/或应用更合适的默认区域设置。if 语句只是检查页面是否是回发,如果不是,则手动将区域设置信息对象设置为代表美国英语。
默认区域设置的选择在紧跟在区域设置信息类实例声明之后的 if 语句中管理。if 语句内的第一行将当前线程的区域设置配置为美国英语。
接下来要处理的是资源管理器;此处声明了一个新的资源管理器实例,通过反射,它被允许加载 App_GlobalResources 文件夹中包含的字符串资源。
接下来,将区域设置对象设置为匹配当前线程的区域设置(之前已设置为美国英语)。
最后,在声明和配置了所有区域设置信息后,将区域设置信息传递给一个名为“LoadStrings
”的子例程,该子例程从适当的资源字符串文件中(基于区域设置信息)收集字符串值,并设置演示中使用到的六个标签的文本。
如果页面之前已加载,则当前区域设置将保持不变,区域设置变量设置为当前线程的区域设置,并且字符串将根据当前区域设置加载。if 语句的这一部分是必需的,以允许用户更改区域设置信息而不覆盖其在页面加载时的设置。
在页面加载事件处理程序之后,类中的下一项用于从适当的资源文件中捕获正确的字符串。这通过一个名为“LoadStrings
”的子例程进行管理。此子例程将当前区域设置作为参数传递,该区域设置用于在页面加载时指示资源管理器从哪个字符串资源文件中获取请求的字符串。子例程使用资源管理器捕获每个字符串,然后返回的字符串用于填充演示应用程序中包含的六个标签的 Text
属性。“LoadStrings
”子例程的代码如下
Private Sub LoadStrings(ByVal ci As CultureInfo)
lbl1.Text = rm.GetString("BirdInfo", ci)
lbl2.Text = rm.GetString("CatInfo", ci)
lbl3.Text = rm.GetString("DogInfo", ci)
lbl4.Text = rm.GetString("TravelInfo", ci)
lbl5.Text = rm.GetString("WaterInfo", ci)
lbl6.Text = rm.GetString("WeatherInfo", ci)
End Sub
演示中的最后一段代码用于支持用于手动设置区域设置信息的图像按钮的单击事件处理程序。此演示中有四个单击事件处理程序,分别对应美国英语、德语、法语和西班牙语。由于它们基本相同,我只在此文章中展示一个,您可以查看其他内容以注意它们之间的差异。
这是法国图像按钮单击事件处理程序的代码
Protected Sub ibtFrance_Click(ByVal sender As Object, _
ByVal e As System.Web.UI.ImageClickEventArgs) _
Handles ibtFrance.Click
Thread.CurrentThread.CurrentCulture = New CultureInfo("fr-FR")
LoadStrings(Thread.CurrentThread.CurrentCulture)
End Sub
您会注意到,单击事件处理程序(在演示 Web 应用程序中由法国国旗图标表示)将当前线程的区域设置设置为“fr-FR”(法语,而不是像 fr-CA 的加拿大法语)。设置区域设置后,将再次调用“LoadStrings
”子例程,并将当前区域设置(现设置为 fr-FR)传递给它。
资源文件
每个资源字符串文件包含相同的字符串标识符列表,但对于每个已标识的字符串,其值根据语言而变化。
英语字符串按图 4 列出,例如,西班牙语字符串的等效项显示在图 5 中。如果您比较这两个资源文件,您会注意到每个字符串的 name 属性相同,但 value 属性不同。当区域设置设置为英语时,将收集第一个文件中的字符串并用于设置标签文本。如果区域设置设置为西班牙语,将收集第二个文件(图 5)中的字符串并用于设置标签文本。
这与应用程序的编码无关,但有许多有用的软件包和网站可以帮助您将字符串从一种语言翻译成另一种语言。其中一个网站是 Alta Vista Babel fish 网站(图 6)。该网站可免费使用,我曾询问过其他语言的使用者,他们对从英语翻译的准确性表示,通常都相当不错。当然,如果您正在专业地开发某项内容,您可能希望聘请翻译来确保您的翻译准确且能被用户接受。
图 4: 英语字符串
图 5: 西班牙语字符串的等效项
图 6: Alta Vista Babel Fish 翻译网站(实际上很有趣)
顺便说一下,如果演示项目中的任何翻译具有冒犯性或不正确,请将其归咎于 Babel Fish,因为事实上我就是用它将演示中使用的所有字符串从英语翻译成其他语言的。
摘要
此演示和文章的目的是通过使用支持多种语言的字符串资源文件来简要介绍本地化。正如引言中所述,本示例绝非对该主题的完整而详尽的讨论,但它是一个关于本地化最重要的一个方面的一个良好介绍。此演示仅展示了几个标签的文本;同样的方法可以应用于设置按钮控件中的文本、列表框或下拉列表的内容、页面标题以及任何其他可能用于显示某种文本的控件。