Подтвердить что ты не робот

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.

Я использую это неправильно? Может ли кто-нибудь помочь мне в этом?

4b9b3361

Ответ 1

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

{% blocktrans %} This is the title: {{ myvar }} {% endblocktrans %}

Ответ 2

{% trans myvar%} просто работает. Поэтому проверьте свой файл PO, чтобы удостовериться, что значение myvar находится в недоступности.

<title>{% trans myvar %}</title>

Также убедитесь, что вы выполнили "python manage.py compilemessages"

Ответ 3

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

Ответ 4

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

Вам нужно принудительно выполнить трансляцию в представлении или в теге фильтра.

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

  • Используйте blocktrans в ваших шаблонах
  • Переменные силы, которые нужно перевести
    • Вы либо задаете переменные в контексте, которые уже отмечены для transtalion
    • или использовать фильтр для их перевода.
  • Сгенерировать переводы в .po файле

История такова:

views.py

def my_view(request):
    return render(request, 'i18n_test.html', {'salutation':"Hola"})

Шаблоны /i 18n_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 %}
...

И производит Hola, Hello, Ciao, Salut в зависимости от текущего языка.

Недостаток (как указано в docs) заключается в том, что makemessages автоматически не включает эти переводы, поэтому нам нужно включите их вручную. В файле django.po:

<сильные > локали/о/django.po

...
msgid "Hola"
msgstr "Hello"
...

Ответ 5

Вы можете перевести переменную в код python, как здесь, для settings.SITE_NAME:

from django.conf import settings
from django.utils.translation import ugettext_lazy as _

def processor004(request):
 my_dict = {
    'site_id004': settings.SITE_ID,
    'site_name004': _(settings.SITE_NAME),
    'installed_apps004': settings.INSTALLED_APPS,
    'embedded_widget004': settings.EMBEDDED_WIDGET,
    'base_template004': settings.BASE_TEMPLATE,
}

return my_dict

Ответ 6

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

"Modeltranslation

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

Ответ 7

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