Ruby言語やLinuxのネタが多いです。
March 31, 2005 [おもひで]
■ [Ruby] Using Gettext To Translate Your Rails Application
著者のSascha Ebachさんから、こんなん作ったよ、どう?というメールが来たので読んでみた。Ruby on RailsでRuby-GetText-Packageを使おうてな話。
■ よくできてるとは思うけど、このまま一般的なフレームワークとして推奨するとしたら、相当制限がきついと思う。というのも、gettext本体に手を入れて「全てのスクリプトが扱うメッセージカタログ(moファイル)は一つしかない(以降案1)」という前提にしているから。
Ruby-GetText-Packageでは、1つのスクリプトごとに1つのメッセージカタログ(moファイル)をバインド(bindtextdomain)するようにしている(以降案2)。
最初は、1クラス単位、モジュール単位、といったことも考えたのだが、Rubyのように既存クラス・モジュールに、後から別の機能を追加できるようなものを前提とすると、ファイル単位にメッセージカタログを持たせるのが一番現実的だと判断したからだ。なので、1つのスクリプトファイル中で1回は「bindtextdomain」を呼ばないといけない。もちろん、実装上は、同じメッセージカタログ名であれば使い回すという風にしているため、通常のアプリケーションであればせいぜい1、2個のメッセージカタログを複数のスクリプトから参照するということなので、ファイルを読み込む処理とかメッセージカタログが占めるメモリ使用量といったところで激しく性能劣化が出ないようにしている(つもり)。
■ で、案1にしてしまうと、すぐに問題として思いつくのが、BBSとBLOGの2つの機能を持ったアプリを作る場合でもメッセージカタログを1つにしないといけない、ということだ。プラグインのような機能もメッセージカタログはパッチで提供する形になってしまう。これはイケテナイ。
もう一つ、Ruby-GetText-Packageを使った他のライブラリ等が使えなくなってしまう(厳密にはローカライズされずに英語で表示されてしまう可能性が高い)。現状、そのようなライブラリは存在しないと思うのでちょっと杞憂すぎるかもしれないけど。
■ 案2の問題点として、Saschaさんが指摘してるのは、毎ファイルごとに宣言するやり方はDRY(Don't Repeat Yourself)の法則に反する、このようなものは1カ所で宣言したいというものだ。
気持ちは分からないでもないが、案1の問題がクリアできない以上、共通的なフレームワークとして採用するのは厳しいと思う。
もちろん、Saschaさんの指摘をクリアできるような何か良いアイデアがあるといいのだけど...。
■ RoR界隈では、他にもYAML/XMLを使った独自実装のアイデアも出てるらしいけど、言語リソースは(特に頻繁に変更があるようなアプリケーションでは)、GetTextが提供している各種ツールのようなメンテナンス用のツールが充実していないとメンテが大変になるので、そういったものが用意できない場合はGetTextを使った方が良いような気もする。
対象となる文字列が少ない場合は、もっとライトウェイトにHikiやtDiaryが使っているメソッドや変数に言語リソースを設定するやり方も良いと思うけど、RoR界隈でその辺の実装をチェックしてる人はいないのかなぁ。
■ ちなみに、彼が改造したRuby-GetText-Pacakgeのいくつかは今回の指摘箇所以外ということでも有用だったのでその部分はいただくこととしよう。
