Symfonyで多言語URLを実現!初心者向け国際化ルーティング(i18n対応URL)の使い方
生徒
「先生、外国語対応のWebサイトってどうやって作るんですか?URLにも言語が入ってるサイトを見かけたんですけど…」
先生
「とても大切なポイントですね。Symfonyでは、国際化対応ルーティングを使って、URLに言語を含めることができますよ。」
生徒
「Symfonyって難しそうなイメージがあるんですが、初心者でも設定できますか?」
先生
「もちろんです!初めての方でも理解できるように、ゆっくり解説していきましょう。」
1. 国際化ルーティング(i18nルーティング)とは?
国際化ルーティング(i18nルーティング)とは、ウェブサイトのURLに言語コードを含める方法のことです。たとえば、
/ja/about(日本語)/en/about(英語)
といったURL構造にすることで、ユーザーの言語に合わせたページを表示できるようになります。
Symfonyではこのような多言語対応URLを簡単に実装でき、SEO対策としても非常に有効です。
2. ルーティングとは?
ルーティングとは、ユーザーがブラウザでアクセスするURLと、そのURLに対応する処理(コントローラ)を結びつける仕組みです。
例えば、ユーザーが/aboutにアクセスしたら「会社概要」ページを表示するように設定します。
3. Symfonyでi18nルーティングを有効にする方法
まずはSymfonyでi18nルーティングを有効にする基本設定を紹介します。
ステップ①:ルーティングの設定を変更する
Symfonyのroutes.yamlファイルに、言語コード(ロケール)を含めた設定を追加します。
# config/routes.yaml
homepage:
path: /{_locale}/
controller: App\Controller\HomeController::index
requirements:
_locale: en|ja
解説:
path: /{_locale}/は、URLに/en/や/ja/のような言語コードが含まれることを意味します。requirementsで対応させたい言語(英語、⽇本語)を指定しています。
ステップ②:デフォルトロケールを設定する
Symfonyが初期状態で使用する言語を指定します。設定ファイルはconfig/packages/locale.yamlです。
# config/packages/locale.yaml
framework:
default_locale: ja
これで、明示的に言語が指定されていない場合でも、日本語が表示されるようになります。
4. URLに言語が含まれない場合の自動リダイレクト
ユーザーがURLに言語コードを含めずアクセスしたとき、自動的に言語付きのURLへリダイレクトする仕組みを作りたいですよね。
その場合は、イベントリスナーでRequestEventを使ってリダイレクト処理を追加します。
// src/EventSubscriber/LocaleRedirectSubscriber.php
namespace App\EventSubscriber;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Routing\RouterInterface;
class LocaleRedirectSubscriber implements EventSubscriberInterface
{
private $router;
private $defaultLocale;
public function __construct(RouterInterface $router, string $defaultLocale = 'ja')
{
$this->router = $router;
$this->defaultLocale = $defaultLocale;
}
public function onKernelRequest(RequestEvent $event)
{
$request = $event->getRequest();
$pathInfo = $request->getPathInfo();
if (!preg_match('#^/(en|ja)/#', $pathInfo)) {
$newUrl = '/' . $this->defaultLocale . $pathInfo;
$event->setResponse(new RedirectResponse($newUrl));
}
}
public static function getSubscribedEvents()
{
return [
'kernel.request' => 'onKernelRequest',
];
}
}
このクラスを使うことで、言語なしURL(例:/about)にアクセスすると、自動的に/ja/aboutにリダイレクトされます。
5. 多言語対応テンプレートを表示する
最後に、表示する文章を言語ごとに変えるために、Twig(テンプレートエンジン)と翻訳ファイルを使います。
Twigで翻訳を表示する方法
<h1>{{ 'page.title'|trans }}</h1>
翻訳ファイルを用意する
翻訳ファイルを作成して、言語ごとのテキストを定義します。
# translations/messages.ja.yaml
page:
title: ようこそ
# translations/messages.en.yaml
page:
title: Welcome
これで、URLが/jaの場合は「ようこそ」、/enの場合は「Welcome」と表示されるようになります。
まとめ
Symfonyで多言語対応URL(i18nルーティング)を実現する方法について学んできました。多言語化は単なる翻訳作業ではなく、URL構造、ルーティング設定、テンプレートの表示内容など、サイト全体の構成にも影響する非常に重要なポイントです。とくに国際向けのWebサイトを作る場合、利用者がどの言語を使ってアクセスしてきたかを判別し、その言語に応じたページを自然な形で表示できる仕組みは欠かせません。Symfonyでは、これらをすべてフレームワークの標準機能で扱えるため、初心者でも段階的に学びながら国際化対応サイトを構築できる点が大きな特徴です。
今回紹介したように、ルーティング設定で{_locale}を使い、requirementsで対応言語を制限するだけで、多言語対応URLの基本は整います。そして、デフォルトロケールを設定することで、言語指定のないアクセスが来た場合でも正しい表⽰に導くことができます。さらに、RequestEventを利用して自動リダイレクトを実装すれば、ユーザーの混乱を避けつつ自然に多言語URLへ誘導できます。このような工夫により、ユーザー体験の向上だけでなく、検索エンジンが言語ごとのページを正しく認識しやすくなるため、国際向けSEOにも有利になります。
また、表示文章の翻訳にはTwigのtransフィルタを使い、言語ごとに翻訳ファイルを用意することで柔軟な文言管理ができます。メニューやタイトル、ボタン名などを分かりやすく整理しておくことは、開発効率の向上にもつながります。特に、大規模なサイトでは翻訳ファイルを適切に分割することで可読性と保守性が高まり、後からの修正にも対応しやすくなります。Symfonyは翻訳の自動読み込みやキャッシュ管理も備えているため、開発者が煩雑な処理に悩まされることなく、安心してサイト制作を進められるのが魅力です。
ここであらためて、今回学んだ内容を整理し、さらに理解を深めるために、簡単なサンプルを紹介します。多言語対応の基本構造を確認することで、これから実際に多言語サイトを作成するときの基礎力がぐっと高まります。
多言語対応URLの動作を確認する簡単サンプル
以下は、言語コードを含んだURLにアクセスすることで、それぞれ異なる言語のメッセージを表示する最小構成のコントローラ例です。
// src/Controller/LocaleDemoController.php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
class LocaleDemoController extends AbstractController
{
#[Route('/{_locale}/demo', name: 'locale_demo', requirements: ['_locale' => 'en|ja'])]
public function index(string $_locale): Response
{
if ($_locale === 'ja') {
return new Response('これは日本語のデモページです。');
}
return new Response('This is the English demo page.');
}
}
このように、URLから受け取った_localeを使い、必要に応じて画面内容を切り替えることができます。テンプレートと翻訳ファイルを組み合わせれば、さらに柔軟な処理が可能となり、どのページにも自然に多言語対応を組み込めるようになります。こうした仕組みを理解しておくことで、国際化されたWebサイトの構築がぐっと身近に感じられるようになるはずです。
多言語対応は最初こそ難しそうに見えますが、一つ一つの仕組みを理解して組み合わせると、驚くほど整然と動作することがわかります。Symfonyはそのための機能を丁寧に提供しており、初心者でも確実にステップアップできる環境が整っています。これから多言語サイトを作りたい人にとって、今回学んだURL構造、ルーティング、翻訳機能は必ず役立つ基盤となるでしょう。
生徒
「言語コードをURLに入れるだけでここまでしっかり切り替えられるとは思いませんでした!」
先生
「そうですね。Symfonyは国際化を前提にした機能がとても充実しているので、初心者でも安心して取り組めますよ。」
生徒
「翻訳ファイルを追加すれば文章も自然に切り替わるのが便利です。もっと複雑なサイトでも応用できそうですね!」
先生
「もちろんです。多言語対応を理解すれば、世界中のユーザーに使ってもらえるサイト作りにつながりますよ。」
生徒
「今日学んだ設定を実際のプロジェクトでも試してみます!」