ugettext()
против ugettext_lazy()
В определениях, таких как формы или модели, вы должны использовать ugettext_lazy
, потому что код этих определений выполняется только один раз (в основном при запуске django);ugettext_lazy
переводит строки ленивым образом, что означает, например,каждый раз, когда вы получаете доступ к имени атрибута в модели, строка будет переводиться заново, что вполне логично, потому что вы можете смотреть на эту модель на разных языках, так как django был запущен!Вы можете без проблем использовать ugettext
, потому что каждый раз, когда вызывается представление, ugettext
будет выполняться заново, поэтому вы всегда получите правильный перевод, соответствующий запросу!
Относительно 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))