LoginSignup
42
39

More than 5 years have passed since last update.

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

Posted at

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


参考

42
39
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
42
39