6.

Laravel バリデーションの日本語化完全ガイド

編集
この記事の要点
  • Laravel デフォルトの英語バリデーションメッセージを日本語化する手順を網羅
  • 基本は ① config/app.phplocale => "ja"resources/lang/ja/validation.php 作成 ③ attributes 配列で項目名翻訳
  • laravel-lang/lang パッケージで全メッセージを一括導入可能
  • Form Request の messages() / attributes() で個別カスタマイズ
  • Laravel 9+ は lang/、Laravel 8 以前は resources/lang/ がデフォルト

なぜ日本語化が必要か

Laravel のバリデーションエラーはデフォルトで英語です:

The name field is required.
The email must be a valid email address.
The password must be at least 8 characters.

日本人向けサービスでは違和感があるので、日本語化が必須です。

手順1: locale を ja に変更

// config/app.php
return [
    'locale' => 'ja',         // ← en から ja へ
    'fallback_locale' => 'en',
    'faker_locale' => 'ja_JP',
    // ...
];

キャッシュ反映:

php artisan config:clear
php artisan config:cache

手順2: 翻訳ファイル作成

Laravel 9+ は lang/、8 以前は resources/lang/ 配下に ja/validation.php を作成:

// lang/ja/validation.php
 ':attribute は必須項目です。',
    'email'    => ':attribute は有効なメールアドレス形式で入力してください。',
    'min'      => [
        'string'  => ':attribute は :min 文字以上で入力してください。',
        'numeric' => ':attribute は :min 以上の数値で入力してください。',
        'array'   => ':attribute は :min 個以上選択してください。',
    ],
    'max'      => [
        'string'  => ':attribute は :max 文字以下で入力してください。',
        'numeric' => ':attribute は :max 以下の数値で入力してください。',
    ],
    'unique'   => '入力された :attribute は既に使用されています。',
    'confirmed'=> ':attribute と確認用の入力が一致しません。',
    'numeric'  => ':attribute は数値で入力してください。',

    'attributes' => [
        'name'     => '名前',
        'email'    => 'メールアドレス',
        'password' => 'パスワード',
        'tel'      => '電話番号',
    ],

    'custom' => [
        'email' => [
            'required' => 'メールアドレスを入力してください。',
            'unique'   => 'このメールアドレスは既に登録されています。',
        ],
    ],
];

手順3: 動作確認

// routes/web.php または Controller
$request->validate([
    'name'     => 'required|max:20',
    'email'    => 'required|email|unique:users',
    'password' => 'required|min:8|confirmed',
]);

送信して空のままだと以下のように表示されます:

名前 は必須項目です。
メールアドレス は必須項目です。
パスワード は必須項目です。

手順 (簡単版): laravel-lang/lang パッケージ

全てのメッセージを自分で書くのは大変。laravel-lang/lang パッケージを使えば 一発:

composer require laravel-lang/common --dev
php artisan lang:add ja

これで lang/ja/ 配下に validation.phpauth.phppagination.phppasswords.php が一括生成されます。70+ 言語対応。

Form Request での個別カスタマイズ

// app/Http/Requests/UserStoreRequest.php
namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class UserStoreRequest extends FormRequest
{
    public function authorize(): bool
    {
        return true;
    }

    public function rules(): array
    {
        return [
            'name'  => 'required|max:20',
            'email' => 'required|email|unique:users',
            'age'   => 'nullable|integer|between:0,120',
        ];
    }

    // この Request 専用のメッセージ
    public function messages(): array
    {
        return [
            'name.required'  => 'お名前を入力してください。',
            'email.required' => 'メールアドレスを入力してください。',
            'email.unique'   => 'このメールアドレスは既に登録済です。',
            'age.between'    => '年齢は :min から :max の範囲で入力してください。',
        ];
    }

    // この Request 専用の属性名
    public function attributes(): array
    {
        return [
            'name'  => 'お名前',
            'email' => 'メールアドレス',
            'age'   => '年齢',
        ];
    }
}

プレースホルダ一覧

プレースホルダ意味
:attribute項目名名前
:min / :max最小/最大値8
:value入力値foo
:sizeサイズ10
:other他フィールド名パスワード確認
:date日付2024-01-01

JSON API のメッセージ形式

Laravel は Accept: application/json が付くと自動で JSON 422 を返す:

{
  "message": "The given data was invalid.",
  "errors": {
    "name": ["名前 は必須項目です。"],
    "email": ["メールアドレス は有効なメールアドレス形式で入力してください。"]
  }
}

トップレベルの message も翻訳したい場合はカスタム例外ハンドラで対応:

// app/Exceptions/Handler.php (Laravel 10 以前) または
// bootstrap/app.php (Laravel 11+)
use Illuminate\Validation\ValidationException;

$exceptions->render(function (ValidationException $e, $request) {
    if ($request->expectsJson()) {
        return response()->json([
            'message' => '入力内容に誤りがあります。',
            'errors'  => $e->errors(),
        ], 422);
    }
});

よくあるハマりどころ

  • locale を変えてもキャッシュで反映されないphp artisan config:clear
  • 翻訳ファイルが resources/lang/ にある → Laravel 9+ は lang/ へ移動 (php artisan lang:publish)
  • attributes が効かない → validation.php の attributes キーに記述する。別ファイルに書くと読まれない
  • カスタムルールphp artisan make:rule で生成したルールのメッセージは message() 内で __() を使う

FAQ

Q: 英語と日本語を両立したい
A: ユーザー設定に応じて App::setLocale($lang) をミドルウェアで設定。lang/en/lang/ja/ 両方用意する。

Q: バリデーション以外(認証メール等)も日本語化したい
A: lang/ja/auth.phplang/ja/passwords.phplang/ja/pagination.php も作成。laravel-lang/lang ならまとめて入る。

Q: ja_JP / ja-JP どちらが正しい?
A: Laravel の locale は ja または ja_JP。Faker の locale は ja_JP。混同しないよう注意。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. 入力データの保持
  2. 必須チェック
  3. 文字列の長さチェック
  4. 存在チェック
  5. 一意チェック
  6. 日本語化