Laravelの言語を日本語に変更

# Laravel の言語を日本語に変更

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

## 手順

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

### 設定変更

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

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

```php:config/app.php
'timezone' => 'Asia/Tokyo', // デフォルトは'UTC'
```

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

```php:config/app.php
'locale' => 'ja', // デフォルトは'en'
```

### 日本語フォルダをインストール

Laravel 公式が日本語フォルダのインストールを記載してくれているので、利用します。

1.まずプロジェクトフォルダでターミナルを開きます。

カレントディレクトリが別になっている場合は、プロジェクトフォルダまで移動します。

```sh
$ cd test // 現在の階層にあるtest(フォルダ)へ移動
```

2.以下のコマンドを順番に叩きます。

```sh:インストーラのダウンロード
$ php -r "copy('https://readouble.com/laravel/6.x/ja/install-ja-lang-files.php', 'install-ja-lang.php');"
```

```sh:インストーラの起動
$ php -f install-ja-lang.php
```

```sh:インストーラの削除
$ php -r "unlink('install-ja-lang.php');"
```

3.不足を追加します。

残念ながら、日本語のファイルに不足があります。(2019/11/28 時点)
次はそれを追加しましょう。

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

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

];
```

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

### View を日本語化

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

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

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

#### 多言語化

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

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

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

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

```json:resources/lang/ja.json
{
  "login": "ログイン"
}
```

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

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

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

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

これが一番<font color="red">**難しかった**</font>変更でした。
色々調べて、ようやっと、、、

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

#### カスタム Nortification

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

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

```sh
$ php artisan make:notification CustomResetPassword
```

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

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

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

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

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

```php:app/User.php
use App\Notifications\CustomResetPassword;

----------(略)----------

    /**
     * パスワード再設定メールの送信
     *
     * @param  string  $token
     * @return void
     */
    public function sendPasswordResetNotification($token)
    {
        $this->notify(new CustomResetPassword($token));
    }
```

これでオーバーライドが完了します。

**やった！**
**これで日本語化できた！！！**

と思った矢先にメールが不完全になっていることに気づきます。
これには非常に苦しめられました。

#### メールテンプレートの publish

調べてみて分かったことですが、
同じメールの内容だとしても切り離されているようです。

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

まずは、メールテンプレートを変更できるようにします。

```sh
$ php artisan vendor:publish --tag=laravel-notifications
```

これにより、`resources/views/vendor/notifications/email.blade.php`が生成されます。

2.`resources/views/vendor/notifications/email.blade.php`を変更する。

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

```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`を開き、以下の記述を追加します。

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

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