Frage

eine gettext Plural-Forms Linie, allgemein einige Beispielwerte für jeden n gegeben. Ich möchte diese Funktion für das Web-Interface für Übersetzer meiner Website, so dass sie wissen, welche Pluralform zu bringen, wo. Zum Beispiel gegeben:

"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"

... Ich mag, dass das erste Textfeld mit der Bezeichnung "1, 21 .." werden, dann "2, 3, 4 ...", dann "5, 6 ..." (nicht sicher, ob dies genau richtig, aber Sie bekommen die Idee.)

Im Augenblick ist das Beste, was ich mit oben kommen kann ist der Ausdruck irgendwie zu analysieren, dann iterieren x von 0 bis 100 und sehen, was n sie produziert. Dies wird nicht garantiert werden (was ist, wenn die niedrigste x über 100 für eine Sprache ist?), Aber es ist wahrscheinlich gut genug. Eine bessere Idee oder bestehende Python-Code?

War es hilfreich?

Lösung

Da es ist spät, ich werde beißen.

Die folgende Lösung ist Hacky, und stützt sich auf Ihre Pluralform zu Python-Code umgewandelt werden, die ausgewertet werden kann (im Grunde die x Umwandlung y: z-Anweisungen an den Python x und y oder z äquivalent und das Ändern && / || zu und / oder)

Ich bin mir nicht sicher, ob Ihr Plural Regel ein konstruiertes Beispiel, und ich verstehe nicht, was Sie mit Ihrem ersten Textfeld bedeuten, aber ich bin sicher, dass Sie bekommen, wo ich mit meinem Beispiel werde Lösung:

# -*- 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)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top