Symfony debug:translation误报已定义翻译缺失的原因与解决问询
1. 全局命令误报缺失的原因
Symfony的debug:translation全局执行时,默认只会扫描项目根目录下的translations/文件夹以及框架自带的翻译资源,不会自动包含第三方Bundle或自定义Bundle内部的翻译文件。
当你在Bundle外(比如项目自定义模板)使用Bundle内定义的翻译消息时,命令会将这些消息判定为「项目主翻译域下的缺失项」——因为它没有去读取Bundle内部的Resources/translations/目录里的翻译文件。
而当你指定BundleName执行命令时,命令会专门扫描该Bundle的翻译资源目录,自然能找到对应的消息定义,所以不会报错。
2. 让全局命令正确追踪所有翻译消息的方法
要让全局debug:translation命令识别到所有Bundle内的翻译定义,需要将Bundle的翻译路径添加到Symfony翻译组件的配置中,具体步骤如下:
编辑
config/packages/translation.yaml文件,在translator配置里添加paths节点,指定Bundle的翻译资源路径:framework: translator: default_path: '%kernel.project_dir%/translations' # 加入Bundle的翻译文件路径 paths: - '%kernel.project_dir%/vendor/your-vendor/your-bundle/Resources/translations' # 如果有多个Bundle,依次添加 - '%kernel.project_dir%/src/YourCustomBundle/Resources/translations'替换上述路径为你实际使用的Bundle的翻译目录路径。
确保模板中的翻译调用指定了正确的域:
如果Bundle的翻译文件是YourBundle.en.xlf(对应域为YourBundle),模板里要这样调用:{{ 'message.key'|trans({}, 'YourBundle') }}如果Bundle用的是默认
messages域(文件名为messages.en.xlf),则无需额外指定域,但必须确保该Bundle的翻译路径已加入配置。
完成配置后,重新执行php bin/console debug:translation en --only-missing,命令就会扫描所有指定路径的翻译文件,不会再误报已定义的消息。
内容的提问来源于stack exchange,提问作者Jaydeep

