禁用 symfony 4 翻译 fallback 的关键是显式配置 fallbacks: [],并确保仅提供目标 locale 的翻译文件;缺失键时返回原文而非回退,默认 locale 不再自动生效。

在 Symfony 4 中,禁用 fallback 语言(即不自动回退到默认语言)的关键是**清空或不配置 fallbacks 选项**,并确保翻译资源严格按当前 locale 提供,缺失键时直接返回原字符串(而非尝试 fallback)。
明确关闭 fallback 配置
编辑 config/packages/translation.yaml,将 fallbacks 设为空数组:
framework:-
default_locale: 'en' -
translator: -
fallbacks: []
⚠️ 注意:不能省略 fallbacks 键,也不能设为 null 或注释掉——Symfony 会将其默认回退为 ['en']。必须显式写成空数组 [] 才真正禁用 fallback 行为。
确保翻译文件只提供目标语言
如果某个 locale(如 fr)下缺少某条翻译,且你已禁用 fallback,$translator->trans('hello') 或 {{ 'hello'|trans }} 将直接返回 'hello'(原文),不会尝试查 messages.en.xlf。
- 只保留你需要支持的 locale 对应的 XLIFF 文件,例如:
translations/messages.fr.xlf、translations/messages.de.xlf - 不要生成或部署
messages.en.xlf(除非你确实想让en也作为可选语言存在) - 若使用自定义域(如
admin.fr.xlf),调用时需指定domain: 'admin',否则仍查找messages域
验证 translator 是否按预期工作
可在控制器中快速测试:
dd($this->translator->trans('missing_key', [], 'messages', 'fr'));- 若返回
'missing_key'(而非英文翻译),说明 fallback 已禁用成功 - 若仍返回英文内容,请检查:
fallbacks: []是否拼写正确、是否被环境特定配置覆盖(如config/packages/test/translation.yaml)、是否缓存未清除(运行php bin/console cache:clear)
补充:Twig 中避免意外 fallback
确保 Twig 模板未隐式依赖全局 fallback:
- 不要依赖
{{ 'key'|trans }}在无 locale 参数时“自动猜”,而应在控制器中解析好当前 locale 并传入模板变量 - 推荐显式调用:
{{ 'key'|trans({}, 'messages', current_locale) }},其中current_locale由控制器决定并传入 - 避免在 Twig 中使用
app.request.get('_locale'),因该值可能未被路由正确设置,导致 locale 为空,触发默认 fallback











