Laravel8の認証(Jetstream)を日本語化しよう
はじめに
Laravel8から、Jetstreamという新しい認証スカフォールドが導入されました。この結果、従来の方法だと完璧な日本語化ができなくなりました。ところが、Laravel8対応の日本語化の解説のほとんどは、Laravel7と同じ方法で日本語化できるような書き方をしています。これでは、初心者の方は大変だろうなと思ったので、Laravel8における認証スカフォールドの正しい日本語化の方法を記しておこうと思いました。
前提
タイトルや「はじめに」に書いた通り、今回はJetstreamをターゲットにしているため、Laravel Breazeやlaravel/uiといった認証スカフォールドを使っている人は対象外となります。ただ、日本語化の仕組みも解説するので、それを理解すれば他のスカフォールドでも応用できると思います。なお、とりあえずさっさと日本語化したい人は、後述の「手順」だけ読んでおけば良いです。
日本語化のポイント
まず、Laravelの日本語化には3つポイントがあります。
- 環境設定の変更
- 認証スカフォールド用の日本語ファイルの追加
-
/resources/lang/
にキーワード置換用のja.json
を配置
このうち1、2については多くのサイトでも解説してくれているので丸っと省きたいと思います(手順は記載しておきます)。一方3についての解説は少ないので、その点について詳しく説明していきます。
ja.jsonとは何か?
Laravelでは、結構前のバージョンから「多言語化」という仕様が追加されています。この仕様に基づいて、bladeに文字列を出力しておくと、jsonにてその文字列をキーとして、別の文字列に置き換えることができるというものです。例えば以下のようになります。
// hoge.blade.php
{{ __('Name') }}
// /resources/lang/ja.json
{
"Name": "ユーザー名"
}
__()
で囲っておくと、blade側は、configファイルの設定に応じて「Name」という文字列を「ユーザー名」という文字列に置き換えて出力してくれるのです。ちなみにlangディレクティブを使ってるケースも同様に置き換え可能です。Laravelのメールテンプレはlangディレクティブで記述しています。
// hoge.blade.php
{{ @lang('Name') }}
// /resources/lang/ja.json
{
"Name": "ユーザー名"
}
この仕様は、Laravel6.x以降の認証スカフォールドに適用されていて、各画面の英語ラベルごとに対応する日本語ラベルを定義しておけば直接テンプレートをいじることなく、日本語化できるというわけです。
そしてJetstreamからは、会員登録等で使用するパスワードのバリデーション文字列の日本語化も、この方法を用いて行う必要がでてきました。これは、パスワードに対するバリデーションだけは、Laravel標準のバリデーションルールを使用せず、Fortifyというパッケージのpasswordメソッドで処理しているせいです。Fortifyのpasswordメソッドではパスワードを検証し、結果に応じて以下のバリデーションメッセージを返すようになっています。
// /vendor/laravel/fortify/src/Rules/Password.phpをgrepした結果
return __('The :attribute must be at least :length characters and contain at least one uppercase character.', ['length' => $this->length,]);
return __('The :attribute must be at least :length characters and contain at least one number.', ['length' => $this->length,]);
return __('The :attribute must be at least :length characters and contain at least one special character.', ['length' => $this->length,]);
return __('The :attribute must be at least :length characters and contain at least one uppercase character and one number.', ['length' => $this->length,]);
return __('The :attribute must be at least :length characters and contain at least one uppercase character and one special character.', ['length' => $this->length,]);
return __('The :attribute must be at least :length characters and contain at least one uppercase character, one number, and one special character.', ['length' => $this->length,]);
return __('The :attribute must be at least :length characters.', ['length' => $this->length,]);
つまり、これらのメッセージに対応した日本語文字列を、ja.json
にて設定する必要があるということです。なお、上記ではいずれも__()
に第2引数を指定していますが、これは第一引数の:length
というプレースホルダーに値を流し込むためです。
更に、今回は/resources/view
以下のbladeテンプレートのみならず/vendor/laravel/jetstrem
内のコンポーネントを使用しており、かつそれらコンポーネントには以下のようなメッセージが埋め込まれているので、ja.json
で置き換える必要があります。
// /vendor/laravel/jetstream/resources/views/components/validation-errors.blade.php
<div class="font-medium text-red-600">{{ __('Whoops! Something went wrong.') }}</div>
// /vendor/laravel/jetstream/resources/views/components/confirms-password.blade.php
@props(['title' => __('Confirm Password'), 'content' => __('For your security, please confirm your password to continue.'), 'button' => __('Confirm')])
{{ __('Password') }}
{{ __('Nevermind') }}
これらの関連するファイルから__()
の英語文字列をすべてピックアップしていき、ja.json
にて、日本語文字列にマッピングするという作業が必要となります。なお後述の「手順」にて、GitHubに公開されていたja.json
をいくつか紹介しておくので、そちらを使えばマッピングの手間は省略できます。
手順
1. 環境設定の変更
以下の3つのキーの値を変更します。他にfallback_locale
というキーがありますが、これは日本語ファイルが無かった場合にどの言語で表示するかを指定するものなので、デフォルトのen
が最適です。faker_locale
は、テストデータをfakerを使って作成するときに、名前等を日本語のものにしてくれます。たまにこの設定を知らない人が、英語のテストデータを使っている様子を見かけますが、その場合はこの設定が漏れているからでしょう。
// /config/app.php
//変更前
'timezone' => 'UTC',
'locale' => 'en',
'faker_locale' => 'en_US',
//変更後
'timezone' => 'Asia/Tokyo',
'locale' => 'ja',
'faker_locale' => 'ja_JP',
2. 認証スカフォールド用の日本語ファイルの追加
Laravelプロジェクト導入当初は、resources/lang/en
にしか会員登録/認証スカフォールド用の言語ファイルが用意されていません。自力で日本語ファイルを作成するのもありですが、なるべく手間を省きたいのでLaravel-Langのお世話になります。
#本番では不要なので--devをつける
composer require laravel-lang/lang:~7.0 --dev
#日本語ディレクトリをLaravelプロジェクト内に移動
cp -r ./vendor/laravel-lang/lang/src/ja ./resources/lang/
また、Laravel公式を翻訳しているReadDoubleでも、同じようなファイルを入手することができます。
php -r "copy('https://readouble.com/laravel/8.x/ja/install-ja-lang-files.php', 'install-ja-lang.php');"
php -f install-ja-lang.php
php -r "unlink('install-ja-lang.php');"
ただし、どちらもattributesが定義されていないのと、一部のメッセージは内容をカスタマイズしてあげないと日本語として違和感が残ってしまうので、以下のような記述を追加します。
// /resources/lang/ja/validation.php
//変更前
'custom' => [
'属性名' => [
'ルール名' => 'カスタムメッセージ',
],
],
//変更後
'custom' => [
'terms' => [
'required' => '登録には規約への同意が必須となります。',
],
],
//変更前
'attributes' => [],
//変更後
'attributes' => [
'name' => 'ユーザー名',
'email' => 'メールアドレス',
'password' => 'パスワード',
'terms' => '規約',
],
ja.jsonを配置
最後に、/resources/lang/直下に、ja.jsonを配置します。このja.jsonについても、GitHubで提供しているリポジトリがあったので、それを利用すると良いでしょう。残念ながらメール文面の日本語化には対応していませんが、メールに関しては正直なところ翻訳するよりは自前でテンプレを用意した方が良いと思います(一応ページの最後にサンプルだけ載せておきます)。
Discussion
大変わかりやすい記事ありがとうございます。
1点確認です。
/resources/lang直下の誤りではないでしょうか?
ご指摘ありがとうございます!おっしゃる通りですので早速訂正しました。引き続きよろしくお願いします。
どもども
毎回手作業で日本語化処理をするのも骨が折れるので、送信メールを含めたBreezeとJetstreamの日本語化をコマンド一発で出来るパッケージを作って見ました
zennにも記事書きました
良かったらお試し願います
ありがとうございます。冬休み中に試してみますね。