【Rails】バリデーションエラーメッセージの日本語化【i18n】

2021年2月8日プログラミング

【Rails】バリデーションエラーメッセージの日本語化【i18n】

どうも、てーやまです。

今回は、『バリデーションチェック時のエラーメッセージ を日本語化』したいと思います。

さて今回も、できないことを一つずつ、積み重ねてできるようになっていきましょう!

ちなみに、日本語化されていないとこんな感じで英文で出力されます。
ではいってみましょう!

i18nをインストールする

Railsがバージョン3以上であれば、Gem"Rails-i18n"をGemfileに記載してインストールできます。

gem 'rails-i18n'

Docker-composeを使っている場合、buildしてイメージを作り直しておきます。
これはDockerfileをみると分かりますが、ローカルのGemfileを仮想環境にADDして、bundle installしてイメージを固めているからです。

docker-compose up で起動されるコンテナはイメージを元にしているので、Gemfileを更新したら、必ずdocker-compose build します。

ADD Gemfile /myapp/Gemfile ←ここでADDしているのがわかります!
ADD Gemfile.lock /myapp/Gemfile.lock
RUN bundle install

デフォルトロケールの設定

rails/activemodel/lib/active_model/locale/en.yml

上記を参照すると、バリデーションエラーメッセージが英文で定義されていることがわかります。

messages:
  blank: "can't be blank"

i18nのデフォルトロケールは上記のように『:en(英語)』なので、『:ja(日本語)』に変更します。

デフォルトロケールはconfig/application.rbに設定します。

  # i18nのカスタム訳文ファイルのパスを明示する
  # この例だと/config/locales/**(任意)/.yml または .rbを参照するよう定義
	I18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}')]
  # i18nのデフォルトロケールは:en(英語)なので、:ja(日本語)に変更する
  I18n.default_locale = :ja

デフォルトロケールを『:ja』とすることで、バリデーションエラーメッセージが日本語化されます。

デフォルトロケールで日本語化されているバリデーションエラーメッセージ

ですがこのままだとテーブルのカラム名がそのまま出力されているので、これも日本語に直したいです。

カスタム訳文ファイルの設定

前述の『デフォルトロケールの設定』のみだとテーブルのカラム名が日本語化されずに不完全なので、カスタム訳文ファイルを作ります。
(個別に辞書を作るイメージ)

カスタム訳文ファイルを作る場所ですが、以下を思い出してみます。

# i18nのカスタム訳文ファイルのパスを明示する
  # この例だと/config/locales/**(任意)/.yml または .rbを参照するよう定義
	I18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}')]

今回は『/config/locales/**(任意)/.yml』の定義に従い、『/config/locales/models/ja.yml』を作ることにします。
(今回はテーブルカラム名の日本語化なので、任意のフォルダ名は『models』としました。

カスタム訳文ファイルの内容

『ja.yml』は構文に厳しくて、インデントが違っただけで日本語化されません。

ja:
  activerecord:
    models:
      user: ユーザー
      main_categorie: メインカテゴリー 
      sub_categorie: サブカテゴリー 
    attributes:
      user:
        name: 名前
        mailaddress: メールアドレス
        password: パスワード
      main_category: 
        category_name: メインカテゴリー名
      sub_category:
        category_name: サブカテゴリー名
        study_time: 勉強時間

上記の解説です。
models: テーブル名を単数形で記載して、日本語訳を書きます
attributes: ここより下にテーブルのカラム単位に日本語訳を書きます

完全に日本語化したバリデーションエラーメッセージ

完全に日本語化して出力することができました。

上手く日本語化できない場合の確認方法

せっかくカスタム訳文ファイルを作ったのに、思うように日本語化できないことがあります。

カスタム訳文ファイルを「.rb」で作ればアプリケーション実行時にエラーを拾えるのですが、ymlファイルで作った場合は何が悪いのか中々判断できません・・・

そんな時は、以下で『カスタム訳文ファイルをちゃんと読めているか』確認することができます。Rails console でも、pry-railsでも良いので、以下の構文で確認してみましょう。

ちゃんと読めている例
[1] pry(main)> I18n.t("activerecord.attributes.main_category")
=> {:category_name=>"メインカテゴリー名"}

読めていない例
[1] pry(main)> I18n.t("activerecord.attributes.main_category")
=> "translation missing: ja.activerecord.attributes.main_category"

自分も、凄く単純なタイプミスで読めていませんでしたが、穴があくほど見つめて解消できました笑

皆さんもこれで、馴染みのあるエラーメッセージを出力しましょう!