Domanda

Dato un gettext linea plurali-Forms, alcuni valori generali di esempio per ogni n. Mi piacerebbe questa funzione per l'interfaccia web per i traduttori del mio sito, in modo che sappiano che forma plurale di mettere dove. Ad esempio, dato:

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

... Voglio che il primo campo di testo per essere etichettato come "1, 21 ..", poi "2, 3, 4 ...", quindi "5, 6 ..." (non so se questo è esattamente a destra, ma si ottiene l'idea.)

In questo momento la cosa migliore che posso venire con è quello di analizzare l'espressione in qualche modo, quindi scorrere x da 0 a 100 e vedere che cosa n che produce. Questo non è garantito il funzionamento (cosa succede se la x più basso è superiore a 100 per un po 'la lingua?), Ma è probabilmente abbastanza buono. Tutte le idee migliori o codice Python esistente?

È stato utile?

Soluzione

Dato che è tardi, sarò morso.

La seguente soluzione è hacky, e si basa sulla conversione del plurale di codice Python che può essere valutata (sostanzialmente convertendo l'x y: z istruzioni al pitone x ed equivalente yoz, e cambiando && / || per e / o)

Non sono sicuro se la vostra regola di forma plurale è un esempio forzato, e non capisco cosa vuoi dire con il primo campo di testo, ma sono sicuro che avrai dove sto andando con il mio esempio soluzione:

# -*- 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)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top