Как установить языковой стандарт по умолчанию для моей JVM?

Я хочу установить значение по умолчанию для моего JVM по умолчанию для fr_CA. Каковы возможные варианты для этого?

Я знаю только один вариант Locale.setDefault()

Ответ 1

Из Справочник Oracle:

Стандартная локализация вашего приложения определяется тремя способами. Во-первых, если вы явно не изменили значение по умолчанию, Locale.getDefault() возвращает локаль, которая была первоначально определена с помощью виртуальной машины Java (JVM) при ее первой загрузке. Это JVM определяет локаль по умолчанию из среды хоста. Гостья локаль среды определяется операционной системой хоста и пользовательские настройки, установленные в этой системе.

Во-вторых, для некоторых реализаций исполнения Java пользователь приложения может переопределите локальный стандарт хоста, указав эту информацию на командной строки, установив user.language, user.country и user.variant.

В-третьих, ваше приложение может вызвать Locale.setDefault(Locale)метод. Метод setDefault (Locale aLocale) позволяет вашему приложению установите системный (фактически VM-wide) ресурс. После того, как вы установили языковой стандарт по умолчанию метод, последующие вызовы Locale.getDefault() вернут установить языковой стандарт.

Ответ 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, как описано здесь: изменение общесистемного языка.

Примечание. Вы должны войти в систему с учетной записью, имеющей административные привилегии.

  • Нажмите Пуск > Панель управления.

  • Windows 7 и Vista: выберите Часы, язык и регион > Регион и язык.

    Windows XP: дважды щелкните значок Региональные и языковые параметрызначок.

    Появится диалоговое окно Региональные и языковые параметры.

  • Windows 7: перейдите на вкладку Административная.

    Windows XP и Vista: перейдите на вкладку Дополнительно.

    (Если вкладка "Дополнительно" отсутствует, то вы не вошли в систему с административные привилегии.)

  • В разделе Язык для не-Unicode выберите нужный язык в раскрывающемся меню.

  • Нажмите ОК.

    Система отображает диалоговое окно с вопросом, следует ли использовать существующие файлов или для установки с компакт-диска операционной системы. Убедитесь, что у вас есть компакт-диск готов.

  • Следуйте инструкциям по установке, чтобы установить файлы.

  • Перезагрузите компьютер после завершения установки.

Конечно, в Linux JRE также использует системные настройки, чтобы определить, какой язык использовать, но инструкции по изменению общесистемного языка из дистрибутива в дистрибутив.

Ответ 5

Вы можете применять аргументы VM для файла JAR со следующим кодом:

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();

Ответ 6

Вы можете сделать это:

enter image description here

enter image description here

И захватить локаль. Вы можете сделать это:

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

Ответ 7

Есть еще один вариант, если вы не хотите менять локаль системы, кроме JVM. Вы можете установить JAVA_TOOL_OPTIONS (или пользовательскую) переменную среды JAVA_TOOL_OPTIONS и установить ее значение -Duser.language=en-US или любой другой язык-REGION, который вы хотите.