“ django-admin.py makemessages -l en”将复数形式添加到输出文件

时间:2018-06-30 12:01:45

标签: python django django-i18n

每次我运行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

当然,删除该行可修复错误并使其消失。
如何防止添加此行?

2 个答案:

答案 0 :(得分:1)

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

django 2.0 发布时修复。有关详细信息,请参阅 this issue

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

答案 1 :(得分:-1)

在所有出现的.po文件中都用 True True True True True True True True True True True True True False True True True True False False False False False False False ... DONE 替换行将使您开始工作!

gettext通常在您使用Django翻译(i18n和l10n)时将单词翻译成单词。但是,当您要将名词(主要是名词)翻译成单数或复数形式时,就会变得比较棘手。 例如,考虑以下示例:

"Plural-Forms: nplurals=2; plural= (n != 1);\n"

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

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

在大多数语言中,n!= 1被认为是复数。在上面的示例中,当ngettext('%d file is deleted', '%d files are deleted', n) % n 和Django n=1进行翻译时,Django必须考虑'%d file is deleted''%d files are deleted'。因此,.po文件中的复数形式的定义如下:n!=1

现在,当您运行"Plural-Forms: nplurals=2; plural= (n != 1);\n"时,Django试图通过在.po文件中添加makemessages行来帮助您,提示必须用我们的复数形式定义替换此行。 / p>

注意: 并非每种语言都有2个复数,例如,日语,越南语,韩语,泰语不需要区分单数和复数(因此"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n")。另一方面,Plural-Forms: nplurals=1; plural=0;的语言包括罗马尼亚语,立陶宛语,俄语,波兰语。查看this link以获得更多示例。

希望您的情况是nplurals = 1。如果不是,请访问this link以获取复数形式。