2010-04-17 56 views
12

我有一个模型,订单,在管理面板中有一个操作,可以让管理员发送有关订单的信息给特定的人列出该订单。每个人都有语言集,这是应该的消息中发送的语言Django:从管理面板发送的消息的切换语言

我使用的是什么样的短版:

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, '[email protected]', ['[email protected]']) 
email.send() 

关于他所使用的语言中的客户信息,请在lang。默认语言是en-us,翻译语言是法语(fr)和德语(de)。

有没有办法将lang中指定的语言翻译为bodysubject然后切换回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

编辑:Oooops,对不起。今天我的头肯定有问题。 – 2010-04-19 21:50:43

+2

translation.deactivate()可能比translation.activate('en')更好。 – 2010-04-22 22:35:58

+0

谢谢。我没有注意到这个功能。 – yoshi 2010-04-24 09:58:16

回答

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。

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

2

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

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的默认的。