nsIStringBundleService

JavaScript内でローカライズされた文字列(平たく言えば日本語)を使用するには、properties ファイルを xul:stringbundle 要素から参照して getString や getFormattedString によって文字列を取り出す方法がある。これは XUL Tutorial にも記載されているように基本的な方法である。
しかし、ユーザーインターフェースとは切り離されたプログラム的な制御がメインの JavaScript にてローカライズされた文字列を使用する場合(特に自前のXPCOMコンポーネントを実装する場合)、いちいち xul へ stringbundle 要素を配置するのは面倒であり、規模が大きくなるとややこしくなりやすい。こういう場合には nsIStringBundleService が便利である。このXPCOMサービスは createBundle メソッドによって指定したURIから properties ファイルを読み込んで nsIStringBundle 型のXPCOMオブジェクトを生成し、 GetStringFromName や formatStringFromName メソッドによってローカライズされた文字列を取り出したりすることができる。以下のサンプルにある getLocaleString 関数は、 BookmarksUtils を参考にして文字列の置換の有無に両対応したものである。

リファレンス:
Interface Reference – nsIStringBundleService
Interface Reference – nsIStringBundle

sample.properties

HELLO=こんにちは
MY_NAME_IS=私の名前は%Sです。

sample.js

var FoxkehUtils = {

    _stringBundle : null,

    getLocaleString : function(aStringKey, aReplacements)
    {
        // 初めて呼び出された時に properties ファイルを読み込んで nsIStringBundle オブジェクト生成
        if ( !this._stringBundle ) {
            const BUNDLE_SVC = Components.classes['@mozilla.org/intl/stringbundle;1'].getService(Components.interfaces.nsIStringBundleService);
            this._stringBundle = BUNDLE_SVC.createBundle("chrome://sample/locale/sample.properties");
        }
        try {
            if ( !aReplacements )
                // 置換なし
                return this._stringBundle.GetStringFromName(aStringKey);
            else
                // 置換あり
                return this._stringBundle.formatStringFromName(aStringKey, aReplacements, aReplacements.length);
        } catch(ex) {
            // 未定義の場合 fallout
            return aStringKey;
        }
    },

    say : function()
    {
        alert(this.getLocaleString("HELLO"));    // こんにちは
        alert(this.getLocaleString("MY_NAME_IS", ["フォクすけ"]));    // 私の名前はフォクすけです。
    },
}

FoxkehUtils.say();

TOP

TOP