概要
バリデーションエラーはデフォルトで英語だが、これを日本語にしてみる。
方法の1つとして、ロケールja
に対するメッセージファイルを編集する方法を整理する。
元になるアプリケーション
ルーティング
GETリクエストに対してフォームを含むビューを表示し、POSTリクエストに対してバリデーション処理を実行する。
1 2 |
Route::get('/validation_message', 'SampleController@validationMessage'); Route::post('/validation_message', 'SampleController@validationMessageResult'); |
ビュー
フォームでユーザー名とメールアドレスを入力し、POST処理の結果バリデーションエラーがあれば表示する。
1 2 3 4 5 6 7 8 9 10 |
<h1>{{ $title }}</h1> <form method="post"> @csrf <p><input type="text" name="name" placeholder="ユーザー名:10文字以内"></p> <p><input type="text" name="email" placeholder="メールアドレス:**@**"></p> <input type="submit" value="送信"> </form> <p>{!! implode('<br>', $errors->all()) !!}</p> |
コントローラー
フォーム表示
GETリクエストに対してフォーム画面を表示する。
1 2 3 4 5 |
public function validationMessage() { return view('samples.validation_message', [ 'title' => 'カスタムバリデーションメッセージ', ]); } |
POST処理
POSTリクエストに対して、ユーザー名とメールアドレスのバリデーションを実行。
1 2 3 4 5 6 7 8 |
public function validationMessageResult(Request $request) { $request->validate([ 'name' => ['required', 'max:10'], 'email' => ['required', 'email'], ]); return redirect('/validation_message'); } |
この場合のバリデーションエラーは以下の様に表示される。
1 2 |
The name field is required. The email field is required. |
あるいは
1 2 |
The name may not be greater than 10 characters. The email must be a valid email address. |
ロケール設定による日本語化
ReaDouble.comのバリデーションのドキュメントでエラーメッセージのカスタマイズについて説明されていて、ローカライゼーションについては多言語化ドキュメントを参照するよう示唆されている。
これに基づいて、バリデーションエラーメッセージの日本語化をローカライゼーション周りで実装する方法を整理する。
言語の選択
config/app.php
でロケール設定を変更する。
locale
をデフォルトのen
からja
に変更locale
がja
で見つからないときのfallback_locale
がデフォルトでen
になっていることを確認- これにより、日本語ロケールの設定がある場合は日本語が適用され、見つからない場合は英語の設定が適用される
1 2 3 4 5 |
..... 'locale' => 'ja', ..... 'fallback_locale' => 'en', ..... |
バリデーションエラーメッセージのコピー・編集
resources/en/validation.php
で英語のバリデーションメッセージが定義されている。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<?php return [ ..... 'email' => 'The :attribute must be a valid email address.', ..... 'max' => [ 'numeric' => 'The :attribute may not be greater than :max.', 'file' => 'The :attribute may not be greater than :max kilobytes.', 'string' => 'The :attribute may not be greater than :max characters.', 'array' => 'The :attribute may not have more than :max items.', ], ..... 'required' => 'The :attribute field is required.', ..... ]; |
日本語ロケール設定のため、ja
ディレクトリーを作成し、そこにコピーしたvalidation.php
を編集する。
resources/ja
ディレクトリーを作成ja
ディレクトリー下にvalidation.php
をコピー- 必要なバリデーションメッセージを日本語化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<?php return [ ..... 'email' => ':attributeが正しい形式ではありません。', ..... 'max' => [ 'numeric' => 'The :attribute may not be greater than :max.', 'file' => 'The :attribute may not be greater than :max kilobytes.', 'string' => ':attributeは:max文字を超えられません。', 'array' => 'The :attribute may not have more than :max items.', ], ..... 'required' => ':attributeの入力が必要です。', ..... ]; |
:attribute
はエラーが発生したフィールドのname
属性の値で置き換えられる。また:max
はバリデーションで設定した値に置き換えられる。
これにより、バリデーションエラーが生じたときの表示は以下の様に日本語化される。
1 2 |
nameの入力が必要です。 emailの入力が必要です。 |
あるいは
1 2 |
nameは10文字を超えられません。 emailが正しい形式ではありません。 |
属性の日本語化
上記のメッセージでは、:attribute
が置き換えられるname
属性のname
やemail
がそのまま現れている。
これらは、validation.php
の最後にある'attributes'
に連想配列を記述することで、日本語表現に置き換えることができる。
1 |
'attributes' => [], |
今回の例の場合、name
属性はname
(ユーザー名)とemail
(メールアドレス)なので、これらを日本語に置き換えるよう定義する。
1 2 3 4 |
'attributes' => [ 'email' => 'メールアドレス', 'name' => 'ユーザー名' ], |
この結果、バリデーションエラーメッセージは以下の様になる。
1 2 |
ユーザー名の入力が必要です。 メールアドレスの入力が必要です。 |
あるいは
1 2 |
ユーザー名は10文字を超えられません。 メールアドレスが正しい形式ではありません。 |
エラーメッセージを日本語化したもの以外のバリデーションに対しては、元のまま残っている英語の内容が使われる。
たとえばバリデーションを追加する。
1 |
'email' => ['required', 'email', 'regex:/^\w+@\w+$/'], |
そうするとバリデーションエラーは以下のようになる。
1 |
The メールアドレス format is invalid. |
全体のセンテンスは英語だが、name
属性email
がattributes
で変更した内容に置き換えられている。