Переключение Django для блока кода переключает язык, поэтому переводы выполняются на одном языке. - PullRequest
12 голосов
/ 10 марта 2011

У меня есть проект django, который использует рабочий процесс, который отправляет электронные письма пользователям.Рабочий процесс прослушивает сервер rabbitmq и получает все сведения об отправляемом электронном письме, переменных шаблона, адресе электронной почты для отправки и т. Д. Тело электронной почты создается с помощью шаблонов django и render_to_string .

Однако я хочу интернационализировать это.Некоторые из наших пользователей будут использовать веб-сайт на английском языке, некоторые на других языках.Они должны получать электронные письма на своем языке.Я попытался включить рабочий процесс электронной почты (используя django.utils.translations.ugettext / ugettext_lazy), чтобы тема и тело письма имели _ (...) или {% blocktrans%} соответственно.

Однако, поскольку электронное письмо отрисовывается и отправляется в другом фоновом рабочем процессе, обычный процесс определения языка django , похоже, не применяется.Там нет ни пользовательского сеанса, ни файлов cookie, ни http-заголовков для просмотра.При отправке сообщения на сервер rabbitmq я могу сохранить код языка

Но как мне сказать django / gettext использовать этот язык в точке.

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

def send_email(details):
  lang = details['lang']
  name = details['name']
  email_address = details['email_address']

  switch_gettext_to_this_language_what_goes_here(lang):
  # ?????
  email_subject = _("Welcome to $SITE")  

Что я вставлю, чтобы переключить переводы / перевод текста в Django на определенный код языка, чтобы _() использовал этот код языка?

Ответы [ 5 ]

34 голосов
/ 08 апреля 2014

Как отметил @SteveMayne в комментарии (но это стоит ответа), теперь вы можете использовать контекстный менеджер translation.override (работает с Django 1.6, не проверял с более ранними версиями):

from django.utils import translation
print(_("Hello"))  # Will print to Hello if default = 'en'

# Make a block where the language will be Danish
with translation.override('dk'):
    print(_("Hello"))  # print "Hej"

Он в основном использует то же самое, что и ответ @bitrut, но он встроен в Django, поэтому он делает меньше зависимостей ...

13 голосов
/ 10 марта 2011

Самый простой способ переключения языка:

from django.utils.translation import activate
activate('en')
# do smthg
activate('pl')
# do something in other language

Будьте осторожны с этим, так как он меняет контекст для остальной части выполнения этого процесса / потока.

13 голосов
/ 30 апреля 2012

С помощью менеджера контекста вы можете форсировать язык:

class force_lang:
    def __init__(self, new_lang):
        self.new_lang = new_lang
        self.old_lang = translation.get_language()
    def __enter__(self):
       translation.activate(self.new_lang)
    def __exit__(self, type, value, tb):
       translation.activate(self.old_lang)

Тогда вы можете использовать with выражение:

with force_lang('en'):
    ...
5 голосов
/ 10 апреля 2015

Это довольно просто, используя django-i18next (https://pypi.python.org/pypi/django-i18next).

Загрузить шаблоны тегов.

{% load i18n i18next %}

Следующий код заставляет голландский языковой стандарт для всего, что находится внутри блока overridelocale.

{% overridelocale 'nl' %}
    <p>
        <a href="/login/">{% trans "Log in" %}</a>
    </p>
{% endoverridelocale %}

Следующий код вызывает русскую локаль для всего, что находится внутри блока overridelocale.

{% overridelocale 'ru' %}
    <p>
        <a href="/login/">{% trans "Log in" %}</a>
    </p>
{% endoverridelocale %}

Следующий код вызывает английскую локаль для всего, что помещено в блок overridelocale.

{% overridelocale 'en' %}
    <p>
        <a href="/login/">{% trans "Log in" %}</a>
    </p>
{% endoverridelocale %}
1 голос
/ 10 марта 2011

Получается Документация Джанго объясняет, как :

Хотя Django предоставляет богатый набор инструментов i18n для использования в представлениях и шаблонах, он не ограничивает использование специфичным для Django кодом. Механизмы перевода Django могут использоваться для перевода произвольных текстов на любой язык, поддерживаемый Django (конечно, если существует соответствующий каталог перевода). Вы можете загрузить каталог переводов, активировать его и перевести текст на язык по вашему выбору, но не забудьте переключиться обратно на исходный язык, так как активация каталога переводов выполняется для каждого потока, и такое изменение повлияет на код, выполняющийся в том же потоке .

...