Как сгенерировать примеры выражения gettext во множественном числе?В Python?

StackOverflow https://stackoverflow.com/questions/749170

Вопрос

Учитывая строку 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?

Это было полезно?

Решение

Учитывая, что уже поздно, я клюну.

Следующее решение является хакерским и основано на преобразовании вашей формы множественного числа в код 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)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top