Django:切换管理面板发送的消息语言

Vir*_*liu 11 django translation

我有一个模型,订单,在管理面板中有一个动作,让管理员将订单信息发送给该订单列出的某些人.每个人都有语言集,这是消息应该发送的语言.

我正在使用的简短版本:

from django.utils.translation import ugettext as _
from django.core.mail import EmailMessage

lang = method_that_gets_customer_language()

body = _("Dear mister X, here is the information you requested\n")
body += some_order_information

subject = _("Order information")

email = EmailMessage(subject, body, 'customer@example.org', ['admin@example.org'])
email.send()
Run Code Online (Sandbox Code Playgroud)

有关他使用的语言的客户信息,请参阅lang.默认语言为en-us,翻译为法语(fr)和德语(de).

有没有办法使用翻译为指定的语言的方式lang进行body,并subject再切换回EN-US?例如:lang是'de'.主题和正文应该获得'de'翻译文件中指定的字符串.

编辑:

找到了解决方案.

from django.utils import translation
from django.utils.translation import ugettext as _


body = "Some text in English"
translation.activate('de')
print "%s" % _(body)
translation.activate('en')
Run Code Online (Sandbox Code Playgroud)

这需要body变量,将其翻译为德语,打印它然后将语言返回到英语.

就像是

body = _("Some text in English")
translation.activate('de')
print "%s" % body
Run Code Online (Sandbox Code Playgroud)

但是用英文打印文本.

dzi*_*ida 0

不确定激活/停用翻译是否是解决该问题的正确方法(?)

如果我面临这个问题,我会尝试构建一些模型来存储主题/正文/语言/类型字段。一些代码草案:

class ClientMessageTemplate(models.Model):
    language = model.CharField(choices=AVAIALBLE_LANGUAGES,...)
    subject = models.CharField(...)
    body = models.CharField(...)
    type = models.CharField(choices=AVAILABLE_MESSAGE_TYPES)
Run Code Online (Sandbox Code Playgroud)

然后您可以根据类型和客户端语言轻松检索您需要的 ClientMessageTemplate。

该解决方案的优点是,您可以通过管理界面维护所有数据,并且无需在每次发生更改时重新编译消息文件。