【Laravel】バリデーションエラーを日本語化してメッセージを表示する|簡単な掲示板アプリの作成

Laravelのバリデーションエラーメッセージを、デフォルトの英語から日本語に変更する方法を解説します。アプリケーション全体の言語設定を日本語に切り替え、翻訳ファイルを作成してメッセージをカスタマイズする手順が学べます。また、Bladeの@errorディレクティブを使って、ビューにエラーメッセージを簡単に表示する方法もわかります。

作成日: 更新日:

開発環境

  • OS: Windows10
  • Visual Studio Code: 1.73.0
  • PHP: 8.3.11
  • Laravel: 11.29.0
  • laravel/breeze: 2.2

サンプルコード

/config/app.php

/config/app.php
1     |
2     */
3 
4-    'locale' => env('APP_LOCALE', 'en'),
5+    'locale' => env('APP_LOCALE', 'ja'),
6 
7     'fallback_locale' => env('APP_FALLBACK_LOCALE', 'en'),
8 
9

/resources/lang/ja/validation.php

/resources/lang/ja/validation.php
1+<?php
2+
3+return [
4+    'max' => [
5+        'string' => ':attributeは:max文字以内で入力してください。',
6+    ],
7+    'required' => ':attributeは必須項目です。',
8+    'email' => ':attributeは有効なメールアドレスを入力してください。',
9+    'attributes' => [
10+        'name' => '名前',
11+        'email' => 'メールアドレス',
12+        'message' => 'メッセージ',
13+    ],
14+];
15

/resources/views/contact/index.blade.php

/resources/views/contact/index.blade.php
1         <div class="mb-3">
2             <label for="name" class="form-label">お名前</label>
3             <input type="text" name="name" id="name" class="form-control" value="{{ old('name') }}" required>
4+            {{-- @if ($errors->has('name'))
5+                <div class="text-danger">{{ $errors->first('name') }}</div>
6+            @endif --}}
7+            @error('name')<div class="text-danger">{{ $message }}</div>@enderror
8         </div>
9         <div class="mb-3">
10             <label for="email" class="form-label">メールアドレス</label>
11             <input type="email" name="email" id="email" class="form-control" value="{{ old('email') }}" required>
12+            {{-- @if ($errors->has('email'))
13+                <div class="text-danger">{{ $errors->first('email') }}</div>
14+            @endif --}}
15+            @error('email')<div class="text-danger">{{ $message }}</div>@enderror
16         </div>
17         <div class="mb-3">
18             <label for="message" class="form-label">メッセージ</label>
19             <textarea name="message" id="message" class="form-control" rows="5" required>{{ old('message') }}</textarea>
20+            {{-- @if ($errors->has('message'))
21+                <div class="text-danger">{{ $errors->first('message') }}</div>
22+            @endif --}}
23+            @error('message')<div class="text-danger">{{ $message }}</div>@enderror
24         </div>
25         <button type="submit" class="btn btn-primary">確認</button>
26     </form>
27

コード解説

変更点: アプリケーションの言語設定を日本語に変更

/config/app.php
1-    'locale' => env('APP_LOCALE', 'en'),
2+    'locale' => env('APP_LOCALE', 'ja'),

config/app.phpは、Laravelアプリケーション全体の基本的な設定を管理するファイルです。この中で'locale'というキーは、アプリケーションのデフォルト言語を指定します。今回は、この値を'en'(英語)から'ja'(日本語)に変更しました。これにより、Laravelはバリデーションエラーメッセージなどを表示する際に、デフォルトで日本語の翻訳ファイルを参照しにいくようになります。アプリケーションの国際化対応の第一歩となる重要な設定です。

変更点: 日本語用のバリデーションメッセージファイルを作成

/resources/lang/ja/validation.php
1+<?php
2+
3+return [
4+    'max' => [
5+        'string' => ':attributeは:max文字以内で入力してください。',
6+    ],
7+    'required' => ':attributeは必須項目です。',
8+    'email' => ':attributeは有効なメールアドレスを入力してください。',
9+    'attributes' => [
10+        'name' => '名前',
11+        'email' => 'メールアドレス',
12+        'message' => 'メッセージ',
13+    ],
14+];

config/app.phpで言語設定を日本語にしただけでは、対応する日本語の翻訳ファイルがないため、メッセージは日本語化されません。そこで、resources/lang/ja/ディレクトリの中に、バリデーションメッセージを定義するvalidation.phpというファイルを新規に作成しました。このファイルでは、連想配列形式で翻訳を定義します。'required''max.string'のように、バリデーションルール名に対応するキーに対して、表示したい日本語メッセージを設定します。メッセージ内の:attribute:maxといった部分は「プレースホルダー」と呼ばれ、エラーが発生した際に具体的な項目名や数値に自動で置き換えられます。attributes配列では、この:attributeプレースホルダーに表示される項目名を定義します。例えば、'name' => '名前'と設定することで、「nameは必須項目です」ではなく「名前は必須項目です」といった、ユーザーにとってより分かりやすいメッセージを表示できるようになります。

変更点: Bladeの@errorディレクティブでエラーメッセージを表示

/resources/views/contact/index.blade.php
1-            {{-- @if ($errors->has('name'))
2-                <div class="text-danger">{{ $errors->first('name') }}</div>
3-            @endif --}}
4+            @error('name')<div class="text-danger">{{ $message }}</div>@enderror

resources/views/contact/index.blade.phpは、ユーザーに表示されるお問い合わせフォームの画面を定義するファイルです。ここでは、各入力項目の下にバリデーションエラーメッセージを表示する方法を、よりシンプルで分かりやすい記述に変更しました。LaravelのBladeテンプレートには@errorという便利なディレクティブが用意されています。@error('name')と記述すると、'name'という項目にバリデーションエラーがある場合にのみ、@error@enderrorで囲まれた内側の処理が実行されます。さらに、その内側では$messageという特別な変数を自動的に使うことができ、この変数の中に日本語化されたエラーメッセージが格納されています。これにより、以前の@if ($errors->has('name'))のような条件分岐を書く必要がなくなり、コードが非常にスッキリと読みやすくなります。今回は、nameemailmessageの全ての入力欄でこの@errorディレクティブを使うように修正しています。

おわりに

今回は、config/app.phplocale設定を'ja'に変更し、アプリケーションの基本言語を日本語に切り替えました。次に、resources/lang/ja/validation.phpファイルを作成して、「名前は必須項目です。」といったユーザーに分かりやすい日本語メッセージを定義しました。最後に、ビューではBladeの@errorディレクティブを使うことで、よりシンプルで直感的なコードでエラーメッセージを表示する方法を学びました。

関連コンテンツ