LoginSignup
66
62

More than 1 year has passed since last update.

Laravelの言語を日本語に変更

Last updated at Posted at 2019-12-03

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 時点)
次はそれを追加しましょう。

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

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

];

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

View を日本語化

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

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

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

多言語化

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

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

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

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

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

少し複雑な変更かもしれないけど、以下の通りに変更すれば大丈夫です。

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

属性の日本語化

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

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

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

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

66
62
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
66
62