Javaのロケール取得と設定

Javaプログラムを国際化対応する場合に、どの言語を選択すべきかはLocaleを見れば良いことはわかっているのだが、具体的にどうすれば良いのか?

デフォルトのLocaleと日本語ロケール

デフォルトを取得するには、Locale.getDefault()で、LocaleにはJAPANとかJAPANESEが定義されているが、具体的にはどのようなものか?以下を日本語Windowsで実行してみる。

import java.util.*;

public class LocaleTest {

  public static void main(String[]args) {
    show("default", Locale.getDefault());
    show("JAPAN", Locale.JAPAN);
    show("JAPANESE", Locale.JAPANESE);

  }

  static void show(String note, Locale locale) {
    System.out.println(note + ":locale:" + locale);
    System.out.println(note + ":language:" + locale.getLanguage());
    System.out.println(note + ":country:" + locale.getCountry());
    System.out.println("");
  }
}

結果は以下になる。

default:locale:ja_JP
default:language:ja
default:country:JP

JAPAN:locale:ja_JP
JAPAN:language:ja
JAPAN:country:JP

JAPANESE:locale:ja
JAPANESE:language:ja
JAPANESE:country:

どうやら、日本語を表しているのはgetLanguage()で取得された”ja”であり、getCountry()で得られる”JP”というのは単に国を表しているようだ。

デフォルトを変更してみる

これを変更してみる。VM引数を使って以下のように変更できるようだ。

-Duser.language=en -Duser.country=US

これを使用すると、以下の結果になる。

default:locale:en_US
default:language:en
default:country:US

...以下は同じ

ということは、国は米国で、言語は日本語という組み合わせも可能だ。

-Duser.language=ja -Duser.country=US

結果は以下。

default:locale:ja_US
default:language:ja
default:country:US

...以下は同じ

結局、Locale.getDefault().getLanguage()を見れば良いということになる。

getLanguage()の値は何か?

この件についての説明は、https://docs.oracle.com/javase/7/docs/api/java/util/Locale.htmlのgetLanguage()にある。

public String getLanguage()

このロケールの言語コードを返す。

注意:ISO 639は安定した標準ではない。いくつかの言語コードは変更されている。Localeのコンストラクタは、コードが変更された言語について新たなコードと古いコードの両方とも受け付ける。しかし、この関数は常に古いコードを返す。もし、コードが変更された特定の言語コードをチェックしたいのであれば、次のようにしてはならない。

if (locale.getLanguage().equals(“he”)) // ダメ!

そうではなく、以下とする。

if (locale.getLanguage().equals(new Locale(“he”).getLanguage()))

返り値:
言語コード、あるいは未定義であれば空文字列

日本語の場合であれば、言語コードは変更されていないだろうし、常に古いコードを返すので、常に”jp”という文字列と比較すれば良いことになるだろう。

OSの環境変数で設定するには?

VM引数ではなく、OSの環境変数で設定する場合の議論がhttps://stackoverflow.com/questions/64038/setting-java-locale-settingsにある。

最も手っ取り早いのはJAVA_TOOL_OPTIONSに設定することらしい。

set JAVA_TOOL_OPTIONS=-Duser.language=en
Javaプログラムの実行