我什么时候应该使用 ugettext _ 惰性?

我有一个关于使用 ugettext 和 ugettext_lazy进行翻译的问题。 我学到了在模型中应该使用 ugettext_lazy,而在视图中应该使用 ugettext。 但是有没有其他地方,我也应该使用 ugettext_lazy? 那么表单定义呢? 他们之间的表现有什么不同吗?

编辑: 还有一件事。有时使用 ugettext_noop而不是 ugettext_lazy。正如文档所说,ugettext_noop字符串只标记为翻译,并且在向用户显示它们之前的最后一刻翻译,但是我在这里有点困惑,这不是类似于 ugettext_lazy所做的吗?我仍然很难决定,我应该在我的模型和表单中使用哪一个。

55735 次浏览

gettext()gettext_lazy()

在诸如表单或模型这样的定义中,你应该使用 gettext_lazy,因为这些定义的代码只执行一次(主要在 django 启动时) ; gettext_lazy以一种懒惰的方式翻译字符串,这意味着,例如,每次你访问一个模型上的属性的名称时,字符串都会被重新翻译——这完全有意义,因为自从 django 启动以来,你可能正在用不同的语言查看这个模型!

在视图和类似的函数调用中,您可以毫无问题地使用 gettext,因为每次调用 gettext的视图都会重新执行,所以您总是能够得到正确的翻译符合要求!

关于 gettext_noop()

正如 布莱斯在他的回答中指出的那样,这个函数将一个字符串标记为可提取的字符串,以便进行翻译,但是返回未翻译的字符串。这对于在两个地方使用字符串非常有用-翻译和未翻译。请看下面的例子:

import logging
from django.http import HttpResponse
from django.utils.translation import gettext as _, gettext_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')

将会失败,因为最后一行将尝试将 对象序列化为 JSON,并且代替“ client”的字符串,它将有一个代理对象。代理对象不能序列化为 json。