Symfonyでバリデーションメッセージを多言語対応する方法!初心者でもわかる国際化の基本
生徒
「Symfonyでフォームのエラーメッセージを日本語で表示させたいんですが、英語のまま出てきます…」
先生
「Symfonyではバリデーションメッセージを多言語対応させる仕組みがあるので、日本語にも対応できますよ。」
生徒
「それって、外国語のユーザーにも自動で言語を切り替えて表示できるってことですか?」
先生
「そのとおりです。Symfonyの翻訳機能を使えば、1つのアプリケーションで複数の言語に対応できますよ。早速やってみましょう!」
1. 多言語対応(国際化)とは?
多言語対応とは、アプリケーションを使う人の言語に合わせて、表示されるメッセージやテキストを切り替えることです。
例えば、日本語のユーザーには「メールアドレスを入力してください」、英語のユーザーには「Please enter your email address」と表示されるようにします。
Symfonyでは、Translationコンポーネントを使って、このような表示切り替えが可能になります。
2. 翻訳ファイルを用意しよう
Symfonyでは、翻訳メッセージは translations フォルダに置く「YAMLファイル」で管理されます。
バリデーションメッセージ用には validators.{言語}.yaml という名前にします。
たとえば日本語にしたいなら、次のようなファイルを作成します。
# translations/validators.ja.yaml
Symfony:
This value should not be blank: 'この項目は必須です'
This value is not a valid email address: '有効なメールアドレスを入力してください'
同様に、英語用のファイルも用意しておくと切り替えができます。
# translations/validators.en.yaml
Symfony:
This value should not be blank: 'This field is required'
This value is not a valid email address: 'Please enter a valid email address'
3. ロケール(言語設定)を変更する
Symfonyでは、使用する言語を ロケール(locale) という設定で決めます。
.env ファイルで、以下のように初期設定します。
APP_LOCALE=ja
これで、アプリケーション全体の言語が「日本語」になります。
4. コントローラやセッションで動的に切り替える
ユーザーがサイト上で言語を切り替えられるようにしたい場合は、コントローラでロケールを動的に変更することもできます。
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
public function changeLanguage(string $locale, Request $request, SessionInterface $session)
{
$session->set('_locale', $locale);
return $this->redirectToRoute('homepage');
}
このようにすれば、「日本語」「英語」など、ボタンで言語を切り替えることも可能です。
5. 自作メッセージも多言語対応できる
バリデーションアノテーションで、メッセージキーを指定して、翻訳ファイルで対応させる方法もあります。
#[Assert\NotBlank(message: 'user.name.required')]
private string $name;
# translations/validators.ja.yaml
user:
name:
required: '名前を入力してください'
# translations/validators.en.yaml
user:
name:
required: 'Please enter your name'
この方法なら、複雑なシステムでもメッセージの管理がしやすくなります。
6. 実行して表示されるエラーメッセージを確認しよう
最後に、バリデーションを実行して、指定した言語でエラーメッセージが表示されるか確認しましょう。
$errors = $validator->validate($user);
foreach ($errors as $error) {
echo $error->getMessage();
}
名前を入力してください
ロケールがenなら
Please enter your name
といった具合に、言語が自動で切り替わります。