django переводит содержимое переменных в шаблоне

Я использую тег шаблона {% 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.

Я неправильно его использую? Могут ли мне помочь с этим?

31
задан thoslin 1 July 2011 в 10:45
поделиться

5 ответов

В этом случае вы можете использовать тег шаблона blocktrans :

{% blocktrans %} This is the title: {{ myvar }} {% endblocktrans %}
28
ответ дан 27 November 2019 в 22:05
поделиться

Джанго не может угадать, что находится в этой переменной, поэтому вы должны перевести ее самостоятельно, добавив как английские (msgid), так и локализованные (msgstr) строки.

8
ответ дан 27 November 2019 в 22:05
поделиться

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

Вам необходимо принудительно заставить перевод в представлении или в теге фильтра.

Подводя итог:

  1. Используйте blocktrans в своих шаблонах
  2. Принудительно переводить переменные
    • Вы либо устанавливаете переменные в контексте, которые уже отмечены для transstalion
    • или используйте фильтр для их перевода
  3. Генерация переводов в файле .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"
...
5
ответ дан 27 November 2019 в 22:05
поделиться

Это сложное элегантное решение, которое может помочь, если вы переводите значения из полей модели: http://django-modeltranslation.readthedocs.org

"Перевод модели

Приложение перевода модели используется для перевода динамического содержимого существующих моделей Django на произвольное количество языков без необходимости изменения исходных классов моделей. "

0
ответ дан 27 November 2019 в 22:05
поделиться

Для меня это произошло, когда у меня был TEMPLATES.DIRS вне моего каталога проекта Django. Загрузка шаблонов в каталог проекта решила проблему.

0
ответ дан 27 November 2019 в 22:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: