全パッケージ クラス階層 このパッケージ 前項目 次項目 インデックス
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 クラスをロードします。
 
 
 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 は、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 を用います。
 
 
 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_fr、ExceptionResources_de など) や widget WidgetResource (WidgetResources_fr、 WidgetResources_de など) では、好きなようにリソースを分割してバンドルのセットを持つこともできます。
 
 parent
	parent
   
 ResourceBundle()
	ResourceBundle()
   
 getBundle(String)
	getBundle(String)
   getBundle(String, Locale)
	getBundle(String, Locale)
   getKeys()
	getKeys()
   getObject(String)
	getObject(String)
   getString(String)
	getString(String)
   getStringArray(String)
	getStringArray(String)
   handleGetObject(String)
	handleGetObject(String)
   setParent(ResourceBundle)
	setParent(ResourceBundle)
   
 parent
parent
protected ResourceBundle parent
 
 ResourceBundle
ResourceBundle
public ResourceBundle()
 
 getString
getString
public final String getString(String key) throws MissingResourceException
 getStringArray
getStringArray
public final String[] getStringArray(String key) throws MissingResourceException
 getObject
getObject
public final Object getObject(String key) throws MissingResourceException
 getBundle
getBundle
public static final ResourceBundle getBundle(String baseName) throws MissingResourceException
 getBundle
getBundle
 public static final ResourceBundle getBundle(String baseName,
                                              Locale locale)
 setParent
setParent
protected void setParent(ResourceBundle parent)
 handleGetObject
handleGetObject
protected abstract Object handleGetObject(String key) throws MissingResourceException
 getKeys
getKeys
public abstract Enumeration getKeys()
全パッケージ クラス階層 このパッケージ 前項目 次項目 インデックス