概要
バリデーションエラーはデフォルトで英語だが、これを日本語にしてみる。
方法の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で変更した内容に置き換えられている。