Я хочу установить значение Locale
по умолчанию для моей JVM fr_CA
. Каковы возможные варианты сделать это?
Я знаю только один вариант Locale.setDefault()
Я хочу установить значение Locale
по умолчанию для моей JVM fr_CA
. Каковы возможные варианты сделать это?
Я знаю только один вариант Locale.setDefault()
Ответы:
Из справочника Oracle :
Стандартный язык вашего приложения определяется тремя способами. Во-первых, если вы явно не изменили значение по умолчанию,
Locale.getDefault()
метод возвращает локаль, которая была первоначально определена виртуальной машиной Java (JVM) при первой загрузке. То есть JVM определяет локаль по умолчанию из среды хоста. Языковой стандарт среды хоста определяется операционной системой хоста и пользовательскими настройками, установленными в этой системе.Во- вторых, в некоторых реализациях среды исполнения Java, пользователь приложения может переопределить локаль по умолчанию хоста, предоставляя эту информацию в командной строке, установив
user.language
,user.country
иuser.variant
свойства системы.В-третьих, ваше приложение может вызвать
Locale.setDefault(Locale)
метод. Метод setDefault (Locale aLocale) позволяет вашему приложению установить общесистемный (фактически виртуальный) ресурс. После того, как вы установите язык по умолчанию с помощью этого метода, последующие вызовы Locale.getDefault () вернут вновь установленный язык.
Вы можете установить его в командной строке через параметры JVM:
java -Duser.country=CA -Duser.language=fr ... com.x.Main
Для получения дополнительной информации посмотрите Интернационализация: Понимание Языка в Платформе Java - Использование Языка
setx _JAVA_OPTIONS -Dsun.locale.formatasdefault=true /m
Вы можете использовать аргументы JVM
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: перейдите на вкладку « Дополнительно ».
(Если вкладка «Дополнительно» отсутствует, значит, вы не авторизованы с правами администратора.)
В разделе « Язык для программ, не поддерживающих Юникод », выберите нужный язык в раскрывающемся меню.
Нажмите ОК .
Система отобразит диалоговое окно с вопросом, использовать ли существующие файлы или установить с компакт-диска операционной системы. Убедитесь, что у вас есть готовый компакт-диск.
Следуйте инструкциям по установке файлов.
Перезагрузите компьютер после завершения установки.
Конечно, в Linux JRE также использует системные настройки для определения используемой локали, но инструкции по настройке общесистемного языка меняются с дистрибутива на дистрибутив.
Есть еще один вариант, если вы не хотите менять языковой стандарт системы, кроме JVM. Вы можете установить системную (или пользовательскую) переменную окружения JAVA_TOOL_OPTIONS
и установить ее значение на -Duser.language=en-US
любой другой язык-REGION, который вы хотите.
Вы можете применить аргументы 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();
Ты можешь сделать это:
И захватить локаль. Ты можешь сделать это:
private static final String LOCALE = LocaleContextHolder.getLocale().getLanguage()
+ "-" + LocaleContextHolder.getLocale().getCountry();