Internationalization 我们是否可以在不重新启动java进程的情况下为java进程设置java进程区域设置(-Djava.util.locale=es_es)

Internationalization 我们是否可以在不重新启动java进程的情况下为java进程设置java进程区域设置(-Djava.util.locale=es_es),internationalization,Internationalization,我需要支持国际化,因此用户将选择必须应用于服务器进程和操作系统的不同语言。我们正在使用CentOS 我们可以在不重新启动java进程的情况下设置java语言环境吗? 请提供设置 如果需要支持国际化,则不应在JVM级别分配区域设置。因此,您不应该使用-Duser.language或-Duser.country。您也不应该使用locale.setDefault()在代码中指定区域设置-这还将设置JVM范围的区域设置(这将影响所有运行的Java应用程序) 现在还不清楚你在追求什么,但就我个人而言,在你

我需要支持国际化,因此用户将选择必须应用于服务器进程和操作系统的不同语言。我们正在使用CentOS

我们可以在不重新启动java进程的情况下设置java语言环境吗?
请提供设置

如果需要支持国际化,则不应在JVM级别分配区域设置。因此,您不应该使用
-Duser.language
-Duser.country
。您也不应该使用
locale.setDefault()
在代码中指定区域设置-这还将设置JVM范围的区域设置(这将影响所有运行的Java应用程序)

现在还不清楚你在追求什么,但就我个人而言,在你的问题中我感觉到一些误解

如果您想支持I18n,您需要做的是检测区域设置并有选择地跟踪它们。根据应用程序和环境的类型,它可能非常简单(
Locale.getDefault(Locale.Category.FORMAT)
在桌面应用程序中(仅限),也可能非常复杂(在web应用程序中,从请求上下文读取区域设置并将其存储为会话变量)。

如您所见,无需分配默认区域设置,它应该留给JVM启动代码。

当我们在设备上工作时,用户将选择要使用我们的应用程序更新到设备/服务器的区域设置。基于此,我们正在更新centos i18n文件的区域设置并更新vm参数。并重新启动整个设备,以使用新的区域设置重新初始化操作系统、java、webapps、db和rabbitmq。在这种情况下-Djava.util.locale是唯一的选项。我们还有其他方法吗?@piyush:因为你需要重新启动整个堆栈,我认为没有任何方法可以解决这个问题(毕竟你可能需要重新读取依赖于语言的数据,例如从数据库中读取)。我认为动态更改VM参数不会解决任何问题。您可以做的是在运行时设置默认的语言环境(使用
locale.setDefault()
),但是您仍然需要以某种方式重新初始化所有组件。因此,我认为避免宕机并不容易。@piyush:我能想到的唯一其他选择是使整个堆栈语言不可知,即避免对区域设置的依赖。如果您仔细考虑一下,您真正需要区域设置的唯一地方是用户界面,就设备业务而言,这通常意味着一些web应用程序。因此,如果您可以在整个过程中存储与语言无关的数据,并在显示时解析字符串,那么您就可以避免停机和切换语言环境的需要。但我相信,在这个阶段,这将意味着大量的工作和金钱(这是架构级别的bug)。感谢您的投入。我们刚刚启动了应用程序,它不是遗留应用程序。我们正试图从集中化文件i18n(具有区域设置信息)控制appserver/third party lib,当用户从网页修改时,我们会在其中更新区域设置。这意味着唯一的选择是提供vm参数language/country,并使用该语言环境初始化vm。我只是想知道是否有可能在不使用新语言环境重新启动的情况下重新启动java进程,并且在重新启动时也会注意。