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

March 21, 2006 [おもひで]

[Ruby] Ruby/CLDR-0.1.0

最近、Ruby-GetText-Packageを開発するにあたっていろいろと「国際化」というものについて考えさせられることが多くなってきました。

以前はこんなことを言っていたけど、これは避けて通れないような気がしてきたのでもう一歩先に踏み出すことに...。

というわけで、すごく悩んでいたのですが、密かに新たなプロジェクトを始めることにしました。それが、このRuby/CLDRです。これがきっと人生最後のライブラリ開発になると思います(って宮崎駿みたいなこと言ってるな(苦笑))。

で、Ruby/CLDRですがローカライゼーションのためのライブラリで、最終的には日付、通貨に代表される地域ごとの情報を適切に取得したり書式指定して表示したりするAPIを提供するライブラリを目指します。

といっても、0.1.0では、単にCommon Locale Data Repository (CLDR) Projectが提供しているXMLロケールデータをRubyから簡単にアクセスできるようにしただけです。そこで力尽きました(苦笑)。

以下のように使います。

 $ cat test.rb
 require 'rubygems'
 require_gem 'cldr', '= 0.1.0'
 require 'cldr'
 
 obj = CLDR::Object.new
 puts obj.core.languages["ja"]
 puts obj.calendar.dateformats[:gregorian]["full"]
 obj = CLDR::Object.new(:locale => Locale::Object.new("fr_FR"))
 puts obj.core.languages["ja"]
 puts obj.calendar.dateformats[:gregorian]["full"]
 $ ruby test.rb
 日本語
 yyyy'年'M'月'd'日'EEEE
 japonais
 EEEE d MMMM yyyy

XMLデータにアクセス、と書きましたが、XMLデータに直でアクセスするような実装だとXMLのparseにも時間がかかりますし、さらに、CDLR(LDML)の複雑なルールを正しく動作させるのはとても大変なので、性能的に問題が出ます。そこでまずはXMLファイルから各言語別のリソースファイル(rubyスクリプトファイル)化するジェネレータを作って、ランタイムではそのロケールファイルを呼び出すだけにして性能を確保しています。

ちなみに私の非力なマシン(Athlon 1.3GHz)だと、全ロケール分のリソースファイルを生成するのに38分ほどかかります。ホント大変です(苦笑)。

#リリース時は生成済みの状態で配布されますのでご心配なく。

APIドキュメントもありませんが、ソースを見て頂くとやっていることは今のところ極めて単純なので、まぁ、いろいろと試してみてください。

次のフェーズとしてはFormat関連のAPIを提供しようかなと思っています。

そのためには、CLDRが提供する各種フォーマットを適切に扱う関数群が必要になります。例えば上の例の"yyyy'年'M'月'd'日'EEEE"とか。

結構、量があるので、どなたかご協力頂けないでしょうか。興味のある方は私までメールくださいませ。

あ、そうそう、Ruby/CLDRはRuby-GetText-Packageに依存しています。最終的には、この2つの組み合わせで表示周りのローカライズの大部分をカバーできればいいなと考えています。

それから、APIはしばらくunstableです。もし、今すぐ使ってみようという方がいらっしゃいましたら、gem+バージョン指定でお使いください。こういうときにはrubygemsは便利ですねぇ。

ちょっと後先が逆になりましたが、同様のライブラリとしてICUというIBMが提供しているライブラリがあり、それのRubyバインディングICU4Rも存在します。

実は、車輪の再発明のことを考えるとこれをそのまま使うのがホントは一番良いような気がしたのですが、ICU自体がかなり大きなライブラリだし、ICU4Rは今のところUnicodeサポートをメインに考えているようでフォーマット関連をまだサポートしていません。私的にはUnicodeサポートはRuby-2.0で解決されると思ってますし、ResourceBundleを使うんだったらRuby-GetText-Packageを使って欲しいので、ICU4R自体に私がお手伝いするのはちょっとなぁ、というわけで自分で始めることにしました。

#将来的にICU4Rが充実してきたらこちらを辞めるかもしれません。

あと、何かとRuby-GetText-Packageと比較されるGlobalizeですね。これも、かなり限定された範囲内で機能が重複しますが、まぁ、あれはRailsの中で使うライブラリですから今回は対象外ですね。

っと、それ以外に、すでに同様のプロジェクトを始めている方(ICU4R以外で)がいらっしゃいましたらご連絡を。今ならまだやめれます(苦笑)。

あ、そうそう、ファイルでかいです。3MBちょいあります(汗)。元のCLDRファイル(core.zip)の3倍ありますが、これは、元のXMLファイルが、「この部分は〜を参照」みたいな感じになっているのを、高速化のために全部展開しているためです。この辺は見直した方が良いかもしれませんね。

最後に。ちょっと名前がなー。Ruby/Localeにしようかと思ったんだけどそういうプロジェクトもうあるしね。CLDRだといまいちピンとこないんだよなぁ。

追記:setup.rb付け忘れました。gemじゃない人は自分でlib配下をコピーしてください。すんません。


編集