【Laravel】バリデーションエラーメッセージのmore errorsを日本語にする方法

  • 2024年3月1日
  • 2024年3月1日
  • Laravel

 LaravelはPHPのフレームワークで多言語化機能が備わっています。この多言語化機能でバリデーションエラーメッセージを日本語にしているとmore errorsというメッセージが日本語にならないという問題に直面することがあります(多分私以外も引っ掛かったことがあるはず)。この部分を多言語対応する方法を紹介します。

 題の more errors とはJSONレスポンスに加工したバリデーション例外のメッセージに現れる次の部分です。例ではmore errorですが、エラー件数が3つ以上になるとmore errorsになります。

{
    "message": "testは必ず指定してください。 (and 1 more error)",
    "errors": {
        "test": [
            "testは必ず指定してください。"
        ],
        "test2": [
            "test2は必ず指定してください。"
        ]
    }
}

 この問題はLaravelの多言語対応をPHPファイルのみで行おうとしている場合に起きます。/lang/validation.phpを用意して日本語メッセージを書いたのにバリデーションエラーのメッセージが日本語にならない、というやつです。

この問題を解決する方法は少なくとも3つあります。

 1つ目は /lang/ja.json ファイルに次のようにメッセージを追加する方法です。

{
    "(and :count more error)" : "(他:count件のエラー)",
    "(and :count more errors)" : "(他:count件のエラー)"
}

 JSONファイルによる多言語化を用います。more errorのメッセージはキーが存在しない多言語対応メッセージでありPHPファイル上には定義できません。このJSONを用意する方法は日本語にするだけなら一番楽でおすすめです。

 2つ目は次のようにLaravel起動後に任意のメッセージを追加する方法です。

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    public function boot(): void
    {
        \Lang::addLines(
            [
                '*.(and :count more error)' => '(他:count件のエラー)',
                '*.(and :count more errors)' => '(他:count件のエラー)',
            ],
            'ja'
        );
    }
}

 Langファサード経由で動的にメッセージを追加します。概ね言語ファイルで事足りるため滅多に使わない方法ですが、これでも日本語化できます。

 3つ目は次のように例外のハンドリングでメッセージを上書きする方法です。

<?php

namespace App\Exceptions;

use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;

class Handler extends ExceptionHandler
{
    public function render($request, \Throwable $e)
    {
        $ret = parent::render($request, $e);

        // バリデーション例外をJSON形式で返す場合、エラーメッセージを制御する
        if ($e instanceof \Illuminate\Validation\ValidationException && $ret instanceof \Illuminate\Http\JsonResponse) {
            $ret->setData([
                'errors'  => $e->errors(),
                // ↓でいい感じの日本語メッセージを作る。ここでは各項目のエラー内容の列挙にしている
                'message' => implode("\n", \Arr::flatten($e->errors())), 
            ]);
        }

        return $ret;
    }
}

 この方法は詳細なエラー情報を自在に制御できるのが利点です。メッセージ時点でより詳しい情報を表示したい時はこの方法をとります。またサポート切れバージョンの話になりますがLaravel8以前でも同じ動作をするという利点もあります(以前この部分のメッセージは多言語対応していませんでした)。

 Laravelのメッセージをざっと日本語化する時、私的におすすめなライブラリはLaravel-Lang/langです。下記コマンドを実行して、インストールと言語ファイルの展開をすればmore errorも含めて大部分のメッセージが日本語化されます。

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

# config/app.phpのlocaleをjaに設定
# 'locale' => 'ja',

 出力されたメッセージが作っているアプリケーションに合わないこともよくありますが、改修はソースコードの中をそのメッセージで検索して書き換えるだけで済むので無の状態より大分やりやすくなります。

>株式会社シーポイントラボ

株式会社シーポイントラボ

TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:〒432-8003
   静岡県浜松市中央区和地山3-1-7
   浜松イノベーションキューブ 315
※ご来社の際はインターホンで「316」をお呼びください

CTR IMG