Symfony CLI生成PDF时Translator翻译不生效该如何解决?
问题根因
CLI场景下Symfony没有请求上下文,你单独给Translator调用setLocale仅会修改当前Translator实例的临时值,Twig的翻译扩展默认不会读取这个值,而是优先取Twig环境自身配置的locale、请求栈中的locale(CLI下为空),最终 fallback 到默认语言。
解决方案
按如下步骤修改代码即可:
- 同时同步Translator、Twig环境、全局Locale类的目标语言设置
- 长期运行的CLI进程(比如Messenger消费者)执行完逻辑后要重置回默认locale,避免影响后续任务
修改后代码参考:
// 先注入默认locale参数:%kernel.default_locale% 到当前服务 protected function generatePdf ($data) { $targetLocale = $data->getCustomer()->getLanguage()->getLocale(); // 同步三类locale配置 $this->translator->setLocale($targetLocale); $this->environment->setLocale($targetLocale); \Locale::setDefault($targetLocale); $view = $this->environment->render('TestBundle:Pdf:test.html.twig', [ 'data' => $data, '_locale' => $targetLocale // 模板如果直接用到_locale变量需要传入 ]); $path = $this->pdfPathFolder.'/'.$data->getCode().'.pdf'; $this->loggableGenerator->generateFromHtml($view, $path, []); // 重置回默认locale,仅长期运行的CLI进程需要加这段 $this->translator->setLocale($this->defaultLocale); $this->environment->setLocale($this->defaultLocale); \Locale::setDefault($this->defaultLocale); return $path; }
其他排查点
- 确认对应语言的翻译文件存在且命名、路径符合Symfony规范,翻译key与模板中使用的一致
- 清空CLI对应环境的缓存:执行
php bin/console cache:clear --env=<你的运行环境>,CLI环境的缓存和web环境是独立的,web端生效不代表CLI端生效 - 若使用Messenger异步处理PDF生成任务,需要把locale作为任务的属性序列化传递,消费端再进行设置,不能依赖请求上下文的locale
内容的提问来源于stack exchange,提问作者Kevin
相关产品推荐
相关产品推荐

