我们用于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源代码中找到的代码?