法语翻译引发“ValueError('复数形式的无效标记:%s'%值)”

Kiy*_*ari 5 django internationalization

我想处理我的网站的法语版本。

我将 Django 2.2 与 i18n 一起使用,并且我已经在 settings.py 中设置了语言环境变量。

# Internationalization
# https://docs.djangoproject.com/en/2.2/topics/i18n/

LANGUAGES = (
    ('en', _('English')),
    ('fr', _('French')),
    ('it', _('Italian')),
    ('es', _('Spanish')),
)

LOCALE_PATHS = (
    os.path.join(BASE_DIR, 'locale'),
)

TIME_ZONE = 'Europe/Paris'

USE_I18N = True

USE_L10N = True

USE_TZ = True
Run Code Online (Sandbox Code Playgroud)

当我使用时./manage.py makemessages -l fr,我正确地有一个 django.po 法语文件,但在./manage.py compilemessages -l fr服务器崩溃后出现以下错误(已修剪):

  File "/usr/lib/python3.7/gettext.py", line 93, in _tokenize
    raise ValueError('invalid token in plural form: %s' % value)
ValueError: invalid token in plural form: EXPRESSION
Run Code Online (Sandbox Code Playgroud)

英语、意大利语和西班牙语翻译效果很好

编辑:嗯,问题已经解决了,但我不太确定如何解决。我删除了我的venv,重新创建了它,法语翻译突然工作了。从 Django 2.2.1 升级到 2.2.2 可能是导致该解决方案的原因。

Hoj*_*esi 3

对于面临此错误的其他语言:

有一行告诉 Django 评估这个表达式,决定它应该使用单词的哪种形式,对于某些语言,这个表达式是不写的,例如波斯语。

对于这些语言,默认行写入主 .po 文件中(不是特定的行):

"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
Run Code Online (Sandbox Code Playgroud)

这里的EXPRESSION部分应该更改为您的语言。

在这里您可以阅读 EXPRESSION 的确切格式,但简单来说,如果您的语言只有单数和复数两种形式,请将行更改为:

"Plural-Forms: nplurals=2; plural=(n != 1);\n"
Run Code Online (Sandbox Code Playgroud)

并重新编译您的消息。