Symfonyでバリデーションメッセージを多言語対応する方法!初心者でもわかる国際化の基本
生徒
「Symfonyでフォームのエラーメッセージを日本語で表示させたいんですが、英語のまま出てきます…」
先生
「Symfonyではバリデーションメッセージを多言語対応させる仕組みがあるので、日本語にも対応できますよ。」
生徒
「それって、外国語のユーザーにも自動で言語を切り替えて表示できるってことですか?」
先生
「そのとおりです。Symfonyの翻訳機能を使えば、1つのアプリケーションで複数の言語に対応できますよ。早速やってみましょう!」
1. 多言語対応(国際化)とは?
多言語対応とは、Webサイトやアプリを利用するユーザーの言語設定(国や地域)に合わせて、画面に表示されるメッセージやテキストを自動的に切り替える仕組みのことです。ITの専門用語では、国際化(Internationalization)や、その略称であるi18n(アイ・エイティーン・エヌ)とも呼ばれます。
例えば、入力フォームで「名前」が未入力だった場合、ユーザーの環境に応じて以下のように出し分けを行います。
- 日本語設定のユーザー: 「この項目は必須です」
- 英語設定のユーザー: 「This field is required」
Symfonyには、この切り替えを非常に効率的に行えるTranslationコンポーネントという強力なツールが標準で備わっています。これを使うことで、プログラム本体のコードを書き換えることなく、翻訳データが入ったファイル(辞書のようなもの)を準備するだけで、世界中のユーザーに対応したアプリを作ることが可能になります。
イメージしてみよう
多言語対応は、アプリの中に「通訳さん」を雇うようなものです。プログラムが「エラーだよ!」と叫ぶと、通訳さんがユーザーの言語を確認して、適切な翻訳カードをサッと提示してくれる。そんな役割をSymfonyの機能が担ってくれます。
プログラミング未経験の方でも、「どの言語のときに、どの言葉を表示するか」というルールを1つずつ決めていくだけなので、難しく考える必要はありません。次の章から、具体的な設定方法を一緒に見ていきましょう。
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
といった具合に、言語が自動で切り替わります。