come imposto le impostazioni internazionali predefinite per la mia JVM?

Voglio impostare le impostazioni internazionali predefinite per la mia JVM su fr_CA. Quali sono le opzioni possibili per fare questo?

Conosco solo un’opzione Locale.setDefault()

Dal riferimento Oracle :

Le impostazioni internazionali predefinite dell’applicazione sono determinate in tre modi. Innanzitutto, a meno che non sia stato modificato in modo esplicito l’impostazione predefinita, il metodo Locale.getDefault() restituisce le impostazioni locali inizialmente determinate dalla Java Virtual Machine (JVM) al momento del primo caricamento. Cioè, la JVM determina le impostazioni internazionali predefinite dall’ambiente host. Le impostazioni locali dell’ambiente host sono determinate dal sistema operativo host e dalle preferenze utente stabilite su quel sistema.

In secondo luogo, in alcune implementazioni del runtime Java, l’utente dell’applicazione può sovrascrivere le impostazioni locali predefinite dell’host fornendo queste informazioni sulla riga di comando impostando le proprietà di sistema user.language , user.country e user.variant .

Terzo, l’applicazione può chiamare il Locale.setDefault(Locale) . Il metodo setDefault (Locale aLocale) consente all’applicazione di impostare una risorsa a livello di sistema (in realtà VM) . Dopo aver impostato le impostazioni internazionali predefinite con questo metodo, le successive chiamate a Locale.getDefault () restituiranno le impostazioni internazionali appena impostate.

Puoi impostarlo sulla riga di comando tramite i parametri JVM:

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

Per ulteriori informazioni, consultare Internazionalizzazione: Informazioni sulle impostazioni internazionali nella piattaforma Java: Uso delle impostazioni internazionali

Puoi usare gli argomenti di JVM

 java -Duser.country=ES -Duser.language=es -Duser.variant=Traditional_WIN 

Nelle risposte qui, fino ad ora, troviamo due modi per modificare le impostazioni internazionali di JRE:

  • Programmaticamente, utilizzando Locale.setDefault () (che, nel mio caso, era la soluzione, dal momento che non volevo richiedere alcuna azione dell’utente):

     Locale.setDefault(new Locale("pt", "BR")); 
  • Tramite argomenti alla JVM:

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

Ma, proprio come riferimento, voglio sottolineare che, su Windows, c’è un altro modo per cambiare le impostazioni locali usate da JRE, come documentato qui : cambiare il linguaggio a livello di sistema.

Nota : è necessario effettuare l’accesso con un account con privilegi di amministratore.

  1. Fai clic su Start> Pannello di controllo .

  2. Windows 7 e Vista: fare clic su Orologio, lingua e regione> regione e lingua .

    Windows XP: fare doppio clic sull’icona Opzioni internazionali e della lingua .

    Viene visualizzata la finestra di dialogo Opzioni internazionali e della lingua .

  3. Windows 7: fare clic sulla scheda Amministratore .

    Windows XP e Vista: fare clic sulla scheda Avanzate .

    (Se non esiste alcuna scheda Avanzate, non si è connessi con i privilegi di amministratore.)

  4. Nella sezione Language per programmi non Unicode , seleziona la lingua desiderata dal menu a discesa.

  5. Clicca OK .

    Il sistema visualizza una finestra di dialogo che chiede se utilizzare i file esistenti o installare dal CD del sistema operativo. Assicurarsi di avere il CD pronto.

  6. Seguire le istruzioni guidate per installare i file.

  7. Riavvia il computer al termine dell’installazione.

Sicuramente su Linux, il JRE usa anche le impostazioni di sistema per determinare quale locale usare, ma le istruzioni per impostare il cambio di lingua a livello di sistema da distro a distro.

È ansible applicare gli argomenti VM per un file JAR con il seguente codice:

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

È usato come segue:

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