2010-08-26 1 views
1

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

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

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

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

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

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

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

ответ

2

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

+0

Я решил создать новый класс, который происходит из System.Web.UI.Page и переопределяет в нем InitializeCulture. Каждый контент-контент происходит от этого класса. – citronas

+0

Это хорошая привычка всегда использовать базовую страницу. Затем вы можете переопределить базовые методы, подобные этому, без необходимости касаться каждого файла класса, чтобы изменить то, на что он наследует. – Chris

1

Посмотрите на Asp.Net modules или подключите events в global.asax.

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

+0

Я предполагаю, что вы имели в виду global.asax. К какому событию я должен подключиться? Session_Start или Application_Start не будут выполнять задание для этого, потому что они не выполняются при каждом запросе – citronas

+0

@citronas, Извините, много времени с тех пор, как я это сделал, из того, что я помню, я использовал одно из событий для каждого запроса в глобальном .asax (это может быть событие на стандартном модуле). У меня нет доступа к исходному коду системы, как это было для старого работодателя. –

+0

Я дам вам +1 в любом случае за предложение HTTP-модуля. – citronas

0

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

<globalization culture="de-DE"/> 
+0

Я хочу дать пользователю возможность изменять культуру во время работы приложения. Установка его вручную в файле web.config помогает мне установить желаемое значение по умолчанию, но не решает проблему. – citronas

+0

@citronas: Я вижу ... Ну, поскольку вы используете контентные страницы, событие Page_Init на главной странице, похоже, хорошее место, чтобы установить культуру. – Guffa

+0

Это не сработало для меня. Я все время возвращаюсь на английский. –

 Смежные вопросы

  • Нет связанных вопросов^_^