Функция npgettext

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

Синтаксис

pythonfrom django.utils.translation import npgettext

npgettext(context, singular, plural, number)

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

⁅b⁆context⁅/b⁆ - строка, определяющая контекст перевода (например, "month_name" или "product_status");

⁅b⁆singular⁅/b⁆ - строка в единственном числе (например, "apple");

⁅b⁆plural⁅/b⁆ - строка во множественном числе (например, "apples");

⁅b⁆number⁅/b⁆ - число, определяющее, какую форму перевода использовать.

Пример

Давайте переведем фразу с учетом контекста и числа для слова "яблоко" в разных контекстах:

pythonfrom django.utils.translation import npgettext
from django.utils.translation import activate

# Активируем русский язык
activate('ru')

# Контекст "fruit" для слова "яблоко"
fruit_message = npgettext('fruit', 'apple', 'apples', 5)
print(fruit_message)

# Контекст "company" для слова "Apple" (компания)
company_message = npgettext('company', 'Apple', 'Apples', 5)
print(company_message)

# Контекст "fruit" для одного яблока
single_fruit = npgettext('fruit', 'apple', 'apples', 1)
print(single_fruit)

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

python"яблок"
"Apple"
"яблоко"

Как видно из примера, в контексте "fruit" слово "apple" переводится как "яблок" для 5 яблок и как "яблоко" для 1 яблока. В контексте "company" слово "Apple" остается без перевода, так как это название компании.

Пример

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

pythonfrom django.utils.translation import npgettext

# Контекст "products" для товаров
product_count = 3
message = npgettext('products', 'product', 'products', product_count)
print(f"Added {product_count} {message}")

# Контекст "orders" для заказов
order_count = 1
order_message = npgettext('orders', 'order', 'orders', order_count)
print(f"You have {order_count} {order_message}")

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

python"Added 3 products"
"You have 1 order"

Пример

Использование функции npgettext в модели с динамическими данными:

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

class Product(models.Model):
  name = models.CharField(max_length=100)
  quantity = models.IntegerField()

  def get_quantity_message(self):
    # Используем контекст "inventory" для инвентаризации
    return npgettext('inventory', 'item', 'items', self.quantity)

# Пример использования
translation.activate('ru')
product = Product(name='Laptop', quantity=10)
message = product.get_quantity_message()
print(f"{product.name}: {product.quantity} {message}")

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

python"Laptop: 10 items"

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

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