你可以创建一个带有内置文化的路由,像这样...
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default",
"{culture}/{controller}/{action}/{id}",
new { culture="en-US", controller = "Home", action = "Index", id = "" }
);
}
您可以通过向所有操作添加一个 culture 参数来获取文化信息,例如:
public ActionResult Index(string culture)
{
ViewData["Message"] = "Welcome to ASP.NET MVC! (" + culture + ")";
return View();
}
您也可以在Global.asax的Application_BeginRequest方法中解析URL并设置线程文化(下面的代码示例显示如何设置文化,而解析则由您完成)。
如果这样做,您可能无法使用RedirectToAction和HTML.ActionLink类型的方法,因为它们不知道文化。当然,您可以自己编写。
使用URL存储文化的缺点是,如果您在网站上错过了某个链接或用户离开网站然后再次回来,您可能会丢失用户文化,他们将不得不再次设置它(虽然不是世界末日,但很烦人)。使用URL存储文化的好处可能在于Google将索引所有不同的语言。
如果您更关心用户体验或开发的便利性而不是Google索引不同的文化(这取决于您正在构建什么样的网站),我建议将文化存储在cookie或会话状态中。
请参阅
如何本地化ASP .Net MVC应用程序?。 接受的答案指向一个
博客文章,展示了如何本地化ASP.Net应用程序。
如果您将用户选择的文化存储在cookie、会话状态或查询参数中,然后在Global.asax文件的BeginRequest方法中设置线程文化,则可以使用标准的Microsoft本地化程序集进行本地化。
以下代码允许您通过将culture=??添加到查询字符串(MyPage?culture=es-MX)来随时更改文化。然后它将被添加到cookie中,这样您就不需要在系统中的每个链接末尾添加它。
protected void Application_BeginRequest()
{
var culture = Request["culture"] ?? Request.Cookies["culture"]?.Name;
if (culture == null) culture = "en-US";
var ci = CultureInfo.GetCultureInfo(culture);
Thread.CurrentThread.CurrentCulture = ci;
Thread.CurrentThread.CurrentUICulture = ci;
var cookie = new HttpCookie("culture", ci.Name);
Response.Cookies.Add(cookie);
}