这是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));
复数的“细菌”是“细菌”.附加“s”是不合适的.
我对Qt Linguist没有多少经验,但我还没有看到它如何处理不规则的变形和形式.
一个更复杂的短语可能是“%n cactus(s)已经成长.”如果有一个仙人掌,复数应该是“cactii”,并且“have”需要与“has”结合.
您可能认为逻辑校正是为了避免这些不规则的单词,因为它们不用于编程.嗯,这在两个方面没有帮助:
>也许有一种语言以不规则的方式修改名词,即使源字符串使用英语,例如“%n message(s)saved”.在MyImaginaryLanguage中,形成翻译字符串的正确方法可能是“1Message saved”,“M2essage saved”,“Me3ssage saved”分别为%n值1,2和3,它看起来不像Qt Linguist处理这个的规则.
>为了使CMS可扩展,就像我需要的那样,需要考虑所有类型的Web应用程序.有人可能会构建一个需要构造像“5仙人掌已经成长”的句子的role-playing game.或许安全软件想说,“ClamAV发现了2种病毒.”而不是“ClamAV发现了2种病毒”.
在线搜索以查看其他Qt开发人员是否有解决此问题但未找到任何问题的解决方案之后,我来到Stack Overflow.
我想知道:
>应该使用什么可扩展和有效的编程技术来翻译可能不规则的字符串?
>如果Qt程序员和翻译人员遇到这种违规问题会怎么做?
基本上你有一个默认字符串,例如“%n仙人掌已经长大.”在你的代码中,这是一个文字.你可以放任何你喜欢的东西,例如“dingbat wibble foo%n bar”.
然后,您可以定义翻译语言(包括与您编写源字符串的语言相同的语言).
语言学家编写了语言如何处理某些东西的各种规则.在英语中它只是单数或复数;但是如果一种语言具有零或其他的特定形式,那么它就会出现在语言学家中.然后它允许您在目标翻译语言中输入正确的句子,并且它处理将%n放在您认为应该在翻译形式中的位置.
因此,无论谁在语言学家中进行翻译都将提供来源,例如,必须填写单数和复数.
Source text:
%n cactus(s) have grown.
English translation (Singular):
%n cactus has grown.
English translation (Plural):
%n cacti have grown.
如果应用程序找不到已安装的翻译,则它会回退到源文字.此外,源文字是翻译人员所看到的内容,因此必须从中推断出您的意思.因此,在描述有多少仙人掌成长时,“dingbat wibble foo%n bar”可能不是一个好主意.
进一步阅读:
> Linguist manual
> Qt Quarterly的Qt Quarterly文章
> Internationalization示例或I18N示例
> Download the SDK并玩一玩.