为什么Java明确地将系统设置为en-AU时调用en-US语言环境?

时间:2016-11-07 05:27:10

标签: java macos locale

我们用于OSX的构建机器运行10.10和10.11的混合。在构建机器的初始机器设置期间,对于我自己的机器,选择澳大利亚英语作为区域设置。我自己的机器运行10.12,这是一个潜在的差异。

当我问locale我正在运行的Locale时,我会得到我期望的结果。

m-matsurika:~ tester$ locale
LANG="en_AU.UTF-8"
LC_COLLATE="en_AU.UTF-8"
LC_CTYPE="en_AU.UTF-8"
LC_MESSAGES="en_AU.UTF-8"
LC_MONETARY="en_AU.UTF-8"
LC_NUMERIC="en_AU.UTF-8"
LC_TIME="en_AU.UTF-8"
LC_ALL=

然而,当我在Java中时,Locale被莫名其妙地设置为美国英语:

m-matsurika:~ tester$ irb
irb(main):001:0> Java::JavaUtil::Locale.getDefault.toLanguageTag
=> "en-US"

但这只发生在构建机器上。对于我自己的机器,结果是" en-AU",正是我所期待的。尽管据我所知,所有机器都采用相同的方式设置。

这怎么可能?

进一步尝试解决这个问题:

m-matsurika:~ tester$ LANG=en_AU ruby -e 'puts Java::JavaUtil::Locale.getDefault.toLanguageTag'
en-US
m-matsurika:~ tester$ LC_ALL=en_AU ruby -e 'puts Java::JavaUtil::Locale.getDefault.toLanguageTag'
en-US

m-hisui:~ tester$ LANG=ja_JP ruby -e 'puts Java::JavaUtil::Locale.getDefault.toLanguageTag'
en-US
m-hisui:~ tester$ LC_ALL=ja_JP ruby -e 'puts Java::JavaUtil::Locale.getDefault.toLanguageTag'
en-US

其他系统信息:

m-matsurika:~ tester$ java -version
java version "1.8.0_92"
Java(TM) SE Runtime Environment (build 1.8.0_92-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.92-b14, mixed mode)

进一步调查:

我写了一个测试程序来获取macOS语言环境,它显示了en_AU。看到这个,我挖出了Java启动器本身的源代码,看看它是如何表现的。在花了半天的时间将其缩小为可运行的测试程序之后,我发现此测试问题显示为en_AU。

我还测试了多个Javas。 1.8.0_92,1.8.0_112和9​​都表现相同,一旦你进入Java,就会显示en_US。我读的源是92,但似乎返回了正确的值。

那么Java如何确定它设置的Locale,如果它不是来自我能在JDK源代码中找到的代码?

0 个答案:

没有答案