Wie lege ich das Standardgebietsschema in der JVM fest?

Antworten:

156

Aus der Oracle-Referenz :

Das Standardgebietsschema Ihrer Anwendung wird auf drei Arten festgelegt. Erstens gibt die Locale.getDefault()Methode , sofern Sie die Standardeinstellung nicht explizit geändert haben, das Gebietsschema zurück, das ursprünglich von der Java Virtual Machine (JVM) beim ersten Laden festgelegt wurde. Das heißt, die JVM ermittelt das Standardgebietsschema aus der Hostumgebung. Das Gebietsschema der Host-Umgebung wird vom Host-Betriebssystem und den auf diesem System festgelegten Benutzereinstellungen bestimmt.

Zweitens auf einigen Java - Runtime - Implementierungen, die Anwendungs - Benutzer können das Standardgebietsschema des Host außer Kraft setzen , indem Sie diese Informationen in der Befehlszeile bereitstellt , indem sie die Einstellung user.language, user.countryund user.variantSystemeigenschaften.

Drittens kann Ihre Anwendung die Locale.setDefault(Locale) Methode aufrufen . Mit der Methode setDefault (Locale aLocale) kann Ihre Anwendung eine systemweite (tatsächlich VM-weite) Ressource festlegen . Nachdem Sie das Standardgebietsschema mit dieser Methode festgelegt haben, geben nachfolgende Aufrufe von Locale.getDefault () das neu festgelegte Gebietsschema zurück.

aleroot
quelle
ist ihr Konflikt, wenn sie dasselbe Gebietsschema aus ResourceBundle abrufen. Ich habe versucht, das Bündel zu holen, aber ich habe bekommen, was ich ursprünglich hatte
Navdeep Singh
153

Sie können es über JVM-Parameter in der Befehlszeile einstellen:

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

Weitere Informationen finden Sie unter Internationalisierung: Grundlegendes zum Gebietsschema in der Java-Plattform - Verwenden des Gebietsschemas

lucasmo
quelle
8
Sie können es auch über die Umgebungsvariable _JAVA_OPTIONS festlegen.
Jeff Paquette
2
Über Java 7 Standard-Gebietsschema :setx _JAVA_OPTIONS -Dsun.locale.formatasdefault=true /m
Vadzim
43

Sie können JVM-Argumente verwenden

java -Duser.country=ES -Duser.language=es -Duser.variant=Traditional_WIN
Aravind Yarram
quelle
29

In den Antworten hier finden wir bis jetzt zwei Möglichkeiten, die JRE-Gebietsschemaeinstellung zu ändern:

  • Programmgesteuert mit Locale.setDefault () (was in meinem Fall die Lösung war, da ich keine Aktion des Benutzers fordern wollte):

    Locale.setDefault(new Locale("pt", "BR"));
  • Über Argumente an die JVM:

    java -jar anApp.jar -Duser.language=pt-BR

Als Referenz möchte ich jedoch darauf hinweisen, dass es unter Windows eine weitere Möglichkeit gibt, das von der JRE verwendete Gebietsschema zu ändern, wie hier dokumentiert : das Ändern der systemweiten Sprache.

Hinweis : Sie müssen mit einem Konto mit Administratorrechten angemeldet sein.

  1. Klicken Sie auf Start> Systemsteuerung .

  2. Windows 7 und Vista: Klicken Sie auf Uhr, Sprache und Region> Region und Sprache .

    Windows XP: Doppelklicken Sie auf das Symbol Regional- und Sprachoptionen .

    Das Dialogfeld Regional- und Sprachoptionen wird angezeigt.

  3. Windows 7: Klicken Sie auf die Registerkarte Verwaltung .

    Windows XP und Vista: Klicken Sie auf die Registerkarte Erweitert .

    (Wenn keine Registerkarte "Erweitert" vorhanden ist, sind Sie nicht mit Administratorrechten angemeldet.)

  4. Wählen Sie im Abschnitt Sprache für Nicht-Unicode-Programme die gewünschte Sprache aus dem Dropdown-Menü aus.

  5. Klicken Sie auf OK .

    Das System zeigt ein Dialogfeld an, in dem Sie gefragt werden, ob vorhandene Dateien verwendet oder von der Betriebssystem-CD installiert werden sollen. Stellen Sie sicher, dass Sie die CD bereit haben.

  6. Befolgen Sie die Anweisungen, um die Dateien zu installieren.

  7. Starten Sie den Computer nach Abschluss der Installation neu.

Natürlich verwendet die JRE unter Linux auch die Systemeinstellungen, um zu bestimmen, welches Gebietsschema verwendet werden soll, aber die Anweisungen zum Festlegen der systemweiten Sprache ändern sich von Distribution zu Distribution.

Antonio Vinicius Menezes Medei
quelle
2
Obwohl diese Informationen hilfreich sein können, möchte ich hervorheben, dass diese Schritte für jedes Betriebssystem unterschiedlich sind und Sie für jedes Betriebssystem möglicherweise ein Gebietsschema einrichten können, das systemweit verwendet wird. Java wurde entwickelt, um dieses Gebietsschema als Standardgebietsschema zu verwenden, wenn wir nicht explizit ein Standardgebietsschema festlegen. Die Informationen in dieser Antwort beziehen sich also darauf, wie das Standardgebietsschema in Windows und nicht in Java festgelegt wird.
MozenRath
5

Es gibt eine andere Möglichkeit, wenn Sie das Gebietsschema des Systems nicht ändern möchten, sondern die JVM. Sie können eine System- (oder Benutzer-) Umgebungsvariable JAVA_TOOL_OPTIONSeinrichten und ihren Wert auf -Duser.language=en-USoder eine andere gewünschte Sprachregion festlegen.

Ryan Ouyang
quelle
1

Sie können VM-Argumente für eine JARDatei mit dem folgenden Code erzwingen :

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());
        }
    }
}

Es wird wie folgt verwendet:

JVMArgumentEnforcer jvmArgumentEnforcer = new JVMArgumentEnforcer("-Duser.language=pt-BR"); // For example
jvmArgumentEnforcer.forceArgument();
BullyWiiPlaza
quelle
1

Du kannst das:

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Und um das Gebietsschema zu erfassen. Du kannst das:

private static final String LOCALE = LocaleContextHolder.getLocale().getLanguage()
            + "-" + LocaleContextHolder.getLocale().getCountry();
Nick Borges
quelle