Функция ngettext_lazy

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

Параметры функции:

Синтаксис

pythonngettext_lazy(singular, plural, number)

Пример . Использование в модели

Определим модель с методом, возвращающим количество комментариев с правильным склонением:

pythonfrom django.db import models
from django.utils.translation import ngettext_lazy

class Article(models.Model):
  title = models.CharField(max_length=100)
  comments_count = models.IntegerField(default=0)
  
  def get_comments_count(self):
    return ngettext_lazy(
      '%d comment',
      '%d comments',
      self.comments_count
    ) % self.comments_count

Пример . С форматированием

Используем функцию внутри шаблона для вывода информации о количестве статей:

pythonfrom django.utils.translation import ngettext_lazy

articles_count = 5
res = ngettext_lazy(
  'There is %d article',
  'There are %d articles',
  articles_count
) % articles_count
print(str(res))

Результат выполнения кода:

python"There are 5 articles"

Пример . С разными числами

Проверим работу функции с разными значениями числа:

pythonfrom django.utils.translation import ngettext_lazy

for count in [0, 1, 2, 10]:
  message = ngettext_lazy(
    '%d user',
    '%d users',
    count
  ) % count
  print(str(message))

Результат выполнения кода:

python"0 users"
"1 user"
"2 users"
"10 users"

Пример . С отложенным переводом

Покажем, что перевод выполняется только в момент преобразования в строку:

pythonfrom django.utils.translation import ngettext_lazy

# Функция возвращает объект lazy, а не строку
translation = ngettext_lazy(
  '%d product',
  '%d products',
  3
)

print(type(translation))
print(str(translation) % 3)

Результат выполнения кода:

python<class 'django.utils.functional.lazy'>
"3 products"

Смотрите также

  • функция ngettext,
    которая выполняет немедленный перевод с учетом числа
  • функция gettext_lazy,
    которая выполняет ленивый перевод без учета числа
  • функция pgettext_lazy,
    которая выполняет ленивый контекстный перевод
  • функция npgettext_lazy,
    которая выполняет ленивый контекстный перевод с учетом числа