Rails2.2のI18Nを試してみた

昨日の Rails勉強会@東京第34回 でRails2.2 (RC1)がリリースされていることを知りました。

Rails 2.2 ではいくつもの中規模(?)な変更・追加が行われていますが、一番興味のあった国際語化(I18N)を試してみました。

基本設定

まずは、http://i18n-demo.phusion.nl/pages/setup をみて(左上のselect boxでja-JPを選択する)。

  1. 日付と時間のフォーマット用プラグインをインストール
  2. このページにある日本語用 config/locales/ja-JP.rb を作成


↑日付入力のselect box が日本語かされています!(Octber が 「10月」になっている)
# テンプレートの日本語化は手動でやってます ^^;



↑ しかし、エラーメッセージは日本語化されません。config/locales/ja-JP.rbにはActiveRecordのエラーメッセージの日本語もあるのですが??

カラム名は当然ですが、日本語を定義してないのでRDBカラム名のままです。

ActiveRecordの日本語化リソースファイルを作成

Translating ActiveRecord • iain.nl という記事を見つけたので、参考に しながら ActiveRecordの日本語化リソースファイルを作成

ja-JP:
  activerecord:
    models:
      todo: Todo
    attributes:
      todo:
        due: 期日
        task: タスク
    errors:
      template:
        header: "{{model}}でエラーが発生しました。"
        body: "つぎの項目を確認して下さい。"
      messages:
        blank: "が空です、入力して下さい"


↑無事にエラーメッセージやカラム名も日本語化されました。

まとめ

  • Rails2.2のI18Nは一応使える
  • しかし、従来使われていた GetTextととはまったく互換性がない
  • ドキュメント不足?
  • なぜ config/locales/ja-JP.rb のActiveRecordのエラーメッセージは使われないの?

追記: config/locales/ja-JP.rb の修正

config/locales/ja-JP.rbを以下のように変更したらこのファイルのエラーメッセージが使われるようになりました。
メッセージのキーワードが変わったのでしょうか?

    # Active Record
    :activerecord => {
      :errors => {
        :template => {
          :header => "{{model}}でエラーが発生しました。",
          :body => "以下のメッセージを確認してください:"
        },
        :messages => {
          :inclusion => "は、リストに含まれていません",
          :exclusion => "は、有効な値ではありません",
          :invalid => "は、妥当な値ではありません",
          :confirmation => "は、確認できません",
          :accepted  => "は、入力できません",
          :empty => "何も入力されていません",
          :blank => "空白です",
          :too_long => "長すぎます ({{count}}文字以下)",
          :too_short => "短すぎます ({{count}}文字以上)",
           ・・・・

この場合、日本語化リソースファイルは以下のようにテーブル、カラムの定義のみでOK

ja-JP:
  activerecord:
    models:
      todo: Todo
    attributes:
      todo:
        due: 期日
        task: タスク