Help us understand the problem. What is going on with this article?

RailsでI18nを使ってViewに表示する文字列を一元管理する

More than 5 years have passed since last update.

国際化対応のためのgemであるi18nを使って、Viewに表示される文字列を共通化、一元管理するTipsです。Railsに精通している方なら、基本かも知れませんがメモとして残しておきます。

i18nで使用する言語を設定する

application.rbに使用する言語を設定します。

config/application.rb
class Application < Rails::Application
  config.i18n.default_locale = :ja
end

Viewに埋め込む言語ファイルをconfig/localesに追加する

続いて、localesディレクトリ配下にViewで使用する文字列の定義ファイルをYAML形式で作ります。ここでは、contentsモデルがあるとしてViewで使用する文字列を書いていきます。

config/locales/ja.yml
ja:
  contents:
    show:
      name: 'コンテンツ詳細'      
    index:
      list_name 'コンテンツ一覧'
    new:
      name: 'コンテンツ名'
      description: '内容'
      holder: '担当: %{name}'

このとき、contents viewのそれぞれのアクションに相当するカタチで記述しておくと、どの画面で使用するかがわかり、後述するLazy lookupも使えるので便利です。

View側でlocales内のファイルを呼び出す

contents配下のViewファイルからymlファイルを呼び出します。

普通の記法

app/views/contents/show.html.erb
<div>
  <%= t contents.show.name # 'コンテンツ詳細' %>
</div>
app/views/contents/index.html.erb
<div>
  <%= t contents.index.list_name # 'コンテンツ一覧' %>
</div>
app/views/contents/new.html.erb
<div>
  <%= t contents.new.name # 'コンテンツ名' %>
  <%= t contents.new.description # '内容' %>
  <%= t contents.new.holder, name: '@kentana20' # '担当: @kentana20' %>
</div>

lazy lookup記法

これでも十分便利なのですが、yaml内がview#actionのカタチでキレイに定義されている場合、以下の記法でも同じ結果となります。

app/views/contents/show.html.erb
<div>
  <%= t '.name' # 'コンテンツ詳細' %>
</div>
app/views/contents/index.html.erb
<div>
  <%= t '.list_name' # 'コンテンツ一覧' %>
</div>
app/views/contents/new.html.erb
<div>
  <%= t '.name' # 'コンテンツ名' %>
  <%= t '.description' # '内容' %>
  <%= t '.holder', name: '@kentana20' # '担当: @kentana20' %>
</div>

あちこちに記述していた contents.action が消えてかなりスッキリしていますね。


共通的に使う文言もここで管理できるので、非常に便利ですね :smiley:
Viewに文言を配置しないだけで、だいぶスッキリ記述できますし、文言の一元管理ができることもメリットです。


参考

kentana20
LiverpoolFCを愛するエンジニア。 株式会社一休で宿泊サイト「一休.com」の開発・運用をやってます。
http://kentana20.hatenablog.com/
ikyu
「こころに贅沢を」をコンセプトに一休.com、一休レストランなどのサービスを提供しています。
https://www.ikyu.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away