Как сгенерировать примеры выражения gettext во множественном числе?В Python?
-
09-09-2019 - |
Вопрос
Учитывая строку 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)