Ruby言語やLinuxのネタが多いです。
February 24, 2006 [おもひで]
■ [Rails] ロケールによるテンプレート切り替え
航海日誌さん経由で知ったのですが、「Rails勉強会@東京 第3回」でRailsの国際化について話があって、Ruby-GetText-Packageも議題に上げて頂いたようですね。ありがとうございました。ってか、国際化ってそんなにホットな話題になってるんでしょうか。なんかそれ自体がちょっと意外だったりしますが。
■ さて、いろいろとリンクを辿ってYuguiさんの議事録を読まさせていただいた(議事録を残して頂きありがとうございました)のですが、「ロケールによるテンプレート切り替え」「文言単位での対照訳」のどちらを使うのか悩まれている方がいらっしゃるようですね。
なので、それについて私の意見をちょっと書いてみようと思います。まぁ、Ruby-GetText-Packageの開発者なので若干偏っているとは思いますが(結論は見えてますしね(苦笑))。
■ まず、「ロケールによるテンプレート切り替え」ですが、私はこれには否定的な考えです。議事録では利点として
「国際化対応というのは異なる文化慣習への対応でもあるから、単なる文言の修正では済まないこともある。テンプレートごと差し替えてしまえばそういうケースでも対応が楽。」
とあります。これは、真かもしれません。しかし、実際のアプリ開発を考えると
「翻訳者が開発者も兼ねておりしかもずっと開発体制を維持できる」
か、あるいは、
「テンプレートはもう仕様変更無し」
の2つの場合でしか成功しないと思います。特にモリモリ開発中のアプリでは大変です。
■ 例えば、あなたがアプリの開発者だとしましょう。ある画面(テンプレート)にボタンとメッセージを追加したとします。あなたは日本語のテンプレートと、英語のテンプレート(あと、英語っぽいテンプレート)には手を入れることができるでしょう。でも、divタグやらなにやらが変更されているテンプレートについてはあなたが手を入れることはできないでしょう。なので翻訳者に「これこれこういう機能を実装したから、それをテンプレートに反映してね」とお願いしなければなりません。そして、その翻訳者(兼開発者)はその機能を十分に把握した上で適切にテンプレートに反映させる必要があります。
これは本当に骨の折れる作業です。しかも、修正されたテンプレートが正しく修正されたのか、開発者自身が判断つかないという事態になりかねません。「テンプレートごと差し替えてしまえばそういうケースでも対応が楽。」と言う見解にはやはりNOと言わざるを得ません。
さて、開発が進んだところで、翻訳者が開発を続けられなくなった場合どうでしょうか。きっと(古くなってしまった)言語テンプレートは削除せざるを得ないでしょう。
■ これに対し「文言単位での対照訳」にしておけばどうでしょうか。翻訳者はテンプレート書き換えに比べて(自由度が減るため)負荷が減ります。さらにRuby-GetText-Packageを使っていれば、未翻訳であってもその部分が英語で表示されるだけで済むため、多少無理はあってもその言語を残せる可能性が高まります。その言語で使いたいユーザにとっては少しでも自分の読める言語になっている方が良いと思う人が多いのではないでしょうか。
■ したがって、私としては、なるべく開発者自身が把握できる範囲でViewの実装までして、文言だけ翻訳してもらう、というスタイル、(まぁ、つまりGetTextのアプローチなわけですが)を強くオススメします。
GetTextの歴史を考えても、多くのGUIアプリはこれで十分なはずです。
■ とはいえ。どーしてもテンプレート切り換えをしたい場合もあるでしょう。ターゲットが「英語と日本語だけ。自分が全部やるから問題ない!」という場合などはその方が効率的かもしれません。
Rails MLでは同じくYuguiさんがプラグインで実装されていらっしゃいますが、これにさらにRuby-GetText-Packageを組み合わせるとロケールの選択がRuby-GetText-Packageと同等になるため、便利だと思います&ちょっとだけ実装が簡単になると思います。
#次のRuby-GetText-Packageではこの機能を導入しちゃおうかしら。ライブラリとしてはどちらの機能も提供する、というのはアリだよね。
--vendor/localize_templates/init.rb:
ActionController::Base.class_eval do
alias render_file_without_locale render_file
private :render_file_without_locale
def render_file_with_locale(template_path, status = nil, use_full_path = false, locals = {})
locale = GetText.locale
[locale.to_s, locale.language].each do |v|
localized_path = template_path + "_" + v
return render_file_without_locale(localized_path, status, use_full_path, locals) if template_exists? localized_path
end
render_file_without_locale(template_path, status, use_full_path, locals)
end
alias render_file render_file_with_locale
end
こんな感じ。require 'gettext/rails'とinit_gettextは別途必要です。って、試してませんので動かなかったらごめんなさい(苦笑)
■ 話はちょっとズレますが、Rails MLってローカライズ周りのネタって結構話出てるんですかね。Rails ML入った方が良いのかなぁ。ってこれ以上ML入るとメールがパンクしそうでなかなか踏み入れられないものがあるのですが(苦笑)。
■ おっと、忘れてた。(ローカライズとは別に)User-Agent毎にテンプレートファイルを切り替える目的でrender_fileの挿げ替えというのは良いアイデアだと思います。
