Jak ustawić domyślne ustawienia regionalne w JVM?

Odpowiedzi:

156

Z referencji Oracle :

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.countryoraz user.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.

aleroot
źródło
jest ich konfliktem podczas pobierania tego samego ustawienia narodowego z ResourceBundle. Próbowałem pobrać pakiet, ale otrzymałem to, co miałem na początku
Navdeep Singh
153

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

lucasmo
źródło
8
Możesz to również ustawić za pomocą zmiennej środowiskowej _JAVA_OPTIONS.
Jeff Paquette,
2
Za pośrednictwem domyślnych ustawień regionalnych Java 7 :setx _JAVA_OPTIONS -Dsun.locale.formatasdefault=true /m
Vadzim
43

Możesz użyć argumentów JVM

java -Duser.country=ES -Duser.language=es -Duser.variant=Traditional_WIN
Aravind Yarram
źródło
29

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.

  1. Kliknij Start> Panel sterowania .

  2. 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 .

  3. 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).

  4. W sekcji Język programów innych niż Unicode wybierz żądany język z menu rozwijanego.

  5. 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.

  6. Postępuj zgodnie z instrukcjami ze wskazówkami, aby zainstalować pliki.

  7. 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ę.

Antonio Vinicius Menezes Medei
źródło
2
chociaż te informacje mogą być pomocne, chciałbym podkreślić, że te kroki są różne dla każdego systemu operacyjnego i dla każdego systemu operacyjnego, możesz być w stanie skonfigurować ustawienia regionalne, które są używane w całym systemie. Java została zaprojektowana tak, aby używać tych ustawień narodowych jako domyślnych ustawień narodowych, gdy nie ustawiamy jawnie domyślnych ustawień regionalnych. Tak więc informacje w tej odpowiedzi dotyczą tego, jak ustawić domyślne ustawienia regionalne w systemie Windows, a nie w Javie.
MozenRath
5

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_OPTIONSi ustawić jej wartość na -Duser.language=en-USlub dowolny inny język-REGION.

Ryan Ouyang
źródło
1

Możesz wymusić argumenty maszyny wirtualnej dla JARpliku 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();
BullyWiiPlaza
źródło
1

Możesz to zrobić:

wprowadź opis obrazu tutaj

wprowadź opis obrazu tutaj

I uchwycić lokalność. Możesz to zrobić:

private static final String LOCALE = LocaleContextHolder.getLocale().getLanguage()
            + "-" + LocaleContextHolder.getLocale().getCountry();
Nick Borges
źródło