Jaka jest różnica między właściwościami CurrentCulture i CurrentUICulture CultureInfo w .NET?

358

W .NET jest CultureInfoklasa w System.Globalizationprzestrzeni nazw. Ma dwie podobne właściwości, obie zwracające wartości CultureInfotypu: CurrentCulturei CurrentUICulture.

Jaka jest różnica między nimi?

Którego powinienem użyć, kiedy i dlaczego?

splattne
źródło
28
Należy pamiętać, że Microsoft, zgodnie z ich mądrością, nie rozdziela kultur interfejsu użytkownika w języku angielskim amerykańskim i (brytyjskim) angielskim lub innym angielskim. Nie ma MUI dla języka angielskiego, co oznacza, że CurrentUICulturezawsze będzie en-US na maszynie w języku angielskim, niezależnie od tego CurrentCulture, które można ustawić, aby zlokalizować Ustawienia regionalne.
nicodemus13
11
Tak. Jestem w Wielkiej Brytanii i znajduję CurrentCulture„en-GB”, ale CurrentUICulture„en-US”.
Pułkownik Panic
Właśnie znalazłem ten artykuł wyjaśniający to szczegółowo: github.com/jbe2277/waf/wiki/CurrentCulture-vs.-CurrentUICulture
RinoTom

Odpowiedzi:

346

CurrentCultureto .NET reprezentacja domyślnych ustawień regionalnych użytkownika w systemie. Kontroluje domyślne formatowanie liczb i dat i tym podobne.

CurrentUICulture odnosi się do domyślnego języka interfejsu użytkownika, ustawienia wprowadzonego w systemie Windows 2000. Dotyczy to przede wszystkim części aplikacji / lokalizacji interfejsu użytkownika.

Bez względu na opcje regionalne, jakie ma skonfigurowany system, będą to „bieżące” wartości w aplikacji .NET.

Często oba są takie same. Ale w moim systemie byłyby inne: wolę moje liczby i daty w formacie niemieckim, więc CurrentCulturebyłby niemiecki, ale wolę też wszystkie moje aplikacje w języku angielskim, więc CurrentUICulturebyłby to angielski.

Jest ładny artykuł na ten temat: Sortowanie wszystkiego Na zewnątrz: Dlaczego mamy zarówno CurrentCulture, jak i CurrentUICulture

Tomalak
źródło
5
Właściwie może to być dobra alternatywa dla szczegółowych wyjaśnień: forums.asp.net/post/1080435.aspx
Michael12345,
@ Michael12345 Dzięki za podpowiedź. Zaktualizowałem link. Wpis, do którego prowadzi link, jest również przyzwoity, a może nawet lepszy.
Tomalak,
5
Są to zatem okropne nazwy, ponieważ CurrentUICulture naprawdę oznacza CurrentLanguageCulture, a CurrentCulture naprawdę oznacza CurrentDataCulture.
Pxtl
2
@Pxtl: Wolę CurrentFormattingCulture niż CurrentDataCulture . Pamiętaj jednak, że mogą one nie być tak wyraźnie rozłączne, jak sugerują nawet twoje imiona. Na przykład, argumentowałbym, że format długiej daty ( D) może zawierać całkiem sporo „języka”: en-USzwraca „piątek, 6 kwietnia 2018 r.”, Podczas gdy ru-RUzwraca „6 sierpnia 2018 r.”.
LUB Mapper
107

To prosta sztuczka, której używam, aby zapamiętać, której użyć:

(date, currency, double).tostring = CurrentCulture

resource.fr-CA.resx file = currentUICulture
foxontherock
źródło
Jeśli zaufać komentarzom nicodemus13 i pułkownikowi Panic , wydaje się, że druga część twojej sztuczki nie powinna działać.
LUB Mapper
15

Dobrym sposobem na zrobienie różnicy oprócz miłych wyjaśnień innych użytkowników i ważnym aspektem w tworzeniu aplikacji internetowych jest:

  • CurrentCulturereprezentuje konfigurację serwera WWW. Na przykład, jeśli twoja aplikacja internetowa ASP.NET jest hostowana w Niemczech, CutlureInfo.CurrentCulturenajprawdopodobniej byłaby to wartość de-DE. Dlatego domyślne .ToString()formatowanie IFormattabletypów używałoby domyślnych formatów niemieckich lub tych, które zostały skonfigurowane w systemie operacyjnym serwera jako domyślne.

  • CurrentUICulturemoże zostać przechwycony z klienta użytkownika i może reprezentować kulturę interfejsu użytkownika klienta łączącego się z witryną. Na przykład, jeśli załadować tę stronę z Rosji, Twoje ustawienia lokalne są skonfigurowane do korzystania z języka rosyjskiego, a aplikacja kliencka wysyła swoje ustawienia regionalne do serwera (Opera i IE to zrobić automatycznie, nie wiem dla Chrome i Firefox), przy czym CurrenUICulturebędzie reprezentować ru-RU. Spowoduje to, że wszelkie zasoby, takie jak zlokalizowane ciągi pobrane za pomocą ResourceManager lub wyrażenia lokalizacji w plikach aspx / ascx ASP.NET będą w języku rosyjskim (jeśli dostępne są tłumaczenia).

Ivaylo Slavov
źródło
13

Różnice:

  1. CurrentCulturesłuży do formatowania dat i walut podczas korzystania CurrentUICulturez języka / tłumaczeń. Zostanie wykorzystany ResourceManagerdo wyszukiwania zasobów według kultury.
  2. Przestrzeń nazw CurrentCultureklasy jest w System.Globalizationchwili, gdy CurrentUICulturepochodzi System.Threading.
  3. CurrentCulturejest utrwalany dla różnych żądań w sesji, ale CurrentUICulturemusi być ustawiony dla każdego żądania.

Podobieństwo:

Oba są System.Globalization.CultureInfoinstancjami.

Matas Vaitkevicius
źródło
8

Warto zauważyć, że CurrentUICultureobsługuje lokalizacje inne niż krajowe, takie jak „en” (kultury neutralne), podczas gdy CurrentCultureTYLKO obsługuje lokalizacje specyficzne dla kraju, takie jak „en-GB”. Ustawienie CurrentCultureneutralnej kultury rzuci ArgumentException.

Zakładam, że dzieje się tak, ponieważ formaty takie jak daty i waluty są silniej powiązane z samym krajem, ale wyświetlany język jest często wymienny między krajami.

Sebris87
źródło