仅在本地计算机 JVM 上设置语言环境



出于工作目的,我需要将我的 Java 语言环境更改为系统范围内的另一种语言,但默认情况下似乎没有简单的方法可以做到这一点。我为 CJK 应用程序进行开发,但更改我的实际系统区域设置以匹配也会重命名我的主文件夹,这意味着如果我的输入法决定停止工作,我将不得不重新启动整个系统。

我试过在 JVM 参数 (-Duser.language=ja -Duser.locale=JP) 上设置

  • maven命令行参数(真的不是我想要的,但出于绝望而尝试)
  • {$project_dir}/.mvn/jvm.config(不理想)
  • 环境JAVA_ARGS(在/etc/environment下)
  • maven JVM arguments in eclipse/intellij
  • MAVEN_OPTS

但它们都不起作用。我的智慧到此为止。

需要明确的是,我正在寻找具有以下标准的解决方案:

  • 不特定于项目
  • 不需要在.mvn之外修改项目源(例如项目属性文件)
  • 不涉及更改我的实际系统区域设置 (en_US)
  • 不需要持续维护(例如不断添加命令行参数)

所以基本上是某种环境变量。

您可以在application.propertiesapplication.yaml中包含这些属性:

spring.mvc.locale=pt_BR
spring.mvc.locale-resolver=fixed

将区域设置更改为所需的区域设置。

这些属性用于在配置WebMvcAutoConfiguration时通过以下方法定义区域设置:

@Bean
@ConditionalOnMissingBean
@ConditionalOnProperty(prefix = "spring.mvc", name = "locale")
public LocaleResolver localeResolver() {
if (this.mvcProperties.getLocaleResolver() == WebMvcProperties.LocaleResolver.FIXED) {
return new FixedLocaleResolver(this.mvcProperties.getLocale());
}
AcceptHeaderLocaleResolver localeResolver = new AcceptHeaderLocaleResolver();
localeResolver.setDefaultLocale(this.mvcProperties.getLocale());
return localeResolver;
}

您也可以在此处查看源代码

你的-Duser.locale=JPJVM参数应该是-Duser.country=JP的。

来自 Oracle 技术资源中的语言环境:

。在某些 Java 运行时实现中,应用程序用户可以通过在命令行上设置user.languageuser.countryuser.variant系统属性来提供此信息,从而覆盖主机的缺省语言环境。

(不是完整的答案,但我没有足够的声誉来评论)

JVM 维护自己的当前缺省语言环境。Java 规范需要此行为。

通常,JVM实现会在 JVM 启动时检测主机操作系统缺省值,并将其用作自己的缺省值。以后更改主机操作系统的当前缺省值对 JVM 没有影响。Java 规范中指定此行为。

通常,您可以通过在用于启动 JVM 的命令行上指定缺省语言环境来覆盖该行为。你说你试过这个,但没有解释为什么这不是一个解决方案。Java 规范中指定此行为。

外部监控和操作

您可以通过打开一些通信路径来外部监视和操作 Java 中的语言环境。

JMX浮现在脑海中。

外部查找

当你的应用启动时,它可以在外部源中查找要使用的区域设置,然后将其设置为应用中的单一实例。

LDAP 服务器就是保存此类值的外部位置之一。您将在 Java 中使用 JNDI 来访问服务器并检索值。

呼叫Locale.setDefault

调用Locale.setDefault会立即影响 JVM 中所有应用程序中的所有代码。但这不会持续下去。重新启动应用程序或 JVM 时,必须再次调用。

任何其他代码都可以调用它以及您的代码,使其不可靠。我不推荐这种方法。

可以通过声明静态类变量来硬编码所需的Locale

static final public Locale LOCALE = Locale.ITALY ;

在应用启动时调用的生命周期代码中,调用Locale.setDefault( SomeClass.LOCALE ) ;

在代码中传递Locale对象

➥ 我建议始终在您关心的各个地方明确地将Locale作为可选参数传递。

ZoneId z = ZoneId.of( "America/Montreal" ) ;
LocalDate today = LocalDate.now( z ) ;
Locale locale = Locale.CANADA_FRENCH ;  // Pass explicitly your desired/expected `Locale`.
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate( FormatStyle.FULL ).withLocale( locale ) ;
String output = today.format( f ) ;

狂欢节 11 Juin 2019

取决于 JVM 的当前缺省语言环境是不可靠的。作为一名程序员,你依赖于你无法控制的外部性。

  • 系统管理员或最终用户可以更改部署中的默认值。
  • 调用Locale.setDefaultJVM 中任何应用程序或库的任何线程中的任何代码都会立即影响您的代码。

顺便说一下,时区也是如此,ZoneId.最好始终明确传递您想要/预期的时区。

此外,如果区域设置或时区至关重要,最好与用户确认。

你可以尝试 settig jvm 参数,如 (presudocode)

第一种方法,你可以这样做——

java -Duser.country=CA -Duser.language=fr ........

第二种方法是调用方法

Locale.setDefault(Locale)

上面的方法将设置它 JVM 明智的语言环境。

第三种方式,根据文档

使用显式区域设置

在某些计算环境中,应用程序仅使用单个区域设置 贯穿其整个生命周期。在其他环境中,应用程序使用 可以更改的全局区域设置。这些环境允许您 以编程方式更改全局区域设置首选项,该首选项保留在 效果,直到您再次明确更改它。Java 应用程序 环境独特,为您提供各种使用能力 以您需要的任何方式在整个应用程序中使用区域设置。

跨国公司的客户遍布全球。这 意味着他们的客户和员工可能会说不同的话 语言,并对公司及其 软件应该表现良好。而且,这是完全可能的,甚至 常见,让法国员工处理意大利人的销售记录 客户。在这些情况下,您将需要绝对控制 您的业务和用户界面对象使用的区域设置 操作和表示数据。您的应用程序可能需要打印 使用意大利日期和货币格式的销售收据,但排序 英语销售人员的客户列表。组合很远 太多了,无法一一列举,但 Java 技术为您提供了灵活性 来处理这种复杂性。

为了获得最大的灵活性,您必须明确请求 支持每个区分区域设置的类的目标区域设置 用。这意味着您必须跟踪多个区域设置首选项 应用程序的各个方面或将区域设置首选项分配给不同的 用户和客户。

如果跟踪了用户的区域设置首选项,则可以创建 通过显式提供区域设置来区分区域设置的类的实例 在构造函数或创建方法中。假设一个首选项对象 存储客户的区域设置选择:

Locale userLocale = preferences.getLocale(); 
NumberFormat nf = NumberFormat.getInstance(userLocale);

因此,在这里,您可以将客户区域设置首选项存储在此首选项对象 API 中,然后执行所需的格式化操作等。

您可以做的是,设置一个全局区域设置或保留一个默认区域设置。 并在需要时,在方法中显式设置所需的"区域设置"。

也请抛出以下链接-

https://www.top-password.com/blog/tag/change-system-locale-windows-command-line/

https://www.oracle.com/technetwork/articles/javase/locale-140624.html#using

我发现对我有用的唯一方法是在我的 IDE 上将LANG=ja_JP.UTF-8设置为启动后启动的实际系统环境变量(eclipse 和 intellij 都在运行配置下提供此功能)。但我真的非常不喜欢这种方法。

最新更新