使用不规则规则翻译语言

6
为了使一个PHP 内容管理系统 可扩展,语言翻译至关重要。我正在研究用于翻译系统的编程方法,并且认为Qt Linguist是一个很好的例子。 以下是Qt文档中的使用示例:
int n = messages.count();
showMessage(tr("%n message(s) saved", "", n));

Qt使用已知的语言规则来确定“message”是否在英语中附加了“s”。
当我向我的开发团队提出这个例子时,他们发现了一个问题,这会危及基于Qt的tr()函数建模的可扩展性效果。
这是一个类似的例子,只是现在出现了严重的问题。
int n = deadBacteria.count();
showMessage(tr("%n bacterium(s) killed", "", n));

"bacterium"的复数形式是"bacteria",不应添加"s"。
我对Qt Linguist没有太多经验,但我还没有看到它如何处理不规则的变位和形式。
更复杂的短语可能是"%n cactus(s) have grown."。复数应为"cactii",如果只有一个仙人掌,则"have"需要变成"has"。
你可能认为逻辑上的纠正是避免使用这些不规则的单词,因为它们在编程中不常用。 好吧,这种方法在两个方面都没有帮助:
  1. 也许有一种语言会以不规则的方式修改名词,即使源字符串在英语中有效,例如"%n message(s) saved"。在MyImaginaryLanguage中,形成翻译字符串的正确方法可能是对于值为123%n值,分别使用"1Message saved", "M2essage saved"和"Me3ssage saved",而Qt Linguist似乎没有处理这个问题的规则。
  2. 为了使我的CMS可扩展,所有类型的Web应用程序都需要被纳入考虑。有人可能会构建一个角色扮演游戏,需要构造像"5 cacti have grown."这样的句子。或者安全软件想要说"ClamAV found 2 viruses.",而不是"ClamAV found 2 virus(es)."

在搜索了解是否有其他Qt开发人员解决了这个问题并没有找到任何答案后,我来到了Stack Overflow。

我想知道:

  1. 应该使用可扩展和有效的编程技术来翻译可能存在不规则规则的字符串。
  2. 如果Qt程序员和翻译遇到这种不规则性问题,他们会怎么做?

我对Qt一无所知,但也许你可以编写一个扩展程序来解析单数/双数/复数的结尾? bacteri(a/um), (1Message/M2essage/Me3ssage) 是一个需要更多工作并且不太灵活的示例。 - Cyclone
3个回答

6
你误解了Qt中复数形式的工作方式:它不是自动翻译。
基本上,你有一个默认字符串,例如“%n仙人掌已经生长”,这是在你的代码中的字面量。你可以随便放任何东西,例如“dingbat wibble foo%n bar”。
然后你可以定义翻译语言(包括与源字符串相同的语言)。
Linguist编程了各种语言处理某些东西的数量的规则。在英语中,它只是单数或复数;但如果一种语言有特定的零形式或其他形式,它会在Linguist中呈现这些形式。然后,它允许您在目标翻译语言中放入正确的句子,并处理将%n放在您决定的翻译形式中应该放置的位置。
因此,在Linguist中进行翻译的人将获得源代码,并填写单数和复数,例如。

源文本:%n cactus(s) have grown.

英语翻译(单数):%n cactus has grown.

英语翻译(复数):%n cacti have grown.

如果应用程序找不到已安装的翻译,则会退回到源文字。同时,翻译人员所看到的也是源文字,因此必须从中推断出您的意思。因此,描述有多少仙人掌生长时,“dingbat wibble foo%n bar”可能不是一个好主意。
进一步阅读:
- Linguist manual - Qt Quarterly 上关于翻译中的复数形式的文章 - 国际化示例或I18N示例 - 下载 SDK 并开始玩耍。

啊,这就解释了那些看起来像魔法一样的东西。我得找时间试试Qt Linguist。 - Deltik

3

您最好的选择是使用GNU gettext国际化框架。它被很好地集成到PHP中,并提供了工具来精确定义所有有关复数形式的奇怪语法规则。


1

使用 Qt Linguist,您可以根据目标语言处理各种语法数量。因此,每当在 tr 字符串中检测到一个 %n,翻译人员将被要求为目标语言提供所有必要的翻译。请参阅本文以获取更多详细信息:

http://doc.qt.nokia.com/qq/qq19-plurals.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接