2009-04-14 6 views
1

gettext Plural-Forms行が与えられた場合、一般的にそれぞれnのいくつかの値の例があります。私は自分のサイトの翻訳者のためのWebインターフェイスのためにこの機能を使いたいので、どこに複数のフォームを置くかを知るようにしたいと思います。例えば、与えられた:gettext複数形式の例をどのように生成するのですか? Pythonで?

"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 ... "(これがまさに正しいかどうかは分かりませんが、あなたはアイデアを得ています)。

今私が思いつくことができる最も良いことは、何らかの形で式を解析し、次にxを0から反復することです100と何が生成するかを参照してください。これは動作することが保証されていません(何らかの言語で最低xが100を超える場合はどうでしょうか?)しかし、おそらく十分です。より良いアイデアや既存のPythonコード?

+0

言語ごとに正しい複数のフォームを試してみると楽しいことがあります。スラブ語では、2,3、および4の後ろに特殊なケースがよくあります。例えば、 – Joey

答えて

1

それが遅れているとすれば、私はかみ合うでしょう。

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

あなたの複数フォームルールが設計された例であるかどうかわかりませんが、最初のテキストフィールドの意味を理解できませんが、私は私のサンプルソリューションを使っています:

# -*- 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) 
+0

あなたは非常に良いアプローチをしています。私は変換すると思った?演算子をPythonの "x if y else z"形式に変換しますが、それはさらに解析が必要になります。 このソリューションのコードは、 "xとyまたはz"の主な問題を抱えています。 "yがfalseの場合はどうなりますか?"が0を '0'に変換します。うーん.... –