|
Java プラットフォーム 1.2 |
|||||||||
前のクラス 次のクラス | フレームあり フレームなし | |||||||||
概要: 内部クラス | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |
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
はスイス (CH) 系のドイツ語 (de) になります。リソースの一部だけを修正することもできます。
プログラムでロケール固有のオブジェクトが必要なときは、getBundle
メソッドを使用して ResourceBundle
クラスをロードします。
最初の引数では、目的のオブジェクトを含むリソースバンドルのファミリ名を指定します。2 番目の引数では、目的のロケールを指定します。ResourceBundle myResources = ResourceBundle.getBundle("MyResources", currentLocale);
getBundle
は、この 2 つの引数を使って、ロードする ResourceBundle
サブクラスの名前を以下のように構築します。
リソースバンドルの照合は、(1) 目的のロケール、(2) Locale.getDefault() によって返された現在のデフォルトロケール、(3) ルートリソースバンドル (基底クラス) に基づいて、さまざまな接尾辞を持つクラスを、低いレベル (限定度が高い) から親レベル (限定度が低い) を次の順序で検索します。
baseclass + "_" + language1 + "_" + country1 + "_" + variant1
baseclass + "_" + language1 + "_" + country1
baseclass + "_" + language1
baseclass + "_" + language2 + "_" + country2 + "_" + variant2
baseclass + "_" + language2 + "_" + country2
baseclass + "_" + language2
baseclass
たとえば、現在のデフォルトロケールが en_US であり、呼び出し側が関心を持っているロケールが fr_CH、リソースバンドル名が MyResources である場合、リソースバンドルの照合は、次のクラスを次の順序で検索します。
MyResources_fr_CH
MyResources_fr
MyResources_en_US
MyResources_en
MyResources
照合の結果はクラスですが、そのクラスはディスクのプロパティファイルの基になっている可能性があります。照合が失敗すると、getBundle()
は MissingResourceException
をスローします。
基底クラスは、完全に合致している必要があります (たとえば、MyResources
ではなく myPackage.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_fr_BE を提供する場合は、MyResources と MyResources_fr の両方を提供しないと、リソースバンドルの参照は正しく行われません。
JDK では、ResourceBundle
の 2 つのサブクラス ListResourceBundle
および PropertyResourceBundle
が用意されています。これらはリソースを作成する簡単な方法を提供します (直列化が完全に統合されたら、ほかの方法を提供する予定)。前の例で簡単に示したように、ListResourceBundle
は、そのリソースをキーと値のペアのリストとして管理します。PropertyResourceBundle
は、プロパティファイルを使用してそのリソースを管理します。
ListResourceBundle
または PropertyResourceBundle
では不十分なときは、独自の ResourceBundle
サブクラスを書くことができます。
それらのサブクラスでは、handleGetObject
メソッドおよび getKeys()
メソッドの 2 つをオーバーライドする必要があります。
以下は ResourceBundle
のサブクラス MyResources の非常に簡単な例です。このサブクラスは 2 つのリソースだけを管理します (多数のリソースを管理するサブクラスには、Hashtable
を使用する)。キーが見つからない場合は、handleGetObject
が null を返す必要があることに注意してください。また、「親レベル」の ResourceBundle
で同じキーに同じ値が設定されているときは、値を提供する必要がないことにも注意してください (以下の例の United Kingdom を参照)。さらに、en_GB リソースバンドルを指定したので、ルートリソースバンドルからすべてのデータを継承する場合でも、デフォルトの en リソースバンドルも提供する必要があることにも注意してください。
例:
// default (English language, United States) abstract class MyResources extends ResourceBundle { public Object handleGetObject(String key) { if (key.equals("okKey")) return "Ok"; if (key.equals("cancelKey")) return "Cancel"; return null; } } // German language public class MyResources_de extends MyResources { public Object handleGetObject(String key) { if (key.equals("okKey")) return "Gut"; if (key.equals("cancelKey")) return "Vernichten"; return null; } } // English language, default (must provide even though all the data is // in the root locale) public class MyResources_en extends MyResources { public Object handleGetObject(String key) { return null; } } // English language, United Kingdom (Great Britain) public class MyResources_en_GB 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
など) で 1 つのリソース、ウィジェット WidgetResource
(WidgetResources_fr
、WidgetResources_de
など) で 1 つのリソースというように、好きなようにリソースを分割してバンドルのセットを持つこともできます。
ListResourceBundle
,
PropertyResourceBundle
,
MissingResourceException
フィールドの概要 | |
protected ResourceBundle |
parent
このバンドルが特定のリソースを含まない場合には、getObject は親バンドルを参照します。 |
コンストラクタの概要 | |
ResourceBundle()
唯一のコンストラクタです。 |
メソッドの概要 | |
static ResourceBundle |
getBundle(String baseName)
適切な ResourceBundle サブクラスを取得します。 |
static ResourceBundle |
getBundle(String baseName,
Locale locale)
適切な ResourceBundle サブクラスを取得します。 |
static ResourceBundle |
getBundle(String baseName,
Locale locale,
ClassLoader loader)
適切な ResourceBundle サブクラスを取得します。 |
abstract Enumeration |
getKeys()
キーの列挙を返します。 |
Locale |
getLocale()
ResourceBundle の Locale を返します。 |
Object |
getObject(String key)
ResourceBundle からオブジェクトを取得します。 |
String |
getString(String key)
ResourceBundle からオブジェクトを取得します。 |
String[] |
getStringArray(String key)
ResourceBundle からオブジェクトを取得します。 |
protected abstract Object |
handleGetObject(String key)
ResourceBundle からオブジェクトを取得します。 |
protected void |
setParent(ResourceBundle parent)
このバンドルの親バンドルを設定します。 |
クラス java.lang.Object から継承したメソッド |
clone,
equals,
finalize,
getClass,
hashCode,
notify,
notifyAll,
toString,
wait,
wait,
wait |
フィールドの詳細 |
protected ResourceBundle parent
コンストラクタの詳細 |
public ResourceBundle()
メソッドの詳細 |
public final String getString(String key) throws MissingResourceException
key
- クラスの説明を参照public final String[] getStringArray(String key) throws MissingResourceException
key
- クラスの説明を参照public final Object getObject(String key) throws MissingResourceException
key
- クラスの説明を参照public static final ResourceBundle getBundle(String baseName) throws MissingResourceException
baseName
- クラスの説明を参照public static final ResourceBundle getBundle(String baseName, Locale locale)
baseName
- クラスの説明を参照locale
- クラスの説明を参照public Locale getLocale()
public static ResourceBundle getBundle(String baseName, Locale locale, ClassLoader loader) throws MissingResourceException
baseName
- クラスの説明を参照locale
- クラスの説明を参照loader
- リソースをロードする ClassLoaderprotected void setParent(ResourceBundle parent)
parent
- このバンドルの親バンドルprotected abstract Object handleGetObject(String key) throws MissingResourceException
key
- クラスの説明を参照public abstract Enumeration getKeys()
|
Java プラットフォーム 1.2 |
|||||||||
前のクラス 次のクラス | フレームあり フレームなし | |||||||||
概要: 内部クラス | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |