Как запретить 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"/>