用不规则规则翻译成语言

时间:2012-03-20 00:29:38

标签: php qt internationalization translation

为了使PHP content management system 可扩展,语言翻译至关重要。我正在研究翻译系统的编程方法,我认为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中,形成翻译字符串的正确方法可能是“ 1Message saved ”,“ M2essage saved ”,“ Me3ssage saved ”for { {1}}分别为%n12,并且它看起来不像Qt Linguist有处理此问题的规则。
  2. 为了使CMS可扩展,就像我需要的那样,需要考虑所有类型的Web应用程序。有人可能会构建一个role-playing game,需要构造像“ 5 cacti已经成长的句子<或者>“或许安全软件想说,” ClamAV发现2种病毒。“而不是” ClamAV发现2种病毒。“< / LI>

    在线搜索以查看其他Qt开发人员是否有解决此问题但未找到任何问题的解决方案后,我来到Stack Overflow。

    我想知道:

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

3 个答案:

答案 0 :(得分:6)

你误解了Qt的多元化是如何运作的:它不是自动翻译。

基本上你有一个默认字符串,例如“%n仙人掌已经长大。”在你的代码中,这是一个文字。你可以放任何你喜欢的东西,例如“dingbat wibble foo%n bar”。

然后,您可以定义翻译语言(包括与您编写源字符串的语言相同的语言)。

语言学家编写了语言如何处理某些东西的各种规则。在英语中它只是单数或复数;但如果一种语言具有零或其他的特定形式,它就会出现在语言学家中。然后,它允许您在目标翻译语言中输入正确的句子,并处理将%n放在您认为应该以翻译形式存在的位置。

因此,无论谁在语言学家中进行翻译,都会提供来源,例如,必须填写单数和复数。

  

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

     

英文翻译(Singular):%n cactus has grown.

     

英文翻译(Plural):%n cacti have grown.

如果应用程序找不到已安装的翻译,则它会回退到源文字。此外,源文字是翻译人员所看到的内容,因此必须从中推断出您的意思。因此,在描述有多少仙人掌成长时,“dingbat wibble foo%n bar”可能不是一个好主意。

进一步阅读:

答案 1 :(得分:3)

您最好的选择是使用GNU gettext i18n框架。它很好integrated into PHP,并为您提供了精确define关于复数形式的所有古怪语法规则的工具。

答案 2 :(得分:1)

使用Qt Linguist,您可以根据目标语言处理各种语法数字。因此,每次在%n字符串中检测到tr时,都会要求翻译人员为目标语言提供所有必要的翻译。查看此文章以获取更多详细信息:

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