You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 09:30:49