2010-01-21 4 views
9

Я нашел несколько отсутствующих стран в Java locales- Если бы я распечатать список доступных локалей,Отсутствующие локали в Java?

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

я пропускаю целый ряд стран, в том числе Нигерии, Ирана, Кыргызстана, Пакистана , Может ли кто-нибудь пролить свет на это, или есть лучший (более полный) способ получить список стран в java?

1.6.0_16-b01

+0

Я подозреваю, что экспортные ограничения Госдепартамента имеют хотя бы какое-то отношение к этому списку ... – kdgregory

+1

Но, независимо от того, я задаю вопрос, является ли таблица локалей разумным способом построения списка стран. Конечно, это зависит от вашего использования, но я думаю, что большинство приложений будет лучше с меньшим списком, в то время как все, что имеет отношение к историческим данным, нуждается в гораздо большем списке. – kdgregory

+0

Мне интересно, если есть способ каким-то образом добавить свой собственный язык в список ... – Stroboskop

ответ

2

нет отображения один-к-одному между странами в мире и регионах. Локали определяют регионы. Они предназначены для обозначения таких вещей, как языковое разнообразие. Просто поясняющий пример: Индия, Шри-Ланка, Пакистан, Бангладеш - все разные страны .. но способ, которым они используют английский язык, не отличается каким-либо значительным образом ... имеет демографическое значение ... все эти страны могут indian locale

+0

Да, я знаю, что на самом деле нет концептуального сопоставления 1-1 между локалями и странами; Тем не менее, я надеялся (предположим?), Что я получаю полный список (я не думаю, достаточно внимательно). Список ISO, в котором ссылки на javadoc также пропускает Пакистан (http://www.loc.gov/standards/iso639-2/php/English_list.php), но опять же это список языков, а не стран. –

2

Статический метод Locale.getISOCountries() возвращает все двухбуквенные коды для стран в списке ISO 3166 Countries. Если вы запустите код ниже:

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

Вы заметите, что PK (ПАКИСТАН), NG (Нигерия) и KG (КЫРГЫЗСТАН) находятся в списке. Обратите внимание, что это не означает, что локаль, связанная со страной, установлена. Если вы хотите реализовать какой-либо специфический для локали поведения, единственными поддерживаемыми локалями являются те, которые были возвращены Locale.getAvailableLocales.

+0

@Tendayi Mawushe - могут существовать коды стран, но это не означает, что форматы даты/числа (например) автоматически предоставят требуемую функциональность. – McDowell

+1

Да, ПК есть, но насколько я могу судить, вы ничего не можете сделать, кроме 2-буквенного кода ISO.Например, вы не можете получить название страны с двухбуквенным кодом. –

+0

Я знаю, что это не означает, что локаль для данной страны установлена. Однако, похоже, вопрос заключается в том, чтобы просто получать список стран, а не выполнять какое-либо специфическое для региона поведение. Я объясню это в ответ. –

6

Sun Java 6 обеспечивает поддержку ограниченного набора локалей. Вектор поддержки для форматирования классов/систем записи/и т. Д. указан в JDK documentation.

Теперь, я не сделал этого, но ...

Вы можете подключить поддержку дополнительных локалей через Спиша (описано here). Например, чтобы предоставить формат даты для нового языкового стандарта, вы сделаете это, выполнив услугу DateFormatProvider. Возможно, вы сможете это сделать, украсив существующую реализацию - я бы посмотрел библиотеку ICU4J, чтобы узнать, предоставляет ли она необходимую поддержку.

1

Если вы хотите поддержать больше локалей/стран, чем в настоящее время доступны в Sun JDK, добавьте ICU4J банки к вашему java.ext.dirs - вы не только получаете гораздо более полный список стран и районов, но и достойной поддержки Collator, DateFormat , и т. д.

Смежные вопросы