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

Zasoby Java

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


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow