Подтвердить что ты не робот

Django: язык переключения сообщения, отправленного с панели администратора

У меня есть модель Order, которая имеет действие в панели администратора, которое позволяет администратору отправлять информацию о заказе определенным лицам, указанным в этом заказе. У каждого человека есть языковой набор, и это язык, на который должно быть отправлено сообщение.

Краткая версия того, что я использую:

from django.utils.translation import ugettext as _
from django.core.mail import EmailMessage

lang = method_that_gets_customer_language()

body = _("Dear mister X, here is the information you requested\n")
body += some_order_information

subject = _("Order information")

email = EmailMessage(subject, body, '[email protected]', ['[email protected]'])
email.send()

Информация о пользователе, которую он использует, доступна в lang. Язык по умолчанию en-us, переводы находятся на французском (fr) и немецком (de).

Есть ли способ использовать перевод для языка, указанного в lang для body и subject, а затем вернуться к en-us? Например: lang - 'de'. Субъект и тело должны получить строки, указанные в файлах 'de'.

изменить

Найден решение.

from django.utils import translation
from django.utils.translation import ugettext as _


body = "Some text in English"
translation.activate('de')
print "%s" % _(body)
translation.activate('en')

Что это за переменная body, переводит ее на немецкий, печатает, а затем возвращает язык на английский.

Что-то вроде

body = _("Some text in English")
translation.activate('de')
print "%s" % body

печатает текст на английском языке.

4b9b3361

Ответ 1

Если вы используете Python 2.6 (или Python 2.5 после импорта with_statement из __future__), вы можете использовать следующий менеджер контекста для удобства.

from contextlib import contextmanager
from django.utils import translation

@contextmanager
def language(lang):
    if lang and translation.check_for_language(lang):
        old_lang = translation.get_language()
        translation.activate(lang)

    try:
        yield
    finally:
        if lang:
            translation.activate(old_lang)

Пример использования:

message = _('English text')
with language('fr'):
    print unicode(message)

Это может быть безопасным, если что-то генерирует исключение, а также восстанавливает статический язык потока вместо стандартного Django.

Ответ 2

Не уверен, что активация/деактивация перевода является правильным способом решения этой проблемы (?)

Если бы я столкнулся с этой проблемой, я бы попытался создать некоторую модель для хранения объектов/полей body/language/type. Некоторая черновик кода:

class ClientMessageTemplate(models.Model):
    language = model.CharField(choices=AVAIALBLE_LANGUAGES,...)
    subject = models.CharField(...)
    body = models.CharField(...)
    type = models.CharField(choices=AVAILABLE_MESSAGE_TYPES)

Тогда вы можете легко получить доступ к ClientMessageTemplate, вам нужна база по типу и языку клиента.

Преимущество этого решения в том, что вы можете иметь все данные, поддерживаемые через интерфейс администратора, и не нужно перекомпилировать файлы сообщений каждый раз, когда что-то изменилось.