2010-01-21 14 views
9

Znalazłem kilka brakujących krajów w Javie locales- Gdybym wydrukować listę dostępnych lokalizacjach,Brakujące ustawienia lokalne w języku Java?

TreeSet<String> m = new TreeSet<String>(); 
for (Locale l : Locale.getAvailableLocales()) { 
    m.add(l.getDisplayCountry()); 
} 
for (String s : m) { 
    System.out.println(s); 
} 

mi brakuje wielu krajach, w tym Nigerii, Iranie, Pakistanie i Kirgistanu . Czy ktoś może rzucić światło na to, czy istnieje lepszy (bardziej wszechstronny) sposób na uzyskanie listy krajów w java?

1.6.0_16-b01

+0

Podejrzewam, że ograniczenia eksportowe Departamentu Stanu mają co najmniej związek z tą listą ... – kdgregory

+1

Ale niezależnie od tego, pytam, czy tabela lokalizacji jest rozsądnym sposobem na zbudowanie listy krajów. Oczywiście zależy to od twojego użycia, ale uważam, że większość aplikacji lepiej sobie radzi z mniejszą listą, podczas gdy wszystko, co ma do czynienia z danymi historycznymi, wymaga znacznie większej listy. – kdgregory

+0

Sprawia, że ​​jestem ciekawa, czy istnieje sposób, aby jakoś dodać własne ustawienia regionalne do listy ... – Stroboskop

Odpowiedz

2

nie ma odwzorowanie jeden do jednego między krajami świata i lokalizacjach. Ustawienia regionalne określają regiony. Mają one oznaczać różnorodność językową. Po prostu przykład wyjaśniający: Indie, Sri Lanka, Pakistan, Bangladesz to różne kraje, ale sposób, w jaki posługują się językiem angielskim, nie różni się w żaden znaczący sposób ... jest sprawą demograficzną ... więc wszystkie te kraje mogą zależeć od indian locale

+0

Tak, wiem, że nie ma tak naprawdę konceptualnego mapowania 1-1 między lokalizacjami i krajami; Niemniej jednak miałem nadzieję (zakładając?), Że otrzymałem kompletną listę (nie wyglądałem wystarczająco dokładnie, jak sądzę). Lista ISO, której odniesienia do javadoc również brakuje w Pakistanie (http://www.loc.gov/standards/iso639-2/php/English_list.php), ale z drugiej strony jest to lista języków, a nie krajów. –

2

Metoda statyczna Locale.getISOCountries() zwraca wszystkie kody dwuliterowe dla krajów na liście ISO 3166 Countries. Jeśli uruchomić poniższy kod:

String[] codes = Locale.getISOCountries(); 
for (String code : codes) { 
    System.out.println(code); 
} 

Można zauważyć, że PK (Pakistan), NG (Nigeria) i KG (Kirgistan) są na liście. Uwaga: nie oznacza to, że są zainstalowane ustawienia regionalne powiązane z tym krajem. Jeśli chcesz zaimplementować dowolne zachowanie związane z ustawieniami narodowymi, jedynymi obsługiwanymi lokacjami są te zwracane przez Locale.getAvailableLocales.

+0

@Tendayi Mawushe - kody krajów mogą być obecne, ale to nie znaczy, że formaty daty/liczby automatycznie dodadzą wymaganą funkcjonalność. – McDowell

+1

Tak, PK istnieje, ale na tyle, na ile mogę powiedzieć, nie można zrobić nic poza otrzymaniem dwuliterowego kodu ISO.Nie można na przykład uzyskać nazwy kraju z kluczem dwuliterowym. –

+0

Mam świadomość, że nie oznacza to, że zainstalowane są ustawienia regionalne danego kraju. Jednak wydaje się, że wydaje się, że próbujesz po prostu uzyskać listę krajów, zamiast robić określone zachowanie specyficzne dla danego kraju. Wyjaśnię to jasno w odpowiedzi. –

6

Sun Java 6 obsługuje tylko ograniczony podzbiór ustawień regionalnych. Wektor wsparcia dla formatowania klas/systemów piszących/etc. znajduje się na liście JDK documentation.

Teraz nie zostało to zrobione, ale ...

Można podłączyć wsparcie dla dodatkowych lokalizacjach poprzez SPI (opisany here). Na przykład, aby udostępnić narzędzie do formatowania daty dla nowego ustawienia narodowego, można to zrobić, realizując usługę DateFormatProvider. Możesz to zrobić, dekorując istniejącą implementację - przejrzę bibliotekę ICU4J, aby sprawdzić, czy zapewnia ona odpowiednią pomoc.

1

Jeśli chcesz obsługiwać więcej lokalizacyjne/krajów niż są obecnie dostępne w Sun JDK, należy rozważyć dodanie ICU4J słoiki do java.ext.dirs - nie będzie tylko dostać znacznie bardziej kompletna lista krajów i ustawień regionalnych, ale także godnej poparcia dla Collator, DateFormat , itp.