Skip to main content
 首页 » 编程设计

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

2024年11月01日3arxive

我想修改电子邮件模板的正文,例如 email_template_edi_sale在模块中 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 文件。然后我更新模块并加载西类牙语覆盖术语的翻译。为了检查这是否有效,我在已翻译的术语 菜单中查找该术语,我发现它已正确翻译。但随后,我通过电子邮件发送了一位客户(设置了西类牙语)的销售订单,模板加载了英文源文本。

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

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

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

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

请您参考如下方法:

此代码不会在 template 时调用被渲染。 _()方法在调用 时返回给定参数的翻译,例如当您 raise 时一个exception那一刻你调用_(msg)该方法将返回消息的翻译,但这里的代码仅在您 install 时执行或 upgrade模块 (when the XML file is loading) .

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

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

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

甚至您可以通过更改 noupdate 来强制更新在 ir.model.data 中标记这个 record你不能将它导出到 PO,因为 Odoo 会忽略它,我真的不知道他们为什么决定这样做(或者可能只是我的版本不工作,我真的不知道)。