超ひさしぶりにJavaを触って多言語対応を行うときにLocaleの使い方にちょっと悩んだのでチェック用のコードを作ってみた。
はじめに
Localeの値を取得して自動的に言語処理を変えたい。
Locale.getDefault() の結果と、日本語を表す Locale.JAPANESE を比較して同じであれば日本語のメッセージを表示しようとしたが想定した値にならなかった。
悩んだこと
Locale.getDefault() の値は、ja_JP であったが、Locale.JAPANESE の値は ja であったため、比較しても日本語で表示できなかった。Locale.JAPAN の値は ja_JP だったため日本語を表示するには Locale.getDefault()の値と、Locale.JAPAN を比較判定して表示すればいいのか?
解釈
Locale.JAPANは日本(国)を表し、Locale.JAPANESE は日本語(言語)を表す。
日本に住んでいても言語は英語を利用する人もいるため、Locale.JAPAN と比較するのはマズイ。
Locale.getDefault().getLanguage() で取得した値と、Locale.JAPANESE.getLanguage()の値を比較するのが良い。
面倒な英語は、アメリカ英語 en_US、イギリス英語 en_GB、オージー英語 en_AU があるけど表示は英語でOKでいいよな。イギリス英語はコックニーとかだと my を me とかbe動詞も変えたりする必要ある?東京の人が話す変な関西弁みたいに、いわゆるモックニー(mockney)になっちゃうかな?
import java.util.Locale;
public class LocaleTest{
public static void main(String[] args){
Locale localization=Locale.getDefault();
System.out.println("java.version:" + System.getProperty("java.version"));
System.out.println("localization.toString():" + localization.toString()); // Locale型を文字列で表示
System.out.println("localization.getCountry() :" + localization.getCountry() ); // 国
System.out.println("localization.getLanguage() :" + localization.getLanguage() ); // 言語
System.out.println("localization.getDisplayVariant():" + localization.getDisplayVariant()); // バリアント
System.out.println("Locale.getDefault():" + localization); // Locale型
System.out.println("localization.getLanguage():" + localization.getLanguage()); // 文字列型
System.out.println("Locale.JAPAN(国):" + Locale.JAPAN);
System.out.println("Locale.JAPAN(国.getCountry()):" + Locale.JAPAN.getCountry());
System.out.println("Locale.JAPAN(国.getLanguage()):" + Locale.JAPAN.getLanguage());
String msg=localization==Locale.JAPAN ? "こんにちは 世界!" : "Hello World";
System.out.println(msg);
System.out.println("Locale.JAPANESE(日本語):" + Locale.JAPANESE);
System.out.println("Locale.JAPANESE(日本語.getCountry()):" + Locale.JAPANESE.getCountry());
System.out.println("Locale.JAPANESE(日本語.getLanguage()):" + Locale.JAPANESE.getLanguage());
msg=localization==Locale.JAPANESE ? "こんにちは 世界!" : "Hello World";
System.out.println(msg);
System.out.println("localization.getLanguage()==Locale.JAPANESE.getLanguage()");
msg=localization.getLanguage()==Locale.JAPANESE.getLanguage() ? "こんにちは 世界!" : "Hello World";
System.out.println(msg);
}
}
実行結果
java.version:1.8.0_181
localization.toString():ja_JP
localization.getCountry() :JP
localization.getLanguage() :ja
localization.getDisplayVariant():
Locale.getDefault():ja_JP
localization.getLanguage():ja
Locale.JAPAN(国):ja_JP
Locale.JAPAN(国.getCountry()):JP
Locale.JAPAN(国.getLanguage()):ja
こんにちは 世界!
Locale.JAPANESE(日本語):ja
Locale.JAPANESE(日本語.getCountry()):
Locale.JAPANESE(日本語.getLanguage()):ja
Hello World
localization.getLanguage()==Locale.JAPANESE.getLanguage()
こんにちは 世界!