Функция pgettext_lazy
Функция pgettext_lazy является ленивой версией функции pgettext. Она используется для перевода строк с учётом контекста, но при этом возвращает объект, который будет переведён только в момент его использования (например, при выводе в шаблоне или при сериализации). Это особенно полезно для полей модели, атрибутов класса и других мест, где перевод должен происходить позже, в зависимости от текущего языка. Функция принимает три аргумента: контекст, исходную строку и строку перевода.
Синтаксис
from django.utils.translation import pgettext_lazy
pgettext_lazy(context, singular_message)
Пример . С моделью
Давайте создадим модель, в которой поле 'status' будет использовать ленивый перевод с контекстом:
from 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 для отображения переведённых значений:
{% 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 была использована при определении поля.
Пример . С выводом в коде
Давайте создадим экземпляр модели и выведем значение поля с переводом:
from 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)
Результат выполнения кода:
"Опубликовано"
Если активировать другой язык, например, английский:
from django.utils.translation import activate
activate('en')
res = article.get_status_display()
print(res)
Результат выполнения кода:
"Published"
Пример . С использованием в классе
Рассмотрим использование pgettext_lazy для создания динамического заголовка в форме:
from 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,
которая выполняет ленивый перевод для множественных чисел без контекста