"django-admin.py makemessages -l en" 将复数形式添加到输出文件
"django-admin.py makemessages -l en" adds Plural-Forms to the output file
每次我 运行 django-admin.py makemessages -l en
,它都会在 djangojs.po 文件中添加以下行:
"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
之后,运行ning python manage.py runserver
因以下错误而中断:
ValueError: plural forms expression could be dangerous
当然,删除该行将修复错误。
如何防止添加此行?
P.S。
我正在寻找一种方法来强制 django-admin 不添加此行,或添加我喜欢的内容,或者至少不会产生错误的内容。
我正在使用 Django 1.11。
在所有出现的 .po 文件中用 "Plural-Forms: nplurals=2; plural= (n != 1);\n"
替换行应该可以让你继续!
gettext 通常在您使用 Django 翻译(i18n 和 l10n)时将单词翻译成单词。但是当您想将(大部分)名词翻译成 singular/plural 形式时,它会变得更加棘手。
例如,考虑这个例子:
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 将 "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
作为默认值插入(这不是有效的语法)。
它在 django 2.0 发布时已修复。有关详细信息,请参阅 this issue。
对于遇到此问题的任何人,可能值得检查您的 django 版本,并在必要时进行更新。
每次我 运行 django-admin.py makemessages -l en
,它都会在 djangojs.po 文件中添加以下行:
"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
之后,运行ning python manage.py runserver
因以下错误而中断:
ValueError: plural forms expression could be dangerous
当然,删除该行将修复错误。
如何防止添加此行?
P.S。 我正在寻找一种方法来强制 django-admin 不添加此行,或添加我喜欢的内容,或者至少不会产生错误的内容。
我正在使用 Django 1.11。
在所有出现的 .po 文件中用 "Plural-Forms: nplurals=2; plural= (n != 1);\n"
替换行应该可以让你继续!
gettext 通常在您使用 Django 翻译(i18n 和 l10n)时将单词翻译成单词。但是当您想将(大部分)名词翻译成 singular/plural 形式时,它会变得更加棘手。 例如,考虑这个例子:
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 将 "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
作为默认值插入(这不是有效的语法)。
它在 django 2.0 发布时已修复。有关详细信息,请参阅 this issue。
对于遇到此问题的任何人,可能值得检查您的 django 版本,并在必要时进行更新。