Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java.util.Locale返回它构建时使用的不同语言_Java_Locale - Fatal编程技术网

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

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

考虑我用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)
    }
}

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

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(实际的,预期的)
。记录并交换。谢谢,结果证明我用错了断言。