【言語ファイル編】Laravelのバリデーションエラーを日本語化する方法 - PHP・Laravelを仕事に - laranoteLaravelのバリデーションは、デフォルトでは英語のエラーメッセージが表示されます。以下の様な感じです。 これでは日本の利用者は驚いてしまいますよね。したがって日本語に翻訳したエラーメッセージを表示させるのはマストと言
Laravelのバリデーションは、デフォルトでは英語のエラーメッセージが表示されます。以下の様な感じです。
これでは日本の利用者は驚いてしまいますよね。したがって日本語に翻訳したエラーメッセージを表示させるのはマストと言えます。
日本語表示させる場合、以下の選択肢があります。
- FormRequestクラスの子クラスで設定する
- 言語ファイルで設定する
本ページでは、2の言語ファイルを編集する方法についてご紹介します。サイト全体に設定できる点で、1よりもメリットがあります。
1に関してはFormRequestクラスの子クラスで設定するで解説していますのでご参照ください。
本ページでは、Laravel10系を利用しています。Laravel9以前に構築されたLaravelでは、langディレクトリがルートではなく、resources下にある可能性がありますのでご注意ください。目次
事前準備
ロケールが日本になっているか
ロケール=アプリケーションのデフォルトの言語が、日本語になっていることを確認します。
具体的には、config/app.phpの中にあるlocaleが’ja’になっていることを確認してください。
インストール直後は’en’になっているはずですが、大抵のケースでは最初に’ja’にしているとは思います。
'locale' => 'ja',
言語ファイルの作成……の前に確認
言語ファイルがすでにあれば、新たに作成する必要はありません。ですので、まずは言語ファイルを探してみましょう。
Laravel9より前のバージョンの場合、もしくはLaravel9以前からアップデートしてLaravel9~10にされている方は、resources/lang/内にディレクトリが無いか確認してみてください。
もしすでにある場合、あなたの環境ではそれが正式な言語ファイルの設置場所です。本項以降、本記事のlang/はresources/lang/と読みかえてください。
最初からLaravel9~の場合は、lang/内にディレクトリがあるかをご確認ください。
言語ファイルの作成
今回、バリデーション関連の言語ファイルである、lang/ja/validation.phpという設定ファイルを作るのが目的です。すでにあれば作成しなくてOKですので、以下をご確認ください。
- lang/ja/validation.phpがある→作成しなくてOK
- lang/en/validation.phpがある→ enディレクトリを複製してjaにし、その中のvalidation.phpを編集します。
- lang/が無い→次の方法で用意します。
lang/が無い場合のみ、以下のコマンドを打ってください。
php artisan lang:publish
すると、lang/enというディレクトリが出来ていると思います。続いてlang内のenを複製し、jaと名前を変えます。
これで結果的に、lang/en/validation.phpというファイルが出来ているはずです。
次項から、このファイルを編集していきましょう。
Lara
Laravel9からlangディレクトリが最上位に移りました。resources/langがある場合は、そちらが優先して機能しますのでご安心ください。
ファイル内容を理解する
実際に修正する前に、lang/en/validation.phpファイルがどういう構造なのかを眺めておきましょう。
ファイルを見てみる
まずは開いてみます。私の環境では、以下の様になっていました。
return [
/*
|--------------------------------------------------------------------------
| Validation Language Lines
|--------------------------------------------------------------------------
|
| The following language lines contain the default error messages used by
| the validator class. Some of these rules have multiple versions such
| as the size rules. Feel free to tweak each of these messages here.
|
*/
'accepted' => 'The :attribute field must be accepted.',
'accepted_if' => 'The :attribute field must be accepted when :other is :value.',
'active_url' => 'The :attribute field must be a valid URL.',
'after' => 'The :attribute field must be a date after :date.',
'after_or_equal' => 'The :attribute field must be a date after or equal to :date.',
'alpha' => 'The :attribute field must only contain letters.',
'alpha_dash' => 'The :attribute field must only contain letters, numbers, dashes, and underscores.',
'alpha_num' => 'The :attribute field must only contain letters and numbers.',
'array' => 'The :attribute field must be an array.',
'ascii' => 'The :attribute field must only contain single-byte alphanumeric characters and symbols.',
'before' => 'The :attribute field must be a date before :date.',
'before_or_equal' => 'The :attribute field must be a date before or equal to :date.',
'between' => [
'array' => 'The :attribute field must have between :min and :max items.',
'file' => 'The :attribute field must be between :min and :max kilobytes.',
'numeric' => 'The :attribute field must be between :min and :max.',
'string' => 'The :attribute field must be between :min and :max characters.',
],
// ~かなり省略~
'attributes' => [],
];
この中で重要なのは、33行目の配列と、それ以外です。
33行目:項目名の日本語化で使用
33行目の’attributes’では、お名前、メールアドレス、電話番号などの項目名を日本語化するのに使います。後に例を挙げますが、これを設定しないとname, email, telなどのままになってしまうのです。
'attributes' => [
// ここに配列で定義する
],
それ以外:ルールに対応するエラーメッセージの日本語化で使用
それ以外は、バリデーションルール毎のエラーメッセージ文の日本語化に使います。例えば以下はバリデーションルールが’accepted’にて、エラーが発生したときの文言です。
'accepted' => 'The :attribute field must be accepted.',
日本語のエラーメッセージを設定
いよいよ設定に移りたいと思います。ここではvalidation.phpが作成された直後を想定して、具体的に日本語のエラーを設定していきます。
バリデーションルール
具体的なバリデーションルールが無いと説明が分かりづらいです。そのため本ページでは、以下をルールとして設定します。説明用なので極めてシンプルにしました。
public function rules(): array
{
return [
'name' => ['required', 'max:10'],
'email' => ['required', 'email'],
];
}
この状態で、何も入力しないと、以下の画像の様なエラーメッセージになっています。
requiredルールのエラーを日本語化する
requiredルールのエラーが定義されている部分を探します。私の例では128行目にありました。
'required' => 'The :attribute field is required.',
これを以下にします。
// 'required' => 'The :attribute field is required.',
'required' => ':attributeが入力されていません。',
1行目はコメントアウト(無効)にし、2行目で日本語化しています(慣れている方は、直接編集してもOKです)。
:attribute部分は置き換わるので、今のところはそのまま残してください。
コロンがついた文字列はプレースホルダーと言い、Laravelが他の文字に置き換える用途に使われます。その他 :min など、コロンがついた英単語は全てそのまま残してください。
これで試すと……こうなります。
name, emailがまだ翻訳されていませんが、良い感じですね。このように動的に変わる部分は:attributeで置き換わるのですが、また別で日本語を指定する必要があります。
Lara
是非’require’以外も挑戦してみてください。基本は他も同じです。
項目名を日本語化する
ここでは’name’, ‘email’という項目に対しての日本語を定義します。以下の様に’attributes’内にそれぞれ以下のように指定すればOKです。なお、’attributes’はファイルの最後の方にあります。
'attributes' => [
'name' => 'お名前',
'email' => 'メールアドレス',
],
これで、以下の様に無事日本語化できました!
FormRequestでの指定について
今回設定した内容は、Laravelアプリケーション全体で使用されます。実務では、一部のフォームなどでは別の日本語にしたい場合もあるかもしれません。
例えば今回、nameを「お名前」としました。しかしあるフォームでは「お客さま名」としたいケースなどはよくあることです。
これに関してはFormRequesを継承した子クラスで指定すればOK。そのフォームの設定のみ上書きされます。FormRequesでの指定は、以下ページをご覧ください。
まとめ
以上、言語ファイルを編集して、Laravelのバリデーションエラー時のメッセージを日本語化しました。日本語化できた時のうれしさは格別ですよね。
本文でも書いたとおり、FormRequestを使った方法と併用もできますので、適材適所で設定すると良いと思います。