java.util.Locale 返回构建时使用的不同语言

Hen*_*ian 5 java locale

考虑我用 Kotlin 编写的一个简单测试:

class LocaleTest {

    @Test fun english() {
        val locale = Locale("en")
        assertEquals("English", locale.displayLanguage)
        assertEquals("en", locale.language)
    }

    @Test fun indonesia() {
        val locale = Locale("id")
        assertEquals("Indonesian", locale.displayLanguage)
        assertEquals("id", locale.language)
    }
}
Run Code Online (Sandbox Code Playgroud)

第二个测试失败了,因为它是预期的,id但实际上是in。这怎么可能?是Locale用 language 构建的id,假设它会返回相同的语言难道不应该安全吗?

nbo*_*ans 2

看一下java.util.Locale\'s的文档getLanguage(),内容如下:

\n
\n

公共字符串 getLanguage()

\n

返回此区域设置的语言代码。

\n

注意:ISO 639 不是一个稳定的标准\xe2\x80\x94 某些语言的代码已更改。Locale 的构造函数可以识别代码已更改的语言的新代码和旧代码,但此函数始终返回旧代码。如果您想检查代码已更改的特定语言,请不要这样做

\n
\n

来源:https://docs.oracle.com/javase/7/docs/api/java/util/Locale.html#getLanguage()

\n

这意味着,根据 ISO 639 标准,在某个时间点,印度尼西亚语言环境由 标识in,但此后发生了变化,印度尼西亚语言环境标识符更改为id

\n