什么是ugettext和ugettext_lazy以及为什么要在django中使用它们?

时间:2014-03-19 19:17:38

标签: django django-models django-views

这是一个非常基本的问题。我试图谷歌找到我能用简单语言理解的答案。但这没有帮助。我在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."),
    }

1 个答案:

答案 0 :(得分:11)

ugettext是可翻译字符串的unicode版本。

ugettext_lazy是一个“懒惰”的版本。懒惰的字符串是Django-ism;它们是类似字符串的对象,直到真正的字符串直到最后一刻才会转动。通常,您不知道如何将字符串翻译到该过程的后期。我不知道浏览器使用什么语言,直到我可以查看他们的请求,所以我希望翻译字符串是“懒惰的”,而不是评估,直到它绝对需要在模板中呈现为止。

出于您的目的,这意味着它们将显示为字符串 - 但这也意味着它们可能会被翻译覆盖。因此,例如,您可以将duplicate-username消息更改为_(“抱歉,但存在具有该名称的用户。请再试一次”)。对于讲英语的浏览器,他们会看到您的新消息。如果这个字符串已经注册了翻译,那么你就会破坏它 - 现在查找西班牙语版本会失败,因为它找不到与你的西班牙语相匹配的字符串。

对于95%的网站,这没关系,因为您不会提供您网站的翻译版本。如果是,请阅读https://docs.djangoproject.com/en/dev/topics/i18n/