在 Odoo 11 中通过 Python 修改的电子邮件模板中的翻译是否被忽略?

Are translations ignored in email templates modified through Python in Odoo 11?

我想修改电子邮件模板的正文,例如模块 sale 中的 email_template_edi_sale

它的声明在 <data no update="1"> 标签内,这意味着我必须做一个变通方法来修改它。所以我决定制作一个 Python 方法来完成这个技巧并从 XML:

调用它

XML

<?xml version="1.0" encoding="utf-8"?>
<odoo>
    <data noupdate="0">
        <function model="mail.template" name="_update_existing_mail_templates"/> 
    </data>
</odoo>

Python

class MailTemplate(models.Model):
    _inherit = 'mail.template'

    @api.model
    def _update_existing_mail_templates(self):
        edi_sale = self.env.ref('sale.email_template_edi_sale', False)
        if edi_sale:
            body_html = _("""<p>Hello customer.</p>""")
            edi_sale.write({
                'body_html': body_html,
            })

此解决方案按预期工作,因为加载模板时,我只看到 Hello customer。现在我想导出它的翻译。 xx.po 文件正确导出,因为我可以翻译术语 <p>Hello customer.</p>。例如,我将其翻译成西班牙语,因此我生成了 es.po 文件。然后我更新模块并加载西班牙语覆盖术语的翻译。为了检查这是否有效,我在 Translated terms 菜单中查找该术语,我发现它翻译正确。但是后来,我通过电子邮件发送了客户(设置了西班牙语)的销售订单,模板加载了英语源文本。

我无法弄清楚发生了什么。

这里有一个类似的问题:Email template translation Odoo 10

但是问的人解决了通过界面手动翻译模板的问题。就我而言,我什至无法应用该解决方案,因为该术语在界面中已正确翻译。

有什么想法可以做到这一点吗?

呈现 template 时不会调用此代码。 _() 方法 return 给定参数的翻译 被调用时 例如当你 raise 一个 exception 那一刻你调用 _(msg) 方法将 return 翻译消息,但是这里的代码仅在 installupgrade 模块 (when the XML file is loading).[= 时执行26=]

为了演示将 SUPERUSER 的语言更改为西班牙语然后升级模块,检查数据库中的值你会发现它是 """<p>Hello customer.</p>""" 的翻译。因为正如您所知,当您安装或升级模块时,所有操作都是由超级用户完成的,与单击按钮的用户无关(例如:self = self.sudo()

我将 SUPERUSER 的语言更改为 法语 然后我升级了模块:

所以实际上您在这里所做的只是转换将传递给写入方法并保存在数据库中的值。

甚至您通过更改此 recordir.model.data 中的 noupdate 标志来强制更新,您也无法将其导出到 PO,因为 Odoo 会忽略它,我真的不会不知道他们为什么决定这样做(或者可能只适用于我的版本,我真的不知道)。