JVMでデフォルトのロケールを設定するにはどうすればよいですか?


回答:


156

Oracleリファレンスから:

アプリケーションのデフォルトのロケールは、3つの方法で決定されます。まず、デフォルトを明示的に変更していない限り、 Locale.getDefault()メソッドは最初に読み込まれたときにJava仮想マシン(JVM)によって最初に決定されたロケールを返します。つまり、JVMはホスト環境からデフォルトのロケールを決定します。ホスト環境のロケールは、ホストオペレーティングシステムとそのシステムで確立されたユーザー設定によって決まります。

第二には、いくつかのJavaランタイムの実装で、アプリケーションのユーザーが設定することで、コマンドライン上でこの情報を提供することで、ホストのデフォルトロケールを上書きすることができuser.languageuser.countryおよび user.variantシステムプロパティを。

3番目に、アプリケーションはLocale.setDefault(Locale) メソッドを呼び出すことができます。setDefault(Locale aLocale)メソッドを使用すると、アプリケーションでシステム全体(実際にはVM全体)のリソースを設定できます。このメソッドでデフォルトロケールを設定した後、Locale.getDefault()を呼び出すと、新しく設定されたロケールが返されます。


ResourceBundleから同じロケールをフェッチしている間の競合です。バンドルをフェッチしようとしたが、最初に持っていたものを手に入れた
Navdeep Singh 2017

153

コマンドラインでJVMパラメータを使用して設定できます。

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

詳細については、「国際化:Javaプラットフォームでのロケールの理解-ロケールの使用」を参照してください


8
_JAVA_OPTIONS環境変数を使用して設定することもできます。
Jeff Paquette、2015年

2
Java 7のデフォルトロケール経由:setx _JAVA_OPTIONS -Dsun.locale.formatasdefault=true /m
Vadzim、2015年


29

ここでの回答では、これまで、JREロケール設定を変更する方法が2つあります。

  • プログラム的には、Locale.setDefault()を使用します(私の場合、これは解決策でした。ユーザーのアクションを必要としないためです)。

    Locale.setDefault(new Locale("pt", "BR"));
  • JVMへの引数を介して:

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

ただし、参考までに、Windowsで、JREが使用するロケールを変更する方法がもう1つあることをここで説明します。システム全体の言語を変更することです。

:管理者権限を持つアカウントでログインする必要があります。

  1. [ スタート]> [コントロールパネル]をクリックします。

  2. Windows 7およびVista:[時計、言語、地域]> [ 地域と言語]をクリックします。

    Windows XP:[ 地域と言語のオプション ]アイコンをダブルクリックします。

    [ 地域と言語のオプション ]ダイアログボックスが表示されます。

  3. Windows 7:[ 管理 ]タブをクリックします。

    Windows XPおよびVista:「詳細」タブをクリックします。

    (「詳細」タブがない場合は、管理者権限でログインしていません。)

  4. 下ではUnicode対応でないプログラムの言語のためのセクション、ドロップダウンメニューから目的の言語を選択します。

  5. OKをクリックします。

    既存のファイルを使用するか、オペレーティングシステムのCDからインストールするかを尋ねるダイアログボックスが表示されます。CDの準備ができていることを確認します。

  6. ガイド付きの指示に従ってファイルをインストールします。

  7. インストールが完了したら、コンピューターを再起動します。

確かにLinuxでは、JREは使用するロケールを決定するためにシステム設定も使用しますが、システム全体の言語を設定する手順は、ディストリビューションからディストリビューションに変更されています。


2
この情報は役立つかもしれませんが、これらの手順はOSごとに異なり、OSごとに、システム全体で使用されるロケールを設定できる場合があることを強調したいと思います。Javaは、デフォルトロケールを明示的に設定していない場合は常に、そのロケールをデフォルトロケールとして使用するように設計されています。したがって、この回答の情報は、JavaではなくWindowsでデフォルトのロケールを設定する方法に関するものです。
MozenRath 2015

5

システムロケールを変更したくない場合は、JVMを使用してください。システム(またはユーザー)環境変数JAVA_TOOL_OPTIONSを設定して、その値-Duser.language=en-USまたはその他の任意の言語-地域を設定できます。


1

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

1

あなたはこれを行うことができます:

ここに画像の説明を入力してください

ここに画像の説明を入力してください

ロケールをキャプチャします。あなたはこれを行うことができます:

private static final String LOCALE = LocaleContextHolder.getLocale().getLanguage()
            + "-" + LocaleContextHolder.getLocale().getCountry();
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.