前提
Laravel 6.6で確認しています。
やりたいこと
- べつに独自のエラーページは作らなくてもいいけど、日本語にしたい。
- エラーページにちょこっと手を加えたい。
- FormRequestの
authorize
やGateでの403エラーを日本語にしたい。
手順
1.翻訳ファイルの作成
/resources/lang/
の直下に(en
やja
に入れない)
ja.json
という名前でjsonファイルを作成します。
2.日本語化
あとは下記のように、日本語のメッセージを書いていきます。
{
"Unauthorized": "未認証",
"Forbidden": "許可されていません。",
"Not Found": "ページが見つかりません。",
"Page Expired": "有効期限が切れています。",
"Too Many Requests": "リクエストが頻繁です。",
"Server Error": "エラーが発生しました。",
"Service Unavailable": "現在サービスはご利用頂けません。",
}
ただしこれでは、Formrequest
のauthorize
メソッドがfalse
の時や、Gate
などで認可状態でないときに
403 | This action is unauthorized
と出てしまいます。
これは、vendor\laravel\framework\src\Illuminate\Auth\Access\AuthorizationException.php
内でエラーが出たときに、メッセージがなかったらこのメッセージにするとべた書きで決まっているためです。
/**
* Create a new authorization exception instance.
*
* @param string|null $message
* @param mixed $code
* @param \Exception|null $previous
* @return void
*/
public function __construct($message = null, $code = null, Exception $previous = null)
{
parent::__construct($message ?? 'This action is unauthorized.', 0, $previous);
$this->code = $code ?: 0;
}
なので、Handler
クラスを修正し、下記のようにエラーが出たら
インスタンスを判別し、403と独自のメッセージを返すようにします。
/**
* Render an exception into an HTTP response.
*
* @param \Illuminate\Http\Request $request
* @param \Exception $exception
* @return \Illuminate\Http\Response
*/
public function render($request, Exception $exception)
{
if ($exception instanceof \Illuminate\Auth\Access\AuthorizationException) {
return abort(403, __('Unauthorized Action'));
}
return parent::render($request, $exception);
}
そして、ja.json
に追記します。
{
~省略~
"Unauthorized Action": "許可されていない操作です。"
}
これで日本語化できたと思います。
もし、漏れていても同様にすれば日本語化できるはずです。
エラーページにちょこっと手を加えたい
php artisan vendor:publish --tag=laravel-errors
上記コマンドで、views
配下にerrors
が作成され、そこにデフォルトのエラーページも入っているので、よしなに編集します。
ちなみに、https://github.com/caouecs/Laravel-lang で様々な国の翻訳ファイルが公開されています。
今回日本語化したもの以外にも、デフォルトのview
で使用されているものも翻訳されています。
バリデーションエラーや、独自ページ作る系の記事が多いのでそんなに需要ない感じなんですかね。