Один из способов сделать это с помощью куки.
Предполагая, что у вас есть раскрывающийся список или какой-либо ввод, где пользователь может выбрать язык, предоставьте эту запись ввода в метод действия. В этом методе действия запишите идентификатор языка в файл cookie:
public class LanguageController
{
[ActionName("change-to")]
public virtual RedirectResult Change(LanguageChanger model)
{
var langCookie = new HttpCookie(CookieNames.Language);
langCookie.Value = model.SelectedIsoCode;
langCookie.Expires = DateTime.UtcNow.AddDays(28);
HttpContext.Response.Cookies.Add(langCookie);
return Redirect(model.ReturnUrl);
}
}
Затем вы можете использовать HttpModule, чтобы установить культуру для каждого запроса. Таким образом, вы знаете, что культура устанавливается во всем конвейере обработки запросов, а не только когда выполняются действия вашего контроллера:
public class CookieLocalizationModule : IHttpModule
{
public void Dispose() { }
public void Init(HttpApplication context)
{
context.BeginRequest += new EventHandler(context_BeginRequest);
}
void context_BeginRequest(object sender, EventArgs e)
{
// read the cookie (if any) and set the culture
if (HttpContext.Current.Request.Cookies[CookieNames.Language] != null)
{
var cookie = HttpContext.Current.Request
.Cookies[CookieNames.Language];
var lang = cookie.Value;
var culture = new System.Globalization.CultureInfo(lang);
Thread.CurrentThread.CurrentCulture = culture;
Thread.CurrentThread.CurrentUICulture = culture;
}
}
}
Чтобы зарегистрировать модуль в IIS & IIS Express, см. Этот web.config (обратите внимание, что конфигурация Cassini будет немного другой)
<system.webServer>
<validation validateIntegratedModeConfiguration="false" />
<modules runAllManagedModulesForAllRequests="true">
<add name="CookieLocalizationModule"
type="MyProject.CookieLocalizationModule, MyProject" />
</modules>
<handlers>
...