Ruby言語やLinuxのネタが多いです。
May 01, 2003 [おもひで]
■ [Hiki][tDiary]プラグインに埋め込まれた表示文字列の言語を選択可能に
昨日の話をちょっと考えてみたのだが、以下のような案はどうだろう。
実は、この考え方自体はtDiary本体が採用しているので新しくはないのだが、プラグインには使われていないので、これを機会にtDiaryプラグインでもこのルールが適用されれば良いなとはちょっと思う...が自分で作ったプラグインを適用させるのはちょっとめんどくさいか(^^;)。
#すでに切り出されているプラグインがあるとのこと。知らんかった<アホ
■ 試しに、Hiki-0.5系添付のreferer.rbのshow_refererというメソッドを例に考えてみる。
def show_referer(db)
s = '<div class="referer">このページへのリンク元<ul>'
referers(db).each do |ref|
disp = replace_url(ref[0].unescape).escapeHTML
s << %!<li>#{ref[1]} <a href="#{ref[0]}">#{disp}</a>!
end
s << '</ul></div>'
end
■ で、これだと思いっきり日本語が埋め込まれてしまっているので英語サイトでは使えない。
■ そこで、表示文字列のみを別メソッドに括りだすというプラグインコーディング上のルールを作る。
def show_referer_label
'このページへのリンク元'
end
def show_referer(db)
s = '<div class="referer">#{show_referer_label}<ul>'
referers(db).each do |ref|
disp = replace_url(ref[0].unescape).escapeHTML
s << %!<li>#{ref[1]} <a href="#{ref[0]}">#{disp}</a>!
end
s << '</ul></div>'
end
■ 英語で使いたい人は、以下のようなプラグインを別途用意する。例えば、referer_en.rbとでもしてpluginディレクトリに置けば、表示時にはこちらが使われることになる。
def show_referer_label 'Referrer' end
■ このreferer_en.rbをプラグイン提供者が用意するのがベストだが、少なくともこの仕組みに準じるように作っておけば、ユーザ自身が作ることもできなくはない。 きたさんの指摘のような場合は仕掛けだけ仕込んで、あとはユーザに任せてしまえば良い...とすればプラグイン作者も少しは気が楽になる...かな。
幸い、このような文字列は1つのプラグインにそれほど数があるモノでもないので対応するのはそれほど大変ではないだろう。
それに、バージョンアップの度にプラグイン自体を書き換えたりする必要がないのは非常に助かる。もちろん、バージョンアップの際に元になる文字列の意味が変更されたり、表示項目が増えたりしたら対応しないといけないけど、それはまぁしょうがないと。
■ ただ、この案で難しいのがRuby-GNOME2のように、1つのHikiで英語・日本語のサイトを運用している場合だ。
そのような場合、上記の仕組みだけだと全部英語(あるいは日本語)になってしまう。
そこで、Hikiを拡張して、plugin/*.rbを読み込む直後に、plugin/#{$lang}/*.rbも一緒に読み込むようにする。$langのディレクトリが存在しない場合は読み込まない。
■ こうしておけば、上記例のreferer_en.rbは、plugin/en/referer.rbとでもしておけば良い。
■ まとめると、
- Hiki本体としては、plugin/*.rbを読み込んだ直後にplugin/#{$lang}/*.rbを読み込むような仕掛けを用意する。
- 各プラグインは、日本語文字列を別メソッド化しておく
- 標準添付のモノに関しては、misc/plugin/en/ディレクトリを作ってそこに上記に対応した英語のリソースを追加してもらえるとよりベター
■ #きたさんのツッコミの後にこの文章自体を見直して一部書き直してます。

tDiaryだと,一部のpluginは文字列部分が切り出されていますね.
英語のリソースを用意するのは結構キビシイなぁ.
適切な英語を思いつかないのです…
え、そうだったんですか。それは知りませんでした。
#ちなみにまだ文章書き換え中だったりします(^^;)。
show_referer_labelの定義内で$langを見て変えるのはダメでしょうか?
まだ手元にしかありませんが、試しにむとぽん案を実装してみました。本体側の言語選択方法と同じだし、いいかもしれません。もう少し試してみます。
yoshimiさんの案はプラグイン単体で解決するところが良いですね。ただ、日本語しか考慮していないプラグインを作者以外が英語化しようとした場合、プラグイン本体を直接修正する必要があるところが少し気になりました。
ふと思ったのですが、plugin/#{$lang}/referer.rbはplugin/#{$lang}/referer_resource.rbとか言う具合に、名前を明示的に分けた方が混乱しなくて良いかもしれませんね。
WiLiKi本体ではGNUのgettextに似たしくみを使っています.
万能ではないですが、基本となるメッセージ文字列とその使う場所が離れないで済む事や、翻訳すべき箇所を自動抽出することが可能なこと、本体に変更があった時に翻訳を変えるべき場所が自動抽出できること、等は大きなメリットだと感じています。