ASP.NET MVC 全球化和本地化入门教程






4.80/5 (44投票s)
在本文中,我们将尝试理解和实现 ASP.NET MVC 中的全球化和本地化。
引言
在本文中,我们将尝试理解和实现 ASP.NET MVC 中的全球化和本地化。
背景
不久前,我看到一个电视广告说:“即使是最小的企业也可以走向国际”。这对于软件行业来说尤其如此,因为在店面运营的团队可以为全球另一端的用户提供服务。
如果我们希望我们的网站设计能够满足全球用户的需求,那么了解和在我们的应用程序中实现全球化和本地化可能是一个好主意。在本文中,我们将尝试了解在 ASP.NET MVC 应用程序中实现全球化和本地化需要做什么。
在开始之前,让我们先弄清楚这两个术语。全球化是设计应用程序以便全球(多文化)用户可以使用它的过程。另一方面,本地化是我们为使我们的应用程序根据当前文化和地区设置运行而进行的自定义过程。这两者是相辅相成的。
注意:本文将重点介绍 ASP.NET MVC 中的全球化和本地化。要了解 ASP.NET Web Forms 中的本地化和全球化,请参阅:在 ASP.NET 中使用全球化和本地化[^]
使用代码
让我们通过尝试开发一个小型示例应用程序来了解如何在 ASP.NET MVC 应用程序中实现全球化和本地化。该应用程序将包含一些静态字符串、一些文本框、按钮以及一些验证错误消息字符串。
首先,让我们在没有任何本地化和全球化支持的情况下实现此应用程序。然后,我们将了解如何实现本地化和全球化。让我们开始创建一个该应用程序的 Demo 模型。
public class Demo
{
public string Name { get; set; }
public int Age { get; set; }
}
现在,让我们添加一些 DataAnnotation
属性来指定 DisplayName
和 ErrorMessage
。
public class Demo
{
[DisplayName("Name")]
[Required(ErrorMessage="Name is Required")]
public string Name { get; set; }
[DisplayName("Age")]
[Required(ErrorMessage = "Age is Required")]
public int Age { get; set; }
}
现在,让我们创建一个简单的控制器,该控制器将有一个简单的创建方法,该方法允许我们将模型数据保存到内存集合中。
public class HomeController : Controller
{
private static List<Demo> list = new List<Demo>();
public ActionResult Index()
{
return View(list);
}
[HttpGet]
public ActionResult Create()
{
return View();
}
[HttpPost]
public ActionResult Create(Demo model)
{
if (ModelState.IsValid)
{
list.Add(model);
return RedirectToAction("Index");
}
return View();
}
}
最后是这个的视图页面。
现在,如果我们运行该应用程序,我们可以看到视图正在内存集合中添加 Demo
模型。
现在,让我们看看在这个应用程序中实现全球化和本地化需要做什么。让我们从识别用户文化需要更改的所有内容开始。
现在,让我们尝试在此应用程序中实现全球化和本地化。当前此应用程序中的问题是所有显示字符串都已硬编码在应用程序中。因此,要实现全球化,我们首先需要将它们以资源的形式外部化,然后使用适当版本的资源,具体取决于所选的文化。
为此,让我们先创建一个包含资源文件的简单类库。
让我们将所有硬编码的字符串放入此类库中的资源文件中。
如果我们希望将这些资源用于多种语言,则需要为每个版本提供单独的资源文件。要拥有印地语(印度)资源,我们需要一个资源文件 Resource.hi-in.resx
。“hi”指定语言,“in”指定地区。我们也可以只为特定语言创建一个资源文件,即不需要地区规范 Resource.hi.resx.
现在我们需要做的是更改我们的应用程序以使用这些资源文件而不是硬编码的值。为此,让我们向此类库添加一个引用,并开始为字符串使用资源文件。因此,我们的模型现在将如下所示:
public class Demo
{
[DisplayName(MyResources.Resources.Name)]
[Required(ErrorMessage=MyResources.Resources.NameRequiredError)]
public string Name { get; set; }
[DisplayName(MyResources.Resources.Age)]
[Required(ErrorMessage = MyResources.Resources.AgeRequiredError)]
public int Age { get; set; }
}
另外,让我们更改视图中的硬编码字符串。
要测试更改,我们需要将浏览器的默认语言设置为印地语(印度)。由于应用程序将检查浏览器的语言偏好设置,然后尝试相应地加载语言和文化。让我们更改 IE 的语言偏好设置。
现在,我们的浏览器已配置为使用 Hi-IN 作为默认语言。我们需要在应用程序中做的最后一件事是拦截浏览器的语言设置,并将当前线程的 CUlture 和 UICulture 值设置为首选语言。这可以在请求生命周期的多个地方完成,在此示例中,我们将其放在 Application_BeginRequest 中。
private void Application_BeginRequest(Object source, EventArgs e)
{
HttpApplication application = (HttpApplication)source;
HttpContext context = application.Context;
string culture = null;
if (context.Request.UserLanguages != null && Request.UserLanguages.Length > 0)
{
culture = Request.UserLanguages[0];
Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(culture);
Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;
}
}
注意:大多数应用程序出于各种原因都有一个应用程序范围的 BaseController。上述代码也可以放在 BaseController
的构造函数中,效果相同。还有一个声明性方法可以通过在 web.config
的 System.web
元素中指定 globalization
元素来达到相同的结果。
<globalization culture="auto" uiCulture="auto" enableClientBasedCulture="true"></globalization>
现在让我们运行应用程序并查看结果。
注意:文本是使用在线工具准确翻译的。所以懂印地语的读者可能会觉得某些 UI 元素有些脱离语境。
现在我们有了一个能够显示英语和印地语的示例 MVC Web 应用程序。总而言之,重要的是要理解资源文件是实现全球化和本地化的关键。始终将所有国际化相关的资源文件放在单独的类库中是一个好习惯。此外,我们需要为每种支持的文化提供单独的资源文件。
最后,我们永远不应该依赖用户的浏览器设置和系统设置来获取特定于文化的信息。始终为用户提供更改网站语言和文化选项是一个好主意,也许可以通过 cookie 来跟踪它们,这样用户就不用每次都选择首选语言了。
关注点
在将我们的网站定位到多种文化时,有一些重要的事情需要理解。当我们定位到多种文化时,我们不能假设关于网页结构和布局的任何内容。这些之所以重要,是因为即使是很小的英语文本翻译成其他语言也可能非常冗长。因此,在实现全球化时,始终遵循标准指南是一个好主意。
- 控件无绝对定位
- 使用流式布局和表单
- 控件无绝对尺寸
- 尝试将控件排在表格中
历史
- 2014年5月16日:首个版本