Blog

Laravel の言語を日本語に変更

Laravel の言語を日本語に変更

Laravelって便利ですね!
今まで一切フレームワークに触れたことがなかったので、余計にすごいと感じています。

しかし、Laravel プロジェクトを作成したときのデフォルトは英語になっています。
今回は、その英語を日本語に変更する方法を記載していきます。

手順

デフォルトのユーザ認証機能を入れた状態からの変更が基本となっています。

設定変更

config/app.phpを開き、設定を変更します。

1.まずはタイムゾーンを変更します。

config/app.php

'timezone' => 'Asia/Tokyo', // デフォルトは'UTC'

2.次にロケールの変更です。

config/app.php

'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 時点)
次は、その不足を追加します。

resouces/lang/ja/passwords.phpを開き、以下を追加します。

resouces/lang/ja/passwords.php

    'user' => "メールアドレスに一致するユーザーは存在していません。",
 +   'throttled' => 'ログインに続けて失敗しています。再度お試しください。',
 ];

これでバリデーションのエラー表示が全て日本語になりました。

View を日本語化

日本語化するには、2 種類の方法があります。
『直接記述(ハードコーディング)』 と 『多言語化』 です。

直接記述(ハードコーディング)

Laravel Blade テンプレートの英語記述を全て、書き換えてしまう方法です。
日本人が普通に作ると、わざわざ英訳を考えず全部日本語で作りますよね?その状態です。

多言語化

Laravel デフォルトのユーザ認証を入れた人は、__(login)というような記述を見かけたと思います。
多言語化には__( )を使用して、中の英語を変換して表示していきます。

現在は、その翻訳する情報がないため、仕方なくそのまま表示しているだけです。
早速、翻訳する情報を作成しましょう。

情報を伝えるためには、resouces/lang/ja.jsonを作成します。

ひとまず以下のコードを記述し、保存しましょう。

resouces/lang/ja.json

{
  "login": "ログイン"
}

そして、ログイン画面に行ってみると
『login』の表示だったものが『ログイン』と表示されているはずです。

これは__(login)ログインということなのだと翻訳された結果です。
あとは、他の英語表示の部分もresouces/lang/ja.jsonに追記すれば日本語化できます。

こちらのメリットは、ロケールをenに戻すと英語に戻せたり、
resouces/lang/fr.jsonを作成し、ロケールをfrにすればフランス語化だって可能です。

POINT

つまり、英語を元にして
ロケールの言語へと自動翻訳して表示してくれるということですね。

パスワードリセットメールの日本語化

これが一番難しかった変更でした。
色々調べて、ようやっと、、、

早速、その手順を見ていきましょう。

カスタム Nortification

まずメールの本文の日本語化を行います。

1.プロジェクトフォルダでターミナルを開き、以下のコマンドを実行します。

$ php artisan make:notification CustomResetPassword

これで、app/Notifications/CustomResetPassword.phpが作成されます。
※「CustomResetPassword」の部分は違っても大丈夫ですが、
パスワードリセットメールを変更していることが分かる名前にするのが良いと思います。

2.app/Notifications/CustomResetPassword.phpの内容を変更する。

少し複雑な変更かもしれませんが、以下の通りに変更すれば大丈夫です。

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でオーバーライドする。

以下のコードを追加します。
useuseの塊の後ろに追加し、メソッドはクラスの中に追加します。

app/User.php

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を変更する。

以下のように変更すれば、大丈夫です。

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 属性そのままになっています。

属性の日本語化

属性も日本語で表示できるようにしましょう。

resouces/lang/ja/validation.phpを開き、以下の記述を追加します。

resouces/lang/ja/validation.php

    'attributes' => [
        "name" => "名前",
        "password" => "パスワード",
        "password_confirmation" => "パスワード(確認用)",
        "email" => "メールアドレス",
    ],

これで、
Laravel デフォルトのユーザ認証までの日本語化が完了です!!


Laravel公式を参照しつつ、変更していけば大丈夫な所が主でしたが、
resouces/lang/ja/passwords.phpの抜けパスワードリセットメールにはとても苦しめられました。

初めてのフレームワークでいきなり詰んでしまうかもしれないと、不安に思っていましたが、
何とか解決できてよかったと思っています。

POINT

今回の件で、
『公式をしっかりと見ること』
『検索して方法を模索すること』
の大切さを改めて再確認しました。

最後まで読んでいただき、ありがとうございました。

MeisterGuild(マイスター・ギルド)広報

最先端技術のMEISTERを目指し、お互い切磋琢磨するGUILD、になりたい株式会社マイスター・ギルドです。Webシステム/サービス開発、スマホアプリ開発、AR/VR/MR開発など、さまざまな情報を発信します。

Related Entry