как установить локаль по умолчанию для JVM?

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

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

5 ответов


С Oracle Reference:

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

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

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


вы можете установить его в командной строке через параметры JVM:

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

для получения дополнительной информации посмотрите на интернационализация: понимание локали в платформе Java-использование локали


вы можете использовать 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, как задокументировано здесь: изменение системы языка.

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

  1. клик Пуск > Панель Управления.

  2. Windows 7 и Vista: нажмите Часы, язык и регион > регион и язык.

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

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

  3. Windows 7: Нажмите административные tab.

    Windows XP и Vista: нажмите дополнительно tab.

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

  4. под язык для программ, отличных от Unicode выберите нужный язык из выпадающего меню.

  5. клик OK.

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

  6. следуйте инструкциям по установке файлов.

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

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


вы можете применить аргументы 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();