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

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

7.2 Перевод моделей и форм
4 из 4 шагов пройдено

Перевод исходного кода Python

Для того чтобы перевести строковые литералы в исходном коде Python, можно пометить строковые литералы для перевода с помощью включенной в django.utils.translation функции gettext(). Эта функция переводит сообщение и возвращает строковый литерал.

По традиции указанная функция импортируется как более короткий псевдоним с именем _ (символ подчеркивания).

Вся документация о переводах находится на странице https://docs.djangoproject.com/en/4.2/topics/i18n/translation/.
 

Стандартные переводы

Следующий ниже исходный код показывает, как помечать строковый литерал для перевода:

from django.utils.translation import gettext as _

output = _('Text to be translated.')

 

Ленивые переводы

Django содержит ленивые версии всех своих переводных функций, которые имеют суффикс _lazy(). При использовании ленивых функций строковые литералы переводятся при доступе к значению, а не при вызове функции (поэтому они переводятся лениво).

Функции ленивого перевода пригодятся, когда помеченные для перевода строковые литералы будут находиться в путях, которые задействуются при загрузке модулей.

 

Переводы с переменными

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

from django.utils.translation import gettext as _

month = _('April')
day = '14'
output = _('Today is %(month)s %(day)s') % {'month': month, 'day': day}

Используя местозаполнители, можно переупорядочивать текстовые переменные.
Например, английский перевод приведенного выше примера будет Today is April 14, а русский – Сегодня 14 апреля.

Если в переводном строковом литерале есть более одного параметра, то следует всегда придерживаться строковой интерполяции вместо позиционной. Благодаря этому можно переупорядочивать текст с местозаполнителями.

 

Формы множественного числа в переводах

Для форм множественного числа можно использовать функции ngettext() и ngettext_lazy().
Эти функции переводят формы единственного и множественного числа в зависимости от аргумента, указывающего число объектов.

В следующем ниже примере показано, как их использовать:

output = ngettext('there is %(count)d product', 'there are %(count)d products', count) % {'count': count}


Теперь, когда вы знаете основы перевода строковых литералов в своем исходном коде Python, самое время применить переводы к проекту.


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

А есть ли возможность множественного числа в html шаблоне?

Изменен Михаил Тевелев

@Михаил_Тевелев, возможно, с использованием блока {% blocktranslate %}, пример из доки:

{% blocktranslate count counter=list|length %}
There is only one {{ name }} object.
{% plural %}
There are {{ counter }} {{ name }} objects.
{% endblocktranslate %}

https://docs.djangoproject.com/en/5.0/topics/i18n/translation/#blocktranslate-template-tag

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