在Drupal中,显示给用户的字符串应该通过t()函数传递,如下所示:
$heading = "<h2>" . t("Product") . "</h2>";
这允许Drupal将字符串翻译成适当的语言。
但是,如果在同一网站上以两种不同的方式使用相同的英文单词,该怎么办?如果我写了一个价格计算模块,其中有一个“产品”选项,表明折扣应该相乘,那么本地化过程如何知道是否将该单词翻译为要购买的项目或算术运算?
我应该完全避免使用同音异义词吗?
答案 0 :(得分:5)
非常好的问题(+1)。我相信,2006年有一个关于Drupal邮件列表的讨论。核心开发人员对i18n和l10n基础设施的当前设计进行了激烈的辩护。 Indoeuropean语言同音异义的问题是有限的,但是当你移居到中国时,由于每个中文表意文字代表了一堆非常不同的概念,因此变得势不可挡,你只能通过观察背景来获得预期的。 / p>
虽然没有同音异义词的编码解决方案,但有一个非常简单的最佳实践:提供上下文!尽可能用句子提供t()函数,而不是单个词,或者说它使用common.inc
中的代码文档:
使用t()时,尝试将整个句子和字符串放在一个t()调用中。这使翻译人员更容易,因为它提供了每个单词所指的内容。
如果无法做到这一点,并且使用不同拼写的同义词不是一个选项,您可以嵌入透明的HTML标记,为翻译提供上下文。例如:
$heading = "<h2>" . t("<span id="product-as-in-stores">Product</span>") . "</h2>";
通过这种方式,您可以为翻译人员提供重要信息,而如果您只是嵌入了<h2>
代码,则翻译人员必须猜测产品所指的内容。
这是 - BTW - 在t()字符串中嵌入HTML标记的极少数情况之一被认为是不好的。
HTH!
答案 1 :(得分:1)
最简单的方法是在其中一个案例中使用另一个术语。词库是你的朋友。乘法情况的“结果”怎么样?
事实是,t()
函数以及其他语言中的其他类似函数,如GNU C国际化中的_()
(我忘记了确切的lib名称),并不适用于单词,但是短语,例如对话框中的消息。也许如果您在翻译的字符串中包含<h2>...</h2>
标签以消除这些情况的歧义?