【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"
自分も、凄く単純なタイプミスで読めていませんでしたが、穴があくほど見つめて解消できました笑
皆さんもこれで、馴染みのあるエラーメッセージを出力しましょう!
ディスカッション
コメント一覧
まだ、コメントがありません