我有一个模型,订单,在管理面板中有一个操作,让管理员将订单信息发送给该订单列出的某些人。每个人都有语言集,这是消息应该被发送的语言。
我正在使用的简短版本:
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)。
是否可以使用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')
这需要body
变量,将其翻译为德语,打印它然后将语言返回到英语。
像
这样的东西body = _("Some text in English")
translation.activate('de')
print "%s" % body
打印英文文本。
答案 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。
此解决方案的优点是您可以通过管理界面维护所有数据,并且每次更改时都不需要重新编译消息文件。