翻译成有不规则规则的语言



为了使PHP内容管理系统具有可扩展性,语言翻译至关重要。我在研究翻译系统的编程方法,我认为Qt语言学家就是一个很好的例子。

这是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语言学家没有太多经验,但我还没有看到它是如何处理不规则的共轭和形式的。

一个更复杂的短语可能是"%n cactus(s) have grown."。复数应该是"cactii",如果有一个仙人掌,"have"需要与"has"共轭。

您可能会认为,逻辑纠正是为了避免这些不规则的单词,因为它们在编程中没有使用。好吧,这在两个方面都没有帮助:

  1. 也许有一种语言会以不规则的方式修改名词,即使源字符串在英语中有效,比如"%n message(s) saved"。在MyImaginaryLanguage中,对于%n123,形成翻译字符串的正确方式可以是"1Message saved"、"M2Message saved"one_answers"Me3sage saved",而且Qt Linguist似乎没有处理这一问题的规则
  2. 要使CMS像我需要的那样可扩展,所有类型的网络应用程序都需要考虑在内。有人可能会构建一个角色扮演游戏,需要像"5棵仙人掌已经生长。"这样的句子。或者安全软件可能会说,"ClamAV发现了2个病毒。",而不是"ClamAV找到了2个"

在网上搜索了一下其他Qt开发人员是否有解决这个问题的方法,但没有找到,我来到了Stack Overflow。

我想知道:

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

您误解了Qt中的复数是如何工作的:它不是自动翻译。

基本上,您有一个默认字符串,例如"%"长出了n株仙人掌"这是一个文字,在你的代码中。你可以在里面放任何你喜欢的东西,例如";dingbat wibble foo%nbar";。

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

语言学家用各种规则来编程语言如何处理事物的数量。在英语中,它只是单数或复数;但是,如果一种语言有一个特定的零或其他形式,它就会呈现出语言学家的那些形式。然后,它允许你在目标翻译语言中输入正确的句子,并处理将%n放在你决定它应该在翻译形式中的位置。

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

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

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

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

如果应用程序找不到已安装的翻译,则返回到源文字。此外,原文是翻译人员所看到的,因此必须从中推断出你的意思;dingbat wibble foo%nbar"在描述已经生长了多少仙人掌时,这可能不是一个好主意。

进一步阅读:

  • 语言学家手册
  • Qt季刊文章谈翻译中的复数形式
  • 国际化示例或I18N示例
  • 下载SDK并进行游戏

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

使用Qt Linguist可以处理基于目标语言的各种语法数字。因此,每当在tr字符串中检测到%n时,翻译人员都会被要求提供目标语言的所有必要翻译。查看本文了解更多详细信息:

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

最新更新