对于一段代码,Django切换切换语言,以便用一种语言完成翻译

时间:2011-03-10 10:59:51

标签: python django internationalization translation gettext

我有一个django项目,它使用一个向用户发送电子邮件的工作进程。工作进程侦听rabbitmq服务器并获取有关要发送的电子邮件,模板变量,要发送到的电子邮件地址等的所有详细信息。电子邮件正文使用django模板和render_to_string创建。

但是我想把这个国际化。我们的一些用户将使用英语网站,其中一些使用其他语言。他们应该用他们的语言收到电子邮件。我试图使用电子邮件工作进程(使用django.utils.translations.ugettext / ugettext_lazy),以便电子邮件主题和电子邮件正文具有_(...)或{%blocktrans%} resp。

但是,由于电子邮件是在不同的后台工作进程中呈现和发送的,因此正常的django language detection process似乎不适用。它没有用户会话,没有cookie或没有http标头可供查看。将消息发送到rabbitmq服务器时,我可以存储语言代码

但是如何告诉django / gettext在某个时刻使用该语言。

e.g。我发送电子邮件的功能可能如下所示:

def send_email(details):
  lang = details['lang']
  name = details['name']
  email_address = details['email_address']

  switch_gettext_to_this_language_what_goes_here(lang):
  # ?????
  email_subject = _("Welcome to $SITE")  

我将django translations / gettext切换为特定的语言代码,以便_()使用该语言代码?

5 个答案:

答案 0 :(得分:34)

正如@SteveMayne在评论中所指出的那样(但值得回答),您现在可以使用上下文管理器translation.override(与Django 1.6一起使用,不检查早期版本):

from django.utils import translation
print(_("Hello"))  # Will print to Hello if default = 'en'

# Make a block where the language will be Danish
with translation.override('dk'):
    print(_("Hello"))  # print "Hej"

它基本上使用与@bitrut相同的内容,但它内置于Django中,因此它减少了依赖...

答案 1 :(得分:13)

您可以使用上下文管理器以一种很好的方式强制语言:

class force_lang:
    def __init__(self, new_lang):
        self.new_lang = new_lang
        self.old_lang = translation.get_language()
    def __enter__(self):
       translation.activate(self.new_lang)
    def __exit__(self, type, value, tb):
       translation.activate(self.old_lang)

然后你可以使用with声明:

with force_lang('en'):
    ...

答案 2 :(得分:12)

切换语言的最简单方法是:

from django.utils.translation import activate
activate('en')
# do smthg
activate('pl')
# do something in other language

要小心这一点,因为它正在改变执行此进程/线程的其余部分的上下文。

答案 3 :(得分:5)

使用django-i18nexthttps://pypi.python.org/pypi/django-i18next)非常简单。

加载模板标签。

{% load i18n i18next %}

以下代码强制荷兰语区域设置放置在overridelocale块内的任何内容。

{% overridelocale 'nl' %}
    <p>
        <a href="/login/">{% trans "Log in" %}</a>
    </p>
{% endoverridelocale %}

以下代码强制俄语语言环境放置在overridelocale块内的任何内容。

{% overridelocale 'ru' %}
    <p>
        <a href="/login/">{% trans "Log in" %}</a>
    </p>
{% endoverridelocale %}

以下代码强制在overridelocale块内放置任何内容的英语区域设置。

{% overridelocale 'en' %}
    <p>
        <a href="/login/">{% trans "Log in" %}</a>
    </p>
{% endoverridelocale %}

答案 4 :(得分:1)

原来the django docs explain how

  

虽然Django提供了一组丰富的i18n工具,可用于视图和模板,但它并不限制使用特定于Django的代码。 Django翻译机制可用于将任意文本翻译为Django支持的任何语言(当然,只要存在适当的翻译目录)。您可以加载翻译目录,激活它并将文本翻译成您选择的语言,但记得切换回原始语言,因为激活翻译目录是基于每个线程完成的,这样的更改将影响在同一个线程中运行的代码