1

gettext Plural-Forms 行が与えられた場合、それぞれの一般的な値の例をいくつか示しますn。サイトの翻訳者がどの複数形をどこに置くべきかを理解できるように、この機能を 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..." というラベルを付けたい (これが正確かどうかはわかりませんが、しかし、あなたはアイデアを得る.)

現時点で私が思いつく最善の方法は、何らかの方法で式を解析し、x を 0 から 100 まで反復して、生成される n を確認することです。これがうまくいくとは限りませんが (ある言語で最小の x が 100 を超えている場合はどうなるでしょうか?)、おそらくこれで十分です。より良いアイデアや既存の Python コードはありますか?

4

1 に答える 1

1

遅いので噛みます。

次の解決策はハックであり、複数形を評価可能な Python コードに変換することに依存しています (基本的に x ? y : z ステートメントを Python の x および y または z に相当するものに変換し、&&/|| を 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)
于 2009-04-16T00:01:35.523 に答える