您可以像这样创建一条内置文化的路线...
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // Route name
"{culture}/{controller}/{action}/{id}", // URL with parameters
new { culture="en-US", controller = "Home", action = "Index", id = "" } // Parameter defaults
);
}
您可以通过像这样为所有操作添加文化参数来获取文化...
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 或会话状态中。
查看How to localize ASP .Net MVC application?。接受的答案指向blog post,它显示了如何本地化 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);
}