» L10N (アドオン日本語化)

Mozilla Add-on Builderで作成した拡張機能をローカライズ(多言語化)する方法について

現時点では Mozilla Add-on Builderでローカライズ(多言語化)した拡張機能を作成できません。
しかし、若干の手作業を付け加えることで Add-on Builderで作成した拡張機能をローカライズ(多言語化)できることが判りました。

ローカライズ(多言語化)に関する前提知識とローカライズ(多言語化)する方法についてまとめましたので拡張機能開発の参考にしていただけると嬉しいです。

「Add-on Builderで作成した拡張機能をローカライズ(多言語化)する方法について」

参考:
Add-on Builderでローカライズ(多言語化)に対応した拡張機能を開発できません
(続) Add-on Builderでローカライズ(多言語化)に対応した拡張機能を開発できません

拡張機能のローカライズ

はじめに

ローカライズしたい拡張機能を見つけたら、作業を始める前に、その拡張機能の機能を一通り確認しておきましょう。

この記事では、アプリケーションのパスワード管理機能を拡張する Saved Pasward Editor を取り上げます。他の拡張機能で、まだ日本語のロケールが無い場合は、日本語のリソースを追加する方法 を参照してローカライズするファイルを準備しておいてください。

この拡張機能の locale/* フォルダには、以下のファイルが含まれています:

  • browserOverlay.dtd
  • prefwindow.dtd
  • pwdedit.dtd
  • pwdedit.properties
  • pwdmgrOverlay.dtd
  • pwdmgrOverlay.properties
  • spe.properties
  • welcome.dtd

いろいろなファイルがありますが、これらは .dtd ファイルと .properties ファイルの 2 種類に分けられます。

翻訳作業後は、どちらのファイルも文字エンコードを UTF-8 (BOM 無し) にして保存してください。

dtd ファイルと properties ファイルのローカライズ

dtd ファイル

dtd ファイルは、拡張機能の content フォルダに含まれる xul ファイルや html ファイルで使用されます。

はじめに、pwdmgrOverlay.dtd ファイルを見てみましょう。このファイルは、保存されたパスワードウィンドウに追加されるボタンとコンテキストメニューの文字列が書かれています。

<!ENTITY newentry.label "New">
<!ENTITY newentry.accesskey "N">
<!ENTITY editentry.label "Edit">
<!ENTITY editentry.accesskey "E">
<!ENTITY cloneentry.label "Clone">
<!ENTITY cloneentry.accesskey "l">

dtd ファイルは、「<!ENTITY 実体名 "文字列">」という書式で書かれており、ダブルクォートで囲まれた文字列の部分を翻訳します。これは、content フォルダの pwdmgrOverlay.xul ファイルで次のように呼び出されています。

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

例えば、pwdmgrOverlay.xul ファイル内で newentry.label の実体名を検索すると、コマンドやボタンメニューの label 属性 で使われていることが分かります。(xul コード内では、&実体名; のように書かれます。)

<command id="new_signon"
         label="&newentry.label;" accesskey="&newentry.accesskey;"
         oncommand="spEditor.newSignon();"/>
 ...
<menuitem id="speMenuBtn_newSignon" label="&newentry.label;"
          accesskey="&newentry.accesskey;"
          oncommand="spEditor.menuBtnSel(event, this);"/>

この部分は「新規作成」にします。newentry.accesskey は、この機能の ショートカットキー に指定されているので英語版と同じにします。

<!ENTITY newentry.label "新規作成">
<!ENTITY newentry.accesskey "N">

同様に、editentry.label と cloneentry.label も翻訳しましょう。

<!ENTITY newentry.label "新規作成">
<!ENTITY newentry.accesskey "N">
<!ENTITY editentry.label "編集">
<!ENTITY editentry.accesskey "E">
<!ENTITY cloneentry.label "複製">
<!ENTITY cloneentry.accesskey "l">

properties ファイル

次に、同じ名前を持つ pwdmgrOverlay.properties ファイルを見てみます。properties ファイルは、JavaScript ファイル (*.js) で使用されます。

# POPUP MESSAGE WHEN ADDING/MODIFYING AN ENTRY FAILS
badnewentry=Got an error:\n  %S\nDid you try to create a duplicate login entry?

# で始まる行はコメントです (ちなみに、dtd ファイルのコメントは html と同じ <!-- --> で囲みます)。

properties ファイルは、「実体名 = 文字列」という書式で書かれ、特殊な文字が含まれることがあります。上記の例の \n は改行、%S は文字列中に表示される JavaScript 変数を表します (複数の %S が使われる場合、%1$S, %2$S のように書きます)。

この拡張機能の場合、properties ファイルは、xul ファイルの stringbudle 要素 で呼び出され、すぐ下の script 要素 で指定された pwdmgrOverlay.js ファイルで使用されています。

pwdmgrOverlay.xul:

<stringbundleset>
...
   <stringbundle id="savedpwdedit-overlay-stringbundle"
     src="chrome://savedpasswordeditor/locale/pwdmgrOverlay.properties"/>
</stringbundleset>

<script type="text/javascript"
        src="chrome://savedpasswordeditor/content/pwdmgrOverlay.js"/>

pwdmgrOverlay.js では、上記の要素を getElementById で取得しています。

spEditor.pmoStrBundle =
  document.getElementById("savedpwdedit-overlay-stringbundle");

pwdmgrOverlay.js ファイル内の badnewentry を検索すると、次のところで使われています:

alert(window, this.genStrBundle.getString("error"),
      this.pmoStrBundle.getFormattedString("badnewentry",
                                           [e.message]));

alert() 関数内の getFormattedString() の引数として、実体名の "badnewentry" とエラーメッセージらしきものが渡されています。というわけで、%S はエラーメッセージに置き換えられるのが分かります。

それでは、上記を踏まえて badnewentry を翻訳しましょう。

badnewentry=エラーが発生しました:\n %S\n既存のログインエントリと同じものを作成しようとしていませんか?

ローカライズする文字列

文字列中の JavaScript 変数

properties ファイルでは、JavaScript 変数に置き換えられる %S が使用されることがあります。一つの実体で複数の変数が使用される場合、.js コード内に記述された順に、「%1$S, %2$S, ...」と書くことができます。

元のロケールによっては、「%S, %S, ...」のように数字が省かれていることがありますが、このままでは変数の位置を入れ替えることができません。これは、元のロケールでの記述順に「%1$S, %2$S, ...」と書くことができます。数字を付けて書けば変数の位置を入れ替えることができます。複数の変数が現れる場合は、数字を付けて書きましょう。

また、元のロケールに書かれた変数の表示を省くこともできます。例えば、最初に現れる %S を省きたいときは「%1$0.S」と書きます。同様に、2 番目に現れるものを省きたいときは「%2$0.S」と書きます。

Plural forms

文脈によっては、文字列の単数形と複数形がセミコロン (;) で分けて書かれているものがあります。複数形の規則 は言語によって異なるため、アプリケーションの言語パックで設定されています。拡張機能もそれを継承します (日本語言語パックの intl.properties を参照)。

日本語の場合は、セミコロンから左側を削除して、複数形を前提に翻訳します。

dueInDays=#1 day;#1 days
dueInHours=#1 hour;#1 hours
dueInDays=#1 日
dueInHours=#1 時間

拡張機能の言語リソース

リソースファイル

拡張機能のユーザインターフェースやメッセージ等の言語リソースは、Firefox や Thunderbird のものと同じ *.dtd ファイルや *.properties ファイルで定義されています [1]。 拡張機能のソースコードのうち .xul ファイルで使われる言語リソースは .dtd ファイル、.js ファイルで使われる言語リソースは .properties ファイルと覚えておくと良いでしょう。また、拡張機能によっては .html ファイルが含まれている場合もあります。

リソースファイルの書式

リソースファイルは、それぞれ次のような書式になります。

dtd ファイル:

<!-- コメントブロック -->
<!ENTITY entity.name    "表示する文字列"><!-- コメント -->

properties ファイル:

# コメント行
entity.name = 表示する文字列

上記の「表示する文字列」の部分が翻訳する文字列になります。どちらのファイルも文字コードは UTF-8 (BOM 無し) で保存します。

リソースファイルの場所

アプリケーションに読み込まれる言語リソースは、拡張機能のパッケージに含まれる chrome.manifest ファイルで定義されており、各ロケール名のフォルダに分けて格納されています。拡張機能によってフォルダの構成は異なります。最も階層を深くしている拡張機能では、次のように書かれているでしょう。

content	myfxaddon	jar:chrome/myfxaddon.jar!/content/myfxaddon/
locale	myfxaddon	en-US	jar:chrome/myfxaddon.jar!/locale/en-US/myfxaddon/
locale	myfxaddon	ja	jar:chrome/myfxaddon.jar!/locale/ja/myfxaddon/

この場合に読み込まれる日本語のリソースファイルは、
chrome フォルダ内の myfxaddon.jar 圧縮ファイルを展開して、
/locale/ja/myfxaddon/ のフォルダにあります。

最も単純なフォルダ構成の拡張機能では、次のように書かれています。

content	myfxaddon	content/
locale	myfxaddon	en-US	locale/en-US/
locale	myfxaddon	ja	locale/ja/

この場合に読み込まれる日本語のリソースファイルは、
locale/ja/ フォルダにあります。

使用される言語は、アプリケーションのロケール設定 (general.useragent.locale) に依存します。

日本語のリソースを追加するには

まだ日本語化されていない拡張機能は、次の手順で日本語のリソースを追加します。

  1. chrome.manifest ファイルを編集して ja [2] の行を追加する。
    (en-US の行をコピーして ja に書き換えてください)
  2. en-US のリソースのフォルダと同じ階層に ja フォルダを作成し、en-US フォルダ内のすべてのファイルを ja フォルダにコピーする。
  3. ja フォルダのリソースファイル (*.dtd, *.properties) を開き、文字列を翻訳する。
    (文字コードを UTF-8 にして保存することを忘れないでください)

拡張機能によっては、文字列がソースコード内に直接書かれているために日本語化できない (国際化・多言語化されていない) ものもあります。その場合は、まず拡張機能の国際化 [3] を作者に依頼しましょう。


[1] Mozilla L10N システムの言語リソースファイル 参照。

[2] Mozilla 製品の日本語版には、Windows/Linux 版の “ja” と Mac 版の “ja-JP-mac” ロケールがあります。拡張機能に Mac 版のロケールを追加したい場合は、次のように chrome.manifest ファイルに ja-JP-mac の行を追加し、locale/ja-JP-mac のフォルダに Mac 用のロケールファイルを置いてください。

locale	myfxaddon	ja-JP-mac	locale/ja-JP-mac/

[3] 国際化 (Internationalization) のことを略して I18N と呼びます。I18N は、ソフトウェアを多言語化することです。ローカライズ (L10N) は、ソフトウェアを特定の地域に合わせて翻訳・設定することです。

アドオン開発者ガイドのチュートリアルを翻訳・公開しました

追記: オリジナルドキュメントが MDN に移行したのに伴い翻訳も MDN の Add-on SDK ページに移動しました。

Firefox にはアドオン開発用の SDK が公開されており、SDK にはチュートリアルや API リファレンスなどの開発者ガイドも用意されています。しかし、英語のみで若干敷居が高いという問題がありましたが、今回その開発者ガイドのうち、SDK のインストール手順とチュートリアル部分を日本語訳し、公開しました。

https://dev.mozilla.jp/addon-sdk-docs/dev-guide/index.html

但しこのサイト上で公開するのは当面の間だけであり、将来的には SDK 本体にマージして行く予定です。いずれマージされるってことでテンプレートなどは AS IS でドキュメントを生成しています。見苦しいところもあるかと思いますがご容赦ください。

未訳ページの翻訳にご協力頂ける方はこの投稿にコメントするか、TwitterFacebook などでご連絡ください。翻訳についてのご指摘などは githubIssue を立てていただくか、pull request していただければ幸いです。