Я использую тег шаблона {% trans%} В документации Django говорится:
Тег шаблона {% trans%} переводит либо постоянную строку (заключенную в одинарные или двойные кавычки), либо переменное содержимое:
{% trans "Это заголовок."%} {% trans myvar%}
https://docs.djangoproject.com/en/1.3/topics/i18n/internationalization/#trans-template-tag
Мне не удалось выполнить {% trans myvar%} потому что myvar просто не отображается в файле django.po после выполнения команды makemessages.
Я неправильно его использую? Могут ли мне помочь с этим?
В этом случае вы можете использовать тег шаблона blocktrans
:
{% blocktrans %} This is the title: {{ myvar }} {% endblocktrans %}
Джанго не может угадать, что находится в этой переменной, поэтому вы должны перевести ее самостоятельно, добавив как английские (msgid
), так и локализованные (msgstr
) строки.
Мой опыт показывает, что переменная трансляция не работает в шаблонах сама по себе . Однако я пришел к подходящему решению, когда содержание переменных известно (я имею в виду, что это не произвольный текст, а набор вариантов, которые вы устанавливаете в базе данных).
Вам необходимо принудительно заставить перевод в представлении или в теге фильтра.
Подводя итог:
blocktrans
в своих шаблонах .po
История такова: 1121]
views.py
def my_view(request):
return render(request, 'i18n_test.html', {'salutation':"Hola"})
templates / 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:
locales / en / django.po
...
msgid "Hola"
msgstr "Hello"
...
Это сложное элегантное решение, которое может помочь, если вы переводите значения из полей модели: http://django-modeltranslation.readthedocs.org
"Перевод модели
Приложение перевода модели используется для перевода динамического содержимого существующих моделей Django на произвольное количество языков без необходимости изменения исходных классов моделей. "
Для меня это произошло, когда у меня был TEMPLATES.DIRS
вне моего каталога проекта Django. Загрузка шаблонов в каталог проекта решила проблему.