symfony 4 必须显式配置 translator.default_path 才能加载本地化翻译资源,需在 config/packages/translation.yaml 中设置绝对路径(如 '%kernel.project_dir%/custom-translations'),并确保目录存在、文件名符合 domain.locale.loader 格式(如 messages.fr.xlf),最后用 php bin/console debug:translation 验证。

在 Symfony 4 中,自定义本地化翻译资源路径不是靠约定自动发现,而是必须显式配置。默认情况下,Symfony 4 不会扫描 translations/ 目录,trans() 调用返回原文,往往是因为路径根本没生效。
明确设置 translator.default_path
这是最关键的一步。Symfony 4+ 要求你手动指定翻译文件所在目录,不能依赖旧版的隐式查找。
- 编辑
config/packages/translation.yaml - 确保包含
default_path配置项,指向你的目标目录 - 路径必须是绝对路径,推荐使用内建参数(如
%kernel.project_dir%)
示例配置:
framework:
translator:
default_path: '%kernel.project_dir%/custom-translations'
fallbacks: ['en']
此时框架会去 your-project/custom-translations/ 下查找 messages.fr.xlf 等文件。
确保目录存在且命名规范
路径设对了,但目录不存在或文件名不合规,照样加载失败。
- 手动创建该目录:
mkdir -p custom-translations - 文件名必须严格遵循
domain.locale.loader格式,例如:messages.zh_CN.xlf、admin.de.xlf - 不支持
messages.zh.yml这类写法——除非你额外启用 YAML 加载器(需注册yamlloader)
验证是否真正加载成功
光看配置不等于生效。建议用命令行快速验证:
- 运行
php bin/console debug:translation fr --domain=messages - 若提示 “No translation resources were found”,说明路径未命中或格式错误
- 若列出键值对,说明已识别并加载
注意:该命令只检查当前环境激活的 locale 和 domain,确保你传入的 locale 与文件后缀一致(如查 fr 就得有 .fr.xlf)。
多路径或 Bundle 内路径(进阶)
如果需要从多个位置加载(比如主项目 + 第三方 Bundle),可使用 paths 数组而非单个 default_path:
framework:
translator:
paths:
- '%kernel.project_dir%/custom-translations'
- '%kernel.project_dir%/src/Resources/AppBundle/translations'
fallbacks: ['en']
Symfony 按数组顺序查找,前面的路径优先级更高。Bundle 内路径适用于模块化项目,但新项目更推荐统一放在 custom-translations/ 或标准 translations/ 下以降低复杂度。











