Функция pgettext_lazy

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

Синтаксис

pythonfrom django.utils.translation import pgettext_lazy

pgettext_lazy(context, singular_message)

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

Давайте создадим модель, в которой поле 'status' будет использовать ленивый перевод с контекстом:

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

class Article(models.Model):
  title = models.CharField(max_length=100)
  status = models.CharField(
    max_length=20,
    choices=[
      ('draft', pgettext_lazy('article status', 'Draft')),
      ('published', pgettext_lazy('article status', 'Published')),
      ('archived', pgettext_lazy('article status', 'Archived')),
    ],
    default='draft'
  )
  
  def __str__(self):
    return self.title

В этом примере каждое значение поля 'status' будет переведено с учётом контекста 'article status'. Перевод произойдёт только при отображении выбора в форме или при выводе значения в шаблоне.

Пример . С шаблоном

Рассмотрим использование pgettext_lazy в шаблоне Django для отображения переведённых значений:

ninja{% load i18n %}

<h1>{% trans "Article List" %}</h1>
<ul>
  {% for article in articles %}
    <li>
      {{ article.title }} - 
      {% if article.status == 'published' %}
        {{ article.get_status_display }}
      {% elif article.status == 'draft' %}
        {{ article.get_status_display }}
      {% else %}
        {{ article.get_status_display }}
      {% endif %}
    </li>
  {% endfor %}
</ul>

В шаблоне метод get_status_display автоматически вернёт переведённое значение с учётом контекста, так как pgettext_lazy была использована при определении поля.

Пример . С выводом в коде

Давайте создадим экземпляр модели и выведем значение поля с переводом:

pythonfrom myapp.models import Article
from django.utils.translation import activate

# Создаём статью
article = Article.objects.create(
  title="My First Article",
  status='published'
)

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

# Выводим статус с переводом
res = article.get_status_display()
print(res)

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

python"Опубликовано"

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

pythonfrom django.utils.translation import activate

activate('en')
res = article.get_status_display()
print(res)

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

python"Published"

Пример . С использованием в классе

Рассмотрим использование pgettext_lazy для создания динамического заголовка в форме:

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

class ArticleForm(forms.Form):
  title = forms.CharField(
    label=pgettext_lazy('form label', 'Title'),
    max_length=100
  )
  content = forms.CharField(
    label=pgettext_lazy('form label', 'Content'),
    widget=forms.Textarea
  )

В этом примере метки полей формы будут переведены с учётом контекста 'form label' только при рендеринге формы. Это позволяет сохранить контекстную информацию для правильного перевода.

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

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