連載
» 2014年11月28日 18時00分 UPDATE

開発現場でちゃんと使えるRails 4入門(11):「設定より規約」のRailsで必要なセッティングの基礎知識と国際化/多言語対応 (1/2)

エンタープライズ領域での採用も増えてきたRuby on Railsを使ってWebアプリケーションを作るための入門連載。最新版の4に対応しています。今回は、gem「Ruby I18n」で国際化/多言語対応する方法やロケール、Railsの設定がまとめられている「config」ディレクトリなどについて 解説します。

[著:林慶、監修:山根剛司,株式会社アジャイルウェア]

※編集部注

本連載はRuby on Rails 4の入門連載です。Rubyについて学びたい方は連載「若手エンジニア/初心者のためのRuby 2.1入門」をご覧ください。


「開発現場でちゃんと使えるRails 4入門」のインデックス

連載目次

国際化とRailsのセッティング

 前回の「ActionMailerのSMTP設定、テンプレートで送信&ActiveModelの基本的な使い方とバリデーション」までで、Railsアプリケーション開発の主要な部分は説明が終わり、そろそろ本連載も終わりが見えてきました。今回はアプリケーションの国際化とRailsのセッティングについて解説します。

 Railsではビューに記載する文字列やコントローラーやモデルの各種メッセージをユーザーの使用言語に応じて切り替える機能が用意されています。この機能は多言語に対応させるためだけのものではありません。モデルや属性の表現をビューごとに書くのではなく一元管理するためのものでもあるので、変更に強い開発をサポートします。

 またRailsのセッティングでは、これまでほとんどデフォルトで使っていた設定を読み解き、Railsの機能について整理します。ステージングやプロダクション環境を作るときには頭に入れておきたい知識ですので、ぜひお読みください。

「Ruby I18n」で国際化/多言語対応

 Railsでは「Ruby I18n」というgemを使って国際化対応を行います。ちなみに、I18nとは「Internationalization」の先頭と末尾とその間の文字の数を表しています。

I18nの基本

 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: "こんばんは"

 アプリケーションから呼び出すときは、先ほどと同じようにすることができます。

Railsの標準的ロケール

 実は「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の構造的ロケール

 ロケールの構造を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」をレシーバーとすると省略ができないので注意しましょう。

       1|2 次のページへ

Copyright© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。