簡體   English   中英

如何在 JVM 中設置默認語言環境?

[英]How do I set the default locale in the JVM?

我想將我的 JVM 的默認Localefr_CA 有哪些可能的選擇來做到這一點?

我只知道一個選項Locale.setDefault()

您可以通過 JVM 參數在命令行上進行設置:

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

有關更多信息,請查看國際化:了解 Java 平台中的語言環境 - 使用語言環境

Oracle 參考

應用程序的默認語言環境通過三種方式確定。 首先,除非您明確更改了默認值,否則Locale.getDefault()方法會返回最初由 Java 虛擬機 (JVM) 首次加載時確定的語言環境。 也就是說,JVM 根據主機環境確定默認語言環境。 主機環境的區域設置由主機操作系統和在該系統上建立的用戶首選項決定。

其次,在某些 Java 運行時實現中,應用程序用戶可以通過設置user.languageuser.countryuser.variant系統屬性在命令行上提供此信息來覆蓋主機的默認語言環境。

第三,您的應用程序可以調用Locale.setDefault(Locale)方法。 setDefault(Locale aLocale) 方法讓您的應用程序設置系統范圍(實際上是 VM 范圍)資源。 使用此方法設置默認語言環境后,對 Locale.getDefault() 的后續調用將返回新設置的語言環境。

您可以使用 JVM 參數

java -Duser.country=ES -Duser.language=es -Duser.variant=Traditional_WIN

到目前為止,在這里的答案中,我們找到了兩種更改 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. 單擊“確定”

    系統會顯示一個對話框,詢問是使用現有文件還是從操作系統 CD 安裝。 確保您已准備好 CD。

  6. 按照指導說明安裝文件。

  7. 安裝完成后重啟電腦。

當然,在 Linux 上,JRE 也使用系統設置來確定要使用的區域設置,但設置系統范圍語言的說明從發行版到發行版有所不同。

如果您不想更改系統語言環境而是 JVM,還有另一種選擇。 您可以設置系統(或用戶)環境變量JAVA_TOOL_OPTIONS並將其值設置為-Duser.language=en-US或您想要的任何其他語言區域。

你可以這樣做:

在此處輸入圖片說明

在此處輸入圖片說明

並捕獲語言環境。 你可以這樣做:

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

您可以使用以下代碼為JAR文件強制執行 VM 參數:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM