Есть ли элегантный способ конвертировать коды языка ISO 639-2 (3 буквы) в Java Locales?
например. eng, spa, ita, ger
Я мог бы перебирать все локали и сравнивать коды, но мне интересно, есть ли более элегантный и эффективный способ достичь этого.
Большое спасибо за любые подсказки:)
Ответы
Ответ 1
Я не знаю, есть ли простой способ конвертировать 3-буквенные версии в 2-буквенные версии, но в худшем случае вы можете создать их карту следующим образом:
String[] languages = Locale.getISOLanguages();
Map<String, Locale> localeMap = new HashMap<String, Locale>(languages.length);
for (String language : languages) {
Locale locale = new Locale(language);
localeMap.put(locale.getISO3Language(), locale);
}
Теперь вы можете искать локали, используя такие вещи, как localeMap.get("eng")
;
Изменить: Изменен способ создания карты. Теперь на одном языке должен быть один объект.
Изменить 2: Это было некоторое время, но изменил код, чтобы использовать фактическую длину массива языков при инициализации Карты.
Ответ 2
Вы можете использовать конструктор Locale(String language)
, где язык является 2-буквенным кодом ISO-639-1. Я думаю, что самым простым способом конвертировать ISO-639-2 в ISO-639-1 было бы создание константы HashMap<String,String>
.
Ответ 3
Некоторые измененные коды из моего проекта, которые имеют аналогичное требование. У нас есть собственный исторический формат часового пояса, поэтому мы не можем использовать стандартные библиотеки.
public class MyProjectTimeZoneFactory {
private static Map timeZoneDb;
/**
* Set up our timezone id mappings; call this from any constructor
* or static method that needs it.
*/
private static void init() {
if(null == TimeZoneDb) {
timeZoneDb = new HashMap(); // Maybe a TreeMap would be more appropriate
timeZoneDb.put(" ","GMT+00");
timeZoneDb.put("EAD ","GMT+10");
timeZoneDb.put("JST ","GMT+9");
// etc.
}
}
public static TimeZone getTimeZone(String id)
throws CommandFormatException {
init();
TimeZone tz;
if(timeZoneDb.containsKey(id)) {
tz = TimeZone.getTimeZone((String)timeZoneDb.get(id));
} else {
throw new CommandFormatException("Invalid Timezone value");
}
return tz;
}
}
Можно утверждать, что было бы лучше иметь карту в конфигурации, а не в коде, возможно, в файле свойств. Это может быть правдой, но помните правило прагматичных программистов: "Это вам не понадобится".