gettextで日本語化(とりあえずvalidationメッセージ)

rails/gettextを使用したマルチルンガル対応として、まずValidateのメッセージがとりあえず日本語になるようしてみました。

gettextパッケージをインストール

gemを使ってgettextパッケージをインストールします。

#sudo gem install gettext

下は、このインストールの実行結果です。

Bulk updating Gem source index for: http://gems.rubyforge.org
Successfully installed gettext-1.92.0
1 gem installed
Installing ri documentation for gettext-1.92.0...
Installing RDoc documentation for gettext-1.92.0...

config/environment.rbの変更

gettextが使用できるようにconfig/environment.rbを変更します。

$KCODE変数

gettextとは関係ないですが、Ruby文字コードを表すグローバル変数$KCODEを指定します。
config/environment.rbの先頭に以下のように追加します。

$KCODE='u'

今回は、UTFを使うので'u'を指定しますがですがeucまたはsjisにする場合は、'e'または's'と指定します。

gettextをrequire

gettextパッケージが使えるようにconfig/environment.rbの一番下でrequireします。

require 'gettext/rails'

gettextの初期化

コントローラでinit_gettextをコールして初期化を行います。

class ApplicationController < ActionController::Base
  helper :all # include all helpers, all the time
  
  init_gettext "cart"
  ....

引数は、テキストドメイン名です。これは、(今回はしていませんが)自分で各言語のメッセージをファイルを作成するとき、このテキストドメイン名と名称がマッチするよう作成する必要があります。

確認

確認のためのモデルとコントローラーの実装をします(gettextを使用/非使用にかかわらず行うことは同じです)。
モデルでvalidates_XXX メソッドにより検証の指定を行います。

class Product < ActiveRecord::Base
  
  validates_presence_of :name, :price
  validates_numericality_of :price

....

end

それからコントローラ側では編集ページからの更新アクションを実装。保存できなかった場合(=saveメソッドがfalseを返した場合)、編集ページを再レンダリングするよう実装します。

def update
   begin
     if params[:id]
        product       = Product.find_by_id(params[:id])
        product.update_attributes(params[:product])
      else
          product = Product.new(params[:product])
      end
      if(!product.save)
        ....
        return render  :action => "edit"
......
   end 

それで、とりあえず、実行してみると、以下のようにメッセージが日本語化されて表示されました。

productに2つのエラーが発生しました。

次の項目を確認してください。

Nameを入力してください。
Priceは数値で入力してください。

あと、PC環境を中国語にすれば、メッセージが中国語になります。

TODO

次は、カラム名なども日本語化せねば..