Django中ngettext与gettext同文件使用时msgid_plural缺失问题
Django 翻译中ngettext生成的.po文件缺少msgid_plural问题
问题场景
以下是用于生成单复数文本翻译的代码:
from django.utils.translations import ngettext as _ from django.utils.translations import gettext num = 3 my_plural_string = _("{num} apple", "{num} apples", num).format(num=num) my_single_string = gettext("this is a text")
运行翻译提取命令后,生成的.po文件未包含第一个复数字符串的msgid_plural属性:
#: .\test_app\test_translation.py:10 msgid "{num} apple" msgstr "" #: .\test_app\test_translation.py:11 msgid "this is a text" msgstr ""
问题原因
核心问题在于你将ngettext别名为_,而Django的makemessages工具默认把_()识别为gettext(单文本翻译)的调用,而非ngettext(复数翻译)。工具无法识别这个调用的复数特性,因此不会生成msgid_plural字段。
解决方案
不需要手动添加msgid_plural,只要让工具正确识别复数调用即可,有两种可行方案:
方案1:使用ngettext原名
直接放弃将ngettext别名为_,改用原函数名:
from django.utils.translations import ngettext, gettext num = 3 my_plural_string = ngettext("{num} apple", "{num} apples", num).format(num=num) my_single_string = gettext("this is a text")
重新运行makemessages后,工具会自动识别复数翻译,生成包含msgid_plural的.po条目:
#: .\test_app\test_translation.py:10 msgid "{num} apple" msgid_plural "{num} apples" msgstr[0] "" msgstr[1] ""
方案2:指定_为复数翻译关键字
如果坚持要用_作为ngettext的别名,运行makemessages时需要通过--keyword参数明确告知工具该别名的复数参数格式:
django-admin makemessages --locale=zh_CN --keyword=_:1,2
其中:1,2表示_()函数的第1个参数是单数msgid,第2个是复数msgid,工具会据此解析并生成正确的复数翻译字段。
内容的提问来源于stack exchange,提问作者Karim Bourahla
相关产品推荐
相关产品推荐

