Ответ 1
В этом случае вы можете использовать тег blocktrans
:
{% blocktrans %} This is the title: {{ myvar }} {% endblocktrans %}
Я использую тэг шаблона {% 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 %}
{% trans myvar%} просто работает. Поэтому проверьте свой файл PO, чтобы удостовериться, что значение myvar находится в недоступности.
<title>{% trans myvar %}</title>
Также убедитесь, что вы выполнили "python manage.py compilemessages"
Django не может угадать, что находится в этой переменной, поэтому вы должны перевести его самостоятельно, добавив как английские (msgid
), так и локализованные строки (msgstr
).
Мой опыт здесь в том, что перевод переменных не работает в шаблонах сам по себе. Однако я пришел к подходящему решению, когда содержимое переменных известно (я имею в виду, что они не являются бесплатным текстом, а набором вариантов, которые вы задали в базе данных).
Вам нужно принудительно выполнить трансляцию в представлении или в теге фильтра.
Подводя итог:
blocktrans
в ваших шаблонах.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"
...
Вы можете перевести переменную в код 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
Это сложное изящное решение, которое может помочь, если вы переводите значения из полей модели: http://django-modeltranslation.readthedocs.org
"Modeltranslation
Приложение моделирования используется для перевода динамического содержимого существующих моделей Django на произвольное число языков без изменения исходных классов моделей.
Для меня это произошло, когда у меня был TEMPLATES.DIRS
вне моего каталога проектов Django. Извлечение шаблонов в каталог проекта решило проблему.