有没有一种优雅的方法将ISO 639-2(3个字母)语言代码转换为Java语言环境?

时间:2009-03-23 16:17:59

标签: java localization locale

E.g。 eng,spa,ita,ger

我可以迭代所有语言环境并比较代码,但我想知道是否有更优雅的&高效的方式实现这一目标....

非常感谢任何提示:)

3 个答案:

答案 0 :(得分:20)

我不知道是否有一种简单的方法可以将3个字母转换为2个字母的版本,但在更糟糕的情况下,你可以创建一个Map的地图,如下所示:

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:已经有一段时间了,但在初始化地图时更改了代码以使用语言数组的实际长度。

答案 1 :(得分:2)

您可以使用构造函数Locale(String language),其中language是2个字母的ISO-639-1代码。我认为将ISO-639-2转换为ISO-639-1的最简单方法是创建HashMap<String,String>常量。

答案 2 :(得分:0)

我项目中的一些修改过的代码,它们有类似的要求。我们有自己的历史时区格式,因此我们无法使用标准库。

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

 }

你可能会认为将地图放在配置而不是代码中会更好 - 也许是在属性文件中。这可能是真的 - 但要记住实用程序员的规则'你不需要它'。