Учитывая строку 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?
Учитывая, что поздно, я буду кусать.
Следующее решение является взломанным и полагается на преобразование вашей множественной формы в код python, который может быть оценен (в основном, преобразование операторов x? y: z в эквивалент python x и y или z и изменение & &/|| to и/или)
Я не уверен, что ваше правило множественной формы - это надуманный пример, и я не понимаю, что вы имеете в виду с вашим первым текстовым полем, но я уверен, что вы поймете, где я иду с моим примером решение:
# -*- 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)