РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
708 of 818 menu

Функция 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,
    которая выполняет ленивый перевод для множественных чисел без контекста
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить