FireVoxにもどる

このコンテンツは現在執筆中です。

目次

目的

FireVoxを日本語化したときの工程や、資料をまとめます。 日本語ロケールファイルを付け加える作業だけではなく、 ローカリゼーション機構のない拡張にlocalフォルダを作り多言語対応にする方法です。 一からローカリゼーション対応の拡張を作るときにも役に立つでしょう。

これは私がこのようにやったという報告であって、正攻法ではないかもしれません。 実際にやるときは、概略だけを参考にして、自分でスクリプトを書いて自動化したり、いろいろやってみてください。

参考ページ

主に以下のサイトを参考にしました。他にも記録していないページを参考。

ここにあるページの情報を見れば、自分がまとめる必要もないかもしれない。

ここにあるサイトは古い情報が含まれている可能性があります。事実そのために手こずったところもあります。

準備するソフト

パッケージの展開

ローカリゼーションへの対応

パッケージのローカリゼーション対応

install.rdfの記述

フォルダの構成

contents.rdfの記述

XULのローカリゼーション対応

XULファイルの記述

DTDファイルの記述

Javascriptのローカリゼーション対応

拡張の動作内容を記述しているのがJS拡張子を持つJavascriptファイルです。このJavascriptで出力される文字列もローカリゼーションの対象となります。

おおまかな手順は次の通りです。

作業の対象は、以下の3種類のファイルです。

それでは、細かな手順を示します。

PROPERTIESファイルはどこに作るのか。

PROPERTIESファイルはlocaleフォルダ内に作ります。これはJavascript内で記述されている文字列の言語のロケールフォルダ内です。例えば英語で記述してありメッセージが英語で出力されるプログラムを作業の対象にする場合は英語ロケールとなり、その言語のinstall.rdfで記述しているロケール指定の階層にファイルを作ります。

例えば、以下のような記述がinstall.rdfファイル内にあるとき、

<em:locale>locale/en-US/</em:locale>

この場合は、localeフォルダ内のen-USフォルダに作ります。次の場合は、

<em:locale>locale/en-US/hoge/</em:locale>

localeフォルダ内のen-USフォルダ内のhogeフォルダ内に作ります。

PROPERTIESファイルに名前を付ける。

名前は任意ですが、その拡張機能の名前にしたほうがわかりやすいでしょう。そして拡張子にpropertiesを付けます。

例えば、拡張機能hogeを作っているときは、hoge.properites とします。

またXULファイル毎にPROPERTIESファイルを用意したり、わかりやすいように複数に分類してもかまわないでしょう。

XULファイルへ登録する。

PROPERTIESファイルの登録はそれが使われるXULファイル内で、stringbundleset要素とstringbundle要素を使って登録します。

以下のように登録することで、Javascriptのプログラム内からPROPERTIESファイルの内容を参照することができるようになります。

利用するPROPERTIESファイル毎にわかりやすい任意のidを決めてstringbundle要素を作ります。

例えば、idがhoge-bundle、PROPERTIESファイルがhoge.propertiesのときは、

<stringbundle id="hoge-bundle" src="chrome://hoge/locale/hoge.properties"/>

となります。

これを、PROPERTIESファイルの数だけ用意して(通常は一つでOK)、全体をstringbundleset要素で囲みます。このstringbundleset要素にも任意のid属性を指定しておきます。

<stringbundleset id="hoge-bundle-set">
   <stringbundle id="hoge-bundle" src="chrome://hoge/locale/hoge.properties"/>
</stringbundleset>

どの文字列を翻訳対象にするか。

Javascriptの書かれているjsファイル内から、文字列の部分を探し出します。これにはJavascriptの文法が分かっていなくてはいけません。また文字列をすべて抜き出してしまえばいいというものでもありません。表示もしくは音声による出力に関連するものや、外部からの入力に対するものなど、プログラムの動作を詳しく分析しながら、判断していきます。

このとき便利なのは、Javascriptの構文を認識し着色してくれるエディタですね。文字列部分を容易に見つけ出せます。もしくは検索で該当箇所を着色してくれる機能があるエディタです。検索には次のような正規表現を使えばいいでしょう。

("[^"]*"|'[^']*')

PROPERTIESファイルにリストを作る

XULファイル内で呼び出されているJavascriptファイルに対して、一つずつ翻訳対象の文字列がないか調べていきます。見つかったら、その情報を先ほどXULファイルに登録したPROPERTIESファイルに、記述していきます。

記述の仕方ですが、文字列を見つけたらそれを指し示す名前を決めます。万人のために英語的な名前にします。この名前の後に'='記号を置いて、さらにその文字列そのものを置きます。文字列を囲む引用符はいりません。

例えば、"Hello,World!"という文字列が見つかったら、PROPERTIESファイルに、

HelloWorld=Hello,World!

という行を追加します。

既に同じ文字列を示しているものがある場合は追加する必要はありません。ただし、同じ文字列だからといって、同じ意味で使われていないこともあります。翻訳すると意味の差が大きく広がる可能性もあります。

文字列の名前は同じXULファイルに登録してあるPROPERTIESファイル間で重複がないように決めていきます。

書式付き文字列も対象にできます。またオリジナルのJSファイルで文字列の足し算を使って処理している部分を書式付き文字列で簡潔に表現できることもあります。この書式については後述します。

この作業を翻訳が必要な文字列の数だけ繰り返します。

PROPERTIESファイルの保存形式

現在、この手順は英語のプログラムをローカリゼーション対応にする改造の方法を書いているので問題はないのですが、 日本語のプログラムなど非ASCII文字の言語をローカリゼーション対応にしているときは、PROPERTIESファイルの保存形式が問題になってきます。

PROPERTIESファイル内の文字列には非ASCII文字列は使えません。しかし日本語を始め様々な非ASCII文字列を表示するための変更ですし、実際に非ASCII文字列を表示する拡張機能をいくつも見てきています。 では、どうやってASCII文字列だけを使いながら、非ASCII文字列を表示しているのでしょうか。 それはユニコードエスケープシーケンスという表記法で、各文字に割り当てられた文字コードを表記していく方法です。

例えば

文書 

\u6587\u66F8

となります。

RsoureceEditor?というJavaで書かれたエディタがあります。保存するとき ASCII(UNICODE\uxxxxxxx)を選べば、この形式で保存できます。 再び編集するときも、ちゃんとした文字の形に変換して見せてくれるので、人間はまったくこの変換に気をつかう必要はありません。

PROPERTIESファイル内のパラメータ付き文字列

文字列中に含むことができるパラメータは、%S です。%dや%xなど他のパラメータも用意されているようですが、思い通りの値は出力されないようです。

%S は、文字列の式の値も、数値の式の値も表示してくれますので、実用上問題ないでしょう。なお小文字sを使った %s は最初の一文字だけを表示してしまいました。

翻訳をする上で問題となるのは、語順の問題です。 原文と同じパラメータの順序で文章を作ることはできなくもないですが、素直な翻訳文を作るためにはパラメータの順序を変えたいなという場面も多々あります。 そんなときは、%とSとの間に「数値$」を入れ、何番目のパラメータを対象にするのかを指定します。

mozillaのソース内で見つけた方法ですが、getStringメソッドを利用した方法もあります。文字列中に%title%というふうな部分を作っておき、Javascriptのソースの方では、それをgetStringで取り込んだ後、文字列のreplaceメソッドを使って置き換えて使用します。

例えば、プロパティ定義ファイルで

title=新規ファイル
message=%title%を作りました。

Javascriptファイルで

var ttl = getString("title");
var mes = getString("message");
mes = mes.replace(/%title%/,ttl);

JSファイルの文字列を置き換える。

PROPERTIESファイルに文字列の対応リストができたら、この文字列を参照するようにJSファイルの内容を書き換えていきます。

注意:この作業はJavascriptの内容を直接書き換えていくので、より慎重におこなってください。引用符を消し間違えただけで、この拡張機能は使い物にならなくなってしまいます。一度に多くの文字列を書き換えずに、少しずつ動作を確認しながら、おこなった方が賢明です。

単純な文字列の場合と、文字列や数値のパラメータを実行時に組み込む文字列の場合があります。

まず、単純な文字列の場合

getStringメソッドを使います。このメソッドは文字列を引数としてとり、stringbundle内から名前としてさがし、対応する値を文字列で返します。

stringbundleを特定するためにgetElementById?メソッドを利用して、次のような式になります。

document.getElementById("foo").getString("bar")

stringbundleのidがfooで、PROPERTIESリスト内の要素名がbarであるときの例です。 これを対象の文字列と置き換えていきます。

PROPERTIESリスト内で次のように名前と文字列が対応しているとき、

bar=Hello,World!

そしてオリジナルのコードが次のとき、

shout("Hello,World!")

書き換え後はこのようになります。

shout( document.getElementById("foo").getString("bar") );

同じ文字列が繰り返し現れるときなどは、エディタについている確認付きの置換コマンドを利用したりしながら、丁寧にやっていきます。しかし一文字違っただけでプログラムは動かなくなったり望んでいる動作ができなくなりますので、とにかく慎重にします。

また、行が長くなるので、document.getElementById?("foo")を大域変数に代入しておき、それを活用するなど適宜自分のスタイルに書き換えてください。

パラメータ付き文字列の場合

パラメータ付きの文字列の場合、メソッドgetFormattedString?利用します。配置の仕方はgetStringと同じで、対象のある文字列と入れ替えですが、パラメータ付きなだけに引数が違っています。getFormattedString?の第二引数に、文字列に対するパラメータの配列がきます。パラメータは文字列もしくは数値をとることができます。

hoge = "";
shout( document.getElementById("foo").getFormattedString("bar",[hoge,2]) );

プログラムの変更

プログラムによっては文字列の置き換えだけでは対応しきれない場合もあるかもしれません。その場合はロケールで条件分岐できるようにプログラムを作りかえて対処します。しかしこの方法だと新たにロケールを追加する毎に、プログラムを書き換えていかなくてはいけないので、あまりおすすめはできません。

PROPERTIESファイルの項目に、ロケールを表す文字列をフラグとして定義することで、簡易的に現在のロケールを獲得できるはずです。

ローカライズ

以上の手順でローカリゼーション対応の機能拡張パッケージを作成できたら、翻訳したい言語(今回は当然日本語)で、ローカライズをしていきます。

何をなすべきかが分かっていれば、上記のローカリゼーション対応作業の中で同時並行で、以下の作業をおこなってもかまいません。

install.rdfへの追加

ロケールフォルダの作成

DTDファイルの作成

PROPERTIESファイルの作成

パッケージの仕方


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS