Chcę ustawić domyślne ustawienie Locale
mojej maszyny JVM nafr_CA
. Jakie są możliwe opcje, aby to zrobić?
Znam tylko jedną opcję Locale.setDefault()
Chcę ustawić domyślne ustawienie Locale
mojej maszyny JVM nafr_CA
. Jakie są możliwe opcje, aby to zrobić?
Znam tylko jedną opcję Locale.setDefault()
Odpowiedzi:
Domyślne ustawienia regionalne aplikacji są określane na trzy sposoby. Po pierwsze, o ile nie zmieniono jawnie wartości domyślnej,
Locale.getDefault()
metoda zwraca ustawienia narodowe, które zostały pierwotnie określone przez wirtualną maszynę języka Java (JVM) podczas pierwszego ładowania. Oznacza to, że maszyna JVM określa domyślne ustawienia regionalne na podstawie środowiska hosta. Ustawienia regionalne środowiska hosta są określane przez system operacyjny hosta i preferencje użytkownika ustalone w tym systemie.Po drugie, w niektórych implementacjach wykonawcze Java, użytkownik aplikacji może zmienić domyślne ustawienia regionalne gospodarza poprzez dostarczanie informacji na temat wiersza poleceń przez ustawienie
user.language
,user.country
orazuser.variant
właściwości systemu.Po trzecie, Twoja aplikacja może wywołać
Locale.setDefault(Locale)
metodę. Metoda setDefault (Locale aLocale) umożliwia aplikacji ustawienie zasobu całego systemu (w rzeczywistości całej maszyny wirtualnej) . Po ustawieniu domyślnych ustawień narodowych za pomocą tej metody, kolejne wywołania funkcji Locale.getDefault () zwrócą nowo ustawione ustawienia regionalne.
Możesz to ustawić w wierszu poleceń za pomocą parametrów JVM:
java -Duser.country=CA -Duser.language=fr ... com.x.Main
Więcej informacji można znaleźć w artykule Internationalization: Understanding Locale in the Java Platform - Using Locale
setx _JAVA_OPTIONS -Dsun.locale.formatasdefault=true /m
Możesz użyć argumentów JVM
java -Duser.country=ES -Duser.language=es -Duser.variant=Traditional_WIN
W odpowiedziach tutaj, do tej pory, znajdujemy dwa sposoby zmiany ustawień regionalnych JRE:
Programowo, używając Locale.setDefault () (co w moim przypadku było rozwiązaniem, ponieważ nie chciałem wymagać żadnej akcji użytkownika):
Locale.setDefault(new Locale("pt", "BR"));
Za pośrednictwem argumentów do JVM:
java -jar anApp.jar -Duser.language=pt-BR
Ale jako odniesienie chcę zauważyć, że w systemie Windows istnieje jeszcze jeden sposób zmiany ustawień regionalnych używanych przez środowisko JRE, jak opisano tutaj : zmiana języka systemu.
Uwaga : musisz być zalogowany na konto z uprawnieniami administratora.
Kliknij Start> Panel sterowania .
Windows 7 i Vista: Kliknij Zegar, język i region> Region i język .
Windows XP: kliknij dwukrotnie ikonę Opcje regionalne i językowe .
Zostanie wyświetlone okno dialogowe Opcje regionalne i językowe .
Windows 7: Kliknij kartę Administracyjne .
Windows XP i Vista: Kliknij kartę Zaawansowane .
(Jeśli nie ma karty Zaawansowane, oznacza to, że nie jesteś zalogowany z uprawnieniami administratora).
W sekcji Język programów innych niż Unicode wybierz żądany język z menu rozwijanego.
Kliknij OK .
System wyświetla okno dialogowe z pytaniem, czy użyć istniejących plików, czy zainstalować z dysku CD z systemem operacyjnym. Upewnij się, że masz przygotowaną płytę CD.
Postępuj zgodnie z instrukcjami ze wskazówkami, aby zainstalować pliki.
Uruchom ponownie komputer po zakończeniu instalacji.
Z pewnością w Linuksie JRE używa również ustawień systemowych do określenia, które locale użyć, ale instrukcje ustawiania zmiany języka dla całego systemu z dystrybucji na dystrybucję.
Jest jeszcze jedna nieobecna, jeśli nie chcesz zmieniać ustawień regionalnych systemu, ale JVM. możesz ustawić zmienną środowiskową System (lub użytkownika) JAVA_TOOL_OPTIONS
i ustawić jej wartość na -Duser.language=en-US
lub dowolny inny język-REGION.
Możesz wymusić argumenty maszyny wirtualnej dla JAR
pliku z następującym kodem:
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());
}
}
}
Jest używany w następujący sposób:
JVMArgumentEnforcer jvmArgumentEnforcer = new JVMArgumentEnforcer("-Duser.language=pt-BR"); // For example
jvmArgumentEnforcer.forceArgument();
Możesz to zrobić:
I uchwycić lokalność. Możesz to zrobić:
private static final String LOCALE = LocaleContextHolder.getLocale().getLanguage()
+ "-" + LocaleContextHolder.getLocale().getCountry();