エンタープライズ領域での採用も増えてきたRuby on Railsを使ってWebアプリケーションを作るための入門連載。最新版の4に対応しています。今回は、gem「Ruby I18n」で国際化/多言語対応する方法やロケール、Railsの設定がまとめられている「config」ディレクトリなどについて 解説します。
前回の「ActionMailerのSMTP設定、テンプレートで送信&ActiveModelの基本的な使い方とバリデーション」までで、Railsアプリケーション開発の主要な部分は説明が終わり、そろそろ本連載も終わりが見えてきました。今回はアプリケーションの国際化とRailsのセッティングについて解説します。
Railsではビューに記載する文字列やコントローラーやモデルの各種メッセージをユーザーの使用言語に応じて切り替える機能が用意されています。この機能は多言語に対応させるためだけのものではありません。モデルや属性の表現をビューごとに書くのではなく一元管理するためのものでもあるので、変更に強い開発をサポートします。
またRailsのセッティングでは、これまでほとんどデフォルトで使っていた設定を読み解き、Railsの機能について整理します。ステージングやプロダクション環境を作るときには頭に入れておきたい知識ですので、ぜひお読みください。
Railsでは「Ruby I18n」というgemを使って国際化対応を行います。ちなみに、I18nとは「Internationalization」の先頭と末尾とその間の文字の数を表しています。
Railsアプリケーションでは「config/locales」にYAML形式の言語別の設定情報(ロケール)を配置します。アプリケーションを作った段階では英語(:en)がデフォルトロケールとなっており、「config/locales」には「en.yml」が存在しています。
en: hello: "Hello world"
このロケールによる「hello」キーの翻訳をアプリケーション側で呼び出すには次のようにします。
I18n.t('hello') => "Hello world"
これはコンソールからでも実行できます。ロケールファイルは次のように階層構造を持たせることもできます。
en: hello: "Hello world" greeting: morning: "Good morning." daytime: "Hello." evening: "Good evening."
階層構造を呼び出すときは「.」で区切ります。
I18n.t('greeting.daytime') => "Hello."
日本語や他の言語にデフォルトロケールを変更するには、「config/application.rb」の中のApplicationクラスの定義で次のように設定します。
config.i18n.default_locale = :ja
これによりロケールファイルの先頭を「ja」とした日本語ロケールを標準として使えるようになります。
ja: hello: "Hello world" greeting: morning: "おはようございます。" daytime: "こんにちは。" evening: "こんばんは"
アプリケーションから呼び出すときは、先ほどと同じようにすることができます。
実は「en.yml」以外にもRailsの標準的なロケールがロードされています。コンソールを立ち上げ、ロードパスを見てみましょう。
I18n.load_path => [ [0] "/**/gems/activesupport-4.0.3/lib/active_support/locale/en.yml", [1] "/**/gems/activemodel-4.0.3/lib/active_model/locale/en.yml", [2] "/**/gems/activerecord-4.0.3/lib/active_record/locale/en.yml", [3] "/**/gems/actionpack-4.0.3/lib/action_view/locale/en.yml", [4] "/**/book_library/config/locales/en.yml" ]
このように、「ActiveSupport」「ActiveRecord」などのロケールも読み込まれています。これらには日付のフォーマットやバリデーションエラーのメッセージが定義されています。しかし、これらのgemのロケールは英語しかないので、日本語や他の言語のロケールが欲しいですね。
Railsコミュニティは流石で、「rails-i18n」で言語ごとの標準的なロケールを配信してくれています。マニュアルインストールの節に従って「rails/locale」の「ja.yml」をダウンロードして「config/locales」に配置しましょう。これにより日付やバリデーションエラーのメッセージが日本語化されます。
ロケールの構造をRailsのコンポーネントの構成に合わせて作ると、さまざまな恩恵が受けられます。
例えば、「form_for」メソッドによりモデルオブジェクトのフォームを作るとき、ブロック変数の「label」メソッドを属性名を引数として与えますが、その属性名のラベルをロケールに従って表示してくれます。
= form_for @book do |f| / 下の行はモデルのロケールを見る = f.label :title
モデルのロケールは次のように記述します。
ja: activerecord: models: book: 書籍 user: ユーザー attributes: book: title: タイトル
また、ビューのパスを反映したロケールを書いて構造化すると、ビューではパスを省略したキーで済みます。
ja: books: index: title: 書籍一覧
このように書くと「app/views/books/index.html.slim」では次のように呼び出すことができます。
= t('.title')
なお、ビューでは「I18n」のレシーバーを必要としません。また、ビューで「I18n」をレシーバーとすると省略ができないので注意しましょう。
Copyright © ITmedia, Inc. All Rights Reserved.