在 ASP.NET 中使用本地化
概述了在 ASP.NET 中实现本地化的两种有用方法
本文最初发布在我的博客上。
如果您最近设计、开发或处理过网站,您可能已经接触过本地化这个话题。在本文中,我将向您展示如何在 Visual Studio .NET 项目中实现本地化。
我们中的大多数人一想到要根据不同语言定制页面就会望而却步。本地化的难点在于,当然是翻译本身。然而,翻译静态标签和网站内容可以很简单,只需让您的用户群来帮忙。好消息是,一旦您解决了这个问题,实现起来就很容易了!
在本文中,我将重点介绍在您的 .NET 项目中实现本地化的两种方法(以及如何让用户选择)。第一种方法是“简单”的方法,但对于大型网站来说,长期来看可能会显得很麻烦。第二种方法是通过分组和缩小需要处理的文件数量。没有哪种方法是最好的,我将留给您决定哪种方法更适合您的项目。
方法 1:使用生成的资源文件
Visual Studio .NET 通过其设计器和工具使本地化变得容易。让我们看看它是如何实现的。
首先,创建一个新的网站项目。

我使用的是 Visual Studio .NET 2008,但无论您使用哪个版本,操作都类似。
然后,设计一个相当简单的网页,包含几个标签控件和一个按钮控件。一个标签将是本地化的文本标签,另一个将显示我们当前设置的区域性。按钮将允许我们切换到预定义的区域性。

现在,转到“工具”并单击“生成本地资源”。这将在 App_LocalResources 文件夹中为您的网页创建一个相应的 Default.aspx.resx 资源文件。如果您向页面添加了更多控件,则必须再次生成本地资源。注意:从页面中删除的控件仍会显示在资源文件中。请务必清理资源文件,如果您删除了控件。

如果您注意到,在 Default.aspx 文件的源代码中,为您的控件添加了 meta:resourcekey
属性。属性值对应于资源文件中的控件名称(例如,meta:resourcekey="Label1Resource1"
对应于 Default.aspx.resx 文件中的“Label1Resource1”及其所有属性)。

既然我们已经生成了资源文件,就可以继续创建本地化资源文件了。有关接受的区域性列表,请参阅此列表。您可以按页面或全局方式本地化您的项目。有关更多信息,请参阅 MSDN 的如何:设置 ASP.NET 网页本地化的区域性和 UI 区域性。
我们将按页面进行本地化。在 Page 指令中,更改以下属性(从默认的“auto”):UICulture="es" culture="es-MX"
。我们将以西班牙语作为测试区域性。您的 Page 指令应该看起来像这样
<%@ Page Language="VB" AutoEventWireup="false"
CodeFile="Default.aspx.vb" Inherits="_Default" culture="es-MX"
meta:resourcekey="PageResource1" uiculture="es" %>
现在,让我们进行本地化!右键单击 Default.aspx.resx 并复制它。将其粘贴到同一文件夹中,并将其重命名为 Default.aspx.es.resx。将 Label1Resource1.Text 更改为“A localized string in Espanol”。

让我们看看会发生什么。右键单击 Default.aspx 并单击“在浏览器中查看”。瞧!我们可以看到标签的文本已更改为西班牙语本地化文本。

请记住,您也可以使用 Web.Config 或 Page
方法根据浏览器的设置来设置区域性。但也要意识到,大多数人不会设置它,或者可能没有正确的设置。这就是为什么我们需要一种方法让用户选择设置的语言。让我们创建一个按钮,通过编程方式将区域性改回美式英语并显示它。
双击设计器中的页面背景,创建一个 Page_OnLoad
事件。在事件方法中,输入以下代码
Protected Overrides Sub InitializeCulture()
If Request.Form("Button1") IsNot Nothing Then
Dim selectedLanguage As String = "en-US"
UICulture = selectedLanguage
Culture = selectedLanguage
Thread.CurrentThread.CurrentCulture = _
CultureInfo.CreateSpecificCulture(selectedLanguage)
Thread.CurrentThread.CurrentUICulture = New _
CultureInfo(selectedLanguage)
End If
MyBase.InitializeCulture()
End Sub
确保导入 System.Globalization
和 System.Threading
。让我们看看现在会发生什么。再次运行您的项目,您会看到标签显示“Español (México)”。现在单击“更改区域性”。您会看到它显示“English (United States)”。注意:我通过资源文件将我的标签更改为显示“English label”。
恭喜!您刚刚学会了如何使用 VS.NET 内置的“生成本地资源”工具来创建本地化网站。
现在,让我们看一下略有不同的方法。
方法 2:使用全局资源文件
如果您和我一样,文件越少越好管理。这就是为什么我深入挖掘并发现了如何只使用一个资源文件来本地化我的网站。这在短期内需要更多工作,但在长期内会减少工作量。让我们开始吧。在我们的项目中创建一个名为 GlobalExample.aspx 的新页面。将其设置为看起来像我们之前的页面。

现在,右键单击您的项目,转到“添加 ASP.NET 文件夹”,然后是 App_GlobalResources。创建一个名为 Lang.resx 的新文件。

我们创建了一个新的资源文件,它将存储我们所有的语言字符串。让我们添加一些。例如:
LBL_LOCALIZED_TXT,值为“A global localized English string”

现在回到 GlobalExample.aspx 并查看源代码。对于 Label1 的 Text 属性,键入 <%$ Resources: Lang, LBL_LOCALIZED_TXT %>
。它看起来应该像这样
<asp:label id="Label1" runat="server"
text="<%$ Resources: Lang, LBL_LOCALIZED_TXT %>" />
这里我使用了一个超级秘密的强大简写来引用我们的 Lang 资源文件。如果您想以编程方式实现相同的功能,请在代码视图中键入此内容
Label1.Text = Resources.Lang.LBL_LOCALIZED_TXT
是不是很不错?强类型资源文件可以非常轻松地以编程方式向控件添加文本。理论上,您可以创建一个包含所有控件 ID 及其相应资源字符串名称的数组,并将它们的值分配给它们(例如,一个名为“lblTextInfo”的标签和一个资源字符串条目“lblTextInfo”)
Label1.Text = _
Resources.Lang.ResourceManager.GetString(Label1.ID)
如果您在 Web 浏览器中查看 GlobalExample.aspx,您会看到它工作得很好。现在,让我们进行本地化!
像之前一样创建 Lang.resx 的副本,并将其重命名为 Lang.es.resx。为我们的标签字符串键入其他内容。回到 GlobalExample.aspx 并添加两个 Page 指令:UICulture="es"
和 Culture="es-MX"
。在浏览器中查看页面。瞧!我们使用了一个独立的资源文件作为本地化字符串的容器。
现在,让我们看看如何像上一个示例一样切换。这是最好的部分。将 Default.aspx.vb 中的 Page_Load
和 InitializeCulture
例程复制并粘贴到 GlobalExample.aspx.vb 中(记住导入 System.Globalization
和 System.Threading
)并运行项目!
Protected Overrides Sub InitializeCulture()
If Request.Form("Button1") IsNot Nothing Then
Dim selectedLanguage As String = "en-US"
UICulture = selectedLanguage
Culture = selectedLanguage
Thread.CurrentThread.CurrentCulture = _
CultureInfo.CreateSpecificCulture(selectedLanguage)
Thread.CurrentThread.CurrentUICulture = New _
CultureInfo(selectedLanguage)
End If
MyBase.InitializeCulture()
End Sub
Protected Sub Page_Load(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Me.Load
Dim c As CultureInfo = CultureInfo.CurrentCulture
lblCulture.Text = c.NativeName
End Sub
您会看到一切都像上一个示例一样工作。此方法唯一的区别是我们有一个资源文件来保存我们所有的文本字符串。也许您想对其进行组织,并创建不同类型的文本资源文件,例如“Links”和“Labels”;可能性是无限的。


最终想法
我们学到了什么?我们了解了
- 使用资源文件
- 更改网页或网站的区域性
- 以编程方式访问资源文件
- 以编程方式更改当前区域性
那么哪种方法更好呢?在我的一家网站上,我使用方法 2。我父亲在他的工作项目中使用了方法 1,并且对结果非常满意。我不提倡一种方法优于另一种方法,这完全取决于您。也许您有一个小型项目,所以快速生成资源文件就可以了。
祝您编码愉快,如果您有任何建议或意见,请随时评论!