如何生成gettext的复数形式表达的例子吗?在Python?
-
09-09-2019 - |
题
给定的gettext复数窗体线,对于每个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 ...”(不知道这是否是完全正确,但你的想法。)
现在,我能想出的最好的事情就是以某种方式解析表达式,然后从0迭代x到100,看看ñ它产生。这是不能保证工作(如果有什么最低x是超过100对于某一国语言?),但它可能不够好。更好的想法或现有Python代码?
解决方案
由于它的晚,我会咬。
下面的解决方案是哈克,并依赖于你的复数形式转换为可以评估(基本上变换x和y Python代码: - Z语句到蟒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)
不隶属于 StackOverflow