You need to enable JavaScript to run this app. Symfony CLI生成PDF时Translator翻译不生效该如何解决?
优惠活动
大模型
产品
解决方案
定价
更多

Symfony CLI生成PDF时Translator翻译不生效该如何解决?

问题根因

CLI场景下Symfony没有请求上下文,你单独给Translator调用setLocale仅会修改当前Translator实例的临时值,Twig的翻译扩展默认不会读取这个值,而是优先取Twig环境自身配置的locale、请求栈中的locale(CLI下为空),最终 fallback 到默认语言。

解决方案

按如下步骤修改代码即可:

  1. 同时同步Translator、Twig环境、全局Locale类的目标语言设置
  2. 长期运行的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 06:39:01