如何生成 gettext 复数形式表达式的示例? 用Python?

发布于 2024-07-16 23:12:38 字数 516 浏览 4 评论 0原文

给定 gettext Plural-Forms 行,为每个 n 提供一些示例值。 我希望网站翻译人员能够在网络界面中使用此功能,以便他们知道将哪种复数形式放在哪里。 例如,给出:

“复数形式: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 代码吗?

Given a gettext Plural-Forms line, general a few example values for each n. I'd like this feature for the web interface for my site's translators, so that they know which plural form to put where. For example, given:

"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"

... I want the first text field to be labeled "1, 21..", then "2, 3, 4...", then "5, 6..." (not sure if this is exactly right, but you get the idea.)

Right now the best thing I can come up with is to parse the expression somehow, then iterate x from 0 to 100 and see what n it produces. This isn't guaranteed to work (what if the lowest x is over 100 for some language?) but it's probably good enough. Any better ideas or existing Python code?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

顾挽 2024-07-23 23:12:38

既然已经晚了,那我就咬牙切齿吧。

以下解决方案很hacky,依赖于将复数形式转换为可以计算的Python代码(基本上将 x ? y : z 语句转换为Python x 和 y 或 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)

Given that it's late, I'll bite.

The following solution is hacky, and relies on converting your plural form to python code that can be evaluated (basically converting the x ? y : z statements to the python x and y or z equivalent, and changing &&/|| to and/or)

I'm not sure if your plural form rule is a contrived example, and I don't understand what you mean with your first text field, but I'm sure you'll get where I'm going with my example solution:

# -*- 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)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文