我在PHP中遇到了gettext问题。想想源语言中的单词或表达可能有不同含义的情况。
例如:Word A
字有两个含义;一个是B
,一个是C
。在网站的一部分,我们应该使用B
。另一方面,我们应该使用C
。
当我们写_('A')
时如何获得B
或C
?应该有一个可靠的方法来解决这个问题。
答案 0 :(得分: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
文件并重新启动网络服务器后,您的网络应用程序将在正确的位置输出正确的字符串。