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