LoginSignup
2
4

More than 5 years have passed since last update.

Javaで多言語対応 Localeの使い方について

Posted at

超ひさしぶりに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)になっちゃうかな?:thinking:

LocaleTest.java
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()
こんにちは 世界!
2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4