symfony 4 按 url 切换语言需配置路由前缀、启用 session 和翻译器、规范翻译文件命名,并在 twig 中正确使用 trans 过滤器和 path 函数生成多语言链接。

在 Symfony 4 中实现按 URL 切换语言(如 /en/contact、/zh/about),关键不是“访问不同语言 URL 就自动本地化”,而是通过路由前缀绑定 locale、让请求上下文识别它,并驱动 Translator 和生成器同步响应。配置需覆盖路由、翻译器、会话和 Twig 四个环节。
配置多语言路由前缀
让 Symfony 知道 URL 中的 {_locale} 是一个可变参数,并默认 fallback 到英文:
- 编辑
config/routes.yaml,为控制器路由添加前缀和默认 locale:
resource: ../src/Controller/
type: annotation
prefix: '/{_locale}'
defaults: { _locale: 'en' }
requirements: { _locale: 'en|zh|fr|de' }
-
requirements限制合法 locale 值,避免无效路径被匹配;不加也可,但建议显式约束 - 确保控制器中所有路由注解(如
@Route("/contact"))不重复写/contact,否则会与前缀冲突
确保 Translator 能读取当前 locale
Symfony 的 Translator 默认从 RequestStack 获取 _locale,但前提是该值已注入到 Request 中——这由 LocaleAwareListener 完成,它依赖 session 启用:
- 确认
config/packages/framework.yaml启用了 session:
session: ~
- 检查
config/packages/translation.yaml是否设置了基础路径(Symfony 4 默认不自动扫描translations/):
default_locale: 'en'
translator:
default_path: '%kernel.project_dir%/translations'
- 运行
php bin/console debug:router,确认生成的路由名带 locale 参数(如app_contact实际对应/en/contact)
准备翻译文件并验证命名规范
文件必须放在 translations/ 目录下,命名格式为 domain.locale.loader:
- 例如:英文主消息 →
translations/messages.en.xlf或translations/messages.en.yaml - 中文 →
translations/messages.zh.xlf(推荐 XLIFF)或translations/messages.zh.yaml - 若使用 YAML,确保项目已启用 YAML 加载器(
symfony/yaml包通常已存在) - 内容示例(YAML):
app.contact_title: "联系我们"
- 调用时用
$translator->trans('app.contact_title'),无需手动传 locale —— 它会自动从 request 取
Twig 模板中正确使用 trans 过滤器
Symfony 4 允许全局使用 |trans,但需确保 translator 服务注入成功:
- 在
config/packages/twig.yaml中启用全局变量(简单直接):
globals:
translator: '@translator'
- 模板中即可写:
{{ 'app.contact_title'|trans }} - 生成带 locale 的链接时,显式传参:
{{ path('app_contact', { _locale: 'zh' }) }},Twig 会自动补全当前其他参数 - 避免在模板里写
app.request.get('_locale')来做条件判断——逻辑应前置到控制器











