必要な情報はRails Guidesの中の以下のページにまとまっている。
Rails Internationalization (I18n) API
-
I18n.translateメソッドを使って「抽象化されたキー」から、ロケールに基づく「自然言語」に変換する。いきなり英語で文章を考えなくて済む分、日本人には取っ付きやすいかもしれない。同様に、I18n.localizeメソッドで日付や時刻のフォーマットを行う。- それぞれ
I18n.t, I18n.lという省略形が用意されている。さらに多くのコンテクストではt, lというショートカットメソッドが使える。
- それぞれ
- Railsフレームワーク自体もこのメカニズムで国際化されているため、各コンポーネントが要求するキーに対して適切な翻訳を用意することで、フレームワーク全体が翻訳される。
-
キーは階層化することができる。またRailsが要求するキーも、コンポーネントごとに階層化されている(例: activerecord.errors.messages.record_invalid など)
- 標準のメッセージファイルにおいては、YAML(.yml)またはRuby(.rb)のハッシュを使って、キーの階層をそのまま再現する。
- 階層の上位部分をスコープ(scope)と呼ぶが、どこまでがスコープかという区別は明確ではない。
I18n.locale=で使用するロケールを設定する。- 使用するロケールの決定方法について。Web”サイト”においてはURL中にロケールを含めるべきである。一方で、Web”アプリケーション/サービス”においてはAcceptヘッダやDBに保存した個人設定を使うことも有効である。
フレームワーク全体の日本語化
とにかく手っ取り早く”日本語化”をしたいという場合は
https://github.com/svenfuchs/rails-i18n/blob/master/rails/locale/ja.yml
を config/locales/ に放り込んで、config/application.rb に
config.i18n.default_locale = :ja
と書いておけば、フレームワークが自動で出力する各種メッセージは日本語になる。ただ標準ではエラーメッセージのフィールド名の後に空白が入るので、errors.formatを次のように修正しておいた方が良いかもしれない(好みの問題だが)。
--- ja.yml.orig 2011-06-22 22:38:21.000000000 +0900
+++ ja.yml 2011-06-22 22:38:33.000000000 +0900
@@ -188,7 +188,7 @@
submit: "保存する"
errors:
- format: "%{attribute} %{message}"
+ format: "%{attribute}%{message}"
messages: &errors_messages
inclusion: "は一覧にありません。"
以後、この ja.yml に自分のアプリ用のメッセージを追加していっても良いが、やはり専用の翻訳ファイルを追加した方が扱いやすいだろう。翻訳ファイルは config/locales/ の中に拡張子 .yml か .rb で作成する。ファイル名は何でもいいし、言語ごとに分けてもいいし分けなくてもいい。ただしサブディレクトリの中に入れた場合は追加の設定が必要になる(参照 3.4 Organization of Locale Files)。また新たにファイルを追加した場合はサーバを再起動しなければならない。
ActiveRecordのモデル名・フィールド名の日本語化
上の手順でvalidationのエラーメッセージは日本語化されるが、モデル名やフィールド名は自分で翻訳を用意する必要がある。詳細については下ページ参照。
Translations for Active Record Models
ActiveModelのモデル名・フィールド名の日本語化
任意のクラスにおいて ActiveModel::Translation モジュールをextendすることで、ActiveRecord同様の翻訳機能が有効になる。
class MyForm extend ActiveModel::Translation end
ただしスコープが activerecord ではなく activemodel であることに注意(サブクラスで i18n_scope メソッドをオーバライドすれば変更できるが)。
activemodel:
models:
my_form: "モデル名"
attributes:
my_form
attr_name: "属性名"なおvalidationに関してはActiveRecordと共通である。