Symfony 4 导出本地化翻译需用 translation:extract 命令,必须配置 TwigExtractor、指定 --dir=templates --format=xlf --output-dir=translations 才能提取 Twig 模板字符串。

在 Symfony 4 中导出本地化翻译消息,核心命令是 translation:extract,但它默认**不扫描 Twig 模板**,也不自动识别所有消息来源。必须手动配置 extractor、指定路径和格式,否则会漏掉大量字符串。
必须安装并启用 Twig 提取器
Symfony 默认只提取 PHP 文件里的 trans() 调用。要提取 {{ 'hello'|trans }} 或 {% trans %}... 这类模板内容,需:
- 运行
composer require symfony/twig-bridge(提供TwigExtractor) - 在
config/packages/translation.yaml中显式启用它:
framework:
translator:
extractors: ['twig']
仅此一项配置就决定了是否能扫到 .twig 文件。
导出命令必须带关键参数
直接运行 php bin/console translation:extract en 是无效的。正确写法需同时满足三项:
-
--dir=templates:明确指向模板目录(不能只写src/) -
--format=xlf:XLIFF 是唯一支持 Twig 提取的格式;.yaml或.json不行 -
--output-dir=translations:指定输出位置,通常就是项目根下的translations/
完整示例:
php bin/console translation:extract en --dir=templates --format=xlf --output-dir=translations
处理 PHP 和 Twig 混合项目
如果代码中既有控制器里的 $translator->trans('key'),又有模板里的 {{ 'label'|trans }},建议分两次提取:
- 先扫 PHP 层:
php bin/console translation:extract en --dir=src --format=xlf --output-dir=translations - 再扫模板层:
php bin/console translation:extract en --dir=templates --format=xlf --output-dir=translations
这样可避免键名冲突,也方便后续交给翻译平台时分类管理。
导出后检查要点
生成的 messages.en.xlf 需确认以下几项才适合进入众包流程:
-
<file source-language="en">中的source-language值正确(众包平台常校验此项) -
<source>标签里是键名(如user.profile.title),不是原文——若看到原文,说明 extractor 未生效或格式选错 - 不手动修改
<trans-unit id="...">的id属性,它由 extractor 自动生成,改了会导致合并失败
不复杂但容易忽略。


















