Когда я должен использовать ugettext_lazy? - PullRequest
122 голосов
/ 12 ноября 2010

У меня есть вопрос об использовании ugettext и ugettext_lazy для переводов.Я узнал, что в моделях я должен использовать ugettext_lazy, а в представлениях ugettext.Но есть ли другие места, где я тоже должен использовать ugettext_lazy?Как насчет определений форм?Есть ли различия в производительности между ними?

Редактировать: И еще одна вещь.Иногда вместо ugettext_lazy используется ugettext_noop.Как сказано в документации, строки ugettext_noop помечаются только для перевода и переводятся в последний возможный момент перед отображением их пользователю, но я немного запутался, разве это не похоже на то, что делает ugettext_lazy?Мне все еще трудно решить, что мне следует использовать в моих моделях и формах.

Ответы [ 3 ]

172 голосов
/ 12 ноября 2010

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))
15 голосов
/ 03 мая 2014

Отличное использование _noop - это когда вы хотите записать сообщение на английском языке для разработчиков, но представить переведенную строку зрителю. Примером этого является http://blog.bessas.me/posts/using-gettext-in-django/

4 голосов
/ 10 июля 2014

Ленивая версия возвращает прокси-объект вместо строки, и в некоторых ситуациях она не будет работать должным образом.Например:

def get(self, request, format=None):
   search_str = request.GET.get('search', '')
   data = self.search(search_str)
   lst = []
   lst.append({'name': ugettext_lazy('Client'), 'result': data})
   return HttpResponse(json.dumps(lst), content_type='application/json')

потерпит неудачу, поскольку в самой последней строке будет предпринята попытка сериализации lst объекта в JSON, и вместо строки для «клиента» будет иметь прокси-объект.Прокси-объект не сериализуем в json.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...