python - 不同复数数的语言之间的翻译
问题描述
我正在尝试从英文源创建简体中文翻译文件。这一切都发生在一个 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
。
我在这个阶段看到两个选项:
nplurals = 2
欺骗我的中文 .po 文件,并使用与英文相同的规则声明:"Plural-Forms: nplurals=2; plural=(n > 1)"
.- 更新我的所有源字符串,以便
%(num)d
在需要复数版本时始终使用单数版本。
我对这两种选择都不满意。有替代方案吗?
解决方案
这似乎是 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 文件。
推荐阅读
- c - C 语言:Scanf
- file - 如何使用 VS Code 以只读模式打开文件
- javascript - 需要 addEventListener() 冒泡修复
- .net-core - 创建使用旧式 machineKey 的 .NET Core DataProtectionProvider
- ios - iOS 如何在 Shared/AppGroup/xxx/Library/Sounds 中播放自定义通知声音文件
- image - pyqtgraph如何在大尺寸图片中向下扩展?
- javascript - 如果在外部单击,则隐藏元素
- machine-learning - 如何将树结构特征转换为矢量特征
- android - Android Studio 错误 - 无法加载类“com.google.gson.JsonParseException”
- python - 为许多对象调用任意类方法