从Django的保存信号中我想发送一封电子邮件。应根据保存的内容(具有lang标志)设置电子邮件的语言。如何将该语言传递给Djangos render_to_string帮助器?我只能找到RequestContexts的语言设置,这里没有请求或用户。
此致 的Björn
答案 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)
希望这有帮助。