【问题标题】:Is there an elegant way to convert ISO 639-2 (3 letter) language codes to Java Locales?有没有一种优雅的方法可以将 ISO 639-2(3 个字母)语言代码转换为 Java 语言环境?
【发布时间】:2009-03-23 16:17:59
【问题描述】:

例如英,水疗,意大利,德国

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

非常感谢任何提示:)

【问题讨论】:

  • 最简单的方法是改用 ISO 639-2(2 个字母)语言代码,这是 Locale 类开始使用的。
  • 不,这对我来说绝对不容易……不幸的是……
  • 另外,应该说的是 ISO 639-1,而不是 -2。哎呀。

标签: java localization locale


【解决方案1】:

我不知道是否有一种简单的方法可以将 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:已经有一段时间了,但在初始化 Map 时更改了代码以使用语言数组的实际长度。

【讨论】:

  • 谢谢 - 我不能说这是我希望的答案,但显然真的没有更好的方法:(
  • 不理想,我知道。你会认为会有一种内置的方法来处理这个......另外,我修改了代码以预先分配 185 个条目的映射,因为这就是 Java 6u11 的(Windows 版本)所具有的。跨度>
  • 是的,这就是我所希望的——Java 有时很奇怪。感谢您对此的意见
  • 最好先获取语言,然后根据语言的大小分配localeMap。
  • 请注意 java 使用 639-2/T(或 639-3?)而不是 639-2/B。所以,德语是deu 而不是ger
【解决方案2】:

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

【讨论】:

  • 我知道我可以。不幸的是,我从数据库中得到了 3 个字母代码。
  • 嗯可以工作,但不是很优雅,我会说...有时我想知道 Java... :-/
  • 不,它不优雅。但是使用 ISO-639-2 代码是相当少见的。
【解决方案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;
   }

 }

您可能会争辩说,将地图放在配置中而不是代码中会更好——也许在属性文件中。这可能是真的——但请记住实用程序员的规则“你不需要它”。

【讨论】:

    猜你喜欢
    • 2015-06-20
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    • 1970-01-01
    • 2020-07-14
    • 1970-01-01
    • 2015-05-30
    • 2021-12-24
    相关资源
    最近更新 更多