i18nを使った日本語化

i18nって?
ある言語を他の言語に翻訳してくれる機能
国際化(Internationalization)の略称
・デフォルトに日本語を設定するまでの手順 ・rails-i18n gemのインストール
Gemfileに

gem 'rails-i18n', '~> 5.1' # For 5.0.x, 5.1.x and 5.2.x

を記述してbundle install
・デフォルトの言語設定
Railsではデフォルトでは英語をロケールとして扱っているので、デフォルトに日本語を設定したい場合は、config/application.rbに

config.i18n.default_locale = :ja

と指定する必要がある
ロケールファイルはconfig/locales以下に配置、この時、config/locales/defaults、 config/locales/models、config/locales/views のように使われる場所によってディレクトリを分類してそこにそれぞれのロケールファイルを配置した方がひとつにロケールファイルをまとめるより管理がしやすい。
ただこれだと、railsではデフォルトのローケルファイルの読み込みでは、ネストされたロケールファイルを読み込めないので、

config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}').to_s]

を記述することで訳文の読み込みのパスを設定することができる
今回モデルの日本語化の設定はconfig/locales/modelsに

ja:
  activerecord:
    models:
      user: 'ユーザー'
      # view側 :  User.model_name.human = 'ユーザー' / t('activerecord.models.user')と同じ
    attributes:
      user:
        last_name: '姓'
        # view側: User.human_attribute_name :last_name => "姓" / t("activerecord.attributes.user.last_name")と同じ
        first_name: '名'
        email: 'メールアドレス'
        password: 'パスワード'
        password_confirmation: 'パスワード確認'

models以下のインデントに日本語化したいモデルを指定、attributes以下にモデルの属性を指定
この時、viewでform_withメソッドの引数にユーザーのモデルを渡しているとき(ユーザーの新規登録ページなど)は、Railsが勝手にlabelにロケールファイルの翻訳を適用してくれる

#users/new.html.erb
<%= form_with(model:@user,local: true,) do |form| %>
        <div class="form-group">
          <%= form.label :last_name %>
          <%= form.text_field :last_name,class: "form-control" %>
        </div>

        <div class="form-group">
          <%= form.label :first_name %>
          <%= form.text_field :first_name,class: "form-control" %>
        </div>

        <div class="form-group">
          <%= form.label :email %>
          <%= form.text_field :email,class: "form-control" %>
        </div>

        <div class="form-group">
          <%= form.label :password %>
          <%= form.password_field :password,class: "form-control" %>
        </div>

        <div class="form-group">
          <%= form.label :password_confirmation %>
          <%= form.password_field :password_confirmation,class: "form-control" %>
        </div>

        <%= form.submit (t 'defaults.register'), class: "btn btn-primary" %>
<% end %>

また、引数にモデルを渡していない時(ユーザーログインページなど)は、label自身に直接翻訳を適用する必要がある

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

viewの日本語化の設定はconfig/locales/viewsに

ja:
  defaults:
    login: 'ログイン'
    register: '登録'
    logout: 'ログアウト'
  users:
    new:
      signup: 'ユーザー登録'
      to_login_page: 'ログインページへ'
  user_sessions:
    new:
      login: 'ログイン'
      to_register_page: '登録ページへ'
      password_forget: 'パスワードをお忘れの方はこちら'

のように設定

lazy lookupとは?

Controllerやviewファイルのディレクトリの階層」を翻訳ファイルに設定する事で、Controllerやviewファイルの内部で参照するキーを短縮してアクセスする事が出来る仕組み
例えば、app/views/users/new.html.erbファイル内で<h1>ログインページへ</h1>ロケールファイル(今回は上記のロケールファイル)を使って翻訳して記述したい場合、<h1><%= t('users.new.to_login_page') %></h1>と記述するが、lazy lookup記法を使うことで、<h1><%= t('.to_login_page') %></h1>と記述を省略できる。

参考文献

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

GitHub - svenfuchs/rails-i18n: Repository for collecting Locale data for Ruby on Rails I18n as well as other interesting, Rails related I18n stuff

[初学者]Railsのi18nによる日本語化対応 - Qiita

【Rails】I18n入門書 | Pikawaka - ピカ1わかりやすいプログラミング用語サイト