Функция gettext_lazy

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

Функция принимает строку или строку с форматом в качестве аргумента и возвращает объект типа ProxyTranslation. Этот объект ведёт себя как строка в большинстве контекстов, но фактический перевод откладывается до момента обращения к нему.

Синтаксис

pythonfrom django.utils.translation import gettext_lazy

gettext_lazy(message, *args, **kwargs)

Пример . Использование в модели

Рассмотрим пример использования gettext_lazy для определения читаемых имён полей модели, которые будут переведены на язык пользователя:

pythonfrom django.db import models
from django.utils.translation import gettext_lazy as _

class Article(models.Model):
  STATUS_CHOICES = (
    ('draft', _('Draft')),
    ('published', _('Published')),
    ('archived', _('Archived')),
  )
  
  title = models.CharField(_('Title'), max_length=200)
  content = models.TextField(_('Content'))
  status = models.CharField(
    _('Status'),
    max_length=20,
    choices=STATUS_CHOICES,
    default='draft'
  )
  created_at = models.DateTimeField(_('Created at'))
  
  class Meta:
    verbose_name = _('Article')
    verbose_name_plural = _('Articles')
  
  def __str__(self):
    return self.title

В этом примере строки, переданные в gettext_lazy, будут переведены на язык, установленный для текущего запроса, при отображении в админке или шаблонах.

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

Использование gettext_lazy в формах для создания переводимых меток и сообщений об ошибках:

pythonfrom django import forms
from django.utils.translation import gettext_lazy as _

class ArticleForm(forms.ModelForm):
  title = forms.CharField(label=_('Article title'))
  content = forms.CharField(
    label=_('Content'),
    widget=forms.Textarea,
    help_text=_('Enter the article content here')
  )
  
  class Meta:
    model = Article
    fields = ['title', 'content', 'status']
    labels = {
      'status': _('Publication status'),
    }
    error_messages = {
      'title': {
        'max_length': _('Title is too long (max 200 characters).'),
      },
    }

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

python"Заголовок статьи"
"Содержание"
"Введите содержание статьи здесь"
"Статус публикации"
"Заголовок слишком длинный (максимум 200 символов)."

Пример . С отложенным переводом в шаблоне

Продемонстрируем, как gettext_lazy работает в контексте шаблонов, когда строка переводится только при отображении:

pythonfrom django.utils.translation import gettext_lazy as _
from django.template import Template, Context

# Создаём отложенную строку
greeting = _('Hello, world!')

# Передаём её в контекст шаблона
template = Template("{{ greeting }}")
context = Context({'greeting': greeting})

# При рендеринге строка будет переведена на текущий язык
res = template.render(context)
print(res)

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

python"Привет, мир!"

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

  • функция gettext,
    которая выполняет немедленный перевод строки
  • функция ngettext_lazy,
    которая выполняет отложенный перевод с учётом формы числа
  • функция pgettext_lazy,
    которая выполняет отложенный перевод с указанием контекста
  • тег translate,
    который используется для перевода строк в шаблонах