リソースバンドル(Resource Bundle)

リソースバンドルとは

リソースバンドル(Resource Bundle)は多言語化対応するための仕組みです。
例えばアメリカの環境では英語で表示し、日本の環境では日本語で表示するといった仕組みです。

リソースバンドルを使用すると以下のようなメリットがあります。

  • ソースと定義を分離することで保守性が向上する
  • 定義の修正時、ソースを変更する必要がない
    (プロパティファイルリソースバンドルの場合)
  • 言語を増やす場合でも基本的に定義を増やすのみでソースを修正する必要がない
    (プロパティファイルリソースバンドルの場合)

リソースバンドルの種類

リソースバンドルには、リソースをクラスで定義する方法と、プロパティファイルで定義する方法の2種類あります。
それぞれ専用のクラスが用意されており、どちらの方法を採用するかでクラスを使い分けます。

【ResourceBundleの種類】
java.util.
ListResourceBundle
リソースをクラスで定義する時に使用するクラス
定義内容の修正にはプログラム修正(コンパイル)が伴う
java.util.
PropertyResourceBundle
リソースをプロパティファイルで定義する時に使用するクラス
定義内容の修正時はプロパティファイルのみを修正すればよいので容易に変更が可能

どちらのタイプを使用するかは、状況により使い分けください。
一般的には定義内容の変更が容易なプロパティファイルを使用することが多いです。

また、2種類のリソースバンドルは同時に併用して定義することも可能です。

リソースバンドルのルール

リソースバンドルの名称や優先度には以下ルールがあります。

リソースバンドルの名称

リソースバンドルに使用するクラス名やファイル名は、一定の規則に則った名称を付ける必要があり、①基底名のみ②基底名+言語コード③基底名+言語コード+国コード の3パターンがあります。

基底名は自由に付けられる名称です。言語に対するリソースであればその後ろにアンダーバーでつなげて言語コードを指定します。さらに国を指定する場合はさらにその後ろにアンダーバーでつなげて国コードを指定します。

プロパティファイルの場合、拡張子は.propertiesにします。

【クラス名/プロパティファイル名の命名規則】
クラス名/ファイル名意味
基底名デフォルトロケールの場合に読み込まれる
(クラス名の例)ItemBundle
(プロパティファイル名の例)ItemBundle.properties
基底名_言語コードロケールが指定した言語コードに合致する場合に読み込まれる
(クラス名の例)ItemBundle_en
(プロパティファイル名の例)ItemBundle_en.properties
基底名_言語コード_国コードロケールが指定した言語コード、国コードに合致する場合に読み込まれる
(クラス名の例)ItemBundle_en_US
(プロパティファイル名の例)ItemBundle_en_US.properties

(言語コードの例)ja:日本語、en:英語、fr:フランス語
(国コードの例)JP:日本、US:アメリカ、UK:英国、FR:フランス

上記以外の言語コード、国コードについては以下ページをご覧ください。
 ⇒ 言語コード/国コードの一覧

使用するリソースバンドルの優先順

環境に一致するリソース定義が複数存在する場合、以下の順で採用されます。

  1. 言語コード、国コードが一致するクラスファイル
  2. 言語コード、国コードが一致するプロパティファイル
  3. 言語コードが一致するクラスファイル
  4. 言語コードが一致するプロパティファイル
  5. デフォルトロケール用のクラスファイル
  6. デフォルトロケール用のプロパティファイル

ListResourceBundleの使用例

英語用と日本語用のリソースバンドルクラスを定義して呼び出す例です。

(ListResourceBundleクラスの定義)

import java.util.ListResourceBundle;

//「英語・アメリカ」用のリソースバンドル
public class ItemResourceBundle_en_US extends ListResourceBundle {
  @Override
  protected Object[][] getContents() {
    return new Object[][] {
      {"item01", "Apple"},
      {"item02", "Orange"},
      {"item03", "Grape"}
    };
  }
}

//「日本語・日本」用のリソースバンドル
public class ItemResourceBundle_ja_JP extends ListResourceBundle {
  @Override
  protected Object[][] getContents() {
    return new Object[][] {
      {"item01", "りんご"},
      {"item02", "みかん"},
      {"item03", "ぶどう"}
    };
  }
}
(ListResourceBundleクラスの定義を呼び出す例)

//ロケールをアメリカで呼び出した場合
Locale loc = Locale.US;
ResourceBundle bundle = ResourceBundle.getBundle("ItemResourceBundle", loc);
String i1 = bundle.getString("item01");  //Apple
String i2 = bundle.getString("item02");  //Orange
String i3 = bundle.getString("item03");  //Grape

//ロケールを日本で呼び出した場合
Locale loc = Locale.JP;
ResourceBundle bundle = ResourceBundle.getBundle("ItemResourceBundle", loc);
String i1 = bundle.getString("item01");  //りんご
String i2 = bundle.getString("item02");  //みかん
String i3 = bundle.getString("item03");  //ぶどう

//日本の環境からロケールを明示せず呼び出した場合
ResourceBundle bundle = ResourceBundle.getBundle("ItemResourceBundle");
String i1 = bundle.getString("item01");  //りんご
String i2 = bundle.getString("item02");  //みかん
String i3 = bundle.getString("item03");  //ぶどう

PropertyResourceBundleの使用例

英語用と日本語用のリソースバンドルプロパティファイルを定義して呼び出す例です。

(ItemResourceBundle_en_US.properties)
item01=Apple item02=Orange item03=Grape
(ItemResourceBundle_ja_JP.properties)
item01=りんご item02=みかん item03=ぶどう
(ListResourceBundleプロパティファイルの定義を呼び出す例)

//ロケールをアメリカで呼び出した場合
Locale loc = Locale.US;
ResourceBundle bundle = ResourceBundle.getBundle("ItemResourceBundle", loc);
String i1 = bundle.getString("item01");  //Apple
String i2 = bundle.getString("item02");  //Orange
String i3 = bundle.getString("item03");  //Grape

//ロケールを日本で呼び出した場合
Locale loc = Locale.JP;
ResourceBundle bundle = ResourceBundle.getBundle("ItemResourceBundle", loc);
String i1 = bundle.getString("item01");  //りんご
String i2 = bundle.getString("item02");  //みかん
String i3 = bundle.getString("item03");  //ぶどう

//日本の環境からロケールを明示せず呼び出した場合
ResourceBundle bundle = ResourceBundle.getBundle("ItemResourceBundle");
String i1 = bundle.getString("item01");  //りんご
String i2 = bundle.getString("item02");  //みかん
String i3 = bundle.getString("item03");  //ぶどう

関連API

コメント

タイトルとURLをコピーしました