Функция npgettext_lazy

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

Синтаксис

pythonnpgettext_lazy(context, singular, plural, number)

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

Параметры

Параметр context - это строка, определяющая контекст перевода. Она позволяет различать одинаковые строки в разных контекстах (например, "apple" как фрукт и как компания).

Параметр singular - строка в единственном числе, которая будет переведена.

Параметр plural - строка во множественном числе, которая будет переведена.

Параметр number - числовое значение, которое определяет, какая форма будет использована в соответствии с правилами множественного числа текущего языка.

Пример . С моделью

Определим модель с полем, использующим npgettext_lazy для отображения количества комментариев:

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

class Article(models.Model):
  title = models.CharField(max_length=200)
  comments_count = models.IntegerField(default=0)

  def get_comments_label(self):
    return npgettext_lazy(
      "comments section",
      "comment",
      "comments",
      self.comments_count
    )

Теперь при использовании метода в шаблоне или представлении перевод будет отложен до момента рендеринга:

pythonfrom myapp.models import Article

article = Article.objects.get(id=1)
article.comments_count = 5
label = article.get_comments_label()
print(str(label))

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

python"5 комментариев"

Пример . С формой

Используем npgettext_lazy для динамического выбора формы слова в форме:

pythonfrom django import forms
from django.utils.translation import npgettext_lazy

class ProductForm(forms.Form):
  quantity = forms.IntegerField(min_value=1)

  def get_quantity_label(self):
    quantity = self.cleaned_data.get('quantity', 0)
    return npgettext_lazy(
      "product quantity",
      "item",
      "items",
      quantity
    )

Пример использования в представлении:

pythonfrom myapp.forms import ProductForm

form = ProductForm(data={'quantity': 3})
if form.is_valid():
  label = form.get_quantity_label()
  print(str(label))

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

python"3 items"

Пример . С разными контекстами

Покажем, как npgettext_lazy различает строки в разных контекстах:

pythonfrom django.utils.translation import npgettext_lazy

class Product:
  def __init__(self, name, price):
    self.name = name
    self.price = price

  def get_price_label(self):
    return npgettext_lazy(
      "product price",
      "dollar",
      "dollars",
      self.price
    )

  def get_currency_label(self):
    return npgettext_lazy(
      "currency",
      "dollar",
      "dollars",
      self.price
    )

product = Product("Laptop", 1000)
price_label = product.get_price_label()
currency_label = product.get_currency_label()
print(str(price_label))
print(str(currency_label))

Результат выполнения кода для французского языка:

python"1000 dollars"
"1000 dollars"

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

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