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に書けば良い。