Django: переключить язык сообщения, отправленного из админ-панели - PullRequest
11 голосов
/ 17 апреля 2010

У меня есть модель 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, 'customer@example.org', ['admin@example.org'])
email.send()

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

Есть ли способ использовать перевод для языка, указанного в lang для body и subject, и затем переключиться обратно на en-us? Например: lang это «де». Субъект и тело должны получить строки, указанные в файлах перевода '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

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

Ответы [ 2 ]

2 голосов
/ 13 июня 2010

Если вы используете 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.

0 голосов
/ 09 июня 2010

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

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

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

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

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

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