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
相关产品推荐
相关产品推荐

