はじめに
Railsには、あらかじめi18nというgemが入っています。このgemは、アプリケーションの文言を英語以外の別の1つの言語に翻訳する機能や、多言語サポート機能を簡単かつ拡張可能な方式で導入するためのフレームワークです。
また、有志で翻訳ファイルがgemとして公開されています。
日本語化対応するために、適切な設定を行っていきましょう。
作業の流れ
- rails-i18nをインストール
- デフォルトの言語設定
- 翻訳ファイルを作成する
- ビューファイルでの使い方
rails-i18nをインストール
gem 'rails-i18n' '~> 5.1'
$ bundle install
デフォルトの言語設定
Railsではデフォルトで英語のロケールファイル(辞書ファイル)が選択されているので。日本語に設定しましょう。
また、ローケルファイルを複数に分ける場合に必要な記述も記入しましょう。
config.i18n.default_locale = :ja # デフォルトのlocaleを日本語(:ja)にする
# 以下の記述で複数のローケルファイルが読み込まれるようになる(必須)
config.i18n.load_path += Dir[Rails.root.join('config/locales/**/*.{rb,yml}').to_s]
翻訳ファイルを作成する
モデルに関する内容を記載するlocale/activerecord/ja.yml
、
Viewの表示のみの内容を記載するlocale/view/ja.yml
を作成します。
ja:
activerecord:
models:
user: 'ユーザー'
board: '掲示板'
attributes:
user:
email: 'メールアドレス'
password: 'パスワード'
password_confirmation: 'パスワード確認'
last_name: '姓'
first_name: '名'
ja:
defaults:
login: 'ログイン'
register: '登録'
logout: 'ログアウト'
users:
new:
title: 'ユーザー登録'
to_login_page: 'ログインページへ'
user_sessions:
new:
title: 'ログイン'
to_register_page: '登録ページへ'
password_forget: 'パスワードをお忘れの方はこちら'
boards:
index:
title: '掲示板一覧'
new:
title: '掲示板作成'
bookmarks:
title: 'ブックマーク一覧'
profiles:
show:
title: 'プロフィール'
ビューファイルでの使い方
Modelに紐付くform_withのlabelでは、Railsが定義を読み込んで適用します。
<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 :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 %>
<div class='text-center'>
<%= link_to (t '.to_login_page'), login_path %>
</div>
</div>
</div>
また、引数にモデルを渡していないform_withのlabelでは、i18nの記載を追加する必要があります。
<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, 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' %>
</div>
<% end %>
<div class='text-center'>
<%= link_to (t '.to_register_page'), new_user_path %>
<a href="#"><%= t '.password_forget' %></a>
</div>
</div>
</div>
Model.model_name.human
メソッドとModel.human_attribute_name(attribute)
メソッドを使うことで、モデル名と属性名を透過的に参照できるようになります。
たとえば以下のような訳文があるとします。
en:
activerecord:
models:
user: Customer
attributes:
user:
login: "Handle"
# Userの"login"属性は"Handle"という語に翻訳される
User.model_name.human
は”Customer”を返し、User.human_attribute_name("login")
は”Handle”を返します。
lazy lookup記法
ja:
users: # controller/usersに対応
new: # newアクションに対応
title: 'ユーザー登録'
<h1><%= t('users.new.title') %></h1>
<h1><%= t('.title') %></h1>
例えば、上記のapp/views/users/new.html.erb
ファイル内で<h1>ユーザー登録</h1>
を上記ロケールファイルを使って翻訳して記述したい場合、通常は <h1><%= t('users.new.title') %></h1>
と記述します。
lazy lookup記法を使うことで、<h1><%= t('.title') %></h1>
と記述を省略でき、よりスッキリさせることができます。
終わりに
i18nは仕組みが少し難しい面もありますが、頑張って習得していきましょう。
参考記事



コメント