web-dev-qa-db-ja.com

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

JVMのデフォルトのロケールをfr_CAに設定します。これを行うための可能なオプションは何ですか?

私は1つのオプションLocale.setDefault()しか知らない

132
MozenRath

Oracle Reference から:

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

次に、一部のJavaランタイム実装では、アプリケーションユーザーは、user.languageuser.country、およびuser.variantシステムプロパティを設定してコマンドラインでこの情報を提供することにより、ホストのデフォルトロケールをオーバーライドできます。

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

139
aleroot

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

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

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

134
lucasmo

JVM引数を使用できます

Java -Duser.country=ES -Duser.language=es -Duser.variant=Traditional_WIN
36

ここまでの回答では、これまで、JREロケール設定を変更する2つの方法を見つけました。

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

    Locale.setDefault(new Locale("pt", "BR"));
    
  • JVMへの引数経由:

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

しかし、参考として、Windowsでは、JREが使用するロケールを変更する方法がもう1つあります。これは、ドキュメントに記載されている here :システム全体の言語の変更です。

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

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

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

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

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

  3. Windows 7:Administrativeタブをクリックします。

    Windows XPおよびVista:Advancedタブをクリックします。

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

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

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

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

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

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

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

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

enter image description here

enter image description here

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

private static final String LOCALE = LocaleContextHolder.getLocale().getLanguage()
            + "-" + LocaleContextHolder.getLocale().getCountry();
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
BullyWiiPlaza

JVM以外のシステムロケールを変更したくない場合は別の方法があります。システム(またはユーザー)環境変数Java_TOOL_OPTIONSをセットアップし、その値を-Duser.language=en-USまたは任意の他の言語領域に設定できます。

0
Ryan Ouyang