【问题标题】:"django-admin.py makemessages -l en" adds Plural-Forms to the output file“django-admin.py makemessages -l en”将复数形式添加到输出文件
【发布时间】:2018-06-30 12:01:44
【问题描述】:

每次我运行 django-admin.py makemessages -l en 时,它都会在 djangojs.po 文件中添加以下行:

"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"

之后,运行 python manage.py runserver 会出现此错误:

ValueError: plural forms expression could be dangerous

当然,删除该行将修复错误。
如何防止添加此行?

附: 我正在寻找一种方法来强制 django-admin 不添加此行,或者添加我喜欢的内容,或者至少不会产生错误的内容。

我正在使用 Django 1.11。

【问题讨论】:

    标签: python django django-i18n


    【解决方案1】:

    这是由于翻译目录中缺少复数形式造成的问题。结果 django 将 "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" 作为默认值插入(这不是有效的语法)。

    django 2.0 发布时已修复。详情请见this issue

    对于遇到此问题的任何人,可能值得检查您的 django 版本,并在必要时进行更新。

    【讨论】:

      【解决方案2】:

      在所有出现的 .po 文件中将行替换为 "Plural-Forms: nplurals=2; plural= (n != 1);\n" 应该会让你继续前进!

      当您使用 Django 翻译(i18n 和 l10n)时,gettext 通常会逐字翻译。但是当您想将(大部分)名词翻译成单数/复数形式时,它会变得更加棘手。 例如,考虑这个例子:

      if n == 1:
        string = "%d file is deleted"%n
      else:
        string = "%d files are deleted"%n
      

      要处理国际化中的复数翻译,Plural-forms 是要遵循的标准。 Python-Django 以如下方式实现 ngettext: (visit doc for your Django version)

      ngettext('%d file is deleted', '%d files are deleted', n) % n
      

      在大多数语言中,n!=1 被认为是复数。在上面的例子中,当n=1 Django 必须考虑'%d file is deleted''%d files are deleted'n!=1 用于翻译。因此 .po 文件中复数形式的定义如下:"Plural-Forms: nplurals=2; plural= (n != 1);\n"

      现在,当您运行 makemessages 时,Django 试图通过在 .po 文件中添加 "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" 行来帮助您,暗示该行必须替换为我们对复数形式的定义。

      注意: 并非每种语言都有 2 个复数,例如,日语、越南语、韩语、泰语不需要区分单数和复数(因此 Plural-Forms: nplurals=1; plural=0;)。另一方面,有一些语言,如罗马尼亚语、立陶宛语、俄语、波兰语,其中nplurals=3。查看this link 了解更多示例。

      希望在您的情况下,nplurals=1。如果没有,请访问 this link 获取复数形式。

      【讨论】:

      • 嘿,非常感谢,但这不是我的回答,请再读一遍我的问题。我确实知道您的所有解释,但我正在寻找一种方法来强制 django-admin 删除这行提示或添加我喜欢的内容,或者至少不会产生错误。
      • 哦,好吧,我的错!但是您的代码中确实有 ngettext 函数调用,是吗?
      • 是的,我有一些
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-28
      • 2010-09-29
      相关资源
      最近更新 更多