Symfony 4 中实现中英文切换需理清四环节:语言环境传递、翻译文件存放、Twig 模板使用、切换动作触发;通过配置 default_locale、存取 session 的 _locale、使用 |trans 过滤器及 messages.{locale}.yaml 文件即可完成。

在 Symfony 4 中实现中英文切换,关键不是堆砌配置,而是理清“语言环境怎么传、翻译文件怎么放、模板怎么用、切换动作怎么触发”这四个环节。下面是一个可直接运行的完整案例,不依赖 Bundle,仅用官方组件,结构清晰、无冗余。
一、安装与基础配置
确保已安装核心组件:
composer require symfony/translation-
composer require symfony/twig-bundle(如未启用 Twig) -
composer require symfony/framework-bundle(默认已存在)
编辑 config/packages/translation.yaml:
framework:
default_locale: 'en'
translator:
paths:
- '%kernel.project_dir%/translations'
fallbacks:
- 'en'
同时确认 config/packages/framework.yaml 中启用了 session(语言切换需会话支持):
framework:
session:
handler_id: null
cookie_secure: auto
cookie_samesite: lax
二、准备翻译文件
在项目根目录创建 translations/ 文件夹,放入两个标准 YAML 文件:
translations/messages.en.yaml:
app.welcome: "Welcome to our site" user.greeting: "Hello %name%!" date.format: "M j, Y"
translations/messages.zh.yaml:
app.welcome: "欢迎访问我们的网站" user.greeting: "你好 %name%!" date.format: "Y年n月j日"
注意:文件名必须为 messages.{locale}.yaml,其中 messages 是默认域,en/zh 是合法 locale 标识;YAML 内容无需嵌套,扁平键值即可生效。
三、在 Twig 模板中使用翻译
在任意 Twig 模板(如 templates/base.html.twig)中直接调用:
{{ 'app.welcome'|trans }}
{{ 'user.greeting'|trans({ '%name%': '张三' }) }}
{{ 'date.format'|trans|date('Y-m-d') }}
Twig 的 |trans 过滤器会自动读取当前请求的 locale,并从对应 YAML 文件中查找键。若当前 locale 为 zh,app.welcome 就输出中文;为 en 则输出英文。
四、实现语言切换逻辑
创建一个简单控制器处理 locale 切换:
// src/Controller/LocaleController.php
namespace App\Controller;
<p>use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;</p><h1>[Route('/locale/{locale}', name: 'set_locale')]</h1><p>class LocaleController extends AbstractController
{
public function __invoke(Request $request, string $locale): RedirectResponse
{
if (!in_array($locale, ['en', 'zh'], true)) {
$locale = 'en';
}
$request->getSession()->set('_locale', $locale);
return $this->redirect($request->headers->get('referer', '/'));
}
}
然后在 Twig 模板顶部添加切换链接:
<a href="{{ path('set_locale', {locale: 'en'}) }}">EN</a> |
<a href="{{ path('set_locale', {locale: 'zh'}) }}">中文</a>
Symfony 会在每次请求时自动从 session 读取 _locale 值作为当前语言环境——无需手动设置 Translator 实例。
五、让 locale 自动生效(关键细节)
上述切换之所以能工作,依赖于 Symfony 的自动 locale 解析机制。它按顺序检查:
- 请求参数
_locale(如/home?_locale=zh) - session 中的
_locale(我们上面存的) - Accept-Language HTTP 头(浏览器发送)
- 配置中的
default_locale
只要 session 中有 _locale,后续所有 |trans、日期格式、数字格式都会自动使用该 locale,包括表单错误信息、验证约束提示等——全部开箱即用。
不复杂但容易忽略。


















