第十五章:国际化和本地化-gettext:消息编目-复数值

本文探讨了在gettext中处理复数形式的国际化方法,详细介绍了如何使用ngettext和ungettext函数来根据数量变化选择正确的复数形式。通过示例展示了英语和其他语言中复数形式的差异,并解释了如何配置Plural-Forms来适配不同语言的复数规则。

15.1.4 复数值
简单的消息替换可以处理大多数转换需求,不过gettext将复数处理为一种特殊情况。一个消息的单数和复数形式之间会有差别,而且取决于具体语言,这种差别可能也有所不同,有些只是某个单词的末尾不同,有些则是整个橘子结构都不同。根据复数的层次,可能还会有不同的形式。为了更容易地管理复数(在某个情况下,甚至是为了能管理复数),模块提供了一组单独的函数来询问一个消息的复数形式。

from gettext import translation
import sys

t = translation('plural','locale',fallback=False)
num = int(sys.argv[1])
msg = t.ngettext('{num} means singular.',
                 '{num} means plural.',
                 num)

# Still need to add the values to the message ourselves
print(msg.format(num=num))

使用ungettext()来访问一个消息的复数版本。参数是要转换的消息和项数。

在这里插入图片描述
由于有一些候选的转换形式,所以这些替换形式会被列在一个数组中。通过使用数组,就可以对有多种复数形式的语言完成转换(例如,波兰语就用不同的形式来表示相对数量)。
在这里插入图片描述
除了填入转换串之外,还需要告诉库采用哪种复数形式,让它知道对应给定的数量值如何在数组中索引。行"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"包含两个值,需要手工替换:nplurals是一个整数,指示数组的大小(使用的转换数);plural是一个C语言表达式,用于将得到的数量转换为查找转换时需要的数组索引。字面量串n会被替换为传递给ungettext()的数量。
例如,英语包括两种复数形式。数量0会被处理为复数(“0 bananas”)。Plural-Forms项如下。

Plural-Forms: nplurals=2; plural=n != 1;
单数转换位于位置0,复数转换在位置1。
在这里插入图片描述

编译编目之后,运行几次测试脚本,展示不同的N值如何被转换为对于转换字符串的索引。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值