Laravel 5.8 認証通知メールの多言語化

##通知処理の実態
`make:auth`で実装されるものは基本的な処理のみで
骨格となる処理はvendor/laravel/framework配下に実装されている

###メール内容の多言語化
メール本文は以下のphpで実装されている。
`vendor/laravel/framework/src/Illuminate/Auth/Notifications`
ResetPassword.php⇒パスワードリセット通知
VerifyEmail.php⇒登録時認証メール通知

`Lang::getFromJson()`でja.jsonの置換を行っている。

メールのヘッダーフッターは以下のファイルを使用している。
`vendor/laravel/framework/src/Illuminate/Notifications/resources/views/`配下にある。
email.blade.php

`@lang()`に囲われた文字列をja.jsonに定義することで変換される

```
@lang(
    "If you’re having trouble clicking the \":actionText\" button, copy and paste the URL below\n".
    'into your web browser: [:actionURL](:actionURL)',
    [
        'actionText' => $actionText,
        'actionURL' => $actionUrl,
    ]
)
```

上記は複雑ですが`.`を削除して、文字列を連結してja.jsonに定義すれば翻訳されるようです。

```json:resouces/lang/ja.json
{
(略)
    "If you’re having trouble clicking the \":actionText\" button, copy and paste the URL below\ninto your web browser: [:actionURL](:actionURL)": "もし\":actionText\"ボタンをクリックできない場合は、以下のURLをコピー＆ペーストして、ブラウザから入力してください。[:actionURL](:actionURL)"
(略)
}
```

独自のメールにしたい場合は、先人たちの例に沿って既存の通知処理をカスタムする。
参考URL
[Laravelパスワードリセットメールの文面・デザインを変更する](https://www.ritolab.com/entry/52#create_Notification_class)

###認証メール・パスワード再設定メールのカスタム
以下のコマンドでそれぞれの通知クラスを作成する

```bash
$ php artisan make:notification CustomResetPasswordNotification
$ php artisan make:notification CustomVerifyEmailNotification
```

`app/Notifications`フォルダが作成され、phpファイルが生成される。

####リセット通知のカスタム
#####通知クラスとメール内容の変更
`toMail()`を以下のように変える。

```php:app/Notifications/CustomResetPasswordNotification.php

use Illuminate\Auth\Notifications\ResetPassword; // ResetPasswordクラス参照

class CustomResetPasswordNotification extends Notification
{
    public $token;
//    public function __construct()
    public function __construct($token)
    {
        $this->token = $token;
    }
    public function toMail($notifiable)
    {
        return (new MailMessage)
            ->subject(__('Reset Password'))
            ->view('vendor.notifications.email')
            ->action(__('Reset Password'), url('password/reset', $this->token));
    }
}
```

標準の`email.blade.php`を`resources/views/vendro/notifications/`に用意する。
メールの定型文を大幅に変える場合、email.blade.phpを複製してカスタマイズする。

追記
`view()`にすると例外が発生するので`markdown()`にする。
定型文に則ると以下の感じ。

```php:app/Notifications/CustomResetPasswordNotification.php
    public function toMail($notifiable)
    {
        return (new MailMessage)
            ->markdown('vendor.notifications.email', [
                'actionText' => __('Reset Password'),
                'introLines' => [
                    __('You are receiving this email because we received a password reset request for your account.'),
                ],
                'outroLines' => [
                    __('If you did not request a password reset, no further action is required.'),
                ],
            ])
            ->action(__('Reset Password'), url('password/reset', $this->token))
            ->subject(__('Reset Password Notification'));
    }
```

パスワードリセットと登録認証でそれぞれ定型文ファイルを分けるなら
引数で渡す必要はないので以下のように修正。

```bash
$ cp ./resources/views/vendor/notifications/email.blade.php ./resources/views/vendor/notifications/reset.blade.php
```

通知クラスの呼び出しを簡素化

```php:app/Notifications/CustomResetPasswordNotification.php
    public function toMail($notifiable)
    {
        return (new MailMessage)
            ->markdown('vendor.notifications.reset')
            ->action(__('Reset Password'), url('password/reset', $this->token))
            ->subject(__('Reset Password Notification'));
    }
```

bladeファイルに多言語対応する場合は上述の通り、`__(...)`を`@lang(...)`に置換する。

#### 認証通知メールのカスタム
#####通知クラスの変更
リセットと同様に変更するが、認証するため必要なURLを取得するためのメソッド`verificationUrl`が
`Notifications`にはなく`Illuminate\Auth\Notifications\VerifyEmail`にあるのでこちらを継承する。

```php:app/Notifications/CustomVerifyEmailNotification.php

use Illuminate\Auth\Notifications\VerifyEmail; // クラス参照

//class CustomVerifyEmailNotification extends Notification
class CustomVerifyEmailNotification extends VerifyEmail
{

    public function toMail($notifiable)
    {
        return (new MailMessage)
            ->markdown('vendor.notifications.verify')
            ->action(__('Verify Email Address'), $this->verificationUrl($notifiable)) // verificationUrl()で認証URL取得
            ->subject(__('Verify Email Address'));
    }
```

#####Userモデルの変更

```php:app/User.php
use Illuminate\Contracts\Auth\MustVerifyEmail as ContractsMustVerifyEmail; // Illuminate\Auth\MustVerifyEmailと名称が被る為、別名
use Illuminate\Auth\MustVerifyEmail;
use App\Notifications\CustomResetPasswordNotification;
use App\Notifications\CustomVerifyEmailNotification;

class User extends Authenticatable implements ContractsMustVerifyEmail
{
    use Notifiable;
    use MustVerifyEmail;
(略)
    /**
     * Send the email verification notification.
     *
     * @return void
     */
    public function sendEmailVerificationNotification()
    {
        $this->notify(new CustomVerifyEmailNotification());
    }
```