gettext 복수 형태 표현의 예를 생성하는 방법은 무엇입니까? 파이썬에서?
-
09-09-2019 - |
문제
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)