Я хочу встановити за замовчуванням 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) дозволяє вашій програмі встановити загальносистемний (власне VM) ресурс. Після того, як ви встановите локаль за замовчуванням за допомогою цього методу, наступні виклики до Locale.getDefault () повернуть нещодавно встановлений локаль.
Ви можете встановити його в командному рядку за допомогою параметрів JVM:
java -Duser.country=CA -Duser.language=fr ... com.x.Main
Для отримання додаткової інформації дивіться інтернаціоналізацію: Розуміння місцевого розташування на платформі Java - Використання локальної програми
Ви можете використовувати аргументи JVM
java -Duser.country=ES -Duser.language=es -Duser.variant=Traditional_WIN
У відповідях тут, до цих пір, ми знаходимо два способи зміни налаштування мови JRE:
Програматично, використовуючи Locale.setDefault () (що, в моєму випадку, було рішенням, оскільки я не хотів вимагати жодних дій користувача):
Locale.setDefault(new Locale("pt", "BR"));
Через аргументи до СВМ:
java -jar anApp.jar -Duser.language=pt-BR
Але, в якості довідки, я хочу зазначити, що в Windows існує ще один спосіб зміни локалі, використовуваний JRE, як це зафіксовано тут : зміна загальносистемної мови.
Примітка . Ви повинні увійти в обліковий запис, який має права адміністратора.
Клацніть Пуск> Панель управління .
Windows 7 та Vista: Клацніть годинник, мова та регіон> регіон та мова .
Windows XP: Двічі клацніть піктограму Регіональні та мовні параметри .
З'явиться діалогове вікно " Регіональні та мовні параметри ".
Windows 7: Перейдіть на вкладку Адміністратор .
Windows XP та Vista: Перейдіть на вкладку Додатково .
(Якщо немає вкладки "Розширений", ви не входите в систему з адміністративними привілеями.)
У розділі Мова для програм, що не стосуються Unicode , виберіть потрібну мову зі спадного меню.
Натисніть кнопку ОК .
Система відображає діалогове вікно із запитом, чи потрібно використовувати існуючі файли чи встановлювати з компакт-диска операційної системи. Переконайтеся, що у вас готовий компакт-диск.
Дотримуйтесь вказівок, щоб встановити файли.
Перезавантажте комп'ютер після завершення встановлення.
Безумовно, в Linux JRE також використовує системні налаштування, щоб визначити, яку локальну мову використовувати, але вказівки для встановлення зміни загальносистемної мови з дистрибутивної на дистрибутивну.
Є ще одне, якщо вам не подобається міняти локальну систему, а лише JVM. Ви можете встановити змінну середовища (або користувача) середовища JAVA_TOOL_OPTIONS
та встановити її значення на -Duser.language=en-US
будь-якій іншій мові - РЕГІОН, яку ви хочете.
Ви можете застосувати аргументи 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();