我什么时候应该使用ugettext_lazy?

时间:2010-11-12 01:06:05

标签: python django translation

我有一个关于使用ugettext和ugettext_lazy进行翻译的问题。 我了解到在模型中我应该使用ugettext_lazy,而在视图ugettext中。 但是还有其他地方,我也应该使用ugettext_lazy吗?表格定义怎么样? 它们之间是否有任何性能差异?

修改 还有一件事。有时,使用ugettext_lazy而不是ugettext_noop。正如文档所述,ugettext_noop字符串仅标记为翻译并在最新可能的情况下翻译,然后将其显示给用户,但我在这里有点困惑,与ugettext_lazy做的不同?我仍然难以决定,我应该在我的模型和表格中使用哪一个。

3 个答案:

答案 0 :(得分:169)

ugettext()ugettext_lazy()

在表单或模型之类的定义中,您应该使用ugettext_lazy,因为此定义的代码只执行一次(主要是在django的启动时); ugettext_lazy以懒惰的方式翻译字符串,这意味着,例如。每次访问模型上的属性名称时,字符串都会被新翻译 - 这很有意义,因为自从django启动以来你可能会用不同的语言看这个模型!

在视图和类似的函数调用中,您可以毫无问题地使用ugettext,因为每次调用视图ugettext时都会重新执行,因此您将始终获得符合请求的正确翻译!

关于ugettext_noop()

正如Bryce在他的回答中指出的那样,这个函数将一个字符串标记为可翻译但可以返回未翻译的字符串。这对于在两个地方使用字符串很有用 - 翻译和未翻译。请参阅以下示例:

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))

答案 1 :(得分:15)

_noop的一个很好的用途是,当您想要为开发人员用英语记录消息时,但是将翻译后的字符串呈现给查看者。这方面的一个例子是http://blog.bessas.me/posts/using-gettext-in-django/

答案 2 :(得分:4)

延迟版本返回一个代理对象而不是字符串,在某些情况下,它不会按预期工作。例如:

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而不是#34; client"它会有一个代理对象。代理对象无法序列化为json。

相关问题