You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决Symfony自定义vendor bundle翻译键无法提取的问题

问题解决方案

为什么translation:update命令无法提取自定义bundle的翻译键

Symfony的translation:update命令默认仅扫描项目根目录下的src、templates目录,不会主动扫描vendor目录下的第三方bundle(包括通过symlink引入的自定义bundle),你可以通过以下方式解决:

  • 执行命令时追加--bundle参数指定你的自定义bundle名称,示例:
    bin/console translation:update fr --dump-messages --bundle=YourCustomBundleName
    
  • 检查自定义bundle是否已在config/bundles.php中正常注册,且目录结构符合Symfony规范:PHP业务代码放在bundle的src/目录,模板文件放在Resources/views/或bundle根目录的templates/目录

自定义类中常量/数组翻译键的自动提取方案

Symfony默认的翻译提取器仅能识别三类翻译键:模板中的trans过滤器/{% trans %}标签、PHP代码中显式调用$translator->trans()的参数、表单类中配置了翻译域的属性值。你存储在MyCustomClass数组中的状态键默认无法被识别,有两种实现方案:

方案1:实现自定义翻译提取器(推荐,适合大量翻译键场景)

你可以通过实现Symfony\Component\Translation\Extractor\ExtractorInterface接口完成自定义提取:

  1. 新建提取器类实现上述接口,在extract()方法中遍历目标类,读取常量数组中的所有翻译键加入到消息集合中
  2. 给该提取器类添加translation.extractor服务标签,配置别名和优先级即可被翻译命令自动调用

方案2:无侵入兼容方案(适合少量翻译键场景)

在自定义类中新增一段不会被实际执行的占位代码,将所有翻译键用$translator->trans()包裹,默认提取器就能自动识别:

// 仅用于翻译提取器扫描,不会被实际执行
if (false) {
    $translator->trans('status.pending');
    $translator->trans('status.approved');
    $translator->trans('status.rejected');
}

适配Symfony 5.3版本的注意事项

  • 上述方案完全兼容你使用的Symfony 5.3.8和Translation 5.3.9版本,无需额外适配
  • 如果提取结果仍包含多余的系统翻译键,可以追加--domain参数指定你需要提取的翻译域缩小扫描范围

内容的提问来源于stack exchange,提问作者Skuti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 23:18:02