在ASP.NET中使用全球化和本地化






4.65/5 (33投票s)
全球化和本地化在ASP.NET中是如何工作的
引言
本文旨在帮助理解全球化和本地化在ASP.NET中是如何工作的。
背景
几天前,我看到一个电视广告说“即使是最小的企业也能走向国际化”。这对于软件行业来说尤其真实,因为那些在自家小房间里运营的公司可以为全球另一端的用户提供服务。
如果我们希望我们的网站能够满足全球用户的需求,那么理解并在我们的应用程序中实现全球化
和本地化
可能是一个好主意。ASP.NET框架通过提供大量的样板功能,使开发人员能够轻松实现这些功能。
在开始之前,让我们先理清这两个术语。全球化
是指以一种能够被全球用户(多种文化)使用的应用程序的方式进行设计。而本地化
则是我们为了让应用程序能够根据当前的文化和地区进行定制化设置的过程。这两者是相辅相成的。
理解资源文件
想象一下,我们有一个网页,里面有很多标签和文本。如果没有ASP.NET全球化机制,如果我想根据当前地区显示这些标签和文本,我可能会陷入大量的switch
语句或if
语句。准确地说,为每种支持的语言都写一个case。现在,这种技术或许可行,但它耗时、容易出错,有时还会让开发者感到沮丧。
为了避免编写这样的代码,ASP.NET提供了资源
文件。资源文件就像一个中央存储库,我们可以把所有的文本都放在里面,网页可以简单地读取这个资源文件并填充各自的标签。这里的妙处在于,如果我们想支持多种语言,我们可以为每种语言准备一个单独的资源文件(包含相应语言的文本),在运行时,ASP.NET引擎会根据用户的地区和文化选择正确的资源文件。
有两种类型的资源
- 本地资源
- 全局资源
本地资源是页面特定的资源,也就是说,每个页面都会有一个本地资源文件。全局资源则是整个网站通用的资源,也就是说,一个资源文件可以被所有页面访问(也可以有多个全局资源文件)。
Using the Code
现在,让我们创建一个测试网页,我们将用它来理解。我们有一个简单的页面,它使用Label
控件显示一个欢迎消息,一个label
指示当前日期,最后还有一个label
用于显示今天的日期。

现在,我是在设计时填充这些标签,但如果我想支持多种文化,我将不得不从本地资源文件中获取它们。Visual Studio提供了从给定网页创建本地资源文件的机制。这可以通过在设计视图中查看页面,然后选择“工具->生成本地资源”
来完成。这将创建一个App_LocalResources文件夹,为该页面生成一个本地资源文件,并开始从该资源文件中获取所有标签的文本值。(所有本地资源文件都位于App_LocalResources中,所有全局资源文件都位于App_GlobalResources文件夹中。

如果我们查看资源文件,它包含了页面中所有控件的文本。

页面中的控件现在正在使用资源文件来获取其内容
<asp:Label ID="lblWelcome" runat="server" meta:resourcekey="lblWelcomeResource1">
</asp:Label>
现在,我们需要为这个页面创建本地资源文件,以便页面能够根据当前用户的文化从相应的文件中获取文本。对于一个页面的多个资源文件的格式是:PageName.aspx.languageId-cultureId.resx。如果找不到任何语言-文化组合的资源文件,将使用默认资源文件。
如果我们想以印地语-印度语显示此网页,我们需要一个资源文件Default.aspx.hi-in.resx。

现在如果我们运行页面,我们不会看到任何变化来测试这些更改。为了测试更改,我们需要将浏览器的默认语言设置为印地语-印度语
。我为我的IE浏览器这样设置了。

现在,当我们运行页面时,ASP.NET会检测到用户设置指定语言和地区分别为印地语和印度语,因此它开始从我们新创建的资源文件中提取文本。如果我为西班牙语执行相同的过程,由于不存在西班牙语的资源文件,将使用默认资源文件。如果我们希望支持西班牙语,那么我们需要为西班牙语创建一个单独的资源文件。

但是,依赖用户的浏览器和系统设置来获取特定文化的信息并不是一个好主意。最好总是为用户提供一个选项,让他们可以在网站上更改语言和文化。所以,让我们提供一个下拉列表,让他们可以选择当前的语言。
为了实现这一点,我们需要做的是重写InitializeCulture
函数,并将UICulture
设置为用户选择的语言。
protected override void InitializeCulture()
{
if (Request.Form["DropDownList1"] != null)
{
UICulture = Request.Form["DropDownList1"];
}
base.InitializeCulture();
}
这将使用户能够动态切换语言。但有一个地方值得注意,我用红色圈起来了。UI显示的是印地语,但日期格式不是印度格式。要做到这一点,我们需要将Culture
设置为选定的文化,以便日期、货币和其他地区特定格式的设置也能生效。
protected override void InitializeCulture()
{
if (Request.Form["DropDownList1"] != null)
{
//for UI elements
UICulture = Request.Form["DropDownList1"];
//for region specific formatting
Culture = Request.Form["DropDownList1"];
}
base.InitializeCulture();
}
现在我们有一个小型网页,能够以英语和印地语显示。总结来说,重要的是要理解资源文件是实现全球化和本地化的关键。全局资源文件包含网站所有页面共有的文本,任何页面的任何控件都可以绑定到它。本地资源文件是页面特定的。我们需要为每种支持的文化提供单独的资源文件。最好也要有一个默认的资源文件。最后,我们绝不应该依赖用户的浏览器设置,而应该在我们的网站上提供“语言/文化更改”选项。
关注点
当我们将网站面向多种文化时,有一些重要的事情需要理解。当我们面向多种文化时,我们不能假设网页的结构和布局。这些事情之所以重要,是因为即使是很小的英文文本,在其他语言中的翻译也可能非常冗长。因此,在实现全球化时,始终遵循标准指南是一个好主意。
- 控件不使用绝对定位
- 使用响应式布局和表单
- 控件不使用绝对大小
- 尝试在表格中排列控件
我认为,经过这次练习,我们现在可以开始着手全球化任何网站了。实现这些功能确实需要时间,但ASP.NET通过提供一些“必须一直拥有”的功能,大大减轻了开发者的负担。
历史
- 2012年2月23日:在ASP.NET中使用全球化和本地化