【问题标题】:How to get iso2 language code for locale?如何获取区域设置的 iso2 语言代码?
【发布时间】:2011-04-07 14:00:24
【问题描述】:

我通过这种方式获取 iso2 语言代码:

public String getLang(Locale language)
    return language.toString().substring(0,2).toLowerCase()
}

有更好的方法吗?

edit:当我使用 getLanguage 时,我得到一个空字符串。

【问题讨论】:

  • 您的方法不安全。例如。 Aragonese 的 ISO3 代码是 arg,而 ISO2 代码是 an

标签: java locale


【解决方案1】:

怎么样

public String getLang(Locale language)
    return language.getLanguage();
}

当然,如果为这种语言定义了一个 ISO 639-1 2 字母代码,则它只会是一个 2 字母代码,否则它可能会返回一个 3 字母代码(甚至更长)。


如果您的语言环境没有语言代码(如_DE),您的代码将给出愚蠢的结果(我的代码将返回空字符串,这更好一点,恕我直言)。如果语言环境包含语言代码,它将返回它,但您不需要 toLowerCase() 调用。

【讨论】:

  • 对我来说,这返回“nl_be”,而不是预期的“nl”。这怎么可能?我不得不使用 locale.getLanguage().split("_")[0] 来获得它:(
  • 这不起作用。需要拆分字符串。至少使用 Java 8
【解决方案2】:

我有同样的问题,这就是我发现的。

如果您使用构造函数创建Locale

Locale locale = new Locale("en_US");

然后你打电话给getLanguage:

String language = locale.getLanguage();

language 的值为“en_us”;

如果您使用构建器创建Locale

Locale locale = new Locale.Builder().setLanguage("en").setRegion("US").build()

那么locale.getLanguage() 的值将返回“en”。

这对我来说很奇怪,但这就是它的实现方式。

所以这是解释 如果您希望语言代码返回两个字母的 ISO 语言,您需要使用 Java Locale 构建器或进行一些字符串操作的长答案。

您使用substring 的方法有效,但我会使用我在下面写的内容来涵盖分隔符可能是“-”或“_”的情况。

public String getLang(Locale language)
    String[] localeStrings = (language.split("[-_]+"));
    return localeStrings[0];
}

【讨论】:

    【解决方案3】:

    也许可以致电Locale#getLanguage()

    【讨论】:

      【解决方案4】:

      Locale locale = ?; locale.getLanguage();

      【讨论】:

        【解决方案5】:

        使用toLanguageTag() 方法怎么样?

        例子:

        public String getLang(Locale language) {
            return language.toLanguageTag();
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-28
          • 1970-01-01
          相关资源
          最近更新 更多