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)
小心这个,因为它正在改变这个进程/线程的其余执行的上下文.
小智 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)
使用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)
归档时间: |
|
查看次数: |
7187 次 |
最近记录: |