我有一个关于使用ugettext和gettext_lazy()
进行翻译的问题。我了解到在模型中应该使用gettext_lazy()
,而在视图中应该使用ugettext。但是还有其他地方,我也应该使用gettext_lazy()
吗?那么表单定义呢?它们之间是否存在性能差异?
**编辑:**还有一件事。有时,使用gettext_noop()
代替gettext_lazy()
。正如文档所说,gettext_noop()
字符串只标记为翻译,并在显示给用户之前尽可能晚地翻译,但我有点困惑,这不是类似于gettext_lazy()
的做法吗?我仍然很难决定,我应该在我的模型和表单中使用哪个。
4条答案
按热度按时间v440hwme1#
gettext()
对比gettext_lazy()
在表单或模型等定义中,你应该使用
gettext_lazy
,因为这些定义的代码只执行一次(主要是在django启动时);gettext_lazy
以惰性方式翻译字符串,这意味着,例如。每次你访问一个模型的属性名时,字符串都会被重新翻译-这完全是有意义的,因为自从django启动以来,你可能会在不同的语言中看到这个模型!在视图和类似的函数调用中,你可以毫无问题地使用
gettext
,因为每次视图被调用时,gettext
都会被重新执行,所以你总是会得到适合请求的正确翻译!关于
gettext_noop()
正如Bryce在他的回答中指出的那样,这个函数将一个字符串标记为可提取以进行翻译,但确实返回未翻译的字符串。这对于在两个地方使用字符串很有用-已翻译和未翻译。请参见以下示例:
nxagd54h2#
_noop的一个很好的用法是,当你想为开发人员记录一条英语消息,但将翻译后的字符串呈现给查看者时。例如,http://blog.bessas.me/posts/using-gettext-in-django/
ix0qys7i3#
懒惰版本返回一个代理对象而不是字符串,在某些情况下,它不会按预期工作。例如:
会失败,因为最后一行会尝试将lst对象序列化为JSON,而不是“client”的字符串,它将具有代理对象。代理对象不可序列化为json。
bnlyeluc4#
gettext()可以在函数内部工作,但不能在函数外部工作。
gettext_lazy()可以在函数内部和外部工作。
gettext_lazy()
外部函数。<gettext()>
下面是
gettext()
可以工作的地方:<gettext_lazy()>
下面是
gettext_lazy()
可以工作的地方: