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

如何让Odoo邮件模板始终发送西班牙语版本的发票附件?

解决Odoo邮件模板附件强制使用西班牙语的问题

我刚好处理过类似的需求,你的核心痛点是邮件主体用用户当前语言,但附件发票必须固定为西班牙语,之前的两种方法都没命中正确的处理逻辑,给你几个可行的方案:

方案一:在邮件模板中单独给附件渲染指定语言

这个方法最灵活,不会影响邮件主体的语言,只针对附件报表强制设置西班牙语上下文:

在邮件模板的<attachment>节点里,通过with_context临时切换报表渲染的语言环境:

<attachment>
    <!-- 临时给文档对象设置西班牙语上下文,渲染报表 -->
    <t t-set="pdf_content" t-value="doc.with_context(lang='es_ES').env.ref('wms_report.report_document').render_qweb_pdf(doc.id)[0]"/>
    <t t-set="attach_name" t-value="'Factura_' + doc.name + '.pdf'"/> <!-- 这里可以用西班牙语命名附件 -->
    
    <field name="datas" t-esc="pdf_content"/>
    <field name="name" t-esc="attach_name"/>
    <field name="res_model" t-esc="doc._name"/>
    <field name="res_id" t-esc="doc.id"/>
</attachment>

原理:with_context(lang='es_ES')只会改变当前报表渲染时的语言上下文,邮件主体的渲染还是沿用原来的用户语言,完美分离了主体和附件的语言逻辑。

方案二:直接修改报表的默认语言(适合全局固定的场景)

如果这个发票报表无论何时生成都必须是西班牙语,可以直接在报表的XML定义中指定默认语言,一劳永逸:

找到报表wms_report.report_document的定义XML,添加lang="es_ES"属性:

<report
    id="report_document"
    model="your.invoice.model" <!-- 替换成你的发票模型,比如account.move -->
    string="Invoice Report"
    report_type="qweb-pdf"
    name="wms_report.report_document_template"
    file="wms_report.report_document_template"
    lang="es_ES" <!-- 强制报表使用西班牙语渲染 -->
/>

这样不管邮件模板用什么语言,调用这个报表生成的附件都会是西班牙语,不需要在邮件模板里额外处理。

方案三:用Python代码块手动创建附件(复杂场景适用)

如果需要更灵活的逻辑(比如根据某些条件动态调整,但这里固定西班牙语),可以在邮件模板中嵌入Python代码块来处理:

<t t-python="
    import base64
    # 获取文档对象
    invoice = env[doc_model].browse(doc_id)
    # 引用报表并强制西班牙语上下文渲染
    report = env.ref('wms_report.report_document').with_context(lang='es_ES')
    pdf_data, _ = report.render_qweb_pdf([invoice.id])
    # 创建附件
    attachment = env['ir.attachment'].create({
        'name': f'Factura_{invoice.name}.pdf',
        'datas': base64.b64encode(pdf_data),
        'res_model': doc_model,
        'res_id': doc_id,
        'type': 'binary',
    })
"/>
<!-- 关联创建好的附件到邮件 -->
<attachment t-esc="attachment.id"/>

这种方法自由度最高,适合需要额外处理附件的场景(比如添加水印、修改文件名等)。

为什么你之前的方法不行?

  • 方法一设置<field name="lang">es_ES</field>:这个字段是用来设置整个邮件模板的渲染语言上下文,所以会导致邮件主体也变成西班牙语,不符合你的需求。
  • 方法二用translate_doc:translate_doc是Odoo用来翻译模板文本内容的工具,不是用来渲染报表附件的,而且它的参数要求是模板上下文里的对象属性,直接传字符串会触发语法错误。

内容的提问来源于stack exchange,提问作者Marco Gonzalo Gómez Pérez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:43:26