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' => '価格を正しく入力してください',
];
}
バリデーションの確認
英語のメッセージが自動で表示されました。name、priceは、Itemモデルのカラム名です。
カラム名のローカライズ
attributes()
「lang/ja/validation.php」や「FormRequest」に attributes() を定義すると、カラム名をローカライズできます。
public function attributes()
{
return [
キー1 => 値1,
キー2 => 値2,
];
}
- 「キー&バリュー」の連想配列を return で返す
attributes() の追加
「ItemRequest」に attributes() を追加し、name、priceカラムの設定をします。
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」のrequired、integer、min => numericを探して、定型文を変更します。
lang/ja/validation.php
<?php
return [
...
'required' => ':attributeを入力してください。',
...
'integer' => ':attributeを正しく入力してください。',
...
'min' => [
...
'numeric' => ':attributeを正しく入力してください',
...
],
...
];
動作確認
バリデーションエラーが、日本語で表示されるか確認してみましょう。