質問

nためのgettext複フォームライン、一般的ないくつかの例示的な値が与えられます。彼らはどこに置くために、複数のどのフォーム知っているので、私は、自分のサイトの翻訳者のためのWebインターフェイスに対してこの機能をしたいと思います。例えば、所与の

"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 ..."(ではない、これがあれば確認してください正確に正しいが、あなたのアイデアを得る。)

今、私が思い付くことができます最善のことは、何らかの形で式を解析後、0から100までのxを反復処理し、それが生成するものをn個を確認することです。これは、(最低xは、いくつかの言語?100の上にあるものならば)それは十分おそらく良いことだ動作は保証されません。任意のより良いアイデアや既存のPythonコード?

役に立ちましたか?

解決

それは後半だということを考えると、私はかむよ。

以下の溶液がハックされ、基本的にXを変換する(評価YすることができるPythonコードにあなたの複数形を変換に依存している:Pythonのxおよびyまたはz相当するZ文を、および&&変化/ ||か?および/または)

私はあなたの複数形のルールが不自然な例であるかどうかわからないんだけど、私はあなたの最初のテキストフィールドに何を意味するのか理解していないが、私は私の例で行くよどこに得るだろうと確信しています解決策:

# -*- 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)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top