Какова цель ugettext_noop в Django?

Как указано в этом разделе перевода | документация по Django, функция ugettext_noop — вспомогательная функция для интернационализации:

ugettext_noop(сообщение)

Помечает строки для перевода, но не переводит их сейчас. Это можно использовать для хранения строк в глобальных переменных, которые должны оставаться в базовом языке (поскольку они могут использоваться извне) и будут переведены позже.

Кроме того, этот ответ содержит пример его использования:

import logging
from django.http import HttpResponse
from django.utils.translation import ugettext as _, ugettext_noop as _noop

def view(request):
    msg = _noop("An error has occurred")
    logging.error(msg)
    return HttpResponse(_(msg))

Несмотря на эти документы, я до сих пор не понимаю, почему я должен помечать строку как извлекаемую для перевода. Мне кажется, что ugettext_noop это не что иное, как напоминание, и даже в этом случае, какой смысл напоминать программистам, что некоторые строки (в данном случае msg) должны быть переведены позже?


person nalzok    schedule 29.03.2017    source источник


Ответы (1)


Однажды у меня есть задача сделать журнал событий с сохранением его сообщений в базе данных. Он должен был поддерживать i18n. Итак, во-первых, я пометил все сообщения журнала событий функцией ugettext_noop. В этом случае они не были переведены перед добавлением в базу данных. Но при этом они были добавлены в файлы *.po.

В этом примере функции ugettext или ugettext_lazy следует использовать только после извлечения сообщений из базы данных.

person Eduard Stepanov    schedule 29.03.2017
comment
Если сообщения не были переведены до добавления в базу данных, то почему вы помечаете их ugettext_noop? Точно так же в приведенном выше примере, почему бы просто не написать msg = "An error has occurred"? - person nalzok; 29.03.2017
comment
Если я не отмечу его с помощью ugettext_noop, они не будут записаны в файлы *.po. Когда мне нужно сначала перевести сообщение, я сначала получаю соответствующую строку из базы данных, а затем делаю что-то вроде этого: ugettext(event_log_row.msg) Таким образом, использование ugettext таким образом не добавит msg в файл *.po. - person Eduard Stepanov; 29.03.2017
comment
Таким образом, причина, по которой msg не появляется в файле .po, заключается в том, что он передается в ugettext как переменная, а не строковый литерал, поэтому django-admin makemessages не сможет его обнаружить. Обтекание строковых литералов с помощью ugettext_noop решает эту проблему. Я прав? - person nalzok; 29.03.2017
comment
Но когда вы используете эту функцию, она добавляет текст в файл .po. Но если вы удалите текст позже, перевод из po-файла тоже будет удален. Это означает, что мы должны сохранять видимость функции ugettext_noop() в коде. Если я последую вашему примеру: (1) вы обернули каждую строку ugettext_noop(), чтобы у вас было это в вашем файле .po. (2) вы переместили все свои строки в базу данных (3) когда вы читаете из базы данных, вы вызываете ugettext_lazy() для перевода. Это нормально, но что вы сделали со всеми строками, завернутыми в ugettext_noop()? Вы не могли бы удалить их правильно? - person Olivier Pons; 18.08.2017
comment
Конечно, если вы удалите ugettext_noop, соответствующие строки будут удалены из файла .po. - person Eduard Stepanov; 21.08.2017