2014-10-19 120 views
0

我在PHP中有gettext问题。考虑一种情况,即源语言中的单词或表达可以具有不同的含义。Gettext不同的翻译

例如:单词A单词有两个含义;一个是B,另一个是C。在网站的一部分中,我们应该使用B。另一部分我们应该使用C

当我们写_('A')如何才能得到BC?应该有一个坚实的方式来处理这个问题。

+0

你可以发布演示,并显示你已经尝试过的代码吗? – BenM 2014-10-19 09:30:42

+0

没有什么可写的。因为我已经在使用。问题是,我需要同一个词的多个翻译。 – 2014-10-19 09:32:33

+0

对不起,显示你已经尝试过的东西总是很好,并解释它为什么不起作用。没有人会为你写信。 – BenM 2014-10-19 09:34:52

回答

3

Gettext支持所谓的message contexts。 PHP对此没有本地方法,但是it can easily be implemented

假设我们想在不同的上下文中使用术语“金额” - 在一个上下文中,它表示“一组项目的数量”,在其他上下文中,它指的是“发票金额”。

它工作在以下几个步骤:

首先:除了使用gettext()功能,你可以使用一个定制;我们称之为contextGettext()

echo contextGettext('amount', 'count of items'); 
echo contextGettext('amount', 'invoice amount'); 

此方法是这样的:

function contextGettext($string, $context) 
{ 
    // http://www.php.net/manual/de/book.gettext.php#89975 
    $contextString = "{$context}\004{$string}"; 
    $translation = gettext($contextString); 
    return ($translation === $contextString) ? $string : $translation; 
} 

注意\004:这是其限定从所述消息字符串的上下文标识符,作为每gettext的说明书中,分离器。 (没有你需要很在意,只知道背景)

当收集翻译的字符串与xgettext工具,就可以添加以下--keyword参数的上下文相关的字符串:

xgettext … --keyword="contextGettext:2c,1" … 

然后,您.po文件将具有以下项:

msgctxt "count of items" 
msgid "amount" 
msgstr "" 

msgctxt "invoice amount" 
msgid "amount" 
msgstr "" 

翻译目录,生成.mo文件并重新启动后webserve r,你的web应用程序会在正确的位置输出正确的字符串。