这是一个非常基本的问题。我试图谷歌找到我能用简单语言理解的答案。但这没有帮助。我在Django's UserCreationForm
中看到了下面的代码片段,然后才知道存在ugettext_lazy
_
的内容。我不知道,如果它是django specific module/function
,它的目的是什么以及为什么要使用它。
SO中有this article,会对此进行更多讨论。但我想先了解基本面。请赐教!
from django.utils.translation import ugettext, ugettext_lazy as _
///// what is the _ means here and why is it used
class UserCreationForm(forms.ModelForm):
"""
A form that creates a user, with no privileges, from the given username and
password.
"""
error_messages = {
'duplicate_username': _("A user with that username already exists."),
'password_mismatch': _("The two password fields didn't match."),
}
答案 0 :(得分:11)
ugettext是可翻译字符串的unicode版本。
ugettext_lazy是一个“懒惰”的版本。懒惰的字符串是Django-ism;它们是类似字符串的对象,直到真正的字符串直到最后一刻才会转动。通常,您不知道如何将字符串翻译到该过程的后期。我不知道浏览器使用什么语言,直到我可以查看他们的请求,所以我希望翻译字符串是“懒惰的”,而不是评估,直到它绝对需要在模板中呈现为止。
出于您的目的,这意味着它们将显示为字符串 - 但这也意味着它们可能会被翻译覆盖。因此,例如,您可以将duplicate-username消息更改为_(“抱歉,但存在具有该名称的用户。请再试一次”)。对于讲英语的浏览器,他们会看到您的新消息。如果这个字符串已经注册了翻译,那么你就会破坏它 - 现在查找西班牙语版本会失败,因为它找不到与你的西班牙语相匹配的字符串。
对于95%的网站,这没关系,因为您不会提供您网站的翻译版本。如果是,请阅读https://docs.djangoproject.com/en/dev/topics/i18n/。