前回、メールアドレスの確認と日本語化したのですが、パスワードリセットでも英文のメールが送られていたので、こちらも日本語化をしたいと思います。
Laravel 5.7 メールアドレスの確認を日本語化も含めて実装する
ユーザー認証は以下のコマンドで実装されているものとします。
php artisan make:auth
ビューの日本語化
まずは、パスワードリセットの画面を日本語化します。
./resources/views/auth
├── passwords
│ ├── email.blade.php
│ └── reset.blade.php
@extends('layouts.app')
@section('content')
<div class="container">
<div class="row justify-content-center">
<div class="col-md-8">
<div class="card">
<div class="card-header">{{ __('message.password_reset.title') }}</div>
<div class="card-body">
@if (session('status'))
<div class="alert alert-success" role="alert">
{{ session('status') }}
</div>
@endif
<form method="POST" action="{{ route('password.email') }}">
@csrf
<div class="form-group row">
<label for="email" class="col-md-4 col-form-label text-md-right">{{ __('message.user.field.email') }}</label>
<div class="col-md-6">
<input id="email" type="email" class="form-control{{ $errors->has('email') ? ' is-invalid' : '' }}" name="email" value="{{ old('email') }}" required>
@if ($errors->has('email'))
<span class="invalid-feedback" role="alert">
<strong>{{ $errors->first('email') }}</strong>
</span>
@endif
</div>
</div>
<div class="form-group row mb-0">
<div class="col-md-6 offset-md-4">
<button type="submit" class="btn btn-primary">
{{ __('message.button.send') }}
</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
@endsection
翻訳ファイルも変更します。(./resources/lang/ja/message.php)
<?php
return [
// ボタン
"button" => [
"send" => ' 送信 ',
],
// ユーザ情報
"user" => [
"field" => [
"email" => "メールアドレス",
]
],
// パスワードリセット
"password_reset" => [
'title' => 'パスワードリセット'
],
];
送信メールの日本語化
まずは、パスワードリセットをしたときにどこでメールを送っているのかを確認します。
UserモデルがAuthenticatable(Illuminate\Foundation\Auth\User)を継承しています。
その中で、CanResetPasswordというtraitを呼び出しています。
class User extends Model implements
AuthenticatableContract,
AuthorizableContract,
CanResetPasswordContract
{
use Authenticatable, Authorizable, CanResetPassword, MustVerifyEmail;
}
CanResetPasswordの中身を見ると、sendPasswordResetNotificationでメールを送っているので、こちらをカスタマイズしていきます。
trait CanResetPassword
{
/**
* Get the e-mail address where password reset links are sent.
*
* @return string
*/
public function getEmailForPasswordReset()
{
return $this->email;
}
/**
* Send the password reset notification.
*
* @param string $token
* @return void
*/
public function sendPasswordResetNotification($token)
{
$this->notify(new ResetPasswordNotification($token));
}
}
カスタムのNotificationを作成する
artisanを利用して、カスタムのNotificationを作成します。
php artisan make:notification RestPasswordCustom
./app/Notifications/にファイルが作成されるので、もともとパスワードリセットで使用されているRestPasswordNotification(Illuminate\Auth\Notifications\ResetPassword)を参考に編集をいたします。
変更箇所はtoMailの中で、英文をセットしている箇所を日本語に置き換えるだけです。
namespace App\Notifications;
use Illuminate\Notifications\Notification;
use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Support\Facades\Lang;
class RestPasswordCustom extends Notification
{
/**
* The password reset token.
*
* @var string
*/
public $token;
/**
* The callback that should be used to build the mail message.
*
* @var \Closure|null
*/
public static $toMailCallback;
/**
* Create a notification instance.
*
* @param string $token
* @return void
*/
public function __construct($token)
{
$this->token = $token;
}
/**
* Get the notification's channels.
*
* @param mixed $notifiable
* @return array|string
*/
public function via($notifiable)
{
return ['mail'];
}
/**
* 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::getFromJson('message.mail.password_reset.title'))
->line(Lang::getFromJson('message.mail.password_reset.line'))
->action(Lang::getFromJson('message.mail.password_reset.action'), url(config('app.url').route('password.reset', $this->token, false)))
->line(Lang::getFromJson('message.mail.password_reset.out_line1', ['count' => config('auth.passwords.users.expire')]))
->line(Lang::getFromJson('message.mail.password_reset.out_line2'));
}
/**
* Set a callback that should be used when building the notification mail message.
*
* @param \Closure $callback
* @return void
*/
public static function toMailUsing($callback)
{
static::$toMailCallback = $callback;
}
}
翻訳ファイルは
<?php
return [
// メール
"mail" => [
// パスワードリセット
"password_reset" => [
"title" => "パスワードリセットのお知らせ",
"line" => "パスワードリセットの受け付けました。",
"action" => "パスワードリセット",
"out_line1" => "こちらのパスワードリセットの有効期限は :count 分です。",
"out_line2" => "こちらのメールに身に覚えがない場合は、無視をしてください。"
]
],
];
以上、パスワードリセットの日本語化は終わりです。
Laravelはtraitを多様していますので、何かあればその中身を調査するようにしています(ーー;