Когда я должен использовать ugettext lazy?
у меня есть вопрос об использовании ugettext и ugettext_lazy для переводов.
Я узнал, что в моделях я должен использовать ugettext_lazy, в то время как в представлениях ugettext.
Но есть ли другие места, где я должен использовать ugettext_lazy тоже? А как насчет определений форм?
Есть ли разница в производительности между ними?
Edit:
И еще кое-что. Иногда, вместо ugettext_lazy, есть. Как говорится в документации,ugettext_noop строки только для перевода и перевода в самом последнем возможном momment перед отображением их пользователю, но я немного смущен здесь, разве это не похоже на то, что ugettext_lazy делать? Мне все еще трудно решить, что я должен использовать в своих моделях и формах.
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