Java Language
Lokalizacja i internacjonalizacja
Szukaj…
Uwagi
Java jest wyposażona w potężny i elastyczny mechanizm lokalizowania aplikacji, ale łatwo ją również niewłaściwie używać i kończyć z programem, który ignoruje lub zniekształca ustawienia narodowe użytkownika, a tym samym sposób, w jaki oczekuje on twojego zachowania.
Twoi użytkownicy będą oczekiwać, że dane będą zlokalizowane w formatach, do których są przyzwyczajeni, a próba ich obsługi ręcznie jest głupcem. Oto tylko mały przykład różnych sposobów, w jakie użytkownicy oczekują, że treść, którą możesz założyć, jest „zawsze” wyświetlana w określony sposób:
Daktyle | Liczby | Waluta lokalna | Obca waluta | Odległości | |
---|---|---|---|---|---|
Brazylia | |||||
Chiny | |||||
Egipt | |||||
Meksyk | 20/3/16 | 1,234,56 | 1 000,50 USD | 1 000,50 USD | |
UK | 20/3/16 | 1,234,56 | 1 000,50 £ | 100 km | |
USA | 3/20/16 | 1,234,56 | 1 000,50 USD | 1 000,50 MXN | 60 mil |
Ogólne zasoby
- Wikipedia: Internacjonalizacja i lokalizacja
Zasoby Java
- Samouczek Java: internacjonalizacja
- Oracle: Internacjonalizacja: zrozumienie ustawień regionalnych na platformie Java
- JavaDoc: ustawienia
Locale
Automatycznie sformatowane daty przy użyciu „ustawień regionalnych”
SimpleDateFormatter
jest świetny w skrócie, ale jak sama nazwa wskazuje, nie skaluje się dobrze.
Jeśli na swojej aplikacji podasz kod "MM/dd/yyyy"
Twoi użytkownicy międzynarodowi nie będą zadowoleni.
Pozwól, aby Java wykonała pracę za Ciebie
Użyj metod static
w DateFormat
aby pobrać odpowiednie formatowanie dla użytkownika. W przypadku aplikacji komputerowej (gdzie będziesz polegać na domyślnych ustawieniach narodowych ), po prostu wywołaj:
String localizedDate = DateFormat.getDateInstance(style).format(date);
Gdzie style
jest jedną ze stałych formatowania ( FULL
, LONG
, MEDIUM
, SHORT
itp.) Określonych w DateFormat
.
W przypadku aplikacji po stronie serwera, w której użytkownik określa swoje ustawienia narodowe jako część żądania, należy przekazać je jawnie do getDateInstance()
zamiast:
String localizedDate =
DateFormat.getDateInstance(style, request.getLocale()).format(date);
Porównanie ciągów
Porównaj dwa ciągi ignorujące wielkość liter:
"School".equalsIgnoreCase("school"); // true
Nie używaj
text1.toLowerCase().equals(text2.toLowerCase());
Języki mają różne reguły konwersji wielkich i małych liter. „I” zostanie zamienione na „i” w języku angielskim. Ale w języku tureckim „ja” staje się „ı”. Jeśli trzeba użyć toLowerCase()
użyć przeciążenie, która spodziewa się Locale
: String.toLowerCase(Locale)
.
Porównywanie dwóch ciągów ignorujących niewielkie różnice:
Collator collator = Collator.getInstance(Locale.GERMAN);
collator.setStrength(Collator.PRIMARY);
collator.equals("Gärten", "gaerten"); // returns true
Sortuj ciągi szanujące porządek języka naturalnego, ignorując wielkość liter (użyj klucza sortowania, aby:
String[] texts = new String[] {"Birne", "äther", "Apfel"};
Collator collator = Collator.getInstance(Locale.GERMAN);
collator.setStrength(Collator.SECONDARY); // ignore case
Arrays.sort(texts, collator::compare); // will return {"Apfel", "äther", "Birne"}
Widownia
Klasa java.util.Locale
służy do reprezentowania regionu „geograficznego, politycznego lub kulturowego”, w którym lokalizowany jest dany tekst, numer, data lub operacja. Obiekt Locale może zatem zawierać kraj, region, język, a także wariant języka, na przykład dialekt używany w pewnym regionie kraju lub używany w innym kraju niż kraj, z którego pochodzi język.
Instancja Locale jest przekazywana komponentom, które muszą zlokalizować swoje działania, niezależnie od tego, czy konwertuje dane wejściowe, wyjściowe, czy po prostu potrzebują ich do operacji wewnętrznych. Klasa Locale nie może sama dokonać internacjonalizacji ani lokalizacji
Język
Językiem musi być 2 lub 3 znakowy kod języka ISO 639 lub podtag zarejestrowanego języka o długości do 8 znaków. W przypadku, gdy język ma zarówno 2 jak i 3-znakowy kod języka, użyj 2-znakowego kodu. Pełna lista kodów językowych znajduje się w rejestrze podtagów języka IANA.
Kody językowe nie uwzględniają wielkości liter, ale klasa Locale zawsze używa małych wersji kodów językowych
Tworzenie ustawień regionalnych
Utworzenie instancji java.util.Locale
można wykonać na cztery różne sposoby:
Locale constants
Locale constructors
Locale.Builder class
Locale.forLanguageTag factory method
Pakiet Java ResourceBundle
Tworzysz instancję ResourceBundle w następujący sposób:
Locale locale = new Locale("en", "US");
ResourceBundle labels = ResourceBundle.getBundle("i18n.properties");
System.out.println(labels.getString("message"));
Rozważ, że mam plik właściwości i18n.properties
:
message=This is locale
Wynik:
This is locale
Ustawianie ustawień regionalnych
Jeśli chcesz odtworzyć stan przy użyciu innych języków, możesz użyć metody setDefault()
. Jego użycie:
setDefault(Locale.JAPANESE); //Set Japanese