全パッケージ クラス階層 このパッケージ 前項目 次項目 インデックス
java.lang.Object | +----java.util.ResourceBundle
String
などのロケール固有のリソースが必要なときは、ユーザのロケールに合ったリソースバンドルからロードできます。このように、リソースバンドルから、ロケール固有の情報のすべてでなくてもそのほとんどを切り離すことで、ユーザのロケールにはほとんど依存しないプログラムコードを書くことができます。
これにより、以下の特徴を持つプログラムを書くことが可能になります。
1 つのリソースバンドルは、概念的には、ResourceBundle
から継承する関連クラスのセットです。ResourceBundle
関連サブクラスは、どれも同じベース名とロケールを識別する追加要素を持っています。たとえば、MyResources
という名前のリソースバンドルがあると仮定します。この最初のクラスは、そのファミリ MyResources
と単に同じ名前を持つデフォルトのリソースバンドルでしょう。これに、関連したロケール固有のクラスを必要なだけ設定できます。たとえば、MyResources_de
という名前のドイツ版を設定できます。
ResourceBundle
の関連するサブクラスそれぞれには、同じアイテムが含まれていますが、そのアイテムは個々の ResourceBundle
サブクラスが表しているロケールに合わせて翻訳されています。たとえば、MyResources
と MyResources_de
の両方に操作確認用のボタンに使用される String
が含まれているとします。このとき、 MyResources
では、String
には OK
が、MyResources_de
では、Gut
が定義されています。
同じ言語を使用するロケールでも国によってリソースが異なるときは、特殊化が可能です。たとえば、スイス用に MyResources_de_CH
を作成することができます。リソースの一部のみを修正することも可能です。
プログラムでロケール固有のオブジェクトが必要なときは、getBundle
メソッドを用いて ResourceBundle
クラスをロードします。
最初の引数では、目的のオブジェクトを含むリソースバンドルのファミリ名を指定します。2 番目の引数では、目的のロケールを指定します。ResourceBundle myResources = ResourceBundle.getBundle("MyResources", currentLocale);
getBundle
は、この 2 つの引数を用いて、ロードする ResourceBundle
サブクラスの名前を以下のように構築します。
リソースバンドルで照合は、(1) 目的のロケール、(2) デフォルトのロケール (ベースクラス) に基づいて、さまざまなサフィックスを持つクラスを、低いレベル (限定度が高い) から親レベル (限定度が低い) を以下の順で検索します。
baseclass + "_" + language1 + "_" + country1 + "_" + variant1
baseclass + "_" + language1 + "_" + country1
baseclass + "_" + language1
baseclass
baseclass + "_" + language2 + "_" + country2 + "_" + variant2
baseclass + "_" + language2 + "_" + country2
baseclass + "_" + language2
照合の結果はクラスですが、そのクラスはディスクのプロパティファイルによってバックされている可能性があります。照合が失敗すると、getBundle()
は MissingResourceException
をスローします。
ベースクラスは、完全に合致している必要があります (たとえば、myPackage.MyResources
ならば MyResources
だけでは検出されません)。また、コードからアクセス可能である必要があります。ResourceBundle.getBundle
が呼び出されるパッケージに private なクラスであってはなりません。
注: ResourceBundle
は、NumberFormat
、Collation
などに内部的にアクセスするために用いられます。照合ストラテジは同じです。
リソースバンドルは、キーと値のペアになっています。キーは、バンドルのロケール固有のオブジェクトを一意に識別します。キーと値の 2 つのペアが含まれている ListResourceBundle
の例を以下に挙げます。
キーは常にclass MyResource extends ListResourceBundle { public Object[][] getContents() { return contents; } static final Object[][] contents = { // LOCALIZE THIS {"OkKey", "OK"}, {"CancelKey", "Cancel"}, // END OF MATERIAL TO LOCALIZE }; }
String
です。この例では、キーは OkKey
と CancelKey
です。上の例では、値OK
と Cancel
も String
ですが、必ずしもそうである必要はありません。値は、どんなタイプのオブジェクトでも可能です。
リソースバンドルから適切な getter メソッドを用いてオブジェクトを検索します。OkKey
と CancelKey
はどちらも文字列なので、検索には getString
を用います。
getter メソッドは、すべて引数としてキーを要求し、検出したオブジェクトを返します。オブジェクトが見付からないときは、getterメソッドは、button1 = new Button(myResourceBundle.getString("OkKey")); button2 = new Button(myResourceBundle.getString("CancelKey"));
MissingResourceException
をスローします。
getString
以外に、ResourceBundle では、getStringArray
のような 異なるタイプのオブジェクトを取得するメソッドが複数サポートされています。オブジェクトがこれらのメソッドにマッチしない場合は、getObject
を使用して結果を適切なタイプにキャストできます。以下に例を挙げます。
int[] myIntegers = (int[]) myResources.getObject("intList");
注: 常にサフィックスなしのベースクラスを用意しておく必要があります。これは、そのロケール固有のクラスをもたないロケールがリクエストされたときに、適用される「最後の手段」となります。たとえば、以下のサブクラス例では、MyResources
というクラスを持っています。このクラスには米国固有の文字列が含まれているので、明示的にMyResource_en
または MyResource_en_US
を用意する必要はありません。
JDK では、ResourceBundle
の 2 つのサブクラス ListResourceBundle
および PropertyResourceBundle
が用意されています。これらはリソースを作成するかなりシンプルな方法を提供します (直列化が完全に統合されたら、ほかの方法を提供する予定です)。前の例で簡単に見たように、ListResourceBundle
は、そのリソースをキーと値のペアのリストとして管理します。PropertyResourceBundle
は、プロパティファイルを用いてそのリソースを管理します。
ListResourceBundle
または PropertyResourceBundle
では不十分なときは、独自の ResourceBundle
サブクラスを書くことができます。それらのサブクラスでは、handleGetObject
メソッドおよび getKeys()
メソッドの 2 つをオーバーライドする必要があります。
以下は ResourceBundle
サブクラスの非常に簡単な例です。このサブクラスは 2、3 のリソースだけを管理します (多数のリソースを管理するサブクラスには Hashtable
を用います)。キーが見付からないときは、handleGetObject
が null を返す必要があることに注意してください。また、「親レベル」の ResourceBundle
で同じキーに同じ値が設定されているときには値を指定する必要がないことにも注意して下さい (以下の例の uk の部分を参照してください)。
例:
abstract class MyResources extends ResourceBundle { public Object handleGetObject(String key) { if (key.equals("okKey")) return "Ok"; if (key.equals("cancelKey")) return "Cancel"; return null; } } abstract class MyResources_de extends MyResources { public Object handleGetObject(String key) { if (key.equals("okKey")) return "Gut"; if (key.equals("cancelKey")) return "Vernichten"; return null; } } abstract class MyResources_uk extends MyResources { public Object handleGetObject(String key) { // don't need okKey, since parent level handles it. if (key.equals("cancelKey")) return "Dispose"; return null; } }
ResourceBundle
のシングルファミリの使用を制限する必要はありません。たとえば、例外メッセージ ExceptionResources
( ExceptionResources_fr
、ExceptionResources_de
など) や widget WidgetResource
(WidgetResources_fr
、 WidgetResources_de
など) では、好きなようにリソースを分割してバンドルのセットを持つこともできます。
protected ResourceBundle parent
public ResourceBundle()
public final String getString(String key) throws MissingResourceException
public final String[] getStringArray(String key) throws MissingResourceException
public final Object getObject(String key) throws MissingResourceException
public static final ResourceBundle getBundle(String baseName) throws MissingResourceException
public static final ResourceBundle getBundle(String baseName, Locale locale)
protected void setParent(ResourceBundle parent)
protected abstract Object handleGetObject(String key) throws MissingResourceException
public abstract Enumeration getKeys()
全パッケージ クラス階層 このパッケージ 前項目 次項目 インデックス