2011-01-08 9 views
22

Mam wszystkie moje wartości resourcebundle w tabeli i sformatowane zgodnie z wymogiem. Muszę zmienić języki w witrynie internetowej na podstawie wyboru użytkownika w rozwijanym menu na górze strony. Jeśli używam kodu języka jako en_US, oznacza to, że działa poprawnie. jeśli użyję en-Us jako kodu języka, to nie działa. Co może być problemem. Którego należy przestrzegać?Jaka jest różnica między tworzeniem ustawień regionalnych dla en-US i en_US?

Odpowiedz

17

„en” oznacza kod języka określony przez ISO 639. podczas gdy w USA jest kod kraju podany przez 3166.
w Javie, Locale obiekt rozpoznaje język jako languageCode_countryCode (np en_US), a nie jako languageCode- countryCode.

21

"en-US" to IETF language tag. Podczas gdy klasa Java'a Locale była wyraźnie oparta na znacznikach języka IETF, zamiast rozróżniania kodów językowych od kodów krajów (a także wariantów) używają podkreśleń zamiast odszyfrowujących, dlatego wywołanie toString() na odpowiedniku Locale da Ci en_US.

Od wersji Java 7 można używać Locale.forLanguageTag(String) i toLanguageTag() do konwersji między znacznikami języków a obiektami Locale.

Podczas przekształcania ciągów znaków na obiekty Locale dobrze jest normalizować, dzieląc komponenty na łączniki i podkreślenia, zmniejszając pierwszy komponent (kod języka) i dodając drugi komponent (kod kraju).

+0

Ta odpowiedź jest najlepszą odpowiedzią na pytanie, co zrobić w kodzie Java. Dla innych języków/frameworków, nie tak bardzo. Podczas nawiązywania połączeń między strukturami z różnymi konwencjami, masz "awarię" kodera, który musi wiedzieć, że konwersja jest wymagana. zalecamy korzystanie z konwencji frameworka, z którego dzwonisz. Podczas nawiązywania połączeń z inną strukturą podaj "proxy", które wykonują konwersję. Czemu? eliminuje to potrzebę poznania, że ​​nazwany framework używa innej konwencji. Współtwórcy będą TYLKO "widzieć" jedną konwencję, używając tej, która uniknie problemu. – DaBlick

6

Albo możesz użyć Locale us = Locale.forLanguageTag("en-US") i us.toLanguageTag(), a to wykona konwersję bez konieczności tworzenia własnej, podatnej na błędy implementacji. .

1

Od Java8, Inicjowanie narodowe powinny być wykonane za pomocą znacznika języka "en-US" Locale.forLanguageTag ("en-us") toString(); zwraca wynik: en_US

Gdzie jako Locale.forLanguageTag ("en_US") nie tworzy wymaganych ustawień narodowych. Będzie to domyślne ustawienie regionalne. Locale.forLanguageTag ("en_US"). ToString() zwraca wartość null

Powiązane problemy