Есть ли элегантный способ конвертировать коды языка 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;
   }

 }

Можно утверждать, что было бы лучше иметь карту в конфигурации, а не в коде, возможно, в файле свойств. Это может быть правдой, но помните правило прагматичных программистов: "Это вам не понадобится".