首页 > 解决方案 > “django-admin.py makemessages -l en”将复数形式添加到输出文件

问题描述

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

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

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

ValueError: plural forms expression could be dangerous

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

PS我正在寻找一种方法来强制django-admin不添加这一行,或者添加我喜欢的东西,或者至少不会产生错误的东西。

我正在使用 Django 1.11。

标签: pythondjangodjango-i18n

解决方案


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

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

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

为了处理国际化中的复数翻译,复数形式是要遵循的标准。Python-Django 以下列方式实现 ngettext:(请访问 Django 版本的文档

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

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

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

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

希望在您的情况下,nplurals=1。如果不访问此链接以获取复数形式。


推荐阅读