国際化対応のための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
が消えてかなりスッキリしていますね。
共通的に使う文言もここで管理できるので、非常に便利ですね
Viewに文言を配置しないだけで、だいぶスッキリ記述できますし、文言の一元管理ができることもメリットです。