スクリプトからは、ローカライズのために実体を参照することができないため、 代わりにプロパティファイルを利用することになります。
プロパティ
DTD ファイルは、XUL ファイルに置かれているテキストをローカライズするために利用するのには適していますが、 スクリプトに対しては、実体参照を処理するように適用することはできません。【訳注: XUL ファイルに直接スクリプトを埋め込んである場合は除きます】 加えて、スクリプトでは、単純に固定のテキストを表示するのではなく、 動的にメッセージ生成を行って表示するような場合もあると思います。 このような用途のためには、プロパティファイルが利用できます。
プロパティファイルには、スクリプトから利用可能な文字列情報が含まれています。 プロパティファイルは DTD ファイルと同じ場所に、拡張子 .properties
で置いておきます。 このファイルで扱う情報はプロパティと呼ばれ、「名前=値」という形式で宣言されます。 以下に例を示します。
notFoundAlert=No files were found matching the criteria. deleteAlert=Click OK to have all your files deleted. resultMessage=%2$S files found in the %1$S directory.
この例のプロパティファイルには、3 つのプロパティが含まれています。 これらはスクリプトから読み込まれて、利用者に表示されることになります。
文字列バンドル
プロパティファイルを読み込むコードは、独自に記述することも可能かもしれませんが、 XUL では、この用途のために
要素を提供しています。 この要素は、指定されたプロパティファイルの内容を読み込んで、 内部にプロパティのリストを構築して保持し (このリストはバンドルと呼ばれます)、 プロパティに対応する文字列の取得をはじめ、 いくつかのロケール関連の情報を取得するための機能を提供しています。 スクリプトからは、この要素を利用して、名前を元に対応するプロパティの値を参照することが可能になります。stringbundle
<stringbundleset id="strbundles"> <stringbundle id="strings" src="strings.properties"/> </stringbundleset>
上記の
要素を追加することで、XUL ファイルと同じディレクトリに置いた stringbundle
strings.properties
ファイルから、プロパティが読み込まれます。 これをロケールパッケージから読み込むように変更するためには、chrome URL で指定することになります (通常はロケールパッケージから読み込むようにしてください)。 また、他の表示されない要素と同様に、stringbundle
要素は、まとめて
の中に置くようにします。stringbundleset
バンドルから文字列を取り出す
この
要素には、いくつかの (JavaScript オブジェクトの) プロパティが用意されています。 最初の stringbundle
getString
は、スクリプトからバンドルに含まれている文字列を取り出すために利用できます。
var strbundle = document.getElementById("strings"); var nofilesfound=strbundle.getString("notFoundAlert"); alert(nofilesfound);
この例では...
- 最初に id からバンドルへの参照を取得します。
- 次に、
getString()
関数によって、プロパティファイルから「notFoundAlert
」に対応する文字列を探します。もし存在しない場合は null が返ります。 - 最後に、取得した文字列がアラートボックスに表示されます。
テキストのフォーマット
次のメソッドは、getFormattedString()
です。 このメソッドも、キーになる名前に対応する文字列をバンドルから取得しますが、 加えて、フォーマット指定 (例: %S
) が現れるたびに、順番に引数で指定した配列の値で置き換えていきます。
var dir = "/usr/local/document"; var count = 10; var strbundle = document.getElementById("strings"); var result = strbundle.getFormattedString("resultMessage", [ dir, count ]); alert(result);
この例は、以下のメッセージをアラートボックスに表示します。
10 files found in the /usr/local/document directory.
この例では、フォーマット指定として、%1$S
と %2$S
が使用されていて、 メッセージでは、配列に格納されているのとは異なる順番で置き換えが行われていることに気付いたかもしれません。 %
n$S
というフォーマット指定を使用すると、対応するパラメータの位置を直接指定することが可能になります。 すべての言語で単語の並び順が同じではないことに対応するために、getFormattedString()
を使用して、並びの指定を (ロケールに置かれている) プロパティファイルに追い出すことが可能です。
非 ASCII 文字をエスケープする
多くの言語で、非 ASCII 文字が必要になるにもかかわらず、プロパティファイルは、ASCII 文字の範囲だけで記述する必要があります。 しかしながら、プロパティファイルでは、それ以外の文字を \u
XXXX (XXXX は Unicode による文字コード) のエスケープシーケンスで表現することをサポートしています。 このため、非 ASCII 文字を含むプロパティファイルは、'escaped-unicode' 形式に変換する必要があります。 これは、Sun の JDK (Java Development Kit) に含まれている native2ascii コマンドを利用して行うことが可能です。
【訳注: ローカライズ関連の情報は、もじふぉ をはじめとして日本語独自のリソースが充実しています】
Gecko 1.8.x 以降は UTF-8 でコード化されたプロパティファイルをサポートしています。この場合は、非 ASCII 文字をエスケープせずに記述することができます。
次のセクションでは、XBL について見ていきます。これを使用することで要素の振る舞いを定義することが可能になります。