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

1

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

  • 0
    Вы можете получить большое удовольствие, пытаясь сделать правильные формы множественного числа для каждого языка. Славянские языки часто имеют особые случаи для трейлинга 2, 3 и 4, например :)
Теги:
gettext
internationalization

1 ответ

1
Лучший ответ

Учитывая, что поздно, я буду кусать.

Следующее решение является взломанным и полагается на преобразование вашей множественной формы в код 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)
  • 0
    У вас очень хороший подход. Я думал о преобразовании? Оператор в формате Python "x, если y еще z", но это потребует большего разбора. Код в этом решении восприимчив к основной проблеме «x и y или z», а именно «что если y ложно?», Но преобразование 0 в «ноль» работает. Хммм ....

Ещё вопросы

Сообщество Overcoder
Наверх
Меню