我啥时候应该使用 ugettext_lazy?

Posted

技术标签:

【中文标题】我啥时候应该使用 ugettext_lazy?【英文标题】:When should I use ugettext_lazy?我什么时候应该使用 ugettext_lazy? 【发布时间】:2011-05-08 19:52:15 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

在我看来,这比 Django 文档中的解释更容易理解。谢谢@Bernhard。 谢谢!解释何时 使用 ugettext_lazy 也很有帮助,例如将其传递给需要字符串的事物时,如 "".replace、字符串连接等;在这些情况下,惰性代理对象将不起作用。否则这个答案意味着你总是使用 ugettext_lazy 是安全的。 @mrooney 这些情况不太重要,因为如果你这样做,它们会给你一个错误,而不是默默地返回错误的语言翻译。此外,您可以将 "".replace 与 ugettext_lazy 一起使用,您只需在结果上调用 str(),例如lazytext=ugettext_lazy('hello') 然后使用 str(lazytext).replace。 msg = "An error has occurred"; logging.error(msg);return HttpResponse(_(msg))? why need _noop? 如果没有_noop,django 将找不到需要翻译的字符串? 翻译适用于变量。同样,这是一个相同的例子docs,那么为什么_noop【参考方案2】:

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

【讨论】:

链接坏了……【参考方案3】:

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

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。

【讨论】:

在这些情况下您应该使用 ugettext。

以上是关于我啥时候应该使用 ugettext_lazy?的主要内容,如果未能解决你的问题,请参考以下文章

我啥时候应该使用 QThread::HighestPriority

Firebase:我啥时候应该使用 refreshToken?

我啥时候应该使用助手? [关闭]

我啥时候应该使用“while 循环”?

我啥时候应该在 C 中使用 malloc,啥时候不应该?

我啥时候应该在 C 中使用 malloc,啥时候不应该?