考虑我用 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,假设它会返回相同的语言难道不应该安全吗?
看一下java.util.Locale\'s的文档getLanguage(),内容如下:
\n\n公共字符串 getLanguage()
\n返回此区域设置的语言代码。
\n注意:ISO 639 不是一个稳定的标准\xe2\x80\x94 某些语言的代码已更改。Locale 的构造函数可以识别代码已更改的语言的新代码和旧代码,但此函数始终返回旧代码。如果您想检查代码已更改的特定语言,请不要这样做
\n
来源:https://docs.oracle.com/javase/7/docs/api/java/util/Locale.html#getLanguage()
\n这意味着,根据 ISO 639 标准,在某个时间点,印度尼西亚语言环境由 标识in,但此后发生了变化,印度尼西亚语言环境标识符更改为id。