Google Personalized Homepage ガジェットの作り方 : 国際化に対応する(後編)
サイトのリニューアルばかりにうつつをぬかしていると飽きられてしまいそうなので(笑)、そろそろ普通の記事も投稿しておきます。 Google Universal ガジェット国際化の続きです。前回で東京アメッシュガジェットを国際化(日本語と英語だけですが^^;)する手順をご紹介したので、本日はその背景にある仕組みについて、詳細に見ていこうと思います。参考までに、関連する Google からの正式な関連資料としては以下のページがあります。
Google Gadgets and Internationalization (i18n)
主な知識は網羅したつもりですが、必要に応じて上記のページも参照していただければ、より理解が深まると思います。
message bundle ファイルの書き方
前回も触れたように、ガジェットを国際化するには対応する言語(正確には言語と国を組み合わせたロケール)ごとに message bundle と呼ばれる XML ファイルを用意する必要があります。まずはこのファイルの書式について、詳細にご紹介しましょう。 XML ファイルというと複雑そうな感じがしますが、 message bundle の書式はとてもシンプルですので、ご心配なく。
message bundle の書式
message bundle の書式は、以下のサンプルがほぼすべてです。
<messagebundle> <msg name="シンボル">置換メッセージ</msg> ... </messagebundle>
ルート要素として messagebundle 要素があり、その中に msg 要素をメッセージの数だけ並べます。 msg 属性で指定している「シンボル」と「置換メッセージ」はメッセージ内容に応じて適宜置き換えてください。意味は以下のとおりです。
- シンボル
- ガジェット定義ファイル内でメッセージを識別するためのシンボルです。英数字とアンダーバーのみで構成してください。
- 置換メッセージ
- 実際に表示される文字列を指定します。日本語も含めて任意の文字が使えますが、 & (アンパサンド)など一部の文字は XML の仕様に従って適切に実体参照を使ってください。
もし日本語など ASCII 以外の文字が必要な場合は、必ず UTF-8 でエンコードしてください。それ以外の文字コードはたとえ XML 宣言で指定したとしても受け付けられません。
message bundle ファイルのファイル名
message bundle ファイルのファイル名にも慣例があり、以下のように命名することになっています。
<言語コード>_<国コード>.xml
言語コード、国コードはそれぞれを表現するアルファベットです。日本は "ja_JP.xml" 、米国は "en_US.xml" になりますね。言語コード・国コードの詳細は後の「言語コード・国コード」でご紹介します。
また、言語コード・国コードのどちらも "ALL" という特殊な指定があり、他の指定がマッチしなかった場合のデフォルトとして使われます。 例えば "en_UK.xml" と "en_ALL.xml" があった場合、イギリスからのアクセスだけは "en_UK.xml" が使われ、その他の国からの(英語設定での)アクセスは "en_ALL.xml" が適用されます。この仕組みの詳細は「ロケールのフォールバック」でご紹介します。
実際には上記の慣例に従わなくても動作するのですが、どのロケールに対応するファイルかを明確にするためにも、できるだけ合わせるようにしてください。
ガジェット定義ファイルの書き方
message bundle ファイルを作っただけでは、 Google がその "message bundle" ファイルを見つける手段がありませんし、ガジェットのどの部分を置き換えればいいかもわかりません。この問題を解決するため、ガジェット定義ファイルにそれらの情報を含めてやる必要があります。具体的には ModulePrefs 要素の子要素として対応する message bundle ファイルをリストアップし、ロケールによって変化するメッセージを message bundle 内のシンボルに置き換えることになります。以下、順番にご紹介していきます。
message bundle ファイルの指定
まずは対応するロケールの指定を行いましょう。ロケールの指定は ModulePrefs 要素の子要素として以下のような Locale 要素を記述することで行います。
<Locale [lang="言語コード" [country="国コード"]] message="URL"/>
言語コード、国コードは基本的に message bundle ファイルのファイル名のものと同じです。ただし、 "ALL" の場合には lang または country 属性自体を省略します。 lang="ALL" のような指定は通りませんのでご注意ください。 message 属性には対応する message bundle ファイルの URL を指定します。
対応するロケールが複数ある場合(たいていはそうでしょう)、以下のようにロケールの数だけ Locale 要素を並べます。
<Locale messages="http://example.com/ALL_ALL.xml"/> <Locale lang="ja" messages="http://example.com/ja_ALL.xml"/> <Locale lang="en" messages="http://example.com/en_ALL.xml"/>
この場合、日本語設定でのアクセスでは "ja_ALL.xml" のメッセージが表示され、英語設定なら "en_ALL.xml" が使われます。その他の言語でのアクセスに対しては、すべて "ALL_ALL.xml" のメッセージが表示されます。
メッセージシンボルの埋め込み
次は、 message bundle でそれぞれのメッセージの表示位置にメッセージシンボルを埋め込みます。メッセージシンボルは以下の形式になります。「シンボル」は message boundle に記述した msg 要素の name 属性の値です。
__MSG_シンボル__
どこかで見たような形式ですね。そう、ユーザー設定による文字列置換とほぼ同じですね。考え方もほぼ同じで、指定したシンボルに対応するメッセージが上記のシンボルの位置に挿入されます。具体的な例は前回の東京アメッシュガジェットをご覧ください。
メッセージシンボルを記述できる場所は Content 要素の CDATA 内のほか、 ModulePrefs 要素の title, title_url 属性、 UserPref 要素の display_name 属性などがあります。それ以外でも表示メッセージに関連する部分には記述できるかもしれません。しかし、ガジェットの信頼性に影響する場所、例えば ModulePrefs 要素の height 属性などには記述できませんので、ご注意ください。
JavaScript での取得方法
ユーザー設定と同様に、 JavaScript のメソッドでメッセージを取得することもできます。やり方もほぼ同じで、 _IG_Prefs クラスのオブジェクトを作成した後に、その getMsg メソッドを呼び出します。 getMsg メソッドの書式は以下のとおりです。
getMsg(シンボル)
つまり、引数に msg 要素の name 属性の値を渡すだけです。返り値として、対応するメッセージが文字列形式で取得できます。ユーザー設定の場合とは異なり、数値や bool 型で取得するメソッドは用意されていません。
例えば、 "title" というシンボルに対応するメッセージを取得し、ドキュメントに出力するには以下のようにします。
var prefs = new _IG_Prefs(__MODULE_ID__); document.write('<p>' + prefs.getMsg("title") + '</p>');
ユーザー設定の取得方法と非常に似ていることがお分かりいただけるかと思います。
ロケール指定の詳細
Google Universal ガジェットでは、ロケールの指定をアルファベット 2 文字の言語コードと国コードの組み合わせで表現します。この方法は UNIX 系の OS を使っている方にはお馴染みかと思いますが、そうでないと少し戸惑うところかもしれません。そこで、ロケール指定に関してもう少し詳しくご紹介しようと思います。
言語コードと国コード
すでに幾度も出てきていますが、 Google Universal ガジェットはロケールを識別するために「言語コード」と「国コード」の組を使用します。言語コードは ISO 639 をベースにしていますが、すべてが使えるわけではありません。有効な言語コードはリファレンスマニュアルのこちらのページに掲載されています。リファレンスマニュアルは改定で頻繁に URL が変わるのでされるので、ここにも転載しておきますね。
言語コード | 対応する言語 |
---|---|
da | デンマーク語 |
de | ドイツ語 |
en | 英語 |
es | スペイン語 |
fi | フィンランド語 |
fr | フランス語 |
it | イタリア語 |
ja | 日本語 |
ko | 韓国語 |
nl | オランダ語 |
no | ノルウェー語 |
pt-BR | ポルトガル語(ブラジル) |
sv | スウェーデン語 |
ru | ロシア語 |
zh-CN | 中国語(簡体字) |
国コードは ISO 3166 とされていますが、実際には ccTLD (ドメイン名の最後の国を表す 2 文字)と考えたほうが良いようです。実際、英国は ISO 3166 では "GB" ですが、実際には "UK" を指定しなければならないようです(『Gmailの使い方』管理人さま、情報ありがとうございます)。もっとも、私がざっと調べたところ、 ISO 3166 と ccTLD で表記が違う国は英国(GB → uk)とティモール(TL → tp)だけでした。
追記: 言語・国コードの完全なリストがこちらに掲載されました。
ロケールのフォールバック
ロケールごとに message bundle ファイルを用意できるといっても、無数に存在するロケールすべてに対応するのは現実的ではありませんよね。そのため、 Google Universal ガジェットには、完全にマッチするロケールがサポートされていない場合に、他の適切なロケールで代替する機能が備わっています。これが「ロケールのフォールバック」です。具体的には、以下の順番でロケールが検索されていきます。
- 言語・国の双方が完全にマッチするロケール。
- 言語がマッチし、国が "ALL" 指定のロケール。
- 言語・国ともに "ALL" 指定のロケール。
この仕組みを有効に機能させるためには、サポートする言語ごとにひとつは "*_ALL.xml" を用意し、さらにデフォルトとして使用するロケールは "ALL_ALL.xml" にする必要があります。逆に言語・国の双方を明示したロケールを用意することはほとんどありません。まとめると、以下の指針で message bundle ファイルを用意するのが適切かと思います。
- サポートされていない言語でのアクセスに対応するため、最もデフォルトとなる message bundle を "ALL_ALL.xml" とする。
- 他の言語をサポートする場合は、基本的に "<言語コード>_ALL.xml" とする。
- さらに特定の国だけメッセージを変更したい場合のみ、 "<言語コード>_<国コード>.xml" 形式の message bundle を用意する。
また、前述の検索順序から考えて、 "ALL_<国コード>.xml" という message bundle ファイルは絶対に使われません。 "<言語コード>_ALL.xml" と混同しないように注意してください。
URL タイプガジェットでのロケールの取得
最後に、外部サイトを表示するタイプのガジェット(Content 要素の type 属性が "url" のガジェット)の国際化対応についても簡単に触れておきます。 message bundle を使った国際化の仕組みはガジェット定義ファイルの内部でのみ有効なので、 type="url" のガジェットではタイトルやユーザー設定の表示を変える以外には使えません。唯一のサポートは、ページリクエストのCGI パラメータとして以下の情報が渡されることです。
パラメータ名 | 内容 |
---|---|
lang | 言語コード |
country | 国コード |
これらの情報をもとにして、サーバーサイドでメッセージを差し替える処理を実装することになります。すべてを自前で実装しなければいけないので、ちょっと大変です。国際化のことを考えると、 type="url" はあまり使わないほうが良いのかもしれませんね。なお、上記のパラメータはガジェット定義ファイルに Locale 要素があるかどうかに関わらず、必ず付加されるようです。従って、 type="url" のガジェットでは Locale 要素を記述する必要はありません。
以上、 2 回にわたって Google Universal ガジェットの国際化についてご紹介しました。残念ながら日本語は世界から見ればマイノリティーなので、多くの人に使ってもらうためにはこの仕組みを活用する必要がありますね。日本語にしか対応しない場合でも、メッセージを message bundle に逃がしておけば、誰かが他の言語の message bundle を作ってくれるかもしれません。ガジェットを作成する際は、ぜひ最初から国際化に対応しておきましょう!
詳しくはこちらの記事をどうぞ!
この記事にコメントする