Quero definir o padrão Locale
para minha JVM fr_CA
. Quais são as opções possíveis para fazer isso?
Eu sei de apenas uma opção Locale.setDefault()
Quero definir o padrão Locale
para minha JVM fr_CA
. Quais são as opções possíveis para fazer isso?
Eu sei de apenas uma opção Locale.setDefault()
Respostas:
Da referência do Oracle :
A localidade padrão do seu aplicativo é determinada de três maneiras. Primeiro, a menos que você tenha alterado explicitamente o padrão, o
Locale.getDefault()
método retornará o código do idioma inicialmente determinado pela Java Virtual Machine (JVM) quando ele foi carregado pela primeira vez. Ou seja, a JVM determina o código do idioma padrão no ambiente host. O código do idioma do ambiente host é determinado pelo sistema operacional do host e pelas preferências do usuário estabelecidas nesse sistema.Em segundo lugar, em algumas implementações de tempo de execução Java, o usuário do aplicativo pode substituir localidade padrão do hospedeiro, fornecendo esta informação na linha de comando, definindo os
user.language
,user.country
euser.variant
propriedades do sistema.Terceiro, seu aplicativo pode chamar o
Locale.setDefault(Locale)
método O método setDefault (Locale aLocale) permite que seu aplicativo defina um recurso em todo o sistema (na verdade, em toda a VM) . Depois de definir o código de idioma padrão com esse método, as chamadas subseqüentes para Locale.getDefault () retornarão o código de idioma recém-definido.
Você pode configurá-lo na linha de comandos através dos parâmetros da JVM:
java -Duser.country=CA -Duser.language=fr ... com.x.Main
Para obter mais informações, consulte Internacionalização: Compreendendo a localidade na plataforma Java - usando a localidade
setx _JAVA_OPTIONS -Dsun.locale.formatasdefault=true /m
Você pode usar argumentos da JVM
java -Duser.country=ES -Duser.language=es -Duser.variant=Traditional_WIN
Nas respostas aqui, até agora, encontramos duas maneiras de alterar a configuração de localidade do JRE:
Programaticamente, usando Locale.setDefault () (que, no meu caso, era a solução, pois não queria exigir nenhuma ação do usuário):
Locale.setDefault(new Locale("pt", "BR"));
Via argumentos para a JVM:
java -jar anApp.jar -Duser.language=pt-BR
Mas, apenas como referência, quero observar que, no Windows, há mais uma maneira de alterar a localidade usada pelo JRE, conforme documentado aqui : alterando o idioma do sistema.
Nota : Você deve estar logado com uma conta que possua privilégios administrativos.
Clique em Iniciar> Painel de Controle .
Windows 7 e Vista: Clique em Relógio, Idioma e região> Região e idioma .
Windows XP: Clique duas vezes no ícone Opções regionais e de idioma .
A caixa de diálogo Opções regionais e de idioma é exibida.
Windows 7: Clique na guia Administrativo .
Windows XP e Vista: Clique na guia Avançado .
(Se não houver guia Avançado, você não estará logado com privilégios administrativos.)
Na seção Idioma para programas não Unicode , selecione o idioma desejado no menu suspenso.
Clique em OK .
O sistema exibe uma caixa de diálogo perguntando se deseja usar arquivos existentes ou instalar a partir do CD do sistema operacional. Verifique se você tem o CD pronto.
Siga as instruções guiadas para instalar os arquivos.
Reinicie o computador após a conclusão da instalação.
Certamente, no Linux, o JRE também usa as configurações do sistema para determinar qual localidade usar, mas as instruções para definir o idioma do sistema mudam de distribuição para distribuição.
Existe outro problema, se você não gosta de alterar a localidade do sistema, mas a JVM. você pode configurar uma variável de ambiente do sistema (ou usuário) JAVA_TOOL_OPTIONS
e definir seu valor para -Duser.language=en-US
ou qualquer outro idioma - REGION desejado.
Você pode aplicar argumentos da VM para um JAR
arquivo com o seguinte 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());
}
}
}
É usado da seguinte maneira:
JVMArgumentEnforcer jvmArgumentEnforcer = new JVMArgumentEnforcer("-Duser.language=pt-BR"); // For example
jvmArgumentEnforcer.forceArgument();
Você consegue fazer isso:
E para capturar localidade. Você consegue fazer isso:
private static final String LOCALE = LocaleContextHolder.getLocale().getLanguage()
+ "-" + LocaleContextHolder.getLocale().getCountry();