全パッケージ  クラス階層  このパッケージ  前項目  次項目  インデックス

クラス java.util.ResourceBundle

java.lang.Object
   |
   +----java.util.ResourceBundle

public abstract class ResourceBundle
extends Object
リソースバンドルには、ロケール固有のオブジェクトが含まれます。プログラムで String などのロケール固有のリソースが必要なときは、ユーザのロケールに合ったリソースバンドルからロードできます。このように、リソースバンドルから、ロケール固有の情報のすべてでなくてもそのほとんどを切り離すことで、ユーザのロケールにはほとんど依存しないプログラムコードを書くことができます。

これにより、以下の特徴を持つプログラムを書くことが可能になります。

1 つのリソースバンドルは、概念的には、ResourceBundle から継承する関連クラスのセットです。ResourceBundle関連サブクラスは、どれも同じベース名とロケールを識別する追加要素を持っています。たとえば、MyResources という名前のリソースバンドルがあると仮定します。この最初のクラスは、そのファミリ MyResources と単に同じ名前を持つデフォルトのリソースバンドルでしょう。これに、関連したロケール固有のクラスを必要なだけ設定できます。たとえば、MyResources_de という名前のドイツ版を設定できます。

ResourceBundle の関連するサブクラスそれぞれには、同じアイテムが含まれていますが、そのアイテムは個々の ResourceBundle サブクラスが表しているロケールに合わせて翻訳されています。たとえば、MyResourcesMyResources_de の両方に操作確認用のボタンに使用される String が含まれているとします。このとき、 MyResources では、String には OK が、MyResources_de では、Gutが定義されています。

同じ言語を使用するロケールでも国によってリソースが異なるときは、特殊化が可能です。たとえば、スイス用に MyResources_de_CH を作成することができます。リソースの一部のみを修正することも可能です。

プログラムでロケール固有のオブジェクトが必要なときは、getBundle メソッドを用いて ResourceBundle クラスをロードします。

 ResourceBundle myResources = 
      ResourceBundle.getBundle("MyResources", currentLocale);
 
最初の引数では、目的のオブジェクトを含むリソースバンドルのファミリ名を指定します。2 番目の引数では、目的のロケールを指定します。 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 は、NumberFormatCollation などに内部的にアクセスするために用いられます。照合ストラテジは同じです。

リソースバンドルは、キーと値のペアになっています。キーは、バンドルのロケール固有のオブジェクトを一意に識別します。キーと値の 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 です。この例では、キーは OkKeyCancelKey です。上の例では、値OKCancelString ですが、必ずしもそうである必要はありません。値は、どんなタイプのオブジェクトでも可能です。

リソースバンドルから適切な getter メソッドを用いてオブジェクトを検索します。OkKeyCancelKeyはどちらも文字列なので、検索には getString を用います。

 button1 = new Button(myResourceBundle.getString("OkKey"));
 button2 = new Button(myResourceBundle.getString("CancelKey"));
 
getter メソッドは、すべて引数としてキーを要求し、検出したオブジェクトを返します。オブジェクトが見付からないときは、getterメソッドは、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_frExceptionResources_de など) や widget WidgetResource (WidgetResources_frWidgetResources_de など) では、好きなようにリソースを分割してバンドルのセットを持つこともできます。

参照:
ListResourceBundlePropertyResourceBundleMissingResourceException

Variable Index

 o parent
このバンドルが特定のリソースを含まないときには getObject は親バンドルを参照する。

Constructor Index

 o ResourceBundle()

Method Index

 o getBundle(String)
適切な ResourceBundle サブクラスを取得する。
 o getBundle(String, Locale)
適切な ResourceBundle サブクラスを取得する。
 o getKeys()
キーの列挙を返す。
 o getObject(String)
ResourceBundle からオブジェクトを取得する。
 o getString(String)
ResourceBundle からオブジェクトを取得する。
 o getStringArray(String)
ResourceBundle からオブジェクトを取得する。
 o handleGetObject(String)
ResourceBundle からオブジェクトを取得する。
 o setParent(ResourceBundle)
このバンドルの親バンドルを設定する。

Variables

 o parent
  protected ResourceBundle parent
このバンドルが特定のリソースを含まないときには getObject は親バンドルを参照します。

Constructors

 o ResourceBundle
  public ResourceBundle()

Methods

 o getString
  public final String getString(String key) throws MissingResourceException 
ResourceBundle からオブジェクトを取得します。
キャストを保存する便利なメソッドです。

パラメータ:
key - クラスの説明を参照。
 o getStringArray
  public final String[] getStringArray(String key) throws MissingResourceException
ResourceBundle からオブジェクトを取得します。
キャストを保存する便利なメソッドです。

パラメータ:
key - クラスの説明を参照。
 o getObject
  public final Object getObject(String key) throws MissingResourceException
ResourceBundle からオブジェクトを取得します。

パラメータ:
key - クラスの説明を参照。
 o getBundle
 public static final ResourceBundle getBundle(String baseName) throws MissingResourceException
適切な ResourceBundle サブクラスを取得します。

パラメータ:
baseName - クラスの説明を参照。
 o getBundle
 public static final ResourceBundle getBundle(String baseName,
                                              Locale locale)
適切な ResourceBundle サブクラスを取得します。

パラメータ:
baseName - クラスの説明を参照。
locale - クラスの説明を参照。
 o setParent
  protected void setParent(ResourceBundle parent)
このバンドルの親バンドルを設定します。親バンドルは、このバンドルに特定のリソースが含まれていないときに getObject によって参照されます。

パラメータ:
parent - このバンドルの親バンドル
 o handleGetObject
  protected abstract Object handleGetObject(String key) throws MissingResourceException
ResourceBundle からオブジェクトを取得します。 注: サブクラスでオーバーライドする必要があります。

パラメータ:
key - クラスの説明を参照。
 o getKeys
  public abstract Enumeration getKeys()
キーの列挙を返します。 注: サブクラスでオーバーライドする必要があります。


全パッケージ  クラス階層  このパッケージ  前項目  次項目  インデックス