Saya ingin mengatur default Locale
untuk JVM saya fr_CA
. Apa opsi yang memungkinkan untuk melakukan ini?
Saya tahu hanya satu opsi Locale.setDefault()
Saya ingin mengatur default Locale
untuk JVM saya fr_CA
. Apa opsi yang memungkinkan untuk melakukan ini?
Saya tahu hanya satu opsi Locale.setDefault()
Jawaban:
Dari Referensi Oracle :
Lokal default aplikasi Anda ditentukan dalam tiga cara. Pertama, kecuali Anda secara eksplisit mengubah default,
Locale.getDefault()
metode mengembalikan lokal yang awalnya ditentukan oleh Java Virtual Machine (JVM) saat pertama kali dimuat. Yaitu, JVM menentukan lokal default dari lingkungan host. Lokal lingkungan host ditentukan oleh sistem operasi host dan preferensi pengguna yang ditetapkan pada sistem itu.Kedua, pada beberapa implementasi runtime Java, pengguna aplikasi dapat menimpa lokal default host dengan memberikan informasi ini pada baris perintah dengan menetapkan
user.language
,user.country
danuser.variant
sifat sistem.Ketiga, aplikasi Anda dapat memanggil
Locale.setDefault(Locale)
metode. Metode setDefault (Lokal aLocale) memungkinkan aplikasi Anda mengatur sumber daya sistem (sebenarnya VM-lebar) . Setelah Anda menetapkan lokal default dengan metode ini, panggilan berikutnya ke Locale.getDefault () akan mengembalikan lokal yang baru ditetapkan.
Anda dapat mengaturnya di baris perintah melalui parameter JVM:
java -Duser.country=CA -Duser.language=fr ... com.x.Main
Untuk informasi lebih lanjut, lihat Internasionalisasi: Memahami Lokal di Platform Java - Menggunakan Lokal
setx _JAVA_OPTIONS -Dsun.locale.formatasdefault=true /m
Anda dapat menggunakan args JVM
java -Duser.country=ES -Duser.language=es -Duser.variant=Traditional_WIN
Dalam jawaban di sini, hingga sekarang, kami menemukan dua cara untuk mengubah pengaturan lokal JRE:
Secara programatis , menggunakan Locale.setDefault () (yang, dalam kasus saya, adalah solusinya, karena saya tidak ingin memerlukan tindakan apa pun dari pengguna):
Locale.setDefault(new Locale("pt", "BR"));
Melalui argumen ke JVM:
java -jar anApp.jar -Duser.language=pt-BR
Tetapi, seperti referensi, saya ingin mencatat bahwa, di Windows, ada satu cara lagi untuk mengubah lokal yang digunakan oleh JRE, seperti yang didokumentasikan di sini : mengubah bahasa seluruh sistem.
Catatan : Anda harus masuk dengan akun yang memiliki Hak Administratif.
Klik Mulai> Panel Kontrol .
Windows 7 dan Vista: Klik Jam, Bahasa dan Wilayah> Wilayah dan Bahasa .
Windows XP: Klik dua kali ikon Regional dan Opsi Bahasa .
The Regional dan Language Options dialog box muncul.
Windows 7: Klik tab Administratif .
Windows XP dan Vista: Klik tab Advanced .
(Jika tidak ada tab Tingkat Lanjut, maka Anda tidak masuk dengan hak administratif.)
Di bawah bagian Bahasa untuk program non-Unicode , pilih bahasa yang diinginkan dari menu tarik-turun.
Klik OK .
Sistem menampilkan kotak dialog yang menanyakan apakah akan menggunakan file yang ada atau menginstal dari CD sistem operasi. Pastikan CD Anda sudah siap.
Ikuti instruksi yang dipandu untuk menginstal file.
Nyalakan kembali komputer setelah instalasi selesai.
Tentu saja di Linux JRE juga menggunakan pengaturan sistem untuk menentukan lokal yang akan digunakan, tetapi instruksi untuk mengatur perubahan bahasa seluruh sistem dari distro ke distro.
Ada lagi yang jauh jika Anda tidak ingin mengubah lokal Sistem tetapi JVM. Anda dapat mengatur variabel Lingkungan Sistem (atau pengguna) JAVA_TOOL_OPTIONS
dan mengatur nilainya ke -Duser.language=en-US
atau REGION bahasa lain yang Anda inginkan.
Anda dapat menerapkan argumen VM untuk JAR
file dengan kode berikut:
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());
}
}
}
Ini digunakan sebagai berikut:
JVMArgumentEnforcer jvmArgumentEnforcer = new JVMArgumentEnforcer("-Duser.language=pt-BR"); // For example
jvmArgumentEnforcer.forceArgument();
Kamu bisa melakukan ini:
Dan untuk menangkap lokal. Kamu bisa melakukan ini:
private static final String LOCALE = LocaleContextHolder.getLocale().getLanguage()
+ "-" + LocaleContextHolder.getLocale().getCountry();