Как я могу изменить систему.Глобализация.CultureInfo.CurrentUICulture в моем веб-приложении .NET 4.0?

#vb.net #.net-4.0 #internationalization #globalization

#vb.net #.net-4.0 #интернационализация #глобализация

Вопрос:

Кажется, у меня проблема с изменением 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:

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

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) Конечно, серверный код, который отвечал на запросы пользователя на изменение языка, изменился соответствующим образом, чтобы сохранить языковые предпочтения в сеансе, после установки потока.Текущий поток.CurrentCulture и CurrentUICulture
5) Я также установил globalization тег в моем web.config следующим образом:

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

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

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

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

Теперь все работает, как ожидалось.