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ラベルの表記を参照することができません。