В чем разница между свойствами CurrentCulture и CurrentUICulture для CultureInfo в .NET?

359

В .NET есть CultureInfoкласс в System.Globalizationпространстве имен. У него есть два похожих свойства, оба возвращающие значения CultureInfoтипа: CurrentCultureи CurrentUICulture.

В чем разница между ними?

Какой я должен использовать, когда и почему?

splattne
источник
28
Имейте в виду, что Microsoft, по их мнению, не разделяет культуры пользовательского интерфейса американского английского и (британского) английского или других английских языков. Для английского языка MUI отсутствует, что означает, что на англоязычном компьютере CurrentUICultureвсегда будет en-US, независимо от того CurrentCulture, какой параметр можно настроить для локализации региональных настроек.
nicodemus13
11
Да. Я в Великобритании и нахожу CurrentCulture«en-GB», но CurrentUICulture«en-US».
полковник Паник
Только что нашел эту статью, объясняющую это в деталях: github.com/jbe2277/waf/wiki/CurrentCulture-vs.-CurrentUICulture
RinoTom

Ответы:

347

CurrentCultureявляется .NET-представлением локали пользователя системы по умолчанию. Это контролирует число по умолчанию, форматирование даты и тому подобное.

CurrentUICulture относится к языку пользовательского интерфейса по умолчанию - настройке, введенной в Windows 2000. Это в первую очередь относится к части локализации / перевода пользовательского интерфейса вашего приложения.

Независимо от региональных параметров, в которых настроена система, это будут «текущие» значения в вашем .NET-приложении.

Часто они оба одинаковы. Но в моей системе они были бы другими: я предпочитаю свои цифры и даты в немецком формате, поэтому CurrentCultureбудет немецкий, но я также предпочитаю все свои заявки на английском языке, поэтому CurrentUICultureбудет английский.

Есть хорошая статья на эту тему: Сортировка всего: почему у нас есть как CurrentCulture, так и CurrentUICulture.

Томалак
источник
5
На самом деле это может быть хорошей альтернативой для подробного объяснения: forums.asp.net/post/1080435.aspx
Michael12345
@ Michael12345 Спасибо за подсказку. Я обновил ссылку. Пост, на который вы ссылаетесь, тоже приличный, может быть, даже лучше.
Томалак
5
Таким образом, это ужасные имена, поскольку CurrentUICulture действительно означает CurrentLanguageCulture, а CurrentCulture действительно означает CurrentDataCulture.
Pxtl
2
@Pxtl: я бы выбрал CurrentFormattingCulture, а не CurrentDataCulture . Тем не менее, обратите внимание, что они могут быть не такими очевидными, как предполагают даже ваши имена. Например, я бы сказал, что формат длинной даты ( D) может содержать довольно много «языка»: en-USвозвращает «пятница, 6 апреля 2018 года», а ru-RU«6 апреля 2018 г.».
ИЛИ Mapper
107

Это простой трюк, который я использую, чтобы запомнить, какой использовать:

(date, currency, double).tostring = CurrentCulture

resource.fr-CA.resx file = currentUICulture
foxontherock
источник
Если доверять комментариям nicodemus13 и полковника Паника , может показаться, что вторая часть вашего трюка не сработает.
ИЛИ Mapper
15

Хороший способ внести изменения в дополнение к приятным объяснениям, сделанным другими пользователями, и важный аспект в разработке веб-приложений заключается в следующем:

  • CurrentCultureпредставляет настройку веб-сервера. Например, если ваше веб-приложение ASP.NET размещено в Германии, значение CutlureInfo.CurrentCulture, скорее всего, будет de-DE. Таким образом, стандартное .ToString()форматирование для IFormattableтипов будет использовать немецкое форматирование по умолчанию или те, которые были установлены в ОС сервера по умолчанию.

  • CurrentUICultureможет быть получен от пользовательского агента и может представлять культуру пользовательского интерфейса клиента, подключающегося к веб-сайту. Например, если вы загрузите этот сайт из России, ваши локальные настройки настроены на использование русского языка, и ваш пользовательский агент отправляет региональные настройки на сервере (Opera и IE сделать это автоматически, не уверен , что для Chrome и FireFox), то CurrenUICultureбудет представлять ru-RU. Это приведет к тому, что любые ресурсы, такие как локализованные строки, полученные с помощью ResourceManager, или выражения локализации в ASP.NET-файлах aspx / ascx будут на русском языке (если доступны переводы).

Ивайло Славов
источник
13

Отличия:

  1. CurrentCultureдля форматирования дат и валюты, в то время как CurrentUICultureидет с языком / переводами. Он будет использоваться ResourceManagerдля поиска ресурсов по культуре.
  2. Пространство имен CurrentCultureкласса находится в System.Globalizationто время как CurrentUICultureприходит System.Threading.
  3. CurrentCultureсохраняется в разных запросах в сеансе, но CurrentUICultureдолжен быть установлен для каждого запроса.

Сходство:

Они оба являются System.Globalization.CultureInfoпримерами.

Матас Вайткявичюс
источник
8

Стоит отметить, что он CurrentUICultureподдерживает не специфичные для страны локали, такие как en (нейтральные культуры), тогда как CurrentCultureТОЛЬКО поддерживает специфичные для страны локали, такие как en-GB. Настройка CurrentCultureна нейтральную культуру бросит ArgumentException.

Я предполагаю, что это потому, что форматы, такие как даты и валюта, более тесно связаны с самой страной, но отображаемый язык часто взаимозаменяемы между странами.

Sebris87
источник