Мой опыт показывает, что переменная трансляция не работает в шаблонах сама по себе . Однако я пришел к подходящему решению, когда содержание переменных известно (я имею в виду, что это не произвольный текст, а набор вариантов, которые вы устанавливаете в базе данных).
Вам нужно форсировать перевод в представлении или в теге фильтра.
Подводя итог:
- Используйте
blocktrans
в своих шаблонах
- Принудительно переводить переменные
- Вы можете установить переменные в контексте, которые уже помечены для перехода
- или используйте фильтр для их перевода
- Генерация переводов в
.po
файле
История такая:
views.py
def my_view(request):
return render(request, 'i18n_test.html', {'salutation':"Hola"})
шаблоны / i18n_test.html
...
{% blocktrans %}{{ salutation }}{% endblocktrans %}
...
И когда я отрисовываю шаблон, он всегда показывает Hola , какой бы ни был текущий язык.
Для принудительного перевода, в представлении нам нужно использовать ugettext.
def my_view(request):
return render(request, 'i18n_test.html', {'salutation':ugettext("Hola")})
Однако не всегда возможно получить доступ к представлению. Поэтому я предпочитаю использовать такой фильтр.
templatetags / i18n_extras.py
@register.filter(name='translate')
def translate(text):
try:
return ugettext(text)
И шаблон становится
...
{% blocktrans s=salutation|translate %}{{ s }}{% endblocktrans %}
...
И производит Привет, Привет, Чао, Салют в зависимости от текущего языка.
Недостаток (как указано в документах ) заключается в том, что makemessages
не включает автоматически эти переводы, поэтому нам нужно включить их вручную. В файле django.po:
локали / о / django.po
...
msgid "Hola"
msgstr "Hello"
...