JavaScriptの国際化

JavaScriptにはGetTextのような国際化を支援するような仕組みがありません。

では、いかに国際化していけばよいでしょうか?少し考えてみました。

メッセージは、大きくわけて二つに分類されます。

静的に決定されるメッセージと、動的に決定されるメッセージです。

これらの国際化方法はそれぞれ異なってきます。

では、実際にそれぞれのメッセージの国際化方法について説明していきます。

静的なメッセージの国際化方法(テンプレートの国際化)

静的なメッセージについては、ビルドタイムにコンパイルし、ローカライズした

テンプレートを生成するのがよいでしょう。

理由は二つあります。

1) メッセージ数が多いので、静的に決定されるメッセージを全てサーバーサイ

ドから取得するのは、パフォーマンス上、問題があると考えられるからです。

2) XMLHttpRequestでリクエストを送信すると、リクエストに対して必ずレスポ

ンスが戻ってくる保証がなく、ビューがローカライズされないケースが発生する

可能性があるということです。

1は微々たるパフォーマンス上の問題かもしれませんが、2のほうは結構致命的問

題かなと思い、ビルドタイムのコンパイルするのがベストであろうという結論に

いたりました。

VoxがJavaScript全体を置き換える手法を使っているようだと、前回話しました

が、おそらく、この手法を使っているのではないかと思います。

静的に決定されるが実行時にローカライズすればよいメッセージ(エラーメッセージなどの国際化)

 GetText形式でメッセージを取得する関数を定義しておくことで、JavaScript

からのメッセージをツールで簡単に抽出し、POファイルを生成します。ビルドタ

イムに、POファイルからエラーメッセージのJSONファイルを生成します。

テンプレートでは、ロケールに応じて、このエラーメッセージをIncludeしま

す。という方式です。

この方式を採用する理由は、以下の理由からです。

1) エラーメッセージが埋め込まれている箇所も多く、ビルドプロセスが複雑に

なるので、エラーメッセージをビルドタイムに国際化するのはあまり得策ではあ

りません。

2) エラーメッセージは実行時にどれかのエラーが表示されるというもので、実

行時にローカライズしてもパフォーマンス上の問題はありません。従って、エ

ラーメッセージは、静的にコンパイルしておく必要はなく、実行時に国際化すれ

ば十分です。

動的なメッセージの国際化方法

パラメータを含むメッセージについては、静的にパラメータの値が決まらないの

で、ビルドタイムにローカライズすることができません。したがって、これにつ

いてはサーバーサイドからデータを取得し、実行時にローカライズする他ありま

せん。

従って、サーバーサイドで取得したデータをJSON化して返し、クライアントサイ

ドでGetTextのラッパを介して、国際化するという手法を使う必要があります。

JavaScriptの国際化といっても、方法は様々な方法があるかと思います。

何か他にも良い案があるよ!という方は是非教えてください。

では。