[Rails] i18nによる日本語化対応

学習記録

はじめに

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は仕組みが少し難しい面もありますが、頑張って習得していきましょう。

参考記事

https://github.com/svenfuchs/rails-i18n/tree/master/rails/locale
Rails 国際化(I18n)API - Railsガイド
Railsアプリケーションを国際化する方法について解説します。これによりアプリケーションを異なる言語に翻訳することができ、さらに単数形/複数形ルールを変更したり、その国に適した日付フォーマットを設定したりできます。
ロケールファイルの編成
Rails 国際化(I18n)API - Railsガイド
Railsアプリケーションを国際化する方法について解説します。これによりアプリケーションを異なる言語に翻訳することができ、さらに単数形/複数形ルールを変更したり、その国に適した日付フォーマットを設定したりできます。
探索の「遅延」(lazy-lookup)
Rails 国際化(I18n)API - Railsガイド
Railsアプリケーションを国際化する方法について解説します。これによりアプリケーションを異なる言語に翻訳することができ、さらに単数形/複数形ルールを変更したり、その国に適した日付フォーマットを設定したりできます。

コメント

タイトルとURLをコピーしました