14. メッセージとローカライズ

エラーコンポーネント

エラーメッセージ表示のコンポーネントファイルを作成し、エラーメッセージを表示してみましょう。

エラーコンポーネントの作成

「resources/views/components」に「error.blade.php」を作成します。

エラーの繰り返し表示

「error.blade.php」に、$errorsでエラーメッセージを繰り返し表示します。

components/error.blade.php.php
@if ($errors->any())
<div>
  <ul>
    @foreach ($errors->all() as $error)
    <li>{{ $error }}</li>
    @endforeach
  </ul>
</div>
@endif

エラーコンポーネントの読み込み

入力画面で、@include() でエラーコンポーネントを読み込みます。

create.blade.php
<div>
    <h2>商品入力</h2>
    @include('components.error')
    ...
</div>

エラーメッセージ確認

商品入力画面で、エラーメッセージが表示されるか確認してみましょう。

エラーメッセージ設定

バリデーションで発生したエラーをメッセージで表示します。

messages()

messages() でエラーメッセージ設定します。 エラーメッセージは「エラータイプ」と「メッセージ」の連想配列で設定します。

public function messages()
{
    return [
        'カラム1.エラータイプ1' => 'メッセージ1',
        'カラム2.エラータイプ2' => 'メッセージ2',
        ...
    ];
}

messages() の実装

「ItemRequest」の messages() でエラーメッセージを設定します。

ItemRequest.php
public function messages()
{
    return [
        'name.required' => '商品名を入力してください',
        'price.required' => '価格を入力してください',
        'price.integer' => '価格を数値で入力してください',
        'price.min' => '価格を数値で入力してください',
    ];
}

エラーメッセージ確認

設定したエラーメッセージが表示されるか確認してみましょう。

価格にマイナスの数値を入れてもエラーになります。

ローカライズ

ローカライズとは

「日本語」や「英語」などの、同じプログラムで複数の言語に対応することをローカライズ(多言語化)といいます。Laravelではローカライズに対応しやすいような機能が搭載されています。

langフォルダ

Laravelでは「lang/」に言語ごとのフォルダでローカライズファイルを管理をしますが、バージョンによって異なります。

Laravel10から

Laravel 10では「lang/」がデフォルトで存在しません。

php artisan lang:publish

Laravel9

Laravel 9からは「lang/en」フォルダがデフォルトです。

lang/
    ├── en/
    │   ├── xxxx.php
    │   └── xxxx.php
    ├── ja/
    │   ├── xxxx.php
    │   └── xxxx.php

Laravel8以前

Laravel 8以前では「resources/lang/」フォルダがデフォルトです。

resources/
└── lang/
          ├── en/
          │   ├── xxxx.php
          │   └── xxxx.php
          ├── ja/
          │   ├── xxxx.php
          │   └── xxxx.php

メッセージの設定

ローカライズするメッセージは、PHPまたはJSON形式で設定します。PHPの場合は、連想配列でキー&バリュー形式で設定します。

PHP
<?php

return [
    キー1 => 値1,
    キー2 => 値2,
    ...
];

__ ヘルパ関数

__() は、ローカライズファイルで設定したメッセージを表示するヘルパ関数です。

__('ファイル名.キー');

辞書ファイルの作成

「lang/en」フォルダに「messages.php」ファイルを作成します。

lang/en/messages.php
<?php

return [
    'item_name' => 'Item Name',
    'price' => 'Price',
];

lang/en/messages.phpという言語ファイルからwelcomeという翻訳文字列を取得してみましょう。

言語の変更

アプリケーションのデフォルト言語は「config/app.php」のlocaleキーに設定します。デフォルトはen(英語)で設定されています。

<?php

use Illuminate\Support\Facades\Facade;

return [
    ...
    'locale' => 'en',
    ...
];

日本語辞書の作成

「lang」フォルダに「ja/」フォルダを作成します。

「lang/ja/」フォルダに「messages.php」を作成します。

lang/ja/messages.php
<?php

return [
    'item_name' => '商品名',
    'price' => '価格',
];

日本語のロケール

日本語の場合は、locale = jaに変更します。

<?php

use Illuminate\Support\Facades\Facade;

return [
    ...
    'locale' => 'ja',
    ...
];

configファイルのキャッシュ

「config/app.php」ファイルを更新したら、ターミナルで設定をキャッシュします。

php artisan config:cache

カラム名のローカライズ

現状のバリデーション

現状のバリデーションは「ItemRequest」の messages() に、日本語で直接設定しています。

ItemRequest.php
    public function messages()
    {
        return [
             'name.required' => '商品名を入力してください',
             'price.required' => '価格を入力してください',
             'price.integer' => '価格を正しく入力してください',
             'price.min' => '価格を正しく入力してください',
        ];
    }

コメントアウト

メッセージ設定をコメントアウトして、バリデーションしてみましょう。

ItemRequest.php
    public function messages()
    {
        return [
            // 'name.required' => '商品名を入力してください',
            // 'price.required' => '価格を入力してください',
            // 'price.integer' => '価格を正しく入力してください',
            // 'price.min' => '価格を正しく入力してください',
        ];
    }

バリデーションの確認

英語のメッセージが自動で表示されました。namepriceは、Itemモデルのカラム名です。

カラム名のローカライズ

attributes()

「lang/ja/validation.php」や「FormRequest」に attributes() を定義すると、カラム名をローカライズできます。

    public function attributes()
    {
        return [
            キー1 => 値1,
            キー2 => 値2,
        ];
    }
  • 「キー&バリュー」の連想配列を return で返す

attributes() の追加

「ItemRequest」に attributes() を追加し、namepriceカラムの設定をします。

ItemRequest.php
    public function attributes()
    {
        return [
            'name' => __('messages.item_name'),
            'price' => __('messages.price'),
        ];
    }
  • カラム名の値は「lang/ja/messages.php」のキーを利用

メッセージの確認

バリデートすると、カラム名が「日本語」、その他の文言は「英語」で表示されました。

定型文のローカライズ

その他定型文をローカライズしてみましょう。

ローカライズの定型文

英語の定型文は「lang/en/」の各ファイルに設定されています。

メッセージのカスタマイズ

例えば「validation.php」ファイルにはrequiredに定型文のメッセージが設定*されています。

lang/ja/validation.php
'required' => 'The :attribute field is required.',
  • :attribute は、バリデーションエラーになったカラム名が自動割り当て

このメッセージを変更することで、定型文をカスタマイズできます。

'required' => ':attributeを入力してください。',
  • 英語:「lang/en/validation.php」
  • 日本語:「lang/ja/validation.php」

バリデーションメッセージの日本語化

ファイルコピー

「lang/en/validation.php」を「lang/ja/」にコピーします。

定型文の修正

「validation.php」のrequiredintegermin => numericを探して、定型文を変更します。

lang/ja/validation.php
<?php

return [
    ...
    'required' => ':attributeを入力してください。',
    ...
    'integer' => ':attributeを正しく入力してください。',
    ...
    'min' => [
        ...
        'numeric' => ':attributeを正しく入力してください',
        ...
    ],
    ...
];

動作確認

バリデーションエラーが、日本語で表示されるか確認してみましょう。

Laravel超入門