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

时间:2010-04-17 13:39:37

标签: 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()

lang中提供了有关其使用的语言的客户信息。默认语言为en-us,翻译为法语(fr)和德语(de)。

是否可以使用langbodysubject指定的语言翻译,然后切换回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')

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

这样的东西
body = _("Some text in English")
translation.activate('de')
print "%s" % body

打印英文文本。

2 个答案:

答案 0 :(得分:2)

如果您使用Python 2.6(或从with_statement导入__future__后使用Python 2.5),则可以使用以下上下文管理器。

from contextlib import contextmanager
from django.utils import translation

@contextmanager
def language(lang):
    if lang and translation.check_for_language(lang):
        old_lang = translation.get_language()
        translation.activate(lang)

    try:
        yield
    finally:
        if lang:
            translation.activate(old_lang)

使用示例:

message = _('English text')
with language('fr'):
    print unicode(message)

这样做的好处是可以防止抛出异常,以及恢复线程的旧语言而不是Django默认语言。

答案 1 :(得分:0)

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

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

class ClientMessageTemplate(models.Model):
    language = model.CharField(choices=AVAIALBLE_LANGUAGES,...)
    subject = models.CharField(...)
    body = models.CharField(...)
    type = models.CharField(choices=AVAILABLE_MESSAGE_TYPES)

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

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