我正在尝试从英文来源创建一个简体中文翻译文件。这一切都发生在Flask项目中,我一直在使用Flask-Babel(到目前为止已经成功)翻译成西班牙语和法语。我添加了一个中文翻译文件,但遇到了以下问题。
请考虑以下英语字符串:
msgid "One message"
msgid_plural "%(num)d messages"
当只有一条消息时,我不想显示数字1
,我想要拼写出来的版本。
显然,在中文中,单数和复数之间没有语法差异,因此我们的翻译人员只包括两个版本的一个翻译:
msgstr[0] "%(num)d [something in Chinese]"
当我尝试编译此文件时,我收到以下错误消息:
未知命名占位符"NUM">
所以我尝试像这样复制这一行(中文一
是 1):
msgstr[0] "一 [something in Chinese]"
msgstr[1] "%(num)d [something in Chinese]"
但后来我得到了这个错误:
味精的翻译比目录num_plurals多
这是有道理的:中文的nplurals
为 1,所以不应该超过一个msgstr
。
我在此阶段看到两个选项:
- 在我的中文 .po 文件上作弊,并声明该
nplurals = 2
与英语相同的规则:"Plural-Forms: nplurals=2; plural=(n > 1)"
。 - 更新我所有的源字符串,以便在复数版本中需要时,我总是在单数版本中使用
%(num)d
。
我对这两种选择都不太满意。有没有其他选择?
这似乎是 babel 中的一个错误,而不是 gettext 的问题。
以下 PO 摘录是正确的,并使用msgfmt --check
进行编译:
msgid ""
msgstr ""
...
"Language-Team: Chinese (simplified) <i18n-zh@googlegroups.com>n"
"Language: zh_CNn"
...
"Plural-Forms: nplurals=1; plural=0;n"
#: example.c:1
#, python-format
msgid "One message"
msgid_plural "%(num)d messages"
msgstr[0] "%(num)d [something in Chinese]"
在修复错误之前,使用选项 1(在复数形式标头上作弊)似乎是一种可行的解决方法。 或者只是使用msgfmt --check
而不是 Python 脚本来编译 po 文件。