Firefox 3ではじめる拡張機能開発

第5回 localeパッケージによるローカライズ

この記事を読むのに必要な時間:およそ 5.5 分

propertiesファイルによるローカライズ

JavaScriptのソースファイル内にハードコーディングされた英語の文字列は,Java言語で使われるようなpropertiesファイルへと分離させることで,ローカライズ可能となります。propertiesファイルに定義した文字列をJavaScriptから取り出すには,XULのstringbundle要素を使用する方式と,XPCOMサービスであるnsIStringBundleServiceを使用する方式があります。今回は,前者の方式を使用した手順を解説します。

まず,⁠overlay.xul」リスト5のように記述を追加してください。

リスト5 ⁠overlay.xul」への記述内容(stringbundle要素の追加)

<?xml version="1.0"?>

<!DOCTYPE overlay SYSTEM "chrome://taghelper/locale/overlay.dtd">

<overlay xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
  <script type="application/x-javascript" src="chrome://taghelper/content/overlay.js" /> 
  <stringbundleset id="stringbundleset"> 
    <stringbundle id="taghelper-bundle" src="chrome://taghelper/locale/overlay.properties" /> 
  </stringbundleset> 
  <popup id="contentAreaContextMenu"> 
    <menuitem id="taghelper-menu" 
              label="&taghelperMenu.label;" 
              oncommand="TagHelper.generateTags();" /> 
  </popup> 
</overlay> 

リスト5では,stringbundle要素を追加することで,localeパッケージ内のpropertiesファイル「overlay.properties」を読み込みます。stringbundle要素は単独では使用せずに,stringbundleset要素を使用してグループ化して配置します。今回の場合「overlay.xul」のオーバーレイ先である「browser.xul」に,idが「stringbundleset」のstringbundleset要素が存在するため注2)⁠この要素をマージポイントとしてstringbundle要素を追加します。

注2)
第2回の右クリックメニューの追加にて解説したように,⁠DOM Inspector」を使用して調べることができます。

次に,⁠overlay.js」「generateTags」プロパティへリスト6のように記述を追加・修正してください。

リスト6 ⁠overlay.js」「generateTags」プロパティへの記述内容(stringbundle要素の使用)

generateTags: function() {
  var bundle = document.getElementById("taghelper-bundle"); 
  var url = window.content.location.href;
  url = PlacesUtils._uri(url);
  if (!PlacesUtils.bookmarks.isBookmarked(url)) {
    alert(bundle.getFormattedString("NOT_BOOKMARKED", [window.content.document.title])); 
    return;
  }
  var keywords = [];
  var sel = window.content.getSelection();
  for (var i = 0; i < sel.rangeCount; i++) {
    var keyword = sel.getRangeAt(i).toString();
    keyword = keyword.replace(/^\s+|\s+$/g, "");
    keywords.push(keyword);
  }
  Application.console.log(bundle.getString("KEYWORDS") + " = " + keywords); 
  if (keywords.length > 0) {
    PlacesUtils.tagging.tagURI(url, keywords);
  }
  sel.removeAllRanges();
},

引き続き,各言語のpropertiesファイル「overlay.properties」を作成します。propertiesファイルには,各文字列を「キー=値」の形式で記述します。今回は「overlay.js」にて追加した2つのキー「NOT_BOOKMARKED」⁠KEYWORDS」に対応するローカライズされた文字列をリスト7リスト8のように記述します。なお,propertiesファイルに日本語などのマルチバイト文字列を記述する場合,DTDファイルと同様に,文字コードUTF-8,BOM(Byte Order Mark)無しの形式でファイルを保存する必要があります。

リスト7 ⁠en-US」フォルダ内の「overlay.properties」への記述内容

NOT_BOOKMARKED="%S" is not bookmarked. 
KEYWORDS=Keywords

リスト8 ⁠ja-JP」フォルダ内の「overlay.properties」への記述内容

NOT_BOOKMARKED=「%S」はブックマークされていません。 
KEYWORDS=キーワード

リスト6では,まずリスト5で追加したstringbundle要素を変数「bundle」として取得します。stringbundle要素を介してpropertiesファイルからローカライズ文字列を取得するには,通常stringbundle要素のgetStringメソッドを使用します。リスト6では「bundle.getString("KEYWORDS")」とすることで,⁠overlay.properties」に記述したキー「KEYWORDS」に対応するローカライズされた文字列を取得します。

一方,ローカライズされた文字列内の一部を置き換える必要がある場合,stringbundle要素のgetFormattedStringメソッドを使用します。リスト6では「bundle.getFormattedString("NOT_BOOKMARKED", [window.content.document.title])」とすることで,⁠overlay.properties」に記述したキー「NOT_BOOKMARKED」に対応するローカライズされた文字列を取得し,さらに文字列内の「%S」を引数「window.content.document.title」の内容へ置換します。

動作確認

「DTDファイルによるローカライズ」の動作確認でFirefoxを一度再起動しているのであれば,すでにlocaleパッケージが読み込まれていますが,propertiesファイルを追加・修正した際には,そのたびにFirefoxを再起動する必要があります。Firefoxを再起動し,以下の2点を確認してください。

  • ブックマークされていないWebページ上で範囲を選択し,右クリックから「選択範囲からタグを生成」メニュー項目を選択すると,図3のように日本語で警告メッセージが表示される。
  • ブックマーク済みのWebページ上で範囲を選択し,右クリックから「選択範囲からタグを生成」メニュー項目を選択すると,図4のようにエラーコンソールのメッセージパネルへ日本語のデバッグメッセージが出力される。

図3 ローカライズされた警告メッセージ

図3 ローカライズされた警告メッセージ

図4 ローカライズされたデバッグメッセージ

図4 ローカライズされたデバッグメッセージ

著者プロフィール

Gomita

拡張機能開発者。
現在までにScrapBook,FoxAge2ch,Tab Scope,FireGesturesの4つをリリースしている。

URLhttp://www.xuldev.org/