Как запретить Thread.CurrentThread.CurrentCulture переключаться на значение браузера по умолчанию после его установки вручную?

В моем текущем приложении я хочу реализовать локализацию ASP.Net с глобальными ресурсами. У меня проблема в том, что после изменения CurrentThread.CurrentUICulture и CurrentThread.CurrentCulture и перехода на другую страницу эти значения перезаписываются значениями браузера по умолчанию.

У меня есть DropDownList, который позволяет выбирать между разными языками. В Событии ItemChanged я сохраняю имя культуры в сеансе, перенаправляю на страницу по умолчанию и использую этот код

protected override void InitializeCulture()
{
    System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo("de-DE");
    System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo("de-DE");
    base.InitializeCulture();
}

После перехода на другую страницу контента, которая не переопределяет InitializeCulture, я снова использую язык браузера по умолчанию. Как я могу сделать это постоянным?

Какие варианты у меня есть? На ум приходят следующие слова:

  • На каждой странице *.aspx я реализую InitializeCulture
  • Я создаю новый класс, который наследуется от System.Web.UI.Page и переопределяет обработчик событий InitializeCulture. Каждая страница *.aspx, которую я использую, происходит от нее.

Разве нет более "встроенного" способа? ASP.net предлагает такую ​​хорошую поддержку локализации, поэтому я думаю, что должен быть более простой / более эффективный способ достижения моей цели. Кто там?

3 ответа

Решение

Вам нужно переустановить культуру в методе InitializeCulture вашей базовой страницы, как вы уже описали. Это должно быть сделано при каждом запросе. Значение CurrentCulture устанавливается на основе заголовка Accept-Languages, отправленного браузером, и всегда будет устанавливаться таким образом для каждого нового запроса. Нет другого выбора, кроме как установить его вручную для каждого нового запроса, и Page.InitializeCulture - хорошее место для этого.

Взгляните на модули Asp.Net или перехват событий в global.asax.

Использование базового класса, который содержит все страницы, является еще одним хорошим вариантом, но сложнее повторно использовать базовый класс между проектами, которые являются модулем.

Вы можете поместить культуру в свой web.config, в system.web раздел:

<globalization culture="de-DE"/>
Другие вопросы по тегам