Вы можете взглянуть на следующее руководство . Он использует Session для сохранения текущего предпочтения языка пользователя, но код может быть очень легко настроен для использования куки. Идея в том, что у вас будет действие контроллера:
public ActionResult ChangeCulture(string lang, string returnUrl)
{
var langCookie = new HttpCookie("lang", lang)
{
HttpOnly = true
};
Response.AppendCookie(langCookie);
return Redirect(returnUrl);
}
, а затем в Global.asax
вы можете подписаться на событие Application_AcquireRequestState
, чтобы установить текущую культуру потоков на основе значения файла cookie:
protected void Application_AcquireRequestState(object sender, EventArgs e)
{
var langCookie = HttpContext.Current.Request.Cookies["lang"];
if (langCookie != null)
{
var ci = new CultureInfo(langCookie.Value);
//Checking first if there is no value in session
//and set default language
//this can happen for first user's request
if (ci == null)
{
//Sets default culture to english invariant
string langName = "en";
//Try to get values from Accept lang HTTP header
if (HttpContext.Current.Request.UserLanguages != null && HttpContext.Current.Request.UserLanguages.Length != 0)
{
//Gets accepted list
langName = HttpContext.Current.Request.UserLanguages[0].Substring(0, 2);
}
langCookie = new HttpCookie("lang", langName)
{
HttpOnly = true
};
HttpContext.Current.Response.AppendCookie(langCookie);
}
//Finally setting culture for each request
Thread.CurrentThread.CurrentUICulture = ci;
Thread.CurrentThread.CurrentCulture = ci;
//The line below creates issue when using default culture values for other
//cultures for ex: NumericSepratore.
//Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(ci.Name);
}
}
Теперь, как говорится, использование куки и сессии для хранения текущего языка не является SEO дружественным. Когда мне нужно локализованное приложение, я предпочитаю использовать специальный маршрут, который будет содержать язык:
routes.MapRoute(
"Default",
"{lang}/{controller}/{action}/{id}",
new
{
lang = "en-US",
controller = "Home",
action = "Index",
id = UrlParameter.Optional
}
);
и затем префикс всех моих URL с языком. Это обеспечивает уникальные URL для разных языков, чтобы роботы могли правильно индексировать весь контент. Теперь осталось только изменить метод Application_AcquireRequestState
, чтобы он использовал токен lang
URL-адреса и, основываясь на его значении, установить правильные значения Thread.CurrentThread.CurrentUICulture
и Thread.CurrentThread.CurrentCulture
.
.
А теперь, когда вы захотите изменить язык, вы просто сгенерируете правильную ссылку:
@Html.ActionLink("Page index en français", "index", new { lang = "fr-FR" })