如何在render_to_string帮助器中设置语言?

时间:2010-12-27 14:35:25

标签: django internationalization

从Django的保存信号中我想发送一封电子邮件。应根据保存的内容(具有lang标志)设置电子邮件的语言。如何将该语言传递给Djangos render_to_string帮助器?我只能找到RequestContexts的语言设置,这里没有请求或用户。

此致 的Björn

4 个答案:

答案 0 :(得分:11)

根据Django docs答案:

from django.template.loader import render_to_string
from django.utils import translation

(...)

cur_language = translation.get_language()
try:
    translation.activate(some_language)
    text = render_to_string('email-confirmation.html')
finally:
    translation.activate(cur_language)

引用文档(强调我的):

  

您可以加载翻译目录,激活它并将文本翻译成   您选择的语言,但请记得切换回原始    语言,因为在每个线程上激活翻译目录   基础和这样的改变将影响在同一个线程中运行的代码。

答案 1 :(得分:3)

the documentation我发现这种方式更好:

  

为了帮助编写更简洁的代码,还有一个上下文管理器django.utils.translation.override(),它在输入时存储当前语言并在退出时恢复它。有了它,上面的例子就变成了:

from django.utils import translation

def welcome_translated(language):
    with translation.override(language):
        return translation.ugettext('welcome')

答案 2 :(得分:1)

看来我可以在发送的每封邮件之前使用translation.activate(some_lang)。我不确定这是否有效。

我看到可以将一个Context实例发送到render_to_string。如果我能以某种方式将语言设置放在该上下文中,那就太好了。

答案 3 :(得分:1)

您可以将自定义词典传递给render_to_string

render_to_string(template_name, dictionary=None, context_instance=None)

LANGUAGES的默认上下文变量(见django / middlewares / context_processors.py)是:

context_extras['LANGUAGES'] = settings.LANGUAGES
context_extras['LANGUAGE_CODE'] = translation.get_language()
context_extras['LANGUAGE_BIDI'] = translation.get_language_bidi()

所以设置LANGUAGE_CODE就足够了:

render_to_string('email-confirmation.html', {'LANGUAGE_CODE':'en'})

您的模板应如下所示:

{% load i18n %}
{% trans "Welcome to our new webapp" %}

当然你会处理.po文件,但你应该知道(如果没有检查this

希望这有帮助。