Java 21 中的语言环境更新

本地化通常具有挑战性,细微的错误有可能进入您的应用程序。幸运的是,JDK 21 在这方面进行了多项更新,这应该会对开发人员有所帮助。让我们来看看!

当尝试解决本地化问题时,第一步是验证 JVM 正在使用哪个区域设置。
使用 JDK 21,此过程变得更加容易,因为-X:showSettings选项已更新为包含区域设置和 tzdata。

在尝试解决本地化问题时:

  • 第一步是验证 JVM 使用的是哪个 Locale。由于 -X:showSettings 选项已更新为包含 locale 和 tzdata,因此 JDK 21 使这一过程变得更容易。
  • 还可以使用 -X:showSettings:locale 将其配置为只显示本地数据信息,如:$ java -X:showSettings:locale -version

$ java -X:showSettings:locale -version

Locale settings:
    default locale = English (United States)
    default display locale = English (United States)
    default format locale = English (United States)
    tzdata version = 2023c
    ...

此外,还显示了所有可用的本地语言;不过,由于本地语言有几百种,为了便于阅读,本文省略了这些信息。

请参阅:JDK-8305950

更改默认语言
如果您需要更改默认的本地语言,可以使用静态工厂方法 Locale.of()、Locale.Builder 或 Locale.forLanguageTag() 进行编程,并将值传递给 Locale.setDefault()。

瑞典语更新
2006 年,瑞典语排序规则进行了更改,以区分字母 w 和 v。这一更改已反映在 JDK-8306927 中。

根据旧规则,由 {"vc"、"va"、"wb"} 组成的数组将排序为 {"va"、"wb"、"vc"},而根据新规则,将排序为 {"va"、"vc"、"wb"}。

如果您想使用旧的瑞典语排序规则,可以将 sv-u-co-trad 传递给 Locale.forLanguageTag(String):
Locale TRADITIONAL_SWEDISH = Locale.forLanguageTag("sv-u-co-trad");

参考:JDK-8306927

CLDR 43
Java 默认使用 CLDR 来获取本地数据,JDK 21 已将其更新到第 43 版。该版本的主要变化是支持 coverageLevels.txt 文件。
参考: JDK-8296248

将 tzdata 更新为 2023c
JDK 21 已更新为使用 2023c tzdata。由于黎巴嫩处理夏令时的方式发生了变化,这实际上是向 2023a 的回滚。
参考:JDK-8305113

附加阅读:2023c tzdata