Ruby-GetText-Packageを使って多言語化をしていたのだけれども、Rails 3.0で動くかよくわからなかったので、Rails 3.0で動くGetTextのGemライブラリーを探したところ、fast_gettextというライブラリーを見つけた。
環境
- Debian GNU/Linux Squeeze
- ruby 1.8.7 (2010-08-16 patchlevel 302)
- rubygem 1.3.7
- Rails 3.0
Gemライブラリーのインストール
fast_gettextはgettextで生成されたpoファイルを読み取って表示する。gettext_i18n_railsはfast_gettextをRailsから呼び出して使用するみたい。(結局、Ruby-GetText-PackageはRails 3.0で使えるということ?いまいちわからない)。
よって、以下のようになる。
Gemでインストールする。
% gem1.8 install fast_gettext % gem1.8 install gettext_i18n_rails % gem1.8 gettext
Gemfileに以下を追加。
gem 'gettext_i18n_rails' gem 'gettext', '>=1.9.3', :require => false, :group => :development
Gemfile.lockを生成する。
% bundle --local --without=production (開発環境) % bundle --local --without=development (開発環境)
fast_gettextを使う準備
localeslocaleというディレクトリにて、翻訳ファイルを管理するとする。enが英語ファイル。jaが日本語ファイル。(追記:app.potの生成ディレクトリがlocaleで決め打ちであるため、それにしたがった方が良い)
% mkdir locale % mkdir locale/en % mkdir locale/ja
config/initializersにfast_gettext.rbという初期化ファイルを作る。中身は以下のようにする。ここでは、locales以下に作成されているディレクトリ名をロケール名として使うようにしている。
FastGettext.add_text_domain 'app', :path => 'locale', :type => :po
path = Rails.root.to_s+"/locale/"
langArray = Array.new
Dir.glob(path+'*').sort.each do |file|
if File.directory?(file)
langArray.push(file.sub(/#{path}/,""))
end
end
FastGettext.default_available_locales = langArray
FastGettext.default_text_domain = 'app'app/controllers/application_controller.rbに以下の記述を加える。
class ApplicationController < ActionController::Base
〜 省略 〜
#For gettext_i18n_rails
before_filter :set_gettext_locale
# for i18n
before_filter :set_locale
def set_locale
unless params[:locale].nil?
I18n.locale = params[:locale]
else
I18n.locale = :ja
end
end
def default_url_options(options ={})
{:locale => I18n.locale}
end
〜 省略 〜set_gettext_localeが何をしているのかは知らない。set_localeでURLでlocaleが与えられているときにはそのロケールを、そうでないときには日本語(ja)をロケールにするように設定している。fast_gettextはI18n.localeの値で表示するロケールを決定するそうなので、これで表示言語を選ぶことができる。default_url_options では、いちいちロケールを link_to で設定するのは面倒なので、自動で追加するようにしたもの。
以上で準備終了。
potファイルの生成。
基本的には翻訳したいメッセージを_('メッセージ')とくくれば良い。複数形などについてはGitHub: gettext_i18n_railsを参照のこと。メッセージの抽出は以下のコマンドを使う。
% rake gettext:find
これで、locale/app.pot というファイルが生成される。これが元のテンプレートファイル。
翻訳ファイルの作成
たとえば、英語の翻訳ファイルを用意したい場合には、locale/app.pot を locale/en/app.po としてコピーする(拡張子に注意)。
% cp locale/app.pot locales/en/app.po
locale/en/app.po をエディタで開き msgidに対応する訳語を msgstrに書けば良い。