Symfonyで翻訳(i18n)機能を使う方法を解説!初心者にもわかる国際化対応の基本
生徒
「Symfonyで多言語対応のホームページを作ることはできますか?」
先生
「はい、Symfonyには翻訳(いわゆるi18n)という機能があって、簡単に言語を切り替えられるようにできます。」
生徒
「i18nってなんですか?難しそうですね…」
先生
「大丈夫です。i18nは『インターナショナライゼーション』の略で、多言語対応を意味します。初心者でも理解できるよう、ゆっくり解説していきましょう!」
1. Symfonyの翻訳(i18n)とは?
Symfony(シンフォニー)では、翻訳(Translation)機能を使って、英語・日本語など複数の言語に対応したアプリケーションを作ることができます。
i18n(アイ・エイティーン・エヌ)とは「internationalization(インターナショナライゼーション)」の略で、単語の最初の「i」と最後の「n」の間に18文字あることからこのように略されます。
Webサイトをいろいろな国の人が見ても使えるようにしたいときに、このi18n機能が使われます。
2. 翻訳ファイルの作成と命名ルール
Symfonyでは、言語ごとに翻訳ファイルを用意します。翻訳ファイルは、通常translations/フォルダに保存されます。
例えば、日本語の翻訳ファイルは次のように作ります。
# translations/messages.ja.yaml
greeting: 'こんにちは'
farewell: 'さようなら'
英語版はこうです:
# translations/messages.en.yaml
greeting: 'Hello'
farewell: 'Goodbye'
ファイル名の.jaや.enは、それぞれの言語コードです。これはロケールと呼ばれ、日本語はja、英語はenです。
3. コントローラから翻訳する方法
Symfonyでは、コントローラ(Controller)という部分で表示する文章を翻訳できます。以下は翻訳を使う基本的な方法です。
// src/Controller/HelloController.php
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Contracts\Translation\TranslatorInterface;
class HelloController extends AbstractController
{
public function index(TranslatorInterface $translator): Response
{
$message = $translator->trans('greeting');
return new Response($message);
}
}
TranslatorInterfaceという翻訳の機能をコントローラに渡して、trans()メソッドを使って「greeting」というキーの言葉を表示します。
日本語の環境でアクセスすると「こんにちは」、英語環境では「Hello」となります。
4. Twigテンプレートで翻訳する
画面に表示される文字(HTML)も翻訳できます。SymfonyではテンプレートエンジンとしてTwig(トゥイッグ)を使います。Twigではtransフィルターを使って簡単に翻訳できます。
<!-- templates/hello/index.html.twig -->
<p>{{ 'greeting'|trans }}</p>
<p>{{ 'farewell'|trans }}</p>
このように書くことで、messages.ja.yamlなどに書かれた内容が反映されます。
5. 言語を切り替える方法(ロケールの変更)
表示言語を変更したいときは、Symfonyの設定でロケール(言語の指定)を切り替えます。ロケールとは、どの国の言葉を使うかを表すものです。
.envファイルでデフォルトのロケールを設定できます。
# .env
APP_LOCALE=ja
また、URLにパラメータをつけて切り替える方法もあります。
/hello?_locale=en
このようにすると、英語表示に切り替わります。これはルーティングに_localeを含めることで機能します。
6. 翻訳ファイルの更新を反映するには?
翻訳ファイルを書き換えたあと、Symfonyのキャッシュに古い情報が残っていると新しい翻訳が反映されないことがあります。
その場合は、以下のコマンドでキャッシュをクリアしましょう。
php bin/console cache:clear
これで新しい翻訳がすぐに反映されるようになります。
7. 翻訳の対象を整理しておこう
翻訳に使うキー(例:greeting)は、自分で管理する必要があります。たくさん増えてくると分かりにくくなるので、ファイルを分けたり、わかりやすい名前をつけると良いでしょう。
たとえば:
messages.ja.yaml:全体的な共通翻訳homepage.ja.yaml:トップページ専用error.ja.yaml:エラーメッセージ専用
8. Symfony翻訳機能の特徴とポイント
Symfonyの翻訳機能は、コントローラでもTwigテンプレートでも簡単に使える点が特徴です。
特に以下の点が初心者におすすめです:
- 設定ファイルを書くだけで使える
- URLで言語を切り替えられる
- 英語・日本語だけでなく他の言語にも対応可能
翻訳対応を早いうちから考えることで、あとからサイトを多言語にしたい時にも対応しやすくなります。
まとめ
Symfonyの翻訳機能は、国際化を考えたウェブアプリケーションづくりに欠かせない重要な要素であり、さまざまな国や地域の利用者に自然な表現で情報を届けるための基本的な仕組みです。翻訳ファイルをロケールごとに整理し、キーと文章を紐づけて管理する方法は、とても柔軟で扱いやすく、規模が大きくなるほどその利点が実感できます。特に、コントローラでのtrans()の利用や、Twigでのtransフィルターなどは、自然な形で翻訳を埋め込めるため、文章ごとに細かな制御ができ、読み手に合わせたコンテンツを無理なく提供できます。
また、ロケール切り替えの仕組みは、アプリケーションの動作を大きく変えることなく言語表示を変更できるため、多言語サイト運営における負担を軽減し、訪れる人々にとって使いやすい環境を整える一助となります。翻訳ファイルの構成を用途ごとに分割する工夫や、キャッシュクリアによる反映確認など、細やかな作業とともに全体像が整理されていく感覚は、Symfonyの開発に慣れていく上で非常に大きな収穫となるでしょう。
実際の開発では、文章量が多くなるほど管理の工夫が求められますが、Symfonyの翻訳仕組みはその負担を最小限に抑えるための道具がそろっており、世界中のユーザーに向けた情報発信に適した形を整えてくれます。ここでは振り返りも兼ねて、基本的な構文やテンプレート内での利用例とともに、より実務で使いやすいサンプルも整理しておきます。
サンプルプログラムで確認しておこう
以下は翻訳キーを複数ページで共有しながら、柔軟に文章を切り替えるための復習用サンプルです。
# translations/common.ja.yaml
header.title: '多言語サイトへようこそ'
header.subtitle: '翻訳機能で表示を切り替えることができます'
# translations/common.en.yaml
header.title: 'Welcome to the Multilingual Site'
header.subtitle: 'You can switch the language easily'
// src/Controller/PageController.php
use Symfony\Contracts\Translation\TranslatorInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
class PageController extends AbstractController
{
public function header(TranslatorInterface $translator): Response
{
$title = $translator->trans('header.title');
$subtitle = $translator->trans('header.subtitle');
return $this->render('header.html.twig', [
'title' => $title,
'subtitle' => $subtitle
]);
}
}
<!-- templates/header.html.twig -->
<h1 class="fw-bold">{{ title }}</h1>
<p class="text-muted">{{ subtitle }}</p>
このように、翻訳キーを用途ごとに用意しておくことで、複数の画面で自然な文章表現を保ちながら統一感のある表示ができます。ロケールを切り替えるだけで全体の表示が変わるため、利用する人の環境に合わせたコンテンツをスムーズに届けられます。文章管理をわかりやすく保つためには、ページ単位・役割単位で翻訳ファイルを構成していく工夫が効果的です。
生徒
「今日の翻訳機能の話、実際にやってみると仕組みがよくわかりました。特に翻訳ファイルが言語ごとに分かれているのは整理しやすいですね。」
先生
「その感覚はとても大切ですよ。翻訳キーをしっかり管理すると、あとから文章を増やすときにも迷わず対応できますからね。」
生徒
「Twigでの翻訳も思ったより自然に書けるので、実際の画面づくりでも役立てやすいと思いました。」
先生
「ええ、テンプレート側で扱えるのは大きな強みです。文章の調整もしやすくなりますよ。」
生徒
「ロケール切り替えも意外と簡単でした。世界の人に見てもらえるホームページが作れそうでわくわくします。」
先生
「その気持ちを忘れないように、少しずつ応用へ挑戦していきましょう。翻訳の仕組みは使うほど理解が深まりますよ。」
生徒
「はい!また別のページでも試してみます。ありがとうございました!」