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

February 03, 2008 [長年日記]

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

えー、ご無沙汰してしまいましたが、Ruby-GetText-Packageの新版をリリースしました。

バージョンからご推察いただけるかと思いますが、このバージョンは2.0へ向けたリリースの第1弾で、過去のバージョンと一部互換性がありません。

といっても、通常、このサイトで紹介しているような使い方をしている箇所の互換性はありますのであまり気にしないでも大丈夫かと思います。

#引っかかっちゃった人はごめんなさい。アプリの方で対応してください(←乱暴ですんまそ)

というわけで(?)、今回のリリース内容について紹介します。

まず、今回の一番の目玉ですが・・・、な、なんとPure Rubyになっちゃいました!! Pure Ruby化のメリットはやはり大きいですね。

  1. gem install時の問題の解消(Cコンパイラやruby.hが無くてsoモジュールのコンパイルがうまくいかない、等)
  2. gemが一つだけになったので、Win32の場合は・・・みたいなことが不要になった(前のバージョンまではwin32とそれ以外でわかれていました)
  3. JRubyがサポートできた。JRubyはsoモジュールを読み込めないので1.10.0まではRuby-GetText-Packageを使えませんでした。まぁ、Pure Ruby化以外でも、JRubyの現時点でのバグの部分とかIconvが無かった部分に対しての補完など、多少JRuby向けに実装を追加・変更していたりもしていますが、とにもかくにもsoを読まなくなったというのが大きいです。もちろん、JRuby on Railsでも動作しますよ(まだちょっと怪しいけど(苦笑))!

次にLocale周りを書き直しました。soがなくなったのとJRuby対応を追加した点でも機能追加があるのですが、それよりもlib/gettext/配下にあったファイルをlib/locale/配下に移したという変更が(意味的に)大きいかと思います。

GetTextとLocaleというのは本来分かれているべきものなのですが、過去の経緯もあって一つになってました。本当はLocaleを独立させた1つのライブラリとしたいのですが、rubyforge.orgに同名の別ライブラリがあったので独立させるのは諦めました(所詮、そんな理由ですが(苦笑))。

Locale自体の高速化も図っていますので、全体的な処理速度が速くなりました。

そしてRuby on Rails対応です。当然のことではありますが2.0系に対応しました。Rakeファイル中で、GetText::ErbParser.init(:extnames => ['.rhtml', '.erb'])を宣言しなくても、デフォルトで.erbがERBファイルとして認識されるようになりました。

それから、GetText::Rails.available_locales, .normalized_localeというメソッドを追加しました。

available_localesは、現在、そのアプリケーションが提供しているlocale/{lang}/ディレクトリを見て、そこに存在しているディレクトリのみをavailableなlocaleとして返します。

normailized_localeは現在のロケールがavailable_localesに存在していればそのロケール文字列を、存在しなければenを返します。この機能はgettext/rails内部ではキャッシュファイルの作成に利用します。今まではサポートしていない未知な言語であっても全てが異なる言語としてキャッシュファイルを言語ごとに作っていたのですが、このバージョンからは、locale/{lang}/ディレクトリに存在するロケールのみのキャッシュファイルができるようになりました。

もう一つ、これ、結構気に入ってるんですが、error_messages_forにエラーダイアログで表示するタイトルと共通で表示されるエラーメッセージの説明部分を上書き指定できるようになりました。画面ごとに適切なメッセージを出したいときに有効だと思います。

# views/users/edit.html.erb
<%= error_messages_for 'user', {
    :message_title => Nn_("Singular Custom Error message %{record}: %{num}", "Plural Custom Error message %{record}: %{num}"),
    :message_explanation => Nn_("Singular Custom Error explanation %{num}", "Plural Custom Error explanation %{num}")
} %>

:message_titleがタイトル部分、:message_explanationが説明部分です。単数形・複数形、それぞれを指定する必要があるので、上記のようにNn_(singular_message, plural_message)を使います。

システム全体で一つ指定したい場合は、今まで同様、ActionView::Helpers::ActiveRecordHelper::L10n.set_error_message_(title|explanation)を使ってください。

あとは、ウクライナ語とハンガリア語のサポートの追加ですね。Ruby-1.9対応は今のEncoding話が一段落してから対応しようかなぁ、と思います。エンジョイ!