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プログラムの実行
※ Javaの使用する環境変数を参照されたい。