django переводит содержимое переменной в шаблон - PullRequest
28 голосов
/ 01 июля 2011

Я использую тег шаблона {% trans%}. Документы Джанго говорят:

Тег шаблона {% trans%} переводит либо постоянную строку (заключенную в одинарные или двойные кавычки), либо переменное содержимое:

{% trans "Это заголовок." %} {% trans myvar%}

https://docs.djangoproject.com/en/1.3/topics/i18n/internationalization/#trans-template-tag

Я нашел невозможным выполнить {% trans myvar%}, потому что myvar просто не отображается в файле django.po после выполнения команды makemessages.

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

Ответы [ 8 ]

28 голосов
/ 22 июля 2011

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

{% blocktrans %} This is the title: {{ myvar }} {% endblocktrans %}
18 голосов
/ 23 января 2015

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

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

Например, если myvar содержит "Some Publisher", вы можете написать в PO-файле следующее:

msgid "Some Publisher"
msgstr "কিছু প্রকাশক"

Также убедитесь, что вы запустили:

python manage.py compilemessages
8 голосов
/ 01 июля 2011

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

5 голосов
/ 09 октября 2014

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

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

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

  1. Используйте blocktrans в своих шаблонах
  2. Принудительно переводить переменные
    • Вы можете установить переменные в контексте, которые уже помечены для перехода
    • или используйте фильтр для их перевода
  3. Генерация переводов в .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"
...
1 голос
/ 20 мая 2015

Вы можете перевести переменную в коде 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
0 голосов
/ 18 января 2018

сделать собственные теги

from django.utils.translation import ugettext as _

@register.simple_tag
def trans2(tr, *args, **kwargs):
    # print(':', kwargs)
    trans = _(tr)
    trans_str = trans.format(**kwargs)
    return trans_str

в шаблоне:

{% trans2 columns_once.res_data.message with value=columns_once.res_data.recommend%}

в django.po

#: default_content.py:136
msgid "_audit_recommend_speed"
msgstr "Рекомендованная скорость до {value} сек"
0 голосов
/ 19 апреля 2017

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

0 голосов
/ 10 марта 2016

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

"Modeltranslation

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

...