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

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

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

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, 'customer@example.org', ['admin@example.org'])
email.send()

Информация о клиенте о языке, который он использует, доступна в lang. Язык по умолчанию является en-us, переводы находятся на французском языке (франк) и немецкий язык (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

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

11
задан Virgiliu 17 April 2010 в 21:13
поделиться

2 ответа

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

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

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

Затем вы можете легко получить ClientMessageTemplate, который вам нужен, на основе типа и языка клиента.

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

0
ответ дан 3 December 2019 в 12:17
поделиться

Если вы используете 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
ответ дан 3 December 2019 в 12:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: