我有一个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切换为特定的语言代码,以便_()
使用该语言代码?
答案 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-i18next
(https://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支持的任何语言(当然,只要存在适当的翻译目录)。您可以加载翻译目录,激活它并将文本翻译成您选择的语言,但记得切换回原始语言,因为激活翻译目录是基于每个线程完成的,这样的更改将影响在同一个线程中运行的代码