Как установить язык в хендере render_to_string? - PullRequest
8 голосов
/ 27 декабря 2010

Из сигнала сохранения в Django я хочу отправить электронное письмо.Язык письма должен быть установлен на основе сохраняемого контента (он имеет флаг lang).Как я могу передать этот язык помощнику Djangos render_to_string?Я могу найти только языковые настройки для RequestContexts, и здесь нет ни запроса, ни пользователя.

С уважением, Бьорн

Ответы [ 4 ]

11 голосов
/ 20 июня 2013

Ответ основан на 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)

И цитирование документации (выделено мое):

Вы можете загрузить каталог переводов, активироватьи переводите текст на язык по вашему выбору, , но не забудьте переключиться обратно на исходный язык , так как активация каталога переводов выполняется для каждого потока и такое изменение повлияет на выполнение кодав той же теме.

3 голосов
/ 02 февраля 2017

С документация Я нашел этот способ лучше:

Чтобы помочь написать более сжатый код, есть также менеджер контекста django.utils.translation.override (), который сохраняет текущий язык при вводе и восстанавливает его при выходе. При этом приведенный выше пример становится:

from django.utils import translation

def welcome_translated(language):
    with translation.override(language):
        return translation.ugettext('welcome')
1 голос
/ 27 декабря 2010

Вы можете передать пользовательский словарь для render_to_string

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

переменная контекста по умолчанию для ЯЗЫКОВ (см. 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 )

Надеюсь, это поможет.

1 голос
/ 27 декабря 2010

Похоже, что я могу использовать translation.activate (some_lang) перед каждым отправленным сообщением. Я не уверен, является ли это эффективным или нет.

Я вижу, что можно отправить экземпляр Context в render_to_string. Если бы я мог как-то поместить настройку языка в этот контекст, было бы неплохо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...