我想将Locale
JVM 的默认设置为fr_CA
。有哪些可能的选择呢?
我只知道一种选择 Locale.setDefault()
我想将Locale
JVM 的默认设置为fr_CA
。有哪些可能的选择呢?
我只知道一种选择 Locale.setDefault()
Answers:
从Oracle参考:
应用程序的默认语言环境通过三种方式确定。首先,除非您已显式更改默认值,否则该
Locale.getDefault()
方法将返回Java虚拟机(JVM)首次加载时最初确定的语言环境。也就是说,JVM从主机环境中确定默认语言环境。主机环境的语言环境由主机操作系统和在该系统上建立的用户首选项确定。其次,一些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平台中的语言环境-使用语言环境
setx _JAVA_OPTIONS -Dsun.locale.formatasdefault=true /m
您可以使用JVM args
java -Duser.country=ES -Duser.language=es -Duser.variant=Traditional_WIN
到目前为止,在这里的答案中,我们找到了两种更改JRE语言环境设置的方法:
通过编程,使用Locale.setDefault()(在我的情况下,这是解决方案,因为我不想要求用户执行任何操作):
Locale.setDefault(new Locale("pt", "BR"));
通过JVM的参数:
java -jar anApp.jar -Duser.language=pt-BR
但是,只是作为参考,我想需要注意的是,在Windows上,有改变由JRE使用的语言环境的另一种方式,如记录在这里:改变全系统的语言。
注意:您必须使用具有管理权限的帐户登录。
单击开始>控制面板。
Windows 7和Vista:单击时钟,语言和区域> 区域和语言。
Windows XP:双击“ 区域和语言选项” 图标。
出现区域和语言选项对话框。
Windows 7:单击管理选项卡。
Windows XP和Vista:单击“ 高级”选项卡。
(如果没有“高级”选项卡,则您没有使用管理特权登录。)
在“ 非Unicode程序的语言”部分下,从下拉菜单中选择所需的语言。
单击确定。
系统显示一个对话框,询问是否使用现有文件或从操作系统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();