Laravelのパスワード再設定メール内のこの文章を日本語にする方法を解説します。
他の部分は ja.jsonに日本語を入れたりして何とかなったのですが、なぜかここは日本語にできず。
notificationsを使って日本語化しました。
This password reset link will expire in 60 minutes. の日本語化
最初に既存のメッセージが送られないように、ユーザーモデルにオーバーライドの処理を行います。
次に新しい翻訳を作っていきます。
① notification を作成
下記のコマンドを作成して、notificationを作成します。
(PassWordResetの部分は、お好きな名称で大丈夫です)
1 |
php artisan make:notification PasswordReset |
app/Notifications にPasswordResetファイルができます。
②ユーザーモデルを編集
今回行う処理で、【sendPasswordResetNotification】という既存の処理を、【PasswordReset】ファイルでオーバーライド(再定義)することになります。
このことをユーザーモデルファイルに伝えてあげます。
ユーザーモデルファイルの先頭に、【PasswordReset】を指定します。
1 |
use App\Notifications\PasswordReset; |
クラス内に、次のようにコードを入れます。
1 2 3 |
public function sendPasswordResetNotification($token){ $this->notify(new PasswordReset($token)); } |
トークンを使うので、カッコ内に【$tokun】と入れてあります。
③ 翻訳を作成
app/Notifications の PasswordResetファイルを開きます。
一番上に Langファサードをuseで指定しておきましょう。
1 |
use Illuminate\Support\Facades\Lang; |
次にコンストラクタで $token を定義。
1 2 3 4 5 |
public $token; public function __construct($token) { $this->token = $token; } |
public function toMail に翻訳を入れます。
1 2 3 4 5 6 7 8 9 |
public function toMail($notifiable) { 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('password/reset', $this->token)) ->line(Lang::get('このパスワードは :count 分後に期限切れとなります。', ['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.')); } |
すべて日本語にしても良いのですが、resources/lang 内に 日本語翻訳ファイル ja.jason がある場合は、この形でOK。
翻訳は別途ビューファイルに行ってリンクを貼る方法もありますが、今回は上記の方法で行います。
④ テストしてみる
それではメールを送ってみましょう。
つぎのように日本語になりました!
最後の部分は英語だと “If you’re having trouble clicking the “Verify Email Address” button ” といった文章です。
もしこの部分が日本語にできない!という場合は、こちらの記事もどうぞ。
全通知メール共通部分の翻訳方法を解説しています。
【This password reset link will expire in 60 minutes. 】が翻訳されない理由について
ここからは、わたしの試行錯誤を含めて、このエラーについて考えてみます。
実はこのフレーズ、Laravelの日本語化ファイルの中に入っていないのです!
【This password reset link will】 で Laravel のプロジェクトをgrep検索をしてみると分かります。
普通の翻訳では反映されないのは関数が入っているため?
「それじゃあ翻訳をすれば良いんじゃない?」と思いますよね。
vendor/laravel-lang/lang フォルダの中の ja.jason に下記のとおり日本語を入れましたが、サッパリ反応してくれませんでした。
1 |
"This password reset link will expire in :count minuaaates": "パスワードリセットリンクは :count 分後に有効期限が切れます。" |
なんとなく、【:count】が入っているからじゃないか?という気はします。
でもなぜ他の言語は大丈夫なんだろう。
オリジナルのパスワードリセットメッセージの場所
どうしてよいか悩み、前半でご紹介したとおり、オーバーライドしてしまうことにしました。
元の英語の文章は、下記ファイルに入っています。
vendor/laravel/framework/src/illuminate/Auth/Notifications/ResetPassword.php
ここの部分からオーバーライド用のコードをもってきました。
さいごに
このように、文章内に関数が入っているために翻訳が反映されなかった箇所は他にもありました。
翻訳されておらず英語が時々残ってしまうとカッコ悪いですよね。
何とか手間をかけずに日本語化ができるよう、Laravelさんのさらなる進化を期待してます!