Laravelのパスワード再設定メールを安全に日本語化する方法

こんにちはー!むちょこです。

LaravelのAuthには、パスワードリセット機能がついていることをご存知でしょうか。

とても簡単に導入できる便利な機能ですが、そのままだと英語で読みづらいので日本語化するための簡単かつ安全な方法をご紹介したいと思います。

この記事はLaravel 6.18で確認して書いています。

他のバージョンの場合は確認していませんので、恐れ入りますがご自身で各ファイルのコードを実際に確認しながらご利用ください。

パスワードリセット機能

MEMO

パスワードリセット機能の導入方法はここでは割愛します。簡単にできますので、まだの方はこちらをご参照の上ぜひお試しください。

https://readouble.com/laravel/6.x/ja/passwords.html

パスワードリセット機能では、フォームに入力されたメールアドレス宛にパスワードを変更するためのURLがメールで送られます。

メール内容は、デフォルトのままだとこんな感じです。

このメールの本文や件名は、以下の2ファイルに記述されています(読まなくても問題ありません。バージョンが違う方や興味のある方のみ参考までにご覧ください)。

vendor/laravel/framework/src/Illuminate/Notifications/resources/views/email.blade.php
@component('mail::message')
{{-- Greeting --}}
@if (! empty($greeting))
# {{ $greeting }}
@else
@if ($level === 'error')
# @lang('Whoops!')
@else
# @lang('Hello!')
@endif
@endif

{{-- Intro Lines --}}
@foreach ($introLines as $line)
{{ $line }}

@endforeach

{{-- Action Button --}}
@isset($actionText)
<?php
    switch ($level) {
        case 'success':
        case 'error':
            $color = $level;
            break;
        default:
            $color = 'primary';
    }
?>
@component('mail::button', ['url' => $actionUrl, 'color' => $color])
{{ $actionText }}
@endcomponent
@endisset

{{-- Outro Lines --}}
@foreach ($outroLines as $line)
{{ $line }}

@endforeach

{{-- Salutation --}}
@if (! empty($salutation))
{{ $salutation }}
@else
@lang('Regards'),<br>
{{ config('app.name') }}
@endif

{{-- Subcopy --}}
@isset($actionText)
@slot('subcopy')
@lang(
    "If you’re having trouble clicking the \":actionText\" button, copy and paste the URL below\n".
    'into your web browser:',
    [
        'actionText' => $actionText,
    ]
) <span class="break-all">[{{ $displayableActionUrl }}]({{ $actionUrl }})</span>
@endslot
@endisset
@endcomponent
vendor/laravel/framework/src/Illuminate/Auth/Notifications/ResetPassword.php
<?php

namespace Illuminate\Auth\Notifications;

use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Notifications\Notification;
use Illuminate\Support\Facades\Lang;

class ResetPassword extends Notification
{
    /**
     * Build the mail representation of the notification.
     *
     * @param  mixed  $notifiable
     * @return \Illuminate\Notifications\Messages\MailMessage
     */
    public function toMail($notifiable)
    {
        if (static::$toMailCallback) {
            return call_user_func(static::$toMailCallback, $notifiable, $this->token);
        }

        return (new MailMessage)
            ->subject(Lang::get('Reset Password Notification'))
            ->line(Lang::get('You are receiving this email because we received a password reset request for your account.'))
            ->action(Lang::get('Reset Password'), url(route('password.reset', ['token' => $this->token, 'email' => $notifiable->getEmailForPasswordReset()], false)))
            ->line(Lang::get('This password reset link will expire in :count minutes.', ['count' => config('auth.passwords.'.config('auth.defaults.passwords').'.expire')]))
            ->line(Lang::get('If you did not request a password reset, no further action is required.'));
    }
}

よく紹介されているのはこれらのファイルをオーバーライドしたり、新しく自分でクラスを作る方法ですが、日本語化したいだけならそれらは必要ありません。

出力される文言はすべて多言語に対応しているため、日本語用の言語ファイルに追加してあげるだけで大丈夫です。

多言語に対応しているか確認する方法

Bladeテンプレートエンジン内で@lang()か{{ __() }}が使われていたら、その引数は多言語に対応しています。
その他のプログラム内ではLang::get()の引数が多言語に対応しています。

日本語化の方法

まずは言語を日本語に設定しましょう。

config/app.php
'locale' => 'ja',

次に日本語用の言語ファイルを用意します。もし既にファイルがある場合はそちらに追記してください。

resources/lang/ja.json
"Hello!": "こんにちは!",
"Whoops!": "おっと!",
"Regards": "どうぞよろしくお願いします",
"If you’re having trouble clicking the \":actionText\" button, copy and paste the URL below\ninto your web browser:": ":actionTextボタンをクリックできない場合は、次
      のURLをコピーしてブラウザに貼り付けてください。\n",
"Reset Password Notification": "パスワード再設定のお知らせ",
"You are receiving this email because we received a password reset request for your account.": "あなたのアカウントからパスワード再設定のリクエストがありました。",
"This password reset link will expire in :count minutes.": "このリンクの有効期限は、:count 分後までです。",
"If you did not request a password reset, no further action is required.": "もしこのメールにお心当たりがない場合は、このまま放置していただいて大丈夫です。"

右側の日本語訳の方は、私が適当に意訳したものです。適宜変更してくださいね。

左側は翻訳するためのキーになっているので、変更してはいけません(バージョンの違い等で、コード上で使われているキーが変わったときは変更が必要です)。

これでメールの日本語化が完了です!

トラブルシューティング

「表示が変わらないよ?」という方は、configのキャッシュをクリアしてみてください。

コマンド
$ php artisan config:clear