i18n

railsにはデフォルトでWebアプリケーションの英語化(多言語化)をサポートしてくれるGemがあります。それを使うことで、何度も繰り返す単語や文章をまとめて管理することができます。

私の作成しているアプリケーションは今のところ全て英語表記で進めていこうと思っているので、翻訳の機能であるi18nを使うのは必要ないのかな?とも思いました。しかし表記を変えたいときに一括で変えることができて管理しやすいと思ったので統一出来るように設定していきたいと思います。

まず最初にconfig/application.rbに設定情報を追加して、アプリケーション内で使えるように設定していきます。ついでに時刻表記も日本語設定に変えました。

(config/application.rb)
		
		# 言語ファイルを階層ごとに設定するための記述
    config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}').to_s]

    # アプリケーションが対応している言語のホワイトリスト(ja = 日本語, en = 英語)
    config.i18n.available_locales = %i(en)

    # 上記の対応言語以外の言語が指定された場合、エラーとするかの設定
    config.i18n.enforce_available_locales = true

    # デフォルトの言語設定
    config.i18n.default_locale = :en
    
    #日本時間をデフォルトにする
    config.time_zone = "Tokyo"

config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}').to_s]en.ymlファイルをモデルとビューなどの種類で分けて作成できます。今後アプリの内容が多くなってきたときに管理しやすくなります。

そしてen.ymlファイルを追加していきます。

Sayo-MacBook-Pro:emoji_diary SAYO$ mkdir config/locales/views
Sayo-MacBook-Pro:emoji_diary SAYO$ touch config/locales/views/en.yml
Sayo-MacBook-Pro:emoji_diary SAYO$ mkdir config/locales/activerecord
Sayo-MacBook-Pro:emoji_diary SAYO$ touch config/locales/activerecord/en.yml
(config/locals/activerecord/ja.yml)

en:
  activerecord:
    models:
      user: user
    attributes:
      user:
        nickname: nickname
        name: user name
        password: password
        password_confirmation: password confirmation
(config/locals/views/ja.yml)

en:
  defaults:
    login: login
    register: register
    submit: submit
    logout: logout
  users:
    new:
      title: register
	    to_login_page: already a member?
  user_sessions:
    new:
      title: login
      to_register_page: make a new account
      password_forget: forgot a password

ビューで使用していきます。

(users/new.html.erb)

<div class="container">
  <div class="row">
    <div class="col-md-10 offset-md-1 col-lg-8 offset-lg-2">
      <h1><%= t '.title' %></h1>
      <%= form_with model: @user, local: true do |f| %>
        <div class="form-group">
          <%= f.label :nickname %>
          <%= f.text_field :nickname, class: 'form-control' %>
        </div>
        <div class="form-group">
          <%= f.label :name %>
          <%= f.text_field :name, class: 'form-control' %>
        </div>
        <div class="form-group">
          <%= f.label :password %>
          <%= f.password_field :password, class: "form-control" %>
        </div>
        <div class="form-group">
          <%= f.label :password_confirmation %>
          <%= f.password_field :password_confirmation, class: "form-control" %>
        </div>
        <%= f.submit t('defaults.register'), class: 'btn btn-primary' %>
      <% end %>
      <div class='text-center'>
        <%= link_to t('.to_login_page'), login_path %>
      </div>
    </div>
  </div>
</div>

<%= t '.title' %><%= f.label :nickname %><%= link_to t('.to_login_page'), login_path %>のような書き方で使用できます。

<%= f.label :nickname %>の書き方はモデルのオブジェクトによって結びついているのでこのままでi18nを参照することができます。

(user_sessions/new.html.erb)

<div class="container">
  <div class="row">
    <div class=" col-md-10 offset-md-1 col-lg-8 offset-lg-2">
      <h1><%= t '.title' %></h1>
      <%= form_with url: login_path, method: :post, local: true do |f| %>
        <div class="form-group">
          <%= f.label :name, User.human_attribute_name(:name) %>
          <%= f.text_field :name, class: "form-control" %>
        </div>
        <div class="form-group">
          <%= f.label :password, User.human_attribute_name(:password) %>
          <%= f.password_field :password, class: "form-control" %>
        </div>
        <%= f.submit t('defaults.login'), class: "btn btn-primary" %>
      <% end %>
      <div class='text-center'>
        <%= link_to t('.to_register_page'), new_user_path %>
        <a href="#"><%= t '.password_forget' %></a>
      </div>
    </div>
  </div>
</div>

<%= f.label :name, User.human_attribute_name(:name) %>はuser_sessionsのビューで、Userモデルとは結びついていないのでこのように書かないとi18nラベルの表記を参照することができません。