¿Cómo configuro la configuración regional predeterminada en la JVM?

Respuestas:

156

De la referencia de Oracle :

La configuración regional predeterminada de su aplicación se determina de tres maneras. Primero, a menos que haya cambiado explícitamente el valor predeterminado, el Locale.getDefault()método devuelve la configuración regional que fue inicialmente determinada por la Máquina Virtual Java (JVM) cuando se cargó por primera vez. Es decir, la JVM determina la configuración regional predeterminada del entorno del host. La configuración regional del entorno del host está determinada por el sistema operativo del host y las preferencias del usuario establecidas en ese sistema.

En segundo lugar, en algunas implementaciones Java de tiempo de ejecución, el usuario puede anular la aplicación regional predeterminada del huésped, proporcionando esta información en la línea de comandos mediante el establecimiento de los user.language, user.countryy user.variantlas propiedades del sistema.

Tercero, su aplicación puede llamar al Locale.setDefault(Locale) método. El método setDefault (Locale aLocale) permite que su aplicación establezca un recurso en todo el sistema (en realidad, en toda la VM) . Después de establecer la configuración regional predeterminada con este método, las llamadas posteriores a Locale.getDefault () devolverán la configuración regional recién establecida.

aleroot
fuente
es cualquier conflicto al buscar la misma configuración regional de ResourceBundle. Traté de buscar el paquete, pero obtuve lo que tenía inicialmente
Navdeep Singh
153

Puede configurarlo en la línea de comando a través de parámetros JVM:

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

Para obtener más información, consulte Internacionalización: comprensión de la configuración regional en la plataforma Java: uso de la configuración regional

lucasmo
fuente
8
También puede configurarlo a través de la variable de entorno _JAVA_OPTIONS.
Jeff Paquette
2
A través de la configuración regional predeterminada de Java 7 :setx _JAVA_OPTIONS -Dsun.locale.formatasdefault=true /m
Vadzim
43

Puede usar argumentos JVM

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

En las respuestas aquí, hasta ahora, encontramos dos formas de cambiar la configuración regional de JRE:

  • Programáticamente, usando Locale.setDefault () (que, en mi caso, fue la solución, ya que no quería requerir ninguna acción del usuario):

    Locale.setDefault(new Locale("pt", "BR"));
  • A través de argumentos a la JVM:

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

Pero, solo como referencia, quiero señalar que, en Windows, hay una forma más de cambiar la configuración regional utilizada por el JRE, como se documenta aquí : cambiar el lenguaje de todo el sistema.

Nota : debe iniciar sesión con una cuenta que tenga privilegios administrativos.

  1. Haga clic en Inicio> Panel de control .

  2. Windows 7 y Vista: haga clic en Reloj, Idioma y región> Región e idioma .

    Windows XP: haga doble clic en el icono de Opciones regionales y de idioma .

    El regional y de idioma aparece el cuadro de diálogo.

  3. Windows 7: haga clic en la pestaña Administrativo .

    Windows XP y Vista: haga clic en la pestaña Avanzado .

    (Si no hay una pestaña Avanzada, entonces no ha iniciado sesión con privilegios administrativos).

  4. En la sección Idioma para programas no Unicode , seleccione el idioma deseado en el menú desplegable.

  5. Haz clic en Aceptar .

    El sistema muestra un cuadro de diálogo que le pregunta si desea usar archivos existentes o instalarlos desde el CD del sistema operativo. Asegúrese de tener el CD listo.

  6. Siga las instrucciones guiadas para instalar los archivos.

  7. Reinicie la computadora después de que se complete la instalación.

Ciertamente, en Linux, JRE también utiliza la configuración del sistema para determinar qué configuración regional usar, pero las instrucciones para establecer el cambio de idioma de todo el sistema de distribución a distribución.

Antonio Vinicius Menezes Medei
fuente
2
Si bien esta información puede ser útil, me gustaría destacar que estos pasos son diferentes para cada sistema operativo y para cada sistema operativo, es posible que pueda configurar una configuración regional que se utiliza en todo el sistema. Java está diseñado para usar esa configuración regional como la configuración regional predeterminada siempre que no establezcamos explícitamente una configuración regional predeterminada. Entonces, la información en esta respuesta es sobre cómo establecer la configuración regional predeterminada en Windows y no en Java.
MozenRath
5

Hay otro ausente si no desea cambiar la configuración regional del sistema, pero la JVM. puede configurar una variable de entorno del sistema (o usuario) JAVA_TOOL_OPTIONSy establecer su valor en -Duser.language=en-UScualquier otra región de idioma que desee.

Ryan Ouyang
fuente
1

Puede aplicar argumentos de VM para un JARarchivo con el siguiente código:

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

Se usa de la siguiente manera:

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

Puedes hacerlo:

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

Y para capturar locale. Puedes hacerlo:

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