java.util.Locale返回它构建时使用的不同语言
考虑我用Kotlin编写的一个简单测试:java.util.Locale返回它构建时使用的不同语言,java,locale,Java,Locale,考虑我用Kotlin编写的一个简单测试: class LocaleTest { @Test fun english() { val locale = Locale("en") assertEquals("English", locale.displayLanguage) assertEquals("en", locale.language) } @Test fun indonesia() { val lo
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)
}
}
第二个测试失败,因为它应该是
id
,但实际上是in
。这怎么可能?Locale
是用languageid
构建的,假设它将返回相同的语言是否安全
ISO 639不是一个稳定的标准;它定义的一些语言代码
*(特别是“iw”、“ji”和“in”)发生了变化。此构造函数接受
*旧代码(“iw”、“ji”和“in”)和新代码(“he”、“yi”和“id”),但所有其他
*区域设置上的API将仅返回旧代码
因此,id
是一个新的id,但是文档特别指出,对于这种情况,中的将被返回。
为什么呢?我相信,可能不是为了打破旧的应用程序在
中按预期的输出使用,所以换句话说,是为了支持向后兼容性
若您需要检查您正在使用的locale
是否为印度尼西亚语,那个么推荐的方法可能是使用指定的locale创建一些静态常量变量,并检查其相等性
因此,在某些Util类中(我认为在Kotlin中,您可以使用companion对象):
当您需要检查时:
if (INDONESIAN_LOCALE.equals(receivedLocale)) {
...they are the same...
}
查看java.util.Locale
的getLanguage()
的文档说明如下:
公共字符串getLanguage()
返回此区域设置的语言代码
注:ISO 639不是一个稳定的标准-某些语言的代码已更改。Locale的构造函数识别代码已更改的语言的新代码和旧代码,但此函数始终返回旧代码。如果要检查代码已更改的特定语言,请不要这样做
if (locale.getLanguage().equals("he")) // BAD!
资料来源:
这意味着,根据ISO 639标准,在某个时间点,印度尼西亚地区通过
中的
识别,然而,自那时以来,印度尼西亚语言环境标识符已更改为id
,这是Java中的一个已知错误,为了保持向后兼容性,不会对其进行修复
有关更多信息,请访问:
注意:ISO 639不是一个稳定的标准-某些语言的代码已更改。Locale的构造函数识别代码已更改的语言的新代码和旧代码,但此函数始终返回旧代码
如果要检查代码已更改的特定语言,请不要这样做
if (locale.getLanguage().equals("he")) // BAD!
相反,你应该这样做
if (locale.getLanguage().equals(new Locale("he").getLanguage()))
请注意,您的论点顺序是错误的。它是
assertEquals(预期的,实际的)
,而不是assertEquals(实际的,预期的)
。记录并交换。谢谢,结果证明我用错了断言。