一尘不染

我什么时候应该使用ugettext_lazy?

django

我对使用ugettextugettext_lazy翻译有疑问。我了解到,在模型ugettext_lazyugettext中,我应该使用。但是还有其他地方我也应该使用ugettext_lazy吗?表单定义呢?它们之间是否存在性能差异?

编辑: 还有一件事。有时候,代替ugettext_lazy,ugettext_noop被使用。正如文档所述,ugettext_noop仅在将字符串显示给用户之前,才将字符串标记为要翻译,并在可能的最新情况下进行翻译,但是我在这里有点困惑,这与功能相似ugettext_lazy吗?我仍然很难决定在模型和表格中应该使用哪个。


阅读 828

收藏
2020-03-27

共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))
2020-03-27