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

Ror*_*ory 15 python django translation gettext internationalization

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

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

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

但是我如何告诉django/gettext在某一点上使用该语言.

例如,我发送电子邮件的函数可能如下所示:

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")  
Run Code Online (Sandbox Code Playgroud)

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

Max*_*ant 37

正如@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"
Run Code Online (Sandbox Code Playgroud)

它基本上使用与@bitrut相同的东西,但是它内置在Django中,所以它减少了依赖...


Jer*_*zyk 13

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

from django.utils.translation import activate
activate('en')
# do smthg
activate('pl')
# do something in other language
Run Code Online (Sandbox Code Playgroud)

小心这个,因为它正在改变这个进程/线程的其余执行的上下文.

  • 请注意,`django.utils.translation`现在有一个`override(lang)`上下文管理器,它将在退出时自动重置原始语言环境. (2认同)

小智 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)
Run Code Online (Sandbox Code Playgroud)

然后你可以使用with声明:

with force_lang('en'):
    ...
Run Code Online (Sandbox Code Playgroud)

  • 现在包含在translation.override类中.`with translation.override('en'):` (14认同)

Art*_*yan 5

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

加载模板标签.

{% load i18n i18next %}
Run Code Online (Sandbox Code Playgroud)

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

{% overridelocale 'nl' %}
    <p>
        <a href="/login/">{% trans "Log in" %}</a>
    </p>
{% endoverridelocale %}
Run Code Online (Sandbox Code Playgroud)

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

{% overridelocale 'ru' %}
    <p>
        <a href="/login/">{% trans "Log in" %}</a>
    </p>
{% endoverridelocale %}
Run Code Online (Sandbox Code Playgroud)

以下代码强制将英语区域设置强制放置在overridelocale块内.

{% overridelocale 'en' %}
    <p>
        <a href="/login/">{% trans "Log in" %}</a>
    </p>
{% endoverridelocale %}
Run Code Online (Sandbox Code Playgroud)