代码之家  ›  专栏  ›  技术社区  ›  Andrew B.

如何生成getText复数形式表达式的示例?在蟒蛇?

  •  1
  • Andrew B.  · 技术社区  · 16 年前

    给定一个getText复数形式行,一般为每个 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,看看它产生了什么n。这不保证有效(如果某些语言的最低x超过100怎么办?)但这可能足够好了。有更好的想法或现有的python代码吗?

    1 回复  |  直到 16 年前
        1
  •  1
  •   Thomas Vander Stichele    16 年前

    既然已经晚了,我就咬人。

    下面的解决方案是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)