Существует ли элегантный способ преобразования языковых кодов ISO 639-2 (3 буквы) в локали Java? - PullRequest
15 голосов
/ 23 марта 2009

например. eng, spa, ita, ger

Я мог бы перебрать все локали и сравнить коды, но мне интересно, есть ли более элегантный и эффективный способ добиться этого ...

Большое спасибо за любые подсказки:)

Ответы [ 3 ]

20 голосов
/ 23 марта 2009

Я не знаю, есть ли простой способ конвертировать трехбуквенные версии в двухбуквенные, но в худшем случае вы можете создать карту из них, например, так:

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 голосов
/ 23 марта 2009

Вы можете использовать конструктор Locale(String language), где языком является двухбуквенный код ISO-639-1. Я думаю, что самый простой способ конвертировать ISO-639-2 в ISO-639-1 - создать HashMap<String,String> константу.

0 голосов
/ 23 марта 2009

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

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;
   }

 }

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

...