ugettext and ugettext_lazy

27

您能解释一下ugettextugettext_lazy之间的主要区别吗?

当我尝试时...

return HttpResponse(ugettext_lazy("Hello"))

我什么都看不到,但是

return HttpResponse(ugettext("Hello"))

正常工作。

为什么?

1个回答

43

ugettext 用于立即加载字符串的翻译。 ugettext_lazy 返回一个对象,最终可以转换为字符串。如果在正确的区域设置之前评估了ugettext_lazy调用,则需要该对象。

ugettext_lazy 可以用于使用Unicode对象的任何地方。请仔细检查您的HTML输出,它可能看起来像这样:

<django.utils.functional...>

浏览器将其视为未识别的标签而忽略了它们。

在这种情况下,您不需要懒惰执行翻译,因为您正在立即使用字符串。如果出于某种原因确实希望继续使用ugettext_lazy,请尝试以下方法:

return HttpResponse(ugettext_lazy("Hello").encode('utf-8'))

请查看文档以获取更多信息。


3
我认为在models.py中使用ugettext_lazy更加有用。 - Sergey Orshanskiy
2
那么让我看看我是否理解了你的意思。当你在方法或函数内部(例如视图)或在设置和其他内容加载后调用的位置时,ugettext很有用。当想要翻译类属性等(如@SergeyOrshanskiy在定义模型或表单时建议的那样)时,ugettext_lazy更有用,这些内容在服务器启动时加载并需要延迟加载。对吗? - Eduard Luca
1
@EduardLuca 就是这样 :) 这与使用“reverse”相同的原理。例如,您可以在基于类的视图上使用“reverse_lazy”来定义“succes_url”,在这种情况下,直到需要评估反向操作时才会进行评估。 - Mihai Zamfir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接