给定一个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代码吗?
答案 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)