2007-06-22
■ [ruby] WindowsでRuby-GetText-Packageを使ってみる
Ruby-GetText-Package って?
プログラムの国際化に役立つライブラリgettextのRubyバインディング。「英語の環境では英語で、日本語の環境では日本語でメッセージを表示したい」 みたいな時に役に立つよ。
例えばプログラム中で
print _("Hello World\n") print _("%{filename} is %{filesize} byte") % {:filename => "foo.rb", :filesize => 100}
みたいに書いておくと、実行時に翻訳ファイルと照らし合わせて適切なメッセージに変換してくれる。
他にも単数形と複数形でメッセージを変えたり、いろいろ複雑なことができるみたいだよ。
インストールしてみよう
gem install gettext
で、mswin32 の一番新しい(バージョン番号の大きい)やつを選べばOK。
翻訳ファイルを作ってみよう
基本的に、公式サイトのチュートリアルに従えばOK。
- プログラムを書く(例:hello.rb)。
- 翻訳ファイルのテンプレート(*.pot)を生成する。(rgettext hello.rb -o po/hello.pot)
- 言語ごとの翻訳ファイル(*.po)を作る。(hello.pot を po/ja/hello.po 等にコピー)
- 翻訳する。
- 翻訳ファイルを実際に使うための形式(*.mo)に変換する。(rmsgfmt po/ja/hello.po -o /usr/local/share/locale/ja/LC_MESSAGES/)
非常に簡単です。
翻訳ファイルを使ってみよう
Linuxでは /usr/local/share/locale/ 以下に mo を置くみたいだけど、Windowsではどこに置けばいいのかな。 -d オプション付きでhello.rbを実行してみるよ。
[D:\research\Ruby\gettext]ruby -d hello.rb MO file is not found in d:/prog/ruby/share/locale/ja/LC_MESSAGES/hello.mo d:/prog/ruby/local/share/locale/ja/LC_MESSAGES/hello.mo d:/prog/ruby/lib/ruby/gems/1.8/gems/gettext-1.9.0-mswin32/data/locale/ja/LC_ME SSAGES/hello.mo d:/prog/ruby/lib/ruby/gems/1.8/gems/gettext-1.9.0-mswin32/data/locale/ja/hello .mo d:/prog/ruby/lib/ruby/gems/1.8/gems/gettext-1.9.0-mswin32/locale/ja/hello.mo Hello World
この辺のどこかに ja/hello.mo を置けばいいらしい。 (注:開発中は環境変数GETTEXT_PATHを指定しておくと置き場所を変えられます)
あとは hello.rb を実行すれば日本語でメッセージが表示されるはず…!
[D:\research\Ruby\gettext]ruby -d hello.rb Exception `LoadError' at d:/prog/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_req uire.rb:21 - no such file to load -- gettext Bind the domain 'hello' to 'Object'. Current locale is #<Locale::Object:0x2c8b77 8 @script=nil, @charset="CP1252", @country=nil, @modifier=nil, @language="ja", @ variant=nil, @orig_str="ja"> GetText::TextDomain#load_mo: mo file is d:/prog/ruby/share/locale/ja/LC_MESSAGES /hello.mo Exception `Iconv::IllegalSequence' at d:/prog/ruby/lib/ruby/gems/1.8/gems/gettex t-1.9.0-mswin32/lib/gettext/mo.rb:127 - "\343\201\223\343\202\223\343\201\253\34 3\201\241\343\201\257\344"... @charset = UTF-8 @output_charset = CP1252 msgid = Hello World msgstr = 縺薙s縺ォ縺。縺ッ荳也阜 縺薙s縺ォ縺。縺ッ荳也阜
思いっきり文字化けしとるがな(´・ω・`)
[D:\research\Ruby\gettext]set OUTPUT_CHARSET=Shift_JIS [D:\research\Ruby\gettext]ruby hello.rb こんにちは世界
環境変数を指定しておけばいいらしい。
うーん、「ほとんど全ての環境で設定不要なはずです。」 と書かれてるんだけど、うちのWindows XPは「ほとんど全て」に入らないのかな。
(7/4 追記:コメント欄で環境変数LANGに"ja"等を指定していると文字化けするかも、というコメントを頂きました。LANGを定義しないか、"ja_JP", "ja_JP.SJIS"など正確に指定すれば大丈夫のようです。)
私の環境ではWindows2000, XP, Vistaで日本語が表示されます(OUTPUT_CHARSETの設定なしです)。<br><br>おそらくは環境まわりの問題ではないかと思われます。<br><br>例えば、環境変数にLANGが設定されていたりするかもしれません。LANGを設定するのでしたら、ja_JP.SJISと文字コードも含めて正確に記述し直せば表示されるんじゃないかと思われます。<br>LANGが設定されていないとすれば何か他の条件(システム上でのロケール設定がおかしい?)があるかもしれません。<br><br>いずれにせよ、こういった状況は(Ruby-GetTextのバグの可能性も含めて)レポートいただけると助かります。
蛇足ですが、環境変数のLC_ALL, LC_CTYPEなど、LC_*系が設定されていても同様の事象が起こり得ます。<br>上ではja_JP.SJISと書きましたが、もしかしたら、ja_JPでもうまく動作するかもしれません。
お察しの通り、LANGに"ja"が指定されていました。<br>LANGを空にするか、"ja_JP"や"ja_JP.SJIS"を指定した場合は文字化けしませんでした。<br><br>次に何かあったときは報告させていただきます。どうもありがとうございます。
LANG=jaとしても動作するように修正しました(_JPがなくても大丈夫)。<br>この変更は次のリリースに含まれます。乞うご期待 ;)
おお、ありがとうございます。<br>楽しみにしています。