Shota Yamaguchi

Rails勉強中

i18nによる日本語化対応

i18nとは

(internationalization)国際化のこと。

i18nの実装方法

Gemfile

gem 'rails-i18n'


config/application.rb

config.i18n.default_locale = :ja # デフォルトのロケールを設定
config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}').to_s] 

この設定を行うことによってモデルやビュー単位でi18nの定義ファイルを分けることができる。


次に日本語化するファイルをモデルとビューで分けて記述する。 config/locales/views/ja.yml

ja:
   defaults:
     login: 'ログイン'
     register: '登録'
     logout: 'ログアウト'
     message:
      require_login: 'ログインしてください'
   users:
     new:
       title: 'ユーザー登録'
       to_login_page: 'ログインページへ'
     create:
       success: 'ユーザー登録が完了しました'
       fail: 'ユーザー登録に失敗しました'
   boards:
     index:
       title: '掲示板一覧'
       no_result: '掲示板がありません。'
     new:
       title: '掲示板作成'

このようにlazy lookup記法を使用すると

例えば app/views/users/new.html.erb ビューテンプレート内部で、例えばタイトルを表示させたい場合users.new.title のようにアクセスできる。

app/views/users/new.html.erb

<%= t '.title' %>       # => ユーザー登録

コントローラーごとに分けて記述しておくことによって、ビュー側では以下のような簡単な記述になるので見やすくなる。 config/locales/activerecord/ja.yml

ja:
   activerecord:
     models:
       user: 'ユーザー'
       board: '掲示板'
       comment: 'コメント'
       bookmark: 'ブックマーク'
     attributes:
       user:
         id: 'ID'
         email: 'メールアドレス'
         password: 'パスワード'
         password_confirmation: 'パスワード確認'
         last_name: '姓'
         first_name: '名'
       board:
         id: 'ID'
         title: 'タイトル'
         body: '本文'
         board_image: 'サムネイル'
         created_at: '作成日時'
         user: '作成者'
   enums:
     user:
       role:
         admin: '管理者'
         general: '一般'


フォームでの適応

Railsを使っている場合フォームを記述際にform_withを使う場合が多くある。

form_withの場合少し特殊なので注意⚠️!!

以下の2種類で書き方が変わる。

  1. モデルに紐づくフォームの場合
  2. ログイン処理などのようにモデルに紐づかないフォーム

1. モデルに紐づくフォームの場合

 <%= form_with model: @user, local: true do |f| %>
   <div class="form-group">
     <%= f.label :last_name %>
     <%= f.label :password_confirmation %>
     <%= f.password_field :password_confirmation, class: 'form-control' %>
   </div>
     <%= f.submit (t 'defaults.register'), class: 'btn btn-primary' %>
 <% end %>

Railsが勝手に翻訳してくれるため、わざわざ記述する必要がない。

2. モデルに紐づかないフォームの場合

<%= form_with url: login_path, local: true do |f| %>
  <div class="form-group">
    <%= f.label :email, User.human_attribute_name(:email) %>
    <%= f.text_field :email, class: 'form-control' %>
  </div>
  <div class="form-group">
    <%= f.label :password, User.human_attribute_name(:password) %>
    <%= f.password_field :password, class: 'form-control' %>
  </div>
  <div class="actions">
    <%= f.submit (t 'defaults.login'), class: 'btn btn-primary' %>
<% end %>

Model.model_name.humanメソッドと Model.human_attribute_name(attribute)メソッドを使うことで、モデル名と属性名を透過的に参照できるようになる。

例えばconfig/locales/activerecord/ja.ymlが以下のような場合、下のような表示結果になる。

ja:
   activerecord:
     models:
       user: 'ユーザー'
       board: '掲示板'
       comment: 'コメント'
       bookmark: 'ブックマーク'
     attributes:
       user:
         id: 'ID'
         email: 'メールアドレス'
         password: 'パスワード'
         password_confirmation: 'パスワード確認'
         last_name: '姓'
         first_name: '名'
User.model_name.human  =>  ユーザー
User.human_attribute_name("email")  =>  メールアドレス

参考

Railsガイド Rails 国際化 (i18n) API