stringbundleがgetElementByIdで取得できない…

こういう場合には nsIStringBundleService が便利である。このXPCOMサービスは createBundle メソッドによって指定したURIから properties ファイルを読み込んで nsIStringBundle 型のXPCOMオブジェクトを生成し、 GetStringFromName や formatStringFromName メソッドによってローカライズされた文字列を取り出したりすることができる。

XULに埋め込んでもgetElementByIdで取得できない怪奇が発生したので、これを使ってみることにした。
こっちのほうがスマートなので良しとする。

文字列取得関数を返す仕様

  function (path) {
    const BUNDLE_SVC = AnkUtils.ccgs('@mozilla.org/intl/stringbundle;1',
                                     Components.interfaces.nsIStringBundleService);
    var stringBundle = BUNDLE_SVC.createBundle(path);
    return function (key, replacements) {
      try {
        if (!replacements) {
          return stringBundle.GetStringFromName(key);
        } else {
          return stringBundle.formatStringFromName(key, replacements, replacements.length);
        }
      } catch (e) {
        return key;
      }
    };
  };