【问题标题】:How do I set the default locale in the JVM?如何在 JVM 中设置默认语言环境?
【发布时间】:2012-02-07 05:00:08
【问题描述】:

我想将我的 JVM 的默认 Locale 设置为 fr_CA。有哪些可能的选择?

我只知道一个选项Locale.setDefault()

【问题讨论】:

标签: java localization globalization


【解决方案1】:

可以通过JVM参数在命令行中设置:

java -Duser.country=CA -Duser.language=fr ... com.x.Main

更多信息请查看Internationalization: Understanding Locale in the Java Platform - Using Locale

【讨论】:

  • 也可以通过_JAVA_OPTIONS环境变量来设置。
  • 通过Java 7 default locale:setx _JAVA_OPTIONS -Dsun.locale.formatasdefault=true /m
【解决方案2】:

来自Oracle Reference:

应用程序的默认语言环境由三种方式确定。 首先,除非您明确更改了默认值,否则 Locale.getDefault() 方法返回最初确定的语言环境 首次加载时由 Java 虚拟机 (JVM) 执行。那就是 JVM 从主机环境中确定默认语言环境。主人 环境的语言环境由主机操作系统确定,并且 在该系统上建立的用户偏好。

其次,在某些 Java 运行时实现中,应用程序用户可以 通过提供此信息覆盖主机的默认语言环境 通过设置user.language、user.country 和 user.variant系统属性。

第三,您的应用程序可以调用Locale.setDefault(Locale) 方法。 setDefault(Locale aLocale) 方法让您的应用程序 设置系统范围的(实际上是 VM 范围的) 资源。使用此设置默认语言环境后 方法,随后对 Locale.getDefault() 的调用将返回新的 设置语言环境。

【讨论】:

  • 是他们从 ResourceBundle 获取相同语言环境时的任何冲突。我试图获取捆绑包,但我得到了我最初拥有的东西
【解决方案3】:

你可以使用 JVM 参数

java -Duser.country=ES -Duser.language=es -Duser.variant=Traditional_WIN

【讨论】:

    【解决方案4】:

    在此处的答案中,到目前为止,我们找到了两种更改 JRE 语言环境设置的方法:

    • 以编程方式,使用Locale.setDefault()(就我而言,这是解决方案,因为我不想要求用户采取任何行动):

      Locale.setDefault(new Locale("pt", "BR"));
      
    • 通过 JVM 的参数:

      java -jar anApp.jar -Duser.language=pt-BR
      

    但是,作为参考,我想指出,在 Windows 上,还有另一种更改 JRE 使用的语言环境的方法,如 here 所述:更改系统范围的语言。

    注意:您必须使用具有管理权限的帐户登录。

    1. 点击开始>控制面板。

    2. Windows 7 和 Vista:点击时钟、语言和区域 > 区域和语言。

      Windows XP:双击区域和语言选项 图标。

      区域和语言选项对话框出现。

    3. Windows 7:点击管理标签。

      Windows XP 和 Vista:点击高级标签。

      (如果没有高级选项卡,那么您没有使用 管理权限。)

    4. 在非 Unicode 程序的语言部分下,从下拉菜单中选择所需的语言。

    5. 点击确定。

      系统显示一个对话框询问是否使用现有的 文件或从操作系统 CD 安装。确保您有 CD 准备好了。

    6. 按照指导说明安装文件。

    7. 安装完成后重启电脑。

    当然,在 Linux 上,JRE 也使用系统设置来确定要使用的语言环境,但设置系统范围语言的说明会因发行版而异。

    【讨论】:

    • 虽然这些信息可能会有所帮助,但我想强调这些步骤因每个操作系统而异,并且对于每个操作系统,您可以设置系统范围内使用的区域设置。当我们没有明确设置默认语言环境时,Java 被设计为使用该语言环境作为默认语言环境。所以这个答案中的信息是关于如何在 windows 中而不是在 java 中设置默认语言环境。
    【解决方案5】:

    如果您不想更改系统区域设置,但 JVM,还有另一个方法。您可以设置系统(或用户)环境变量 JAVA_TOOL_OPTIONS 并将其值设置为 -Duser.language=en-US 或您想要的任何其他语言区域。

    【讨论】:

      【解决方案6】:

      你可以这样做:

      并捕获语言环境。你可以这样做:

      private static final String LOCALE = LocaleContextHolder.getLocale().getLanguage()
                  + "-" + LocaleContextHolder.getLocale().getCountry();
      

      【讨论】:

        【解决方案7】:

        您可以使用以下代码为 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();
        

        【讨论】:

          猜你喜欢
          • 2016-09-07
          • 2014-09-14
          • 1970-01-01
          • 1970-01-01
          • 2020-04-05
          • 1970-01-01
          • 1970-01-01
          • 2017-11-01
          • 1970-01-01
          相关资源
          最近更新 更多