Функция gettext_lazy
Функция gettext_lazy применяется для маркировки строк для перевода с отложенным выполнением. В отличие от gettext, которая выполняет перевод в момент вызова, gettext_lazy возвращает объект-заполнитель, который будет переведён только тогда, когда строка действительно будет использована (например, при рендеринге шаблона или преобразовании в строку). Это особенно полезно в моделях, формах и других местах, где строки загружаются до того, как язык будет окончательно установлен.
Функция принимает строку или строку с форматом в качестве аргумента и возвращает объект типа ProxyTranslation. Этот объект ведёт себя как строка в большинстве контекстов, но фактический перевод откладывается до момента обращения к нему.
Синтаксис
from django.utils.translation import gettext_lazy
gettext_lazy(message, *args, **kwargs)
Пример . Использование в модели
Рассмотрим пример использования gettext_lazy для определения читаемых имён полей модели, которые будут переведены на язык пользователя:
from 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 в формах для создания переводимых меток и сообщений об ошибках:
from 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).'),
},
}
Результат при рендеринге формы на русском языке:
"Заголовок статьи"
"Содержание"
"Введите содержание статьи здесь"
"Статус публикации"
"Заголовок слишком длинный (максимум 200 символов)."
Пример . С отложенным переводом в шаблоне
Продемонстрируем, как gettext_lazy работает в контексте шаблонов, когда строка переводится только при отображении:
from 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)
Результат выполнения кода:
"Привет, мир!"
Смотрите также
-
функция
gettext,
которая выполняет немедленный перевод строки -
функция
ngettext_lazy,
которая выполняет отложенный перевод с учётом формы числа -
функция
pgettext_lazy,
которая выполняет отложенный перевод с указанием контекста -
тег
translate,
который используется для перевода строк в шаблонах