【问题标题】:How to set the language in render_to_string helper?如何在 render_to_string 助手中设置语言?
【发布时间】:2011-05-31 04:12:54
【问题描述】:

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

真诚的 比约恩

【问题讨论】:

  • 我刚刚在运行管理脚本时遇到了类似的情况...解决方案是添加can_import_settings并在此之后运行translation.activate(settings.LANGUAGE_CODE)。
  • translation.activate 也为我工作 (stackoverflow.com/a/9283987)

标签: django internationalization


【解决方案1】:

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

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

from django.utils import translation

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

【讨论】:

    【解决方案2】:

    根据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)
    

    并引用文档(强调我的):

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

    【讨论】:

    • 这对我来说非常有效,而尝试在新的 Context 对象中设置 LANGUAGE_CODE 等(如其他答案中所建议的那样)却没有。
    【解决方案3】:

    您可以将自定义字典传递给 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

    希望这会有所帮助。

    【讨论】:

      【解决方案4】:

      似乎我可以在发送每条消息之前使用 translation.activate(some_lang)。我不确定这是否有效。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-04-17
        • 1970-01-01
        • 2019-07-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-06-23
        相关资源
        最近更新 更多