カテゴリ: Symfony 更新日: 2025/12/21

Symfonyで多言語URLを実現!初心者向け国際化ルーティング(i18n対応URL)の使い方

Symfonyの国際化ルーティング(i18n対応URL)の実装方法
Symfonyの国際化ルーティング(i18n対応URL)の実装方法

先生と生徒の会話形式で理解しよう

生徒

「先生、外国語対応のWebサイトってどうやって作るんですか?URLにも言語が入ってるサイトを見かけたんですけど…」

先生

「とても大切なポイントですね。Symfonyでは、国際化対応ルーティングを使って、URLに言語を含めることができますよ。」

生徒

「Symfonyって難しそうなイメージがあるんですが、初心者でも設定できますか?」

先生

「もちろんです!初めての方でも理解できるように、ゆっくり解説していきましょう。」

1. 国際化ルーティング(i18nルーティング)とは?

1. 国際化ルーティング(i18nルーティング)とは?
1. 国際化ルーティング(i18nルーティング)とは?

国際化ルーティング(i18nルーティング)とは、ウェブサイトのURLに言語コードを含める方法のことです。たとえば、

  • /ja/about(日本語)
  • /en/about(英語)

といったURL構造にすることで、ユーザーの言語に合わせたページを表示できるようになります。

Symfonyではこのような多言語対応URLを簡単に実装でき、SEO対策としても非常に有効です。

2. ルーティングとは?

2. ルーティングとは?
2. ルーティングとは?

ルーティングとは、ユーザーがブラウザでアクセスするURLと、そのURLに対応する処理(コントローラ)を結びつける仕組みです。

例えば、ユーザーが/aboutにアクセスしたら「会社概要」ページを表示するように設定します。

3. Symfonyでi18nルーティングを有効にする方法

3. Symfonyでi18nルーティングを有効にする方法
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に言語が含まれない場合の自動リダイレクト

4. URLに言語が含まれない場合の自動リダイレクト
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. 多言語対応テンプレートを表示する

5. 多言語対応テンプレートを表示する
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は国際化を前提にした機能がとても充実しているので、初心者でも安心して取り組めますよ。」

生徒

「翻訳ファイルを追加すれば文章も自然に切り替わるのが便利です。もっと複雑なサイトでも応用できそうですね!」

先生

「もちろんです。多言語対応を理解すれば、世界中のユーザーに使ってもらえるサイト作りにつながりますよ。」

生徒

「今日学んだ設定を実際のプロジェクトでも試してみます!」

この記事を読んだ人からの質問

この記事を読んだ人からの質問
この記事を読んだ人からの質問

プログラミング初心者からのよくある疑問/質問を解決します

Symfonyで国際化ルーティングとは何ですか?初心者向けに教えてください。

Symfonyの国際化ルーティング(i18nルーティング)とは、URLに言語コード(例:/ja、/en)を含めることで、多言語対応のWebサイトを実現する仕組みです。
関連記事:
カテゴリの一覧へ
新着記事
New1
Laravel
LaravelでAPIのレスポンスをテストする方法を完全解説!assertJsonで初心者も安心
New2
CodeIgniter
CodeIgniterでRESTful API開発!初心者でもわかる全体構成ガイド
New3
Symfony
Symfonyのコントローラとは?作成・構造・役割を初心者向けにやさしく解説!
New4
Symfony
Symfonyでバリデーションメッセージを多言語対応する方法!初心者でもわかる国際化の基本
人気記事
No.1
Java&Spring記事人気No1
Laravel
Laravelのシングルアクションコントローラとは?使い方と利点
No.2
Java&Spring記事人気No2
Laravel
Laravelで動的パラメータをルートに渡す方法!初心者にもやさしいルートパラメータの使い方入門
No.3
Java&Spring記事人気No3
Laravel
Laravelでキャッシュを使う方法(ファイル・Redis・Memcached)
No.4
Java&Spring記事人気No4
Laravel
LaravelのBlade構文まとめ!@if @foreach など基本ディレクティブ解説
No.5
Java&Spring記事人気No5
Symfony
Symfonyの依存性注入(DI)とは?コンストラクタでの注入方法を初心者向けに徹底解説
No.6
Java&Spring記事人気No6
Laravel
Laravelで名前付きルートを設定する方法!初心者でもわかるroute()関数の使い方
No.7
Java&Spring記事人気No7
Laravel
Laravelのマイグレーション履歴を確認する方法を徹底解説!migrate:statusの使い方
No.8
Java&Spring記事人気No8
Symfony
Symfonyとは?PHPの堅牢なフレームワークの特徴と活用シーン