Quiero establecer el valor predeterminado Locale
para mi JVM fr_CA
. ¿Cuáles son las posibles opciones para hacer esto?
Solo conozco una opción Locale.setDefault()
Quiero establecer el valor predeterminado Locale
para mi JVM fr_CA
. ¿Cuáles son las posibles opciones para hacer esto?
Solo conozco una opción Locale.setDefault()
Respuestas:
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.country
yuser.variant
las 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.
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
setx _JAVA_OPTIONS -Dsun.locale.formatasdefault=true /m
Puede usar argumentos JVM
java -Duser.country=ES -Duser.language=es -Duser.variant=Traditional_WIN
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.
Haga clic en Inicio> Panel de control .
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.
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).
En la sección Idioma para programas no Unicode , seleccione el idioma deseado en el menú desplegable.
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.
Siga las instrucciones guiadas para instalar los archivos.
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.
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_OPTIONS
y establecer su valor en -Duser.language=en-US
cualquier otra región de idioma que desee.
Puede aplicar argumentos de VM para un JAR
archivo 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();
Puedes hacerlo:
Y para capturar locale. Puedes hacerlo:
private static final String LOCALE = LocaleContextHolder.getLocale().getLanguage()
+ "-" + LocaleContextHolder.getLocale().getCountry();