Globalization and localization in ASP.NET Framework
Globalization and Localization
Globalization指将应用程序设计为支持多个语言和文化的过程,Localization则意为将已经Globalization的应用程序设置为特定区域输出的过程。例如将应用程序的输出字符和UI都使用资源文件进行配置,可输出多个不同语言则应用程序已经准备好全球化过程,而根据浏览器语言或者Cookie设置获取特定的区域语言则称之为本地化过程。
Best Practices
新建ASP.NET Framework应用程序后,新建App_GlobalResources文件夹并在下面新建三个资源文件:

其中,Resource.resx为基准资源文件,Resource.en-US则为en-US区域对应的资源文件,Resource.zh-CN则为zh-CN区域对应的资源文件,应当说明的是,所有资源文件的字符串Key应当与Resource.resx资源文件中的Key相一致,Value则为对应区域的本地化字符串。
接下来在Resource.resx中新增一个SYSTEM_NAME用来表示当前系统信息,相应的Resource.en-US和Resource.zh-CN也都新增此Key:

这样就完成了资源文件的准备,使用时可以用Resources.Resource.SYSTEM_NAME用来获取所对应的值:
using System;
using System.Web.UI;
namespace LocalizationSolution
{
public partial class _Default : Page
{
protected void Page_Load(object sender, EventArgs e)
{
Console.WriteLine($"Current System Name:{Resources.Resource.SYSTEM_NAME}");
}
}
}
如果需要在.aspx页面中使用,则可以:
<p><%= Resources.Resource.SYSTEM_NAME %></p>
或者
<asp:label Id="label1" Runat="server" Text="<%$ Resources:Resource, SYSTEM_NAME %>" />
接下来需要考虑的一个问题是:如何知道用户的文化区域?这个方式有很多种,我们这里只介绍通过Cookie的方式,只需要在应用程序接收到请求时,从请求的Cookies获取CultureInfo所对应的值用来设置特定的文化区域,如果未获取到,则设置一个默认的文化区域:
public class Global : HttpApplication
{
void Application_Start(object sender, EventArgs e)
{
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
protected void Application_BeginRequest(object sender, EventArgs e)
{
var cultureInfo = Request.Cookies["CultureInfo"]?.Value;
if (string.IsNullOrWhiteSpace(cultureInfo))
{
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en-US");
return;
}
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(cultureInfo);
}
}
Application_BeginRequest方法在应用程序接收到请求时,框架通过反射的方式调用,在这里获取用户的文化区域并设置是再合适不过了。现在,你可以在Default.aspx页面使用本地化语言,然后访问它:


如果你想要在页面使用<%# %>,例如:
<asp:label Id="label2" Runat="server" Text="<%# Resources.Resource.SYSTEM_NAME %>" />
则需要在Default.aspx.cs中使用DataBind()方法:
public partial class _Default : Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
DataBind();
}
Console.WriteLine($"Current System Name:{Resources.Resource.SYSTEM_NAME}");
}
}
再次运行程序访问默认页面:

可以看到已经成功获取到正确的语言区域。