如何生成gettext复数形式表达式的示例?在Python?

时间:2009-04-14 20:11:06

标签: python internationalization gettext

给定一个gettext Plural-Forms行,通常为每个n提供一些示例值。我希望这个功能用于我网站翻译的网页界面,以便他们知道哪个复数形式放在哪里。例如,给定:

"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" "10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"

...我希望第一个文本字段标记为“1,21 ..”,然后是“2,3,4 ......”,然后是“5,6 ......”(不确定这是否是完全正确,但你明白了。)

现在我能想到的最好的事情就是以某种方式解析表达式,然后将x从0迭代到100并查看它产生了什么。这不能保证工作(如果某种语言的最低x超过100怎么办?)但它可能已经足够了。有更好的想法或现有的Python代码吗?

1 个答案:

答案 0 :(得分:1)

鉴于已经晚了,我会咬人。

以下解决方案很糟糕,依赖于将复数形式转换为可以评估的python代码(基本上将x?y:z语句转换为python x和y或z等效,并更改&amp;&amp; / ||到和/或)

我不确定你的复数形式规则是否是一个人为的例子,我不明白你对你的第一个文本字段的意思,但我相信你会得到我的例子。溶液:

# -*- Mode: Python -*-
# vi:si:et:sw=4:sts=4:ts=4

p = "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"

# extract rule
import re
matcher = re.compile('plural=(.*);')
match = matcher.search(p)
rule = match.expand("\\1")

# convert rule to python syntax
oldrule = None
while oldrule != rule:
    oldrule = rule
    rule = re.sub('(.*)\?(.*):(.*)', r'(\1) and (\2) or (\3)', oldrule)

rule = re.sub('&&', 'and', rule)
rule = re.sub('\|\|', 'or', rule)

for n in range(40):
    code = "n = %d" % n
    print n, eval(rule)