|
JavaTM 2 Platform Std. Ed. v1.3 |
|||||||||
| 前のクラス 次のクラス | フレームあり フレームなし | |||||||||
| 概要: 内部クラス | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド | |||||||||
java.lang.Object | +--java.util.ResourceBundle
リソースバンドルには、ロケール固有のオブジェクトが含まれます。プログラムで String などのロケール固有のリソースが必要なときは、ユーザのロケールに合ったリソースバンドルからロードできます。このように、リソースバンドルから、ロケール固有の情報のすべてでなくてもその大部分を切り離すことで、ユーザのロケールにはほとんど依存しないプログラムコードを書くことができます。
これにより、以下の特徴を持つプログラムを書くことが可能になります。
1 つのリソースバンドルは、概念的には、ResourceBundle から継承する関連クラスのセットです。ResourceBundle 関連サブクラスは、どれも同じベース名とロケールを識別する追加要素を持っています。たとえば、MyResources という名前のリソースバンドルがあるとします。この最初のクラスは、そのファミリ MyResources と単に同じ名前を持つデフォルトのリソースバンドルであると想定できます。これに、関連したロケール固有のクラスを必要なだけ設定できます。たとえば、MyResources_de という名前のドイツ語版を設定できます。
ResourceBundle の関連するサブクラスそれぞれには、同じ項目が含まれていますが、その項目は個々の ResourceBundle サブクラスが表しているロケールに合わせて翻訳されています。たとえば、MyResources と MyResources_de の両方に操作取り消し用のボタンに使用される String が含まれているとします。このとき、MyResources では String に Cancel が、MyResources_de では Abbrechen が定義されています。
同じ言語を使用するロケールでも国によってリソースが異なるときは、特殊化が可能です。たとえば、MyResources_de_CH はスイス (CH) 系のドイツ語 (de) になります。リソースの一部だけを修正することもできます。
プログラムでロケール固有のオブジェクトが必要なときは、getBundle メソッドを使用して ResourceBundle クラスをロードします。
ResourceBundle myResources =
ResourceBundle.getBundle("MyResources", currentLocale);
最初の引数では、目的のオブジェクトを含むリソースバンドルのファミリ名を指定します。2 番目の引数では、目的のロケールを指定します。getBundle は、この 2 つの引数を使って、ロードする ResourceBundle サブクラスの名前を以下のように構築します。
リソースバンドルの照合は、(1) 目的のロケール、(2) Locale.getDefault() によって返された現在のデフォルトロケール、(3) ルートリソースバンドル (基底クラス) に基づいて、さまざまな接尾辞を持つクラスを、低いレベル (限定度が高い) から親レベル (限定度が低い) を次の順序で検索します。
baseclass + "_" + language1 + "_" + country1 + "_" + variant1
baseclass + "_" + language1 + "_" + country1 + "_" + variant1 + ".properties"
baseclass + "_" + language1 + "_" + country1
baseclass + "_" + language1 + "_" + country1 + ".properties"
baseclass + "_" + language1
baseclass + "_" + language1 + ".properties"
baseclass + "_" + language2 + "_" + country2 + "_" + variant2
baseclass + "_" + language2 + "_" + country2 + "_" + variant2 + ".properties"
baseclass + "_" + language2 + "_" + country2
baseclass + "_" + language2 + "_" + country2 + ".properties"
baseclass + "_" + language2
baseclass + "_" + language2 + ".properties"
baseclass
baseclass + ".properties"
たとえば、現在のデフォルトロケールが en_US であり、呼び出し側が関心を持っているロケールが fr_CH、リソースバンドル名が MyResources である場合、リソースバンドルの照合は、次のクラスを次の順序で検索します。
MyResources_fr_CH
MyResources_fr
MyResources_en_US
MyResources_en
MyResources
照合の結果はクラスになりますが、クラスはディスク上のプロパティファイルによって返されることがあります。つまり、getBundle で指定した名前のクラスが見つからなかった場合、「プロパティ」がクラス名に追加され、その名前のプロパティファイルが検索されます。その名前のファイルが見つかると、新しい PropertyResourceBundle オブジェクトが作成され、保持されます。前の例に従って、以下のように設定の変更を指定するクラスおよびファイルが返されます。
(class) MyResources_fr_CH (file) MyResources_fr_CH.properties (class) MyResources_fr (file) MyResources_fr.properties (class) MyResources_en_US (file) MyResources_en_US.properties (class) MyResources_en (file) MyResources_en.properties (class) MyResources (file) MyResources.properties
照合が失敗すると、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 を使用します。
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_fr_BE を提供する場合は、MyResources と MyResources_fr の両方を提供しないと、リソースバンドルの参照は正しく行われません。
Java 2 プラットフォームでは、ResourceBundle の 2 つのサブクラス ListResourceBundle および PropertyResourceBundle が用意されています。これらはリソースを作成する簡単な方法を提供します (直列化が完全に統合されたら、ほかの方法を提供する予定)。前の例で簡単に示したように、ListResourceBundle は、そのリソースをキーと値のペアのリストとして管理します。PropertyResourceBundle は、プロパティファイルを使用してそのリソースを管理します。
ListResourceBundle または PropertyResourceBundle では不十分なときは、独自の ResourceBundle サブクラスを書くことができます。それらのサブクラスでは、handleGetObject メソッドおよび getKeys() メソッドの 2 つをオーバーライドする必要があります。
以下は ResourceBundle のサブクラス MyResources の非常に簡単な例です。このサブクラスは 2 つのリソースだけを管理します (多数のリソースを管理するサブクラスには、Hashtable を使用する)。キーが見つからない場合は、handleGetObject が null を返す必要があります。また、キーが null の場合は、NullPointerException がスローされます。「親レベル」の 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) {
// don't need okKey, since parent level handles it.
if (key.equals("cancelKey")) return "Abbrechen";
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 - クラスの説明を参照してください。NullPointerException - key が null の場合
public final String[] getStringArray(String key)
throws MissingResourceException
key - クラスの説明を参照してください。NullPointerException - key が null の場合
public final Object getObject(String key)
throws MissingResourceException
key - クラスの説明を参照してください。NullPointerException - key が null の場合public Locale getLocale()
protected void setParent(ResourceBundle parent)
parent - このバンドルの親バンドル
public static final ResourceBundle getBundle(String baseName)
throws MissingResourceException
baseName - クラスの説明を参照してください。
public static final ResourceBundle getBundle(String baseName,
Locale locale)
baseName - クラスの説明を参照してください。locale - クラスの説明を参照してください。
public static ResourceBundle getBundle(String baseName,
Locale locale,
ClassLoader loader)
throws MissingResourceException
baseName - クラスの説明を参照してください。locale - クラスの説明を参照してください。loader - リソースをロードする ClassLoader
protected abstract Object handleGetObject(String key)
throws MissingResourceException
key - クラスの説明を参照してください。NullPointerException - key が null の場合public abstract Enumeration getKeys()
|
JavaTM 2 Platform Std. Ed. v1.3 |
|||||||||
| 前のクラス 次のクラス | フレームあり フレームなし | |||||||||
| 概要: 内部クラス | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド | |||||||||
Java、Java 2D、JDBC は、米国およびその他の国における米国 Sun Microsystems, Inc. の商標もしくは登録商標です。
Copyright 1993-2000 Sun Microsystems, Inc. 901 San Antonio Road,
Palo Alto, California, 94303, U.S.A. All Rights Reserved.