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

147

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

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

MozenRath
источник

Ответы:

156

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

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

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

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

aleroot
источник
это любой конфликт при получении той же локали из ResourceBundle. Я попытался получить пакет, но я получил то, что у меня было изначально
Навдип Сингх
153

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

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

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

lucasmo
источник
8
Вы также можете установить его через переменную окружения _JAVA_OPTIONS.
Джефф Пакетт
2
Через Java 7 по умолчанию :setx _JAVA_OPTIONS -Dsun.locale.formatasdefault=true /m
Вадим
43

Вы можете использовать аргументы JVM

java -Duser.country=ES -Duser.language=es -Duser.variant=Traditional_WIN
Аравинд Яррам
источник
29

В ответах здесь до сих пор мы находим два способа изменить настройку языкового стандарта 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: щелкните вкладку « Администрирование ».

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

    (Если вкладка «Дополнительно» отсутствует, значит, вы не авторизованы с правами администратора.)

  4. В разделе « Язык для программ, не поддерживающих Юникод », выберите нужный язык в раскрывающемся меню.

  5. Нажмите ОК .

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

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

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

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

Антонио Виниций Менезес Медей
источник
2
Хотя эта информация может быть полезной, я хотел бы подчеркнуть, что эти шаги различны для каждой ОС и для каждой ОС, вы можете установить локаль, которая используется во всей системе. Java предназначена для использования этой локали в качестве локали по умолчанию, когда мы явно не устанавливаем локаль по умолчанию. Таким образом, информация в этом ответе о том, как установить локаль по умолчанию в Windows, а не в Java.
MozenRath
5

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

Райан Оуян
источник
1

Вы можете применить аргументы 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();
BullyWiiPlaza
источник
1

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

введите описание изображения здесь

введите описание изображения здесь

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

private static final String LOCALE = LocaleContextHolder.getLocale().getLanguage()
            + "-" + LocaleContextHolder.getLocale().getCountry();
Ник Борхес
источник