Продвинутый Django 5 для продолжающих

Прогресс по курсу:  0/193

7.3 Перевод шаблонов
3 из 3 шагов пройдено

Перевод шаблонов

Django предлагает теги {% trans %} и {% blocktrans %} для перевода строковых литералов в шаблонах. Для того чтобы использовать шаблонные теги перевода, необходимо в верхнюю часть шаблона добавить тег {% load i18n %}, который будет их загружать.
 

Шаблонный тег {% trans %}

Шаблонный тег {% trans %} позволяет помечать строковый литерал для перевода. На внутреннем уровне Django выполняет функцию gettext() с заданным текстом в качестве параметра.

Вот как строковый литерал помечается в шаблоне:

{% trans "Text to be translated" %}

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

В следующем ниже примере переведенный текст сохраняется в переменной с именем greeting:

{% trans "Hello!" as greeting %}
<h1>{{ greeting }}</h1>

Тег {% trans %} удобен для простых переводных строковых литералов, но он не способен обрабатывать переводной контент, содержащий переменные.
 

Шаблонный тег {% blocktrans %}

Шаблонный тег {% blocktrans %} позволяет помечать контент, содержащий строковые литералы и переменные, используя местозаполнители.

В следующем ниже примере показано, как использовать тег {% blocktrans %}, содержащий переменную name в контенте для перевода:

{% blocktrans %}Hello {{ name }}!{% endblocktrans %}


Притом можно использовать ключевое слово with, чтобы вставлять шаблонные выражения, такие как доступ к объектным атрибутам или применение шаблонных фильтров к переменным. Для них всегда следует использовать местозаполнители.

Вместе с тем ни к выражениям, ни к объектным атрибутам внутри блока blocktrans обратиться невозможно.

В следующем ниже примере показано, как использовать with для вставки объектного атрибута, к которому был применен фильтр capfirst:

{% blocktrans with name=user.name|capfirst %}
    Hello {{ name }}!
{% endblocktrans %}

  • Комментария
Будьте вежливы и соблюдайте наши принципы сообщества. Пожалуйста, не оставляйте решения и подсказки в комментариях, для этого есть отдельный форум.
Оставить комментарий

А как сделать перевод Динамического  контента ? Ну допустим раздел  FAQ, в модели только вопрос и ответ стандартный CharField(), через админку добавляем вопросы и ответа а на шаблон выводим через {% for %}. Как в таком случае организовать перевод данного динамического контента ?)

@Алмаз_Муфтахов, штатными средствами Django можно перевести или в шаблоне:

<ul>
{% for dt in data %}
    <li>{% trans dt %}</li>
{% endfor %}
</ul>

Или в представлении, перед отправкой контекста.

Более правильный и удобный вариант - использовать пакет django-modeltranslation, который используется для перевода хранимых в БД данных.

@Дмитрий_Селезнев, Да вот пробовал так в шаблоне, почему то не переводит, а в представлении на основе класса только модель, поизучаю пакет django-modeltranslation, спасибо за ответ

@Алмаз_Муфтахов, переводит, но нужно вручную добавлять msgid и msgstr строки.

blocktrans - переводит значение вставленной переменной если там есть текст, или просто вставляет значение игнорирую перевод переменной?

@Михаил_Тевелев, не переводит, но в строке перевода будет имя этой переменной, например для:

{% blocktranslate %}My name is {{ name }}.{% endblocktranslate %}

Содержимое .po файла перевода будет такое:

#, python-format
msgid "My name is %(name)s."
msgstr "Меня зовут %(name)s."

@Дмитрий_Селезнев, спасибо