よたらぼ
自分の興味の赴くままに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ベースで置き換えていただけませんか?(冗談です)


編集