首页 > 解决方案 > 不同复数数的语言之间的翻译

问题描述

我正在尝试从英文源创建简体中文翻译文件。这一切都发生在一个 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]"

但后来我得到了这个错误:

msg 的翻译比目录的 num_plurals 多

这是有道理的:中文有nplurals1 所以不应该超过一个msgstr

我在这个阶段看到两个选项:

  1. nplurals = 2欺骗我的中文 .po 文件,并使用与英文相同的规则声明: "Plural-Forms: nplurals=2; plural=(n > 1)".
  2. 更新我的所有源字符串,以便%(num)d在需要复数版本时始终使用单数版本。

我对这两种选择都不满意。有替代方案吗?

标签: pythoninternationalizationgettextpython-babel

解决方案


这似乎是 babel 的一个 bug,而不是 gettext 的问题。

以下 PO 摘录是正确的,并编译为msgfmt --check

msgid ""
msgstr ""
...
"Language-Team: Chinese (simplified) <i18n-zh@googlegroups.com>\n"
"Language: zh_CN\n"
...
"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 文件。


推荐阅读