Как я могу изменить System.Globalization.CultureInfo.CurrentUICulture в моем веб-приложении .NET 4.0? - PullRequest
2 голосов
/ 07 мая 2011

Кажется, у меня проблема с изменением значения System.Globalization.CultureInfo.CurrentUICulture в соответствии с предпочтениями пользователя (веб-приложение .NET 4.0).

В моем веб-приложении у меня есть две кнопки.Один для греческого языка и один для английского языка.При нажатии кнопок на сервер отправляется запрос с просьбой изменить предпочитаемый язык пользователя.Для греческого я отправляю «el-GR», а для английского - «en-US».

На стороне сервера я использую следующий фрагмент кода для изменения текущего CultureInfo.

 Dim languageChosen As String = Me.Context.Request.Params("langId")

 ' Code for CultureInfo
 Dim cultureInfo As System.Globalization.CultureInfo
 cultureInfo = New System.Globalization.CultureInfo(languageChosen)

 ' Code for Setting the CurrentCulture
 Thread.CurrentThread.CurrentCulture = cultureInfo
 Thread.CurrentThread.CurrentUICulture = cultureInfo

 Response.Redirect("Default.aspx", True)

Теперь при следующих запросах к серверу я проверяю текущую культуру, получая значение из CultureInfo.CurrentUICulture.TwoLetterISOLanguageName, и это всегда показывает «en», даже если я выбрал «el-GR»".

Где может быть проблема?

Нужно ли сохранять предпочитаемый пользователем язык между запросами, например, в сеансе?А затем установить его на System.Thread.CurrentThread.CurrentCulture в начале каждой страницы?

1 Ответ

3 голосов
/ 07 мая 2011

Я нашел решение проблемы.

1) Мне пришлось сохранить пользовательские настройки в сеансе. 2) Каждый раз, когда страница загружается, я теперь устанавливаю Thread.CurrentThread.CurrentCulture после построения cultureInfo на основе предпочтения пользователя, сохраненного в сеансе. Смысл кода, который я делаю, заключается в переопределении InitializeCulture. Другими словами, мои страницы переопределяют InitializeCulture следующим образом:

Protected Overrides Sub InitializeCulture()
    Dim l_languageChosen As String = Session("language")

    ' Code for CultureInfo
    Dim cultureInfo As System.Globalization.CultureInfo
    cultureInfo = New System.Globalization.CultureInfo(l_languageChosen)

    ' Code for Setting the CurrentCulture
    Thread.CurrentThread.CurrentCulture = cultureInfo
    Thread.CurrentThread.CurrentUICulture = cultureInfo

    MyBase.InitializeCulture()

End Sub

3) Чтобы избежать переопределения всех моих страниц этим методом и избежать повторения кода, я создал суперкласс "MyWebPage", который выполняет переопределение (и который наследуется от System.Web.UI.Page), а затем я сделал все свои страницы наследуются от MyWebPage. 4) Конечно, серверный код, который отвечал на запросы пользователя о смене языка, изменился соответственно, чтобы сохранить языковые предпочтения в сеансе, после установки Thread.CurrentThread.CurrentCulture и CurrentUICulture. 5) Я также установил тег globalization в моем web.config следующим образом:

<globalization
  uiCulture="auto"
  culture="auto"
  enableClientBasedCulture="true" />

Это позволило мне определить языковые предпочтения пользователя, заданные в его / ее браузере, чтобы я мог изначально установить предпочтительный язык.

6) В моем global.asax я сохраняю языковые предпочтения, обнаруженные в браузере, следующим образом:

Session.Add("language", System.Globalization.CultureInfo.CurrentUICulture.TwoLetterISOLanguageName)

Теперь все работает как положено.

...