ASP.NET 本地化 (快速参考)






4.91/5 (28投票s)
本文档为您提供 ASP.NET 页面上常用内容的本地化快速参考,包括 ASP.NET 服务器控件、HTML 内容、站点地图和其他资源。
引言
有很多关于 ASP.NET 本地化的文章。本文档不会深入探讨 ASP.NET 本地化。相反,它将为您提供 ASP.NET 页面上常用内容的本地化快速参考,包括 ASP.NET 服务器控件、HTML 内容、站点地图和其他资源。
目录
使用代码
如何本地化 ASP.NET 服务器控件?
ASP.NET 服务器控件本地化是最简单的。一旦将服务器控件添加到页面,就可以简单地将页面切换到“设计”模式,然后转到菜单“工具”->“生成本地资源”。
它将为页面上的每个 ASP.NET 服务器控件生成一个资源字符串。在此示例中,创建了一个名为Default.aspx.resx的文件。它包含我们Default.aspx页面的所有资源名称/值对。
切换回源代码窗格,您将看到它在 HTML 中添加了一些如下所示的代码
<asp:Button ID="Button1" runat="server" Text="Hello"
meta:resourcekey="Button1Resource1" />
然后,您可以复制/粘贴该代码来为其他区域设置创建资源文件。例如,您可以为法国用户创建Default.aspx.fr.resx。
以下截图是在 Internet Explorer 中将语言设置为英语时的情况。
通过转到 Internet Explorer->工具->Internet 选项->语言来将语言更改为法语。
这是法语版本的页面
如何本地化 HTML 内容?
要本地化常规 HTML 内容,您可以使用<asp:Localize>控件。让我们用一个例子来解释。
您的页面中有一个标题和一个段落。
<h1>Localization Page Header</h1>
<p>This is a demo page to show you how to do localization in ASP.NET</p>
要本地化它,您需要向它们添加<asp:Localize>。
<h1><asp:Localize ID="Header" runat="server">Localization Page Header</asp:Localize></h1>
<p><asp:Localize ID="Localize1" runat="server">This is a demo
page to show you how to do localization in ASP.NET</asp:Localize></p>
然后,您可以手动创建资源文件并向页面添加meta:resourcekey="HeaderResource1”
。或者,您可以利用 Visual Studio 自动生成它。将页面切换到“设计”模式。转到菜单“工具”->“生成本地资源”。
它将为您生成以下代码和资源文件(即yourfile.aspx.resx)。
这是它更改的代码
<h1><asp:Localize ID="Header" runat="server"
meta:resourcekey="HeaderResource1"
Text="Localization Page Header"></asp:Localize></h1>
<p><asp:Localize ID="Localize1" runat="server"
meta:resourcekey="Localize1Resource1" Text="This is a demo page to show you
how to do localization in ASP.NET"></asp:Localize></p>
其余步骤与本地化 ASP.NET 服务器控件的步骤相同。
如何本地化站点地图?
本文档将为您提供有关站点地图本地化的更多详细信息。
- 通过将
enableLocalization="true"
添加到站点地图文件(例如,Web.sitemap文件)来启用站点地图本地化。<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" enableLocalization="true">
- 使用以下格式将要本地化的属性值更改为
siteMapNode
中的资源字符串:“$resources:ClassName,KeyName,DefaultValue”。<siteMapNode url="Default.aspx" title="$resources:SiteMapLocalizations,HomePageTitle" description="$resources:SiteMapLocalizations,HomePageDescription">
- 添加全局资源文件夹和文件。在解决方案资源管理器中右键单击网站。单击“添加 ASP.NET 文件夹”。从子菜单中选择“添加 App_GlobalResources”。这将为您的根目录添加一个“App_GlobalResources”文件夹。
然后,添加一个资源文件,例如SiteMapLocalizations.resx。在该文件中,您将为每个资源字符串拥有一个名称/值对。例如
Name Value HomePageTitle Home
- 为每个可能的区域设置创建一个资源文件。例如,您可能有一个名为SiteMapLocalizations.fr.resx的文件用于法语。
下面是菜单在英语和法语中的截图
如何以编程方式本地化字符串?
有时您需要在运行时显示字符串,例如错误消息。您需要以编程方式将其本地化。以下是实现方法
- 在App_GlobalResources文件夹下添加一个资源文件。在此示例中,我们添加了一个名为“CommonResource.resx”的文件以及一个法语版本“CommonResource.fr.resx”。
- 感谢 Alexander Nesterenko 的评论。还有许多其他更好的方法来获取资源字符串。
“您应该通过以下方式从~\App_GlobalResources\MyMessages.resx获取资源:”
- 生成的代码包装器 -
string message = Resources.MyMessages.Hello;
- 资源表达式 -
<asp:Label Text="<%$ Resources: MyMessages, Hello %>" />
- 方法
GetGlobalResourceObject
-
string message = GetGlobalResourceObject("MyMessages", "Hello");
“您应该通过以下方式从~\App_LocalResources\default.aspx.resx获取资源:”
- 资源表达式 -
<asp:Label Text="<%$ Resources: Hello %>" />
- meta:resourceKey -
<asp:Label meta:resourceKey="labelResourceKey" />
- 方法 GetLocalResourceObject -
string message = GetLocalResourceObject("Hello"); "
- 生成的代码包装器 -
以下是截图
如何动态更改区域设置?
在示例代码中,我们添加了两个 LinkButton
。单击“English”时,页面将切换到英语区域设置;单击“Français”时,将切换到法语。为了检测单击的是哪个链接按钮,我们使用了Request.Form[“__EventTarget”]
。它有效,但可能不是最好的方法。
我们覆盖了页面的“InitializeCulture
”方法,以便它根据我们的选择显示正确的区域设置。
HTML 代码
<asp:LinkButton ID="LanguageEnglish" Text="English" runat="server"></asp:LinkButton>
<asp:LinkButton ID="LanguageFrench" Text="Français" runat="server"></asp:LinkButton>
ASP.NET 代码
protected override void InitializeCulture()
{
string language = Request.Form["__EventTarget"];
string languageId = "";
if (!string.IsNullOrEmpty(language))
{
if (language.EndsWith("French"))
languageId = "fr-FR";
else languageId = "en-US";
Thread.CurrentThread.CurrentCulture =
CultureInfo.CreateSpecificCulture(languageId);
Thread.CurrentThread.CurrentUICulture = new CultureInfo(languageId);
}
base.InitializeCulture();
}
这适用于除菜单之外的所有内容。如果您在页面中使用站点地图创建菜单,则可能需要在Page_Load
事件中调用menu.DataBind()
,或者将EnableViewState
设置为false
。否则,您的菜单仍将显示之前的区域设置字符串,而其他内容会更改为新的区域设置。
当我们动态更改区域设置时,我们最有可能需要将其存储在某个地方,以免我们在页面之间跳转时丢失。在示例应用程序中,我们使用 Session 来实现此目的。
编程愉快!