Ruby-GetText の導入
趣旨
私の心はいまだに ActiveHeart にはあるものの、世の中の趨勢はどうやら Ruby-GetText に傾きつつある模様。一念発起して Ruby-GetText を使ってみた。
とりあえずやりたいことは、
- フォームの Vaildation 時のエラーメッセージの日本語化 (カラム名の日本語化を含む)
である。この目標達成に絞って考える。
Thanks to these websites
ネタ元のサイトに感謝の意を表しつつ。
Rails のためのものぐさな Web アプリケーションの国際化手法
私のような怠け者にはぴったり。
Ruby-GetText ご本家
包括的である分、初心者にはいささかとっつきにくいかも。
Ruby-GetText の導入
% sudo gem install gettext
これで OK。他にパッケージは特に必要ないようだ。Ruby-GetText はバイナリコードにコンパイルされる部分を含んでいるが、Windows の場合は mswin 版を選んでおけば大丈夫らしい。(私は Linux を使っているので確認したわけではない)
Rails アプリの設定
2ヶ所設定する。
1. config/environment.rb
require 'gettext/rails'
2. app/controllers/application.rb
init_gettext "myproject" # 適当に設定
ここで重大注意。この init_gettext に与える引数は、後に述べる po ファイルを作るときに与えるものと一致しなければならない。これがわからなかったため、私は2時間つぶした。気をつけてほしい。
Rake タスクの作成
あとは、複数の言語間で単語のマッピングをしなければならない。po ファイルというのと mo ファイルというのを作らなければならない。
- po ファイルは、ある言語から別の言語への対応表になっている。
- mo ファイルは po ファイルをコンパイルして機械に扱いやすくしたもの(らしい)。
必須でないが、便利のために po/mo ファイルを作るための Rake タスクを作成。
以下の内容をたとえば gettext.rake というファイル名で lib/tasks に保存。
require 'gettext/utils' task :updatepo do GetText.update_pofiles('myproject', Dir.glob('app/**/*.{rb,rhtml}'), 'myproject 1.0.0') #(A) end task :makemo do GetText.create_mofiles(true, 'po', 'locale') end
ふたたび重大注意。(A) の GetText.update_pofiles() の第一引数(ここでは 'myproject') は、上で述べたように、app/controller/application.rb の init_gettext() の引数と一致していなければならない。でないと、何のエラーメッセージもなく、日本語化だけできないという事態に陥る。
po / mo ファイルを作る。
% rake updatepo % mkdir po/ja % cp po/myproject.pot po/ja/myproject.po % vim po/ja/myproject.po # <= ここでマッピングを編集。後述。 % rake makemo
で OK。
po ファイルの編集
rake updatemo は賢くも、モデルクラスを舐めてデータベースカラム名の一覧を作って po ファイルに登録してくれる。
#: app/models/entry.rb:- msgid "Entry|Title" msgstr "タイトル" #: app/models/entry.rb:- msgid "Entry|Body" msgstr "本文"
こんな感じで、英語のカラム名に対応する日本語を入れていく。ちなみに rake updatemo で自動的に作られた msgid は "(モデル名)|(カラム名)" という規則で命名されている。
不満点
Ruby-GetText は gettext ファミリーの長い伝統を背負っているから仕方ないのだろうが、po/mo ファイルのあたりがなんともわずらわしい。その地味な名前とともに何かと非本質的なところで損をしているライブラリである。そんな感想は残るものの、動作は快適である。