Bagaimana cara mengatur lokal default di JVM?

Jawaban:

156

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.countrydan user.variantsifat 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.

aleroot
sumber
adalah konflik mereka saat mengambil lokasi yang sama dari ResourceBundle. Saya mencoba mengambil bungkusan itu tetapi saya mendapatkan apa yang saya miliki pada awalnya
Navdeep Singh
43

Anda dapat menggunakan args JVM

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

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.

  1. Klik Mulai> Panel Kontrol .

  2. 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.

  3. 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.)

  4. Di bawah bagian Bahasa untuk program non-Unicode , pilih bahasa yang diinginkan dari menu tarik-turun.

  5. 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.

  6. Ikuti instruksi yang dipandu untuk menginstal file.

  7. 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.

Antonio Vinicius Menezes Medei
sumber
2
sementara informasi ini mungkin membantu, saya ingin menyoroti bahwa langkah-langkah ini berbeda dari setiap OS dan untuk setiap OS, Anda mungkin dapat mengatur Lokal yang digunakan sistem yang luas. Java dirancang untuk menggunakan lokal itu sebagai lokal default setiap kali kita tidak secara eksplisit menetapkan lokal default. Jadi informasi dalam jawaban ini adalah tentang cara mengatur lokal default di windows dan bukan di java.
MozenRath
5

Ada lagi yang jauh jika Anda tidak ingin mengubah lokal Sistem tetapi JVM. Anda dapat mengatur variabel Lingkungan Sistem (atau pengguna) JAVA_TOOL_OPTIONSdan mengatur nilainya ke -Duser.language=en-USatau REGION bahasa lain yang Anda inginkan.

Ryan Ouyang
sumber
1

Anda dapat menerapkan argumen VM untuk JARfile 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();
BullyWiiPlaza
sumber
1

Kamu bisa melakukan ini:

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

Dan untuk menangkap lokal. Kamu bisa melakukan ini:

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