Posted at

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

More than 3 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に文言を配置しないだけで、だいぶスッキリ記述できますし、文言の一元管理ができることもメリットです。



参考