よたらぼ
自分の興味の赴くままにIT技術系のネタを取りとめもなくメモっています。
Ruby言語やLinuxのネタが多いです。

August 26, 2005 [おもひで]

[Ruby] Ruby-GetText-Package

これまでにやった変更点について書いておく。

今まで、rgettext/rmsgfmtはコマンドとして呼び出す必要があった。

これだとWin32な環境なんかでは扱うのがとっても面倒(c:\ruby\bin\ruby c:\ruby\bin\rubyrgettext *.rb -o foo.potってするか、rgettext.bat *.rb -o foo.potみたいなバッチを作ってた)だったんだけど、setup.rbやRakefile中ではあえてコマンドである必要はないので、同等の機能のGetText.rgettext, GetText.rmsgfmtというモジュール関数にした。これ使えば実質rgettext/rmsgfmtコマンドはいらなくなるので便利。

#require 'gettext/rgettext", require 'gettext/rmsgfmt'をする必要あり。

Ruby-GetText-Packageに付属されていて、他のプロジェクトでもよく使い回されているmakemo.rb(複数の.poファイルからrmsgfmtを使って.moファイルを適切なディレクトリに生成してくれる)と同等の機能もGetText.create_mofilesという風に実装してしまった。そのアプリのトップディレクトリ(setup.rbやらREADMEやらが置いてあるのと同じ階層)のRakefileからこの関数を呼び出せば簡単にmoファイルを作ってくれる。

デフォルトではpo/#{lang}/*.poをdata/#{lang}/LC_MESSAGES/*.mo 配下にコピーされるのだけどもちろん引数を渡せばpoファイル、moファイルの配置先を変更できる。

#こちらもrequire 'gettext/rmsgfmt'が必要。

moファイルの標準検索パスは今まで、

/usr/share/locale/#{lang}/LC_MESSAGES/*.mo

/usr/local/share/locale/#{lang}/LC_MESSAGES/*.mo

だった(厳密には/usr/shareの部分はConfig::CONFIG['datadir']の値)が、

さらに、

/usr/share/locale/#{lang}/*.mo

/usr/local/share/locale/#{lang}/*.mo

も対象として呼ぶようにした。GetText.bindtextdomainでのユーザ指定時も、LC_MESSAGES配下とその一つ上のディレクトリも読み込むようにした。

これは、LC_MESSAGESというのに馴染めない人向け。

さらにさらに、rubygemsがインストールされている場合、 /usr/lib/ruby/gems/1.8/gems/#{libname}/data/locale/LC_MESSAGES(ともちろんLC_MESSAGESなしも)も検索することにした。これはgemsがdata/配下を適切にインストールしてくれないから....というのがあるんだけど、実装した今はむしろ、rubygemsの作法の方が良いような気がしてきた(/usr/share/localeとかにmoファイルをインストールする際に、変に他のアプリとファイル名がぶつかることを気にしないで済む)。

そんな感じ。あとは今、Rails向けサンプル作成中。gettext/railsというRails向けのライブラリを用意する予定。といっても、実は現在リリースされている0.9.0の機能であるGetText::Containerを使えばRailsでもマルチテキストドメイン(カタログファイルの別ファイル化)をサポートできることがわかった。ヘルパーや外部ライブラリを作成する人は、それ専用のテキストドメインを使いたいはずなので是非とも使いやすい形でリリースしたいところだ。

[Rails] Railsというフレームワーク

CGIという点から見ると、やってることはtDiaryやHikiとそんなに変わらないと思う。汎用的だけどね。おかげで何をやっているのかすぐに理解できた。

ちょっと富豪的なアプローチの実装なのでオレだったら性能面を心配して(実装もせずに)あきらめちゃうようなところだけど(苦笑)。おかげでRuby-GetText-Packageが起動時にmoファイルをパースするコストがバカにならない、なんて思ってたオレが小さく見えたよ。そんなコストは、あの実装に比べればゴミだゴミっ!

にしてもActiveRecordのORMはすごい便利だね。これ、Ruby-GNOME2なんかと組み合わせて使うとおもしろそう。Ruby-GNOME2 on Ruby on Rails...なんちて。

ちなみに、RoRのヘルパー機能は簡単に言うとtDiaryやHikiのプラグインみたいなものだ(自動的に読み込むとかは無いんだけど)。なので、そっち系のプラグインたちは簡単にRoRに移植できるんじゃないかと思う(もしかしたら移植せずに動くのもありそう)。暇になったらアクセスカウンタあたりを移植してみようかな。

[Rails] ヘルパー

ヘルパーの各ファイルはActionView::Baseのインスタンス(クラス?)内でevalされるのか...。これはつまり、tDiaryやHiki同様、メソッド名には他のヘルパーに対してユニークな名前を付けなきゃいけない、という制限があるということなのね...。


編集