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

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值如何被转换为对于转换字符串的索引。

猜你喜欢

转载自blog.csdn.net/weixin_43193719/article/details/94760475