Laravel の言語を日本語に変更
Laravel プロジェクトを作成してデフォルトは英語になっています。
今回は、その英語を日本語に変更する方法を記載していきます。
手順
デフォルトのユーザ認証機能を入れた状態からの変更が基本となっています。
設定変更
config/app.php
を開き、設定を変更します。
1.まずはタイムゾーンを変更します。
'timezone' => 'Asia/Tokyo', // デフォルトは'UTC'
2.次にロケールの変更です。
'locale' => 'ja', // デフォルトは'en'
日本語フォルダをインストール
Laravel 公式が日本語フォルダのインストールを記載してくれているので、利用します。
1.まずプロジェクトフォルダでターミナルを開きます。
カレントディレクトリが別になっている場合は、プロジェクトフォルダまで移動します。
$ cd test // 現在の階層にあるtest(フォルダ)へ移動
2.以下のコマンドを順番に叩きます。
$ php -r "copy('https://readouble.com/laravel/6.x/ja/install-ja-lang-files.php', 'install-ja-lang.php');"
$ php -f install-ja-lang.php
$ php -r "unlink('install-ja-lang.php');"
3.不足を追加します。
残念ながら、日本語のファイルに不足があります。(2019/11/28 時点)
次はそれを追加しましょう。
resources/lang/ja/passwords.php
を開き、以下を追加します。
'user' => "メールアドレスに一致するユーザーは存在していません。",
+ 'throttled' => 'ログインに続けて失敗しています。再度お試しください。',
];
これでバリデーションのエラー表示などが日本語になりました。
View を日本語化
日本語化するには、2 種類の方法があります。
『直接記述(ハードコーディング)』 と 『多言語化』 です。
直接記述(ハードコーディング)
Laravel Blade テンプレートの英語記述を全て、書き換えてしまう方法。
日本人が普通に作ると、わざわざ英訳を考えず全部日本語で作りますよね?その状態です。
多言語化
Laravel デフォルトのユーザ認証を入れた人は、__(login)
というような記述を見かけたと思います。
多言語化には__( )
を使用して、中の英語を変換して表示していきます。
現在は、その翻訳する情報がないため、仕方なくそのまま表示しているだけです。
早速、翻訳する情報を作成しましょう。
情報を伝えるためには、resources/lang/ja.json
を作成します。
ひとまず以下のコードを記述し、保存しましょう。
{
"login": "ログイン"
}
そして、ログイン画面に行ってみると
「login」の表示だったものが「ログイン」と表示されているはずです。
これは__(login)
はログイン
ということなのだと翻訳された結果です。
あとは、他の英語表示の部分もresources/lang/ja.json
に追記すれば日本語化できます。
こちらのメリットは、ロケールをen
に戻すと英語に戻せたり、
resources/lang/fr.json
を作成し、ロケールをfr
にすればフランス語化だって可能です。
パスワードリセットメールの日本語化
これが一番難しかった変更でした。
色々調べて、ようやっと、、、
早速、その手順を見ていきましょう。
カスタム Nortification
まずメールの本文の日本語化を行います。
1.プロジェクトフォルダでターミナルを開き、以下のコマンドを実行します。
$ php artisan make:notification CustomResetPassword
これで、app/Notifications/CustomResetPassword.php
が作成されます。
※「CustomResetPassword」の部分は違っても大丈夫ですが、
パスワードリセットメールを変更していることが分かる名前にするのが良いと思います。
2.app/Notifications/CustomResetPassword.php
の内容を変更する。
少し複雑な変更かもしれないけど、以下の通りに変更すれば大丈夫です。
use Illuminate\Auth\Notifications\ResetPassword;
class CustomResetPassword extends ResetPassword
{
use Queueable;
public $token;
/**
* Create a new notification instance.
*
* @return void
*/
public function __construct($token)
{
$this->token = $token;
}
----------(略)----------
/**
* Get the mail representation of the notification.
*
* @param mixed $notifiable
* @return \Illuminate\Notifications\Messages\MailMessage
*/
public function toMail($notifiable)
{
return (new MailMessage)
->subject('パスワード再設定')
->line('下のボタンをクリックしてパスワードを再設定してください。')
->action('パスワード再設定', url(route('password.reset', ['token' => $this->token, 'email' => $notifiable->getEmailForPasswordReset()], false)))
->line('もし心当たりがない場合は、本メッセージは破棄してください。');
}
3.app/User.php
でオーバーライドする。
以下のコードを追加します。
use
はuse
の塊の後ろに追加し、メソッドはクラスの中に追加します。
use App\Notifications\CustomResetPassword;
----------(略)----------
/**
* パスワード再設定メールの送信
*
* @param string $token
* @return void
*/
public function sendPasswordResetNotification($token)
{
$this->notify(new CustomResetPassword($token));
}
これでオーバーライドが完了します。
やった!
これで日本語化できた!!!
と思った矢先にメールが不完全になっていることに気づきます。
これには非常に苦しめられました。
メールテンプレートの publish
調べてみて分かったことですが、
同じメールの内容だとしても切り離されているようです。
1.プロジェクトフォルダで、ターミナルを開き、以下のコマンドを入力します。
まずは、メールテンプレートを変更できるようにします。
$ php artisan vendor:publish --tag=laravel-notifications
これにより、resources/views/vendor/notifications/email.blade.php
が生成されます。
2.resources/views/vendor/notifications/email.blade.php
を変更する。
以下のように変更すれば、大丈夫です。
@component('mail::message')
{{-- Greeting --}}
@if (! empty($greeting))
# {{ $greeting }}
@else
@if ($level === 'error')
# エラー
@else
# お知らせ
@endif
@endif
----------(略)----------
{{-- Subcopy --}}
@isset($actionText)
@slot('subcopy')
@lang(
"もし\":actionText\"ボタンが押すことができない場合は, 以下のURLをコピーして\n".
'ブラウザで貼り付けてください: [:actionURL](:actionURL)',
[
'actionText' => $actionText,
'actionURL' => $actionUrl,
]
)
@endslot
@endisset
@endcomponent
これでメールの文面が全て日本語になりました。
しかし、現在バリデーションエラーが出た時の属性が name 属性そのままになっています。
属性の日本語化
属性も日本語で表示できるようにしましょう。
resources/lang/ja/validation.php
を開き、以下の記述を追加します。
'attributes' => [
"name" => "名前",
"password" => "パスワード",
"password_confirmation" => "パスワード(確認用)",
"email" => "メールアドレス",
],
これで、
Laravel デフォルトのユーザ認証までの日本語化が完了です!!