【问题标题】:what is ugettext and ugettext_lazy and why to use them in django?什么是 ugettext 和 ugettext_lazy 以及为什么在 django 中使用它们?
【发布时间】:2014-04-26 07:08:15
【问题描述】:

这是一个非常基本的问题。我试图用谷歌搜索我能用简单的语言理解的答案。但这并没有帮助。我在Django's UserCreationForm 中遇到了下面的sn-p 代码,然后我才知道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."),
    }

【问题讨论】:

标签: django django-models django-views


【解决方案1】:

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

ugettext_lazy 是它的“懒惰”版本。惰性字符串是 Django 主义;它们是类似字符串的对象,直到最后一分钟才真正变成真正的字符串。通常,直到过程的后期,您才知道如何翻译字符串。在我可以查看他们的请求之前,我不知道浏览器使用什么语言,所以我希望翻译字符串是“惰性的”,并且在它绝对需要在模板中呈现之前不进行评估。

出于您的目的,这意味着这些将显示为字符串——但这也意味着它们可能会被翻译覆盖。因此,例如,您可以将重复用户名消息更改为_("Sorry, but a user with that name exists. Please try again")。对于说英语的浏览器,他们会看到您的新消息。但是,如果此字符串已经注册了翻译,那么您将破坏它 - 现在查找西班牙语版本将失败,因为它找不到与您的西班牙语匹配的字符串。

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

【讨论】:

  • 你会如何覆盖?尤其是本例中的重复用户名消息?
猜你喜欢
  • 2014-05-27
  • 2011-05-29
  • 2011-08-03
  • 2017-10-01
  • 2015-09-08
  • 1970-01-01
  • 2011-06-18
  • 1970-01-01
相关资源
最近更新 更多