Question

Étant donné une gettext ligne pluriels-formes, les valeurs générales quelques exemples pour chaque n. Je voudrais cette fonctionnalité pour l'interface web pour les traducteurs de mon site, afin qu'ils sachent quelle forme plurielle où mettre. Par exemple, avec:

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

... Je veux que le premier champ de texte à étiqueter "1, 21 ..", puis "2, 3, 4 ...", puis "5, 6 ..." (pas sûr si cela est tout à fait exact, mais vous voyez l'idée.)

En ce moment, la meilleure chose que je peux trouver est d'analyser l'expression d'une certaine manière, puis itérer x de 0 à 100 et de voir ce qu'il produit n. Ce n'est pas garanti pour fonctionner (si le plus bas x est plus de 100 pour une langue?), Mais il est probablement assez bon. De meilleures idées ou code Python existant?

Était-ce utile?

La solution

Étant donné qu'il est tard, je vais mordre.

La solution suivante est aki, et repose sur la conversion de votre forme plurielle au code python qui peut être évaluée (conversion essentiellement x y: déclarations z au python x et équivalent y ou z, et le changement && / || à et / ou)

Je ne sais pas si votre règle de forme plurielle est un exemple artificiel, et je ne comprends pas ce que vous entendez avec votre premier champ de texte, mais je suis sûr que vous aurez où je vais avec mon exemple solution:

# -*- 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)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top