Когда я должен использовать ugettext lazy?



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



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

632   3  

3 ответов:

ugettext() и ugettext_lazy()

в определениях, таких как формы или модели, вы должны использовать ugettext_lazy потому что код этого определения выполняется только один раз (в основном при запуске Джанго); 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))

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

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

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.

Comments

    Ничего не найдено.