Как создать примеры выражения множественного числа gettext? В питоне? - PullRequest
1 голос
/ 15 апреля 2009

Учитывая строку множественных форм 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 и посмотреть, что оно выдает. Это не гарантированно сработает (что, если на каком-то языке самый низкий x больше 100?), Но, вероятно, он достаточно хорош. Есть лучшие идеи или существующий код Python?

1 Ответ

1 голос
/ 16 апреля 2009

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

Следующее решение является хакерским и основано на преобразовании формы множественного числа в код на языке 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)
...