【问题标题】:How to generate examples of a gettext plural forms expression? In Python?如何生成 gettext 复数形式表达式的示例?在 Python 中?
【发布时间】:2009-04-14 20:11:06
【问题描述】:

给定一个 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 代码吗?

【问题讨论】:

  • 尝试为每种语言做正确的复数形式会很有趣。斯拉夫语言经常有尾随 2、3 和 4 的特殊情况,例如 :)

标签: python internationalization gettext


【解决方案1】:

既然来晚了,那我就咬一口。

以下解决方案是 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)

【讨论】:

  • 你有一个非常好的方法。我想过转换 ?运算符转换为 Python 的“x if y else z”格式,但这需要更多的解析。此解决方案中的代码容易受到“x 和 y 或 z”的主要问题的影响,即“如果 y 为假怎么办?”,但将 0 转换为“零”是可行的。嗯....
猜你喜欢
  • 2018-07-11
  • 2017-12-08
  • 1970-01-01
  • 2020-07-08
  • 2022-11-12
  • 2012-02-10
  • 1970-01-01
  • 2014-04-02
  • 2021-12-27
相关资源
最近更新 更多