1

给定一个 gettext Plural-Forms 行,每个n. 我希望我的网站翻译人员的 Web 界面具有此功能,以便他们知道将哪种复数形式放在哪里。例如,给定:

"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 并查看它产生的 n。这不能保证有效(如果某些语言的最低 x 超过 100 怎么办?)但它可能已经足够好了。有更好的想法或现有的 Python 代码吗?

4

1 回答 1

1

既然来晚了,我就咬一口。

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

我不确定你的复数形式规则是否是一个人为的例子,我不明白你的第一个文本字段是什么意思,但我相信你会通过我的示例解决方案得到我要去的地方:

# -*- 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)
于 2009-04-16T00:01:35.523 回答