Come generare esempi di gettext espressione forme plurale? In Python?
-
09-09-2019 - |
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?
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)