ฉันจะตั้งค่าโลแคลเริ่มต้นใน JVM ได้อย่างไร?


147

ฉันต้องการที่จะตั้งค่าเริ่มต้นLocaleสำหรับ JVM fr_CAของฉันไป ตัวเลือกที่เป็นไปได้ในการทำเช่นนี้คืออะไร?

ฉันรู้ทางเลือกเดียวเท่านั้น Locale.setDefault()


1
ระวังของJava การเปลี่ยนแปลงสถานที่
Vadzim

คำตอบ:


156

จากการอ้างอิงของ Oracle :

ตำแหน่งที่ตั้งเริ่มต้นของแอปพลิเคชันของคุณถูกกำหนดในสามวิธี ก่อนอื่นยกเว้นว่าคุณได้เปลี่ยนค่าเริ่มต้นอย่างชัดเจน Locale.getDefault()เมธอดจะส่งคืนโลแคลที่ถูกกำหนดโดย Java Virtual Machine (JVM) ในครั้งแรกเมื่อโหลดครั้งแรก นั่นคือ JVM กำหนดโลแคลดีฟอลต์จากสภาวะแวดล้อมโฮสต์ โลแคลของสภาพแวดล้อมโฮสต์ถูกกำหนดโดยระบบปฏิบัติการโฮสต์และการกำหนดค่าตามความชอบของผู้ใช้ที่สร้างบนระบบนั้น

ประการที่สองในบาง Java Runtime การใช้งานผู้ใช้แอพลิเคชันสามารถแทนที่ตำแหน่งที่ตั้งเริ่มต้นของโฮสต์โดยการให้ข้อมูลนี้ในบรรทัดคำสั่งโดยการตั้งค่าuser.language, user.countryและ user.variantคุณสมบัติของระบบ

ประการที่สามแอปพลิเคชันของคุณสามารถเรียกLocale.setDefault(Locale) วิธีการนี้ได้ เมธอด setDefault (Locale aLocale) ช่วยให้แอปพลิเคชันของคุณตั้งค่าทรัพยากรทั้งระบบ(จริง ๆ แล้วกว้างทั้ง VM) หลังจากคุณตั้งค่าโลแคลเริ่มต้นด้วยวิธีนี้แล้วการโทรไปที่ Locale.getDefault () ที่ตามมาจะส่งคืนโลแคลที่ตั้งค่าใหม่


เป็นข้อขัดแย้งใด ๆ ของพวกเขาขณะดึงข้อมูลสถานที่เดียวกันจาก ResourceBundle ฉันพยายามดึงมัด แต่ฉันได้สิ่งที่ฉันมีในตอนแรก
Navdeep Singh

153

คุณสามารถตั้งค่าบนบรรทัดคำสั่งผ่านพารามิเตอร์ JVM:

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

สำหรับข้อมูลเพิ่มเติมดูที่การทำให้เป็นสากล: การทำความเข้าใจกับสถานที่ในแพลตฟอร์ม Java - การใช้สถานที่เกิดเหตุ


8
คุณสามารถตั้งค่าผ่านตัวแปรสภาพแวดล้อม _JAVA_OPTIONS
Jeff Paquette

2
ผ่านสถานที่ตั้งเริ่มต้นของ Java 7 :setx _JAVA_OPTIONS -Dsun.locale.formatasdefault=true /m
Vadzim


29

ในคำตอบที่นี่จนถึงตอนนี้เราพบสองวิธีในการเปลี่ยนการตั้งค่าภาษา JRE:

  • โดยทางโปรแกรมใช้Locale.setDefault () (ซึ่งในกรณีของฉันเป็นวิธีแก้ปัญหาเนื่องจากฉันไม่ต้องการให้ผู้ใช้ดำเนินการใด ๆ ):

    Locale.setDefault(new Locale("pt", "BR"));
  • ผ่านการโต้แย้งกับ JVM:

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

แต่ตามที่อ้างอิงฉันต้องการทราบว่าบน Windows มีวิธีหนึ่งในการเปลี่ยนภาษาที่ใช้โดย JRE ดังที่บันทึกไว้ที่นี่ : เปลี่ยนภาษาทั่วทั้งระบบ

หมายเหตุ : คุณจะต้องเข้าสู่ระบบด้วยบัญชีที่มีสิทธิ์ของผู้ดูแลระบบ

  1. คลิกเริ่ม> แผงควบคุม

  2. Windows 7 และ Vista: คลิกนาฬิกาภาษาและภูมิภาค> ภูมิภาคและภาษา

    Windows XP: ดับเบิ้ลคลิกที่ภูมิภาคและภาษาตัวเลือก ไอคอน

    ภูมิภาคและภาษาตัวเลือกกล่องโต้ตอบปรากฏขึ้น

  3. Windows 7: คลิกแท็บการดูแลระบบ

    Windows XP และ Vista: คลิกแท็บขั้นสูง

    (หากไม่มีแท็บขั้นสูงแสดงว่าคุณไม่ได้ลงชื่อเข้าใช้ด้วยสิทธิ์ระดับผู้ดูแลระบบ)

  4. ภายใต้ส่วนภาษาสำหรับโปรแกรมที่ไม่ใช่ Unicodeให้เลือกภาษาที่ต้องการจากเมนูแบบเลื่อนลง

  5. คลิกตกลง

    ระบบจะแสดงกล่องโต้ตอบถามว่าจะใช้ไฟล์ที่มีอยู่หรือติดตั้งจากซีดีระบบปฏิบัติการ ตรวจสอบให้แน่ใจว่าคุณมีซีดีพร้อม

  6. ทำตามคำแนะนำที่แนะนำเพื่อติดตั้งไฟล์

  7. รีสตาร์ทคอมพิวเตอร์หลังจากการติดตั้งเสร็จสมบูรณ์

แน่นอนบน Linux JRE ยังใช้การตั้งค่าระบบเพื่อกำหนดภาษาที่จะใช้ แต่คำแนะนำในการตั้งค่าการเปลี่ยนภาษาทั่วทั้งระบบจาก distro เป็น distro


2
ในขณะที่ข้อมูลนี้อาจมีประโยชน์ฉันต้องการเน้นว่าขั้นตอนเหล่านี้แตกต่างกันไปสำหรับแต่ละ OS และแต่ละระบบปฏิบัติการคุณอาจสามารถตั้งค่า Locale ที่ใช้ระบบได้ทั้งระบบ Java ถูกออกแบบมาเพื่อใช้ภาษานั้นเป็นภาษาเริ่มต้นเมื่อใดก็ตามที่เราไม่ได้ตั้งค่าภาษาเริ่มต้นอย่างชัดเจน ดังนั้นข้อมูลในคำตอบนี้จึงเป็นเรื่องเกี่ยวกับวิธีการตั้งค่าภาษาเริ่มต้นใน windows และไม่ใช่ใน java
MozenRath

5

มีอีกถ้าคุณไม่ต้องการเปลี่ยนสถานที่ของระบบ แต่ JVM คุณสามารถตั้งค่าตัวแปรสภาพแวดล้อม System (หรือผู้ใช้) JAVA_TOOL_OPTIONSและตั้งค่าเป็น-Duser.language=en-USหรือภาษาอื่น ๆ ที่คุณต้องการ


1

คุณสามารถบังคับใช้อาร์กิวเมนต์ VM สำหรับJARไฟล์ด้วยรหัสต่อไปนี้:

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

มันถูกใช้ดังนี้:

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

1

คุณสามารถทำได้:

ป้อนคำอธิบายรูปภาพที่นี่

ป้อนคำอธิบายรูปภาพที่นี่

และเพื่อจับภาพสถานที่ คุณสามารถทำได้:

private static final String LOCALE = LocaleContextHolder.getLocale().getLanguage()
            + "-" + LocaleContextHolder.getLocale().getCountry();
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.