Ruby言語やLinuxのネタが多いです。
May 03, 2005 [おもひで]
■ [Ruby] Ri18n: Make your Ruby application international.
Ruby-GetText-Package-0.9.0リリース直後にリリースされたPure RubyなL10n化ライブラリ。GetTextをベースとしているようだが、moファイルを使わずにpoファイルを直接パースするなどある意味ロックだ。
ちと参考までにソースを読んでみたが...。うーん。まぁ、Ruby-GetText-Packageのメンテナをやってる段階ですでに公正な判断はできないとは思うんだけど...。
サンプルがなぜか動作しなかったので純粋にソースを見て気になった点をあげてみる。
- poファイルを直接使うのでRuby/Libglade2なんかとは相性悪い(ってか使えない)
- I18nServiceのシングルトンを生成する(それならmoduleでも良いと思うんだけど...)。そしてアプリごとにi18nconfig.rbというファイルを作っておいて、それを元にpoファイルを解析させる。したがってbindtextdomainみたいなものは不要...なようなんだけど、逆に言えば複数のTextDomainは扱えないんじゃないかな...(深く追ってないのでもしかしたらオレの誤解かも)。アプリやライブラリごとにi18nconfigを上手に使い分けれるようになっているのだろうか。
- rgettextは使わずにrake gettextとするらしい。確かにrgettextというツールを使う必要がないのは便利かもしれない。msgmerge的な機能も提供してるっぽい...試せてないけど。
- ユーザの利用するロケールを自動判別するような仕掛けが見つからない。例えば、ENVでLANG周りを利用するとかいうコードが見あたらない。起動時に-lオプションで設定する例があったりするけど、ユーザが能動的に設定するのだろうか....。まぁ、直接設定する方法もあるので、アプリ側のコンフィグで設定するとか、GUIで設定機能を作り込めば良いっちゃ良いのか...。
- ライブラリ名がrequire 'gettext'。思いっきりRuby-GetText-Packageと重複している。これを試した人は、Ruby-GetText-Packageを再インストールしないとRuby-GetTextなアプリは動作しなくなると思う。うーん、これはやめて欲しかった。
■ [Ruby] Ruby-GetText-PackageとERB(等のテンプレートエンジン)
今回、Ruby-GetText-PackageをERB対応させてみて気づいたんだけど、正直あまり上手なやり方ではないと思う。なぜなら...とつなげる前にERB+Ruby-GetTextのrhtmlファイルの一例を以下にあげる。
オリジナルrhtmlファイル(単なるHTMLに見えるのは単純化のため):
<html>
<head>Sample page</head>
<body>
<h1>Sample Header</h1>
<p>Hello world</p>
</body>
</html>
GetText化したrhtmlファイル:
<html>
<head><%= _("Sample page") %></head>
<body>
<h1><%= _("Sample Header") %></h1>
<p><%= _("Hello world") %></p>
</body>
</html>
ロジックを記述するべき<% ... %>の部分で「異なる言語を想定する箇所を特定するだけのためにRubyのコードを挿入する」ことをしている。これはまぁ、<%=_(" ... ")%>という複雑なマークアップが「異なる言語を指定している」って割り切っちゃってるわけなんだけど、やっぱり見づらいしなんかちょっと違う気がする。
■ そこでいろいろ考えたんだけど、rhtmlの<% ... %>以外の部分で何らかのHTMLタグで囲まれる部分をそれぞれ部分文字列としてmsgid化できるようなパーサを作ってそこを全て翻訳対象にする、というようなことが必要な気がしてきた。
上の例で言えば、rhtmlはやはりオリジナルrhtmlファイルのままで、"Sample page", "Sample Header", "Hello world"の部分は勝手に抜き出して、msgidとしてくれる、という感じだ。
■ 純粋なHTMLの中から上記のような文字列をロケール化するような機能をつければ、元がERBだろうと他のテンプレートエンジンだろうと関係なく使えるな、遅そうだけど。あ、でもERBとかが設定したDBの値がたまたまmsgidと重複したときとか考えるとERBはERBのレベルのままHTMLのタグの部分をロケール化できないとダメかもしれない。となるとエンジン側で対応してもらった方が良さそうな気もする。
■ なんか抜けがあるような気はするんだけど、なんとなくそう思ったことをここにつらつらとメモできた、ということで今日は寝るとしよう。明日早いんだよなー(苦笑)。
