gettext 복수 형태 표현의 예를 생성하는 방법은 무엇입니까? 파이썬에서?

StackOverflow https://stackoverflow.com/questions/749170

문제

GetText 복수 형식 라인이 주어지면 일반적으로 각각에 대한 몇 가지 예제 값 n. 내 사이트 번역기의 웹 인터페이스에 대한이 기능을 원하므로 어디에 올릴 수 있는지 알 수 있습니다. 예를 들어, 주어진 :

"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를 반복하고 그것이 무엇을 생산하는지 보는 것입니다. 이것은 작동하는 것이 보장되지 않습니다 (X가 가장 낮은 X가 일부 언어의 경우 100을 초과하면 어떻게 될까요?) 아마도 충분할 것입니다. 더 나은 아이디어 나 기존 파이썬 코드가 있습니까?

도움이 되었습니까?

해결책

늦었다는 것을 감안할 때 물게 될 것입니다.

다음 솔루션은 해킹되어 있으며 복수 양식을 평가할 수있는 Python 코드로 변환하는 데 의존합니다 (기본적으로 x? y : z 문을 Python x 및 y 또는 z로 변환하고 &&/|| and and 또는 또는/또는 change )

복수 양식 규칙이 고안된 예인지 확실하지 않으며 첫 번째 텍스트 필드에서 당신이 의미하는 바를 이해하지 못하지만 내 예제 솔루션과 함께 어디로 가고 있는지 확신합니다.

# -*- 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