我如何设置我的JVM的默认语言环境?
我想为我的JVM设置默认的语言环境fr_CA。 有什么可能的select来做到这一点?
我知道只有一个选项Locale.setDefault()
从Oracle参考资料 :
您的应用程序的默认区域设置有三种确定方式。 首先,除非明确更改默认值,否则
Locale.getDefault()
方法将返回Java虚拟机(JVM)首次加载时最初确定的区域设置。 也就是说,JVM从主机环境中确定默认的语言环境。 主机环境的语言环境由主机操作系统和在该系统上build立的用户首选项决定。其次,在某些Java运行时实现中,应用程序用户可以通过设置
user.language
,user.country
和user.variant
系统属性在命令行上提供此信息来覆盖主机的默认语言环境。第三,您的应用程序可以调用
Locale.setDefault(Locale)
方法。 setDefault(Locale aLocale)方法可以让您的应用程序设置一个系统范围(实际上是VM范围)的资源。 使用此方法设置默认语言环境后,对Locale.getDefault()的后续调用将返回新设置的语言环境。
您可以通过JVM参数在命令行上进行设置:
java -Duser.country=CA -Duser.language=fr ... com.x.Main
有关更多信息,请参阅国际化:了解Java平台中的语言环境 – 使用语言环境
您可以使用JVM参数
java -Duser.country=ES -Duser.language=es -Duser.variant=Traditional_WIN
在这里的答案中,到目前为止,我们find了两种更改JRE语言环境设置的方法:
-
以编程方式,使用Locale.setDefault() (在我的情况下,这是解决scheme,因为我不想要求用户的任何操作):
Locale.setDefault(new Locale("pt", "BR"));
-
通过JVM的参数:
java -jar anApp.jar -Duser.language=pt-BR
但是,作为参考,我想指出的是,在Windows上,还有一种更改JRE使用的语言环境的方法,如以下所述:更改系统范围的语言。
注意 :您必须使用具有pipe理特权的帐户login。
点击开始>控制面板 。
Windows 7和Vista:单击时钟,语言和区域> 区域和语言 。
Windows XP:双击区域和语言选项图标。
出现区域和语言选项对话框。
Windows 7:单击pipe理选项卡。
Windows XP和Vista:单击“ 高级”选项卡。
(如果没有“高级”选项卡,则说明您没有使用pipe理权限login。)
在“ 非Unicode程序的语言”部分下,从下拉菜单中select所需的语言。
点击OK 。
系统将显示一个对话框,询问是使用现有文件还是从操作系统CD进行安装。 确保您准备好CD。
按照指导说明安装文件。
安装完成后重新启动计算机。
当然,在Linux上,JRE还使用系统设置来确定要使用的语言环境,但是将系统范围的语言从发行版变更为发行版的说明。
您可以使用以下代码为JAR
文件强制执行VM参数:
import java.io.File; import java.lang.management.ManagementFactory; import java.lang.management.RuntimeMXBean; import java.net.URISyntaxException; import java.util.ArrayList; import java.util.List; public class JVMArgumentEnforcer { private String argument; public JVMArgumentEnforcer(String argument) { this.argument = argument; } public static long getTotalPhysicalMemory() { com.sun.management.OperatingSystemMXBean bean = (com.sun.management.OperatingSystemMXBean) java.lang.management.ManagementFactory.getOperatingSystemMXBean(); return bean.getTotalPhysicalMemorySize(); } public static boolean isUsing64BitJavaInstallation() { String bitVersion = System.getProperty("sun.arch.data.model"); return bitVersion.equals("64"); } private boolean hasTargetArgument() { RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean(); List<String> inputArguments = runtimeMXBean.getInputArguments(); return inputArguments.contains(argument); } public void forceArgument() throws Exception { if (!hasTargetArgument()) { // This won't work from IDEs if (JARUtilities.isRunningFromJARFile()) { // Supply the desired argument restartApplication(); } else { throw new IllegalStateException("Please supply the VM argument with your IDE: " + argument); } } } private void restartApplication() throws Exception { String javaBinary = getJavaBinaryPath(); ArrayList<String> command = new ArrayList<>(); command.add(javaBinary); command.add("-jar"); command.add(argument); String currentJARFilePath = JARUtilities.getCurrentJARFilePath(); command.add(currentJARFilePath); ProcessBuilder processBuilder = new ProcessBuilder(command); processBuilder.start(); // Kill the current process System.exit(0); } private String getJavaBinaryPath() { return System.getProperty("java.home") + File.separator + "bin" + File.separator + "java"; } public static class JARUtilities { static boolean isRunningFromJARFile() throws URISyntaxException { File currentJarFile = getCurrentJARFile(); return currentJarFile.getName().endsWith(".jar"); } static String getCurrentJARFilePath() throws URISyntaxException { File currentJarFile = getCurrentJARFile(); return currentJarFile.getPath(); } private static File getCurrentJARFile() throws URISyntaxException { return new File(JVMArgumentEnforcer.class.getProtectionDomain().getCodeSource().getLocation().toURI()); } } }
它使用如下:
JVMArgumentEnforcer jvmArgumentEnforcer = new JVMArgumentEnforcer("-Duser.language=pt-BR"); // For example jvmArgumentEnforcer.forceArgument();