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

August 02, 2008 [長年日記]

[Ruby] Ruby-GetText-Package-1.92.0リリース!

1.90.0から続いていたメモリリークですがようやく一段落打てたのではないかと思います。1.91.0では使い方によってメモリリークが起きてました。今回、レポートいただいたものは全部フィックスできたと思うので、もしメモリリークに悩まされている方はぜひ1.92.0を試してみてください(もしRuby-GetTextが原因でまだ直っていないと言う場合はご一報を)。

さて、メモリリーク修正以外の今回の主な改善点ですが、機能的にはGNU gettextのmsgctxtと同等の機能を実装したことです。pgettext(msgctxt, msgstr), p_(msgctxt, msgstr)の形式で使います。詳しくはこちらを参照してください

Rails方面ですが、今回は2.1.0に対応しました。テスト自体も主に2.1.0ベースで行っています。Railsの内部実装が結構変わってたりするので、もしかしたら2.0.0系で動かなくなっているところもあるかもしれませんが、そのような場合はレポートしてください。

他にはActiveRecordで追加されたvalidates_numericality_ofの属性追加に対応してます(:greater_than, :greater_than_or_equal_to, :equal_to, :less_than, :less_than_or_equal_to,:odd, :even)。

それから、validates_(format|inclusion|exclusion)_ofで、%{val}という値を取れるようになってます。validates_length_ofでいうところの%dみたいな感じです(%dもこれに統一しようかな・・・)。

validates_inclusion_of :name, :in => %w(a, b), :message => N_("%{fn} can't be %{val}")

あ、あと、これはRuby-GetTextというよりもRails-2.1.0側の話ではあるのですが、Rails-2.1.0では、require 'gettext/rails'を直接呼び出すとエラーになる場合があります。その場合はconfig.gemを使います。

config/environment.rb:
Rails::Initializer.run do |config|
  :
  :
  config.gem "gettext", :lib => "gettext/rails" 
end

render_partialもローカライズできます(これ、前からできたっけ?(汗))。例えば、render :partial => "foo"で、_foo.html.erb, _foo_ja.html.erbとすると、日本語の場合のみ_foo_ja.html.erbが呼び出されます。

[Rails] Rails-2.2系(edge rails)への対応

さっそくレポートもらったんだけど、Rails-2.2系にはまだ対応してません。Rails-2.2系からRails i18nというプロジェクトの成果が取り込まれ始めていて内部的な後方互換性はめちゃくちゃです。ある程度はしょうがないと思いますが、Ruby-GetTextをはじめ、あらゆるローカライズプラグインが影響受けてしまうでしょう。かなり大掛かりな変更なのでRuby-GetTextで2.1/2.2の両方を同時にサポートするのきついかもしれませんね。

ちなみに、Rails i18nの人から参加してくれ、と言われたのですが、言われたときにはすでに最初のバージョン(0.1.0)がgithub上にあって、それが、自分の目指すものと違いすぎたので丁重にお断りしました。gettextよくわからないんだよね、と言っていましたが、RailsのCoreに入れるくらいなら、とりあえず一通りのプラグインの実装を研究してみるくらいの意気込みがあっても良いと思うのですが・・・。元々、Globalizeの人らしくそれと似たようなアプローチを取っている模様です。言語毎のファイルはymlベースでメンテナンス性良くないし・・・String#tって・・・(まぁ、これは好みの問題か(苦笑))。

私としては、Ruby-GetTextの本分であるメッセージカタログ以外のところはうまいことRails i18nで実装されるとうれしいのですが、しばらくは茨の道が続きそうですね。誰か、今のRails i18nに殴りこんで全部GetTextベースで置き換えていただけませんか?(冗談です)


August 09, 2008 [長年日記]

[Rails] Ruby-GetText-1.92.0を使ってもまだfile_exists?のエラーが出る

というレポートがあった。レポートではCellというプラグインと一緒に使うと出るというのでそれを調べてみた。

まず、file_exists?問題の整理をすると、Rails-2.0.xからRails-2.1.0でActionView::Base#file_exists? メソッドが ActionView::TemplateFinder#file_exists?に移ったことが原因で、ActionView::Base#file_exists? メソッドを呼び出そうとしているコードはコケるようになってしまう、というもの。

Ruby-GetText-Package-1.92.0以前ではワークアラウンドとしてこちらのサイトの情報を使っている人が多かったみたいだけど、この回避策は、平たく言えばRails-2.0.0と同じActionView::Base#file_exists?をRails-2.1.0で使えるように復活させるものであって、Railsとして、file_exists?はTemplateFinderが持つべき、というポリシーの変更には適さない(もちろん有効な手段であることは間違いなかったけど)。

そこで、Ruby-GetText-Package-1.92.0では、正しい解決策として(だと思って)、TemplateFinder#file_exists?を使うように修正した。

一方、Cellは自前のCell::TemplateFinderというものを持っていて、これをRailsのActionView::TemplateFinderと置き換えている模様。置き換えるのは良いんだけど、Cell::TemplateFinderは何も継承しない独自のクラスで、file_exists?というメソッドを持ってない。結果、Ruby-GetText-Package-1.92.0がTemplateFinder#file_exists?を呼び出そうとしてコケてしまう。

ダックタイピングも良いけど、TemplaeFinderを置き換えるのに、オリジナルのクラスの公開メソッドと非互換性があるってのはいかがなものか・・・。というわけで、もっとも単純な解決策はCell::TemplateFinderがActionView::TemplateFinderを継承することで、次に単純なのはfile_exists?をCell::TemplateFinderが実装すること。

それにしても、このfile_exists? を移したという修正は結構いろいろなところで影響が出ているんじゃないかなぁ。i18n化の件といい、混乱は続くよどこまでも。