Rails 3.0で gettextを使う

Ruby-GetText-Packageを使って多言語化をしていたのだけれども、Rails 3.0で動くかよくわからなかったので、Rails 3.0で動くGetTextのGemライブラリーを探したところ、fast_gettextというライブラリーを見つけた。

環境

Gemライブラリーのインストール

fast_gettextgettextで生成されたpoファイルを読み取って表示する。gettext_i18n_railsはfast_gettextRailsから呼び出して使用するみたい。(結局、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_gettextI18n.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に書けば良い。