我啥时候应该使用 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