不同复数形式的语言之间的翻译

时间:2019-06-24 11:28:30

标签: python internationalization babel gettext

我正在尝试从英文来源创建简体中文的翻译文件。这一切都是在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

这很有意义:中文的nplurals为1,因此msgstr不应超过一个。

我在此阶段看到两个选择:

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

我对这两种选择都不满意。有其他选择吗?

1 个答案:

答案 0 :(得分:0)

这似乎是babel中的错误,而不是gettext问题。

以下PO摘录是正确的,并使用+---------+--------+-------------+ | SNumber | SName | SPercentage | +---------+--------+-------------+ | 415 | Nag | 70% | +---------+--------+-------------+ 进行编译:

msgfmt --check

在修复该错误之前,使用选项1(对复数形式的标头作弊)似乎是可行的解决方法。或者只是使用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]" 而不是Python脚本来编译po文件。