我什么时候应该使用ugettext_lazy?

Dze*_*kob 134 python django translation

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

编辑: 还有一件事.有时候,不是ugettext_lazy,ugettext_noop被使用.正如文档所说,ugettext_noop字符串只标记为翻译并在最新可能的情况下翻译,然后再显示给用户,但我在这里有点困惑,是不是与此类似ugettext_lazy?我仍然很难决定哪个,我应该在我的模型和表格中使用哪个.

Ber*_*ant 185

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))
Run Code Online (Sandbox Code Playgroud)

  • 在我看来,这比Django的文档解释更容易理解.谢谢@Bernhard. (14认同)
  • 谢谢!解释*not*何时使用ugettext_lazy也是有帮助的,例如将它传递给期望字符串如".replace",字符串连接等的东西时; 懒惰的代理对象在这些情况下不起作用.否则,这个答案意味着你总是使用ugettext_lazy是安全的. (14认同)
  • @mrooney这些案例不重要,因为如果你这样做会给你一个错误,而不是默默地返回错误的语言翻译.此外,你可以使用带有ugettext_lazy的".replace",你只需要在结果上调用str(),例如lazytext = ugettext_lazy('hello'),然后再使用str(lazytext).replace. (4认同)
  • 仅供参考,我发现如果您将其中一个标记函数(例如“ugettext”)导入为“_”,然后使用“import as”导入第二个标记函数(例如“ugettext_noop”)(例如“import ugettext_noop as _noop”) ,那么 `xgettext` 将无法识别并提取后者。换句话说,除了“import as _”之外的所有导入都必须通过其全名导入和引用。 (3认同)
  • `msg = “发生错误”怎么样?日志记录.error(msg);返回HttpResponse(_(msg))?为什么需要`_noop`?如果没有`_noop`,django将找不到需要翻译的字符串? (2认同)

Bry*_*yce 17

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

  • 链接坏了...... (4认同)

Ale*_*gov 5

惰性版本返回代理对象而不是字符串,并且在某些情况下无法正常工作。例如:

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')
Run Code Online (Sandbox Code Playgroud)

会失败,因为最后一行将尝试将lst对象序列化为JSON,而不是“ client”的字符串,它将具有一个代理对象。代理对象不可序列化为json。

  • 在这种情况下,您应该使用ugettext。 (2认同)