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

Python gettext类API下ngettext复数翻译失效问题求助

问题解析与解决办法

核心原因

调用gettext.install()时,默认仅将指定域翻译对象的gettext()方法绑定为全局_()函数,但模块级的gettext.ngettext()属于默认域(通常为messages)的函数,无法识别你通过install()配置的自定义域和上下文,因此无法触发正确的翻译。

解决方案

方案1:安装时直接全局绑定ngettext

调用gettext.install()时,通过names参数指定同时安装_()和ngettext(),这样全局的ngettext会关联你指定的翻译域:

import gettext

# 自定义域+ locales目录,同时全局化_和ngettext
gettext.install('my_app', localedir='./locales', names=('_', 'ngettext'))

# 直接调用全局ngettext即可正常翻译
print(ngettext('file', 'files', 1))
print(ngettext('file', 'files', 5))

方案2:复用已安装的翻译对象

如果已经执行过gettext.install(),可以通过gettext._current_translations获取当前激活的翻译对象,调用它的ngettext方法:

import gettext

gettext.install('my_app', localedir='./locales')

# 获取当前绑定的翻译实例(None对应默认上下文)
current_trans = gettext._current_translations[None]

# 使用实例的ngettext方法完成复数翻译
print(current_trans.ngettext('apple', 'apples', 3))

方案3:基于Class-based API直接绑定

若使用Class-based API,实例化Translations对象后调用install()时指定names参数,效果和方案1一致:

from gettext import translation

# 初始化翻译对象
trans = translation(domain='my_app', localedir='./locales')
# 全局绑定_和ngettext
trans.install(names=('_', 'ngettext'))

# 直接使用全局ngettext
print(ngettext('comment', 'comments', 0))

内容的提问来源于stack exchange,提问作者buhtz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 01:23:19