使用gettext
单一值
echo gettext( "Hello, world!\n" );
复数
printf(ngettext("%d comment", "%d comments", $n), $n);
英文谐音?
echo gettext("Letter");// as in mail, for Russian outputs "письмо"
echo gettext("Letter");// as in character, for Russian outputs "буква"
与英文单词“character”相同,它可以是一个人或一个字母的字符! gettext如何识别同义词的正确翻译?
答案 0 :(得分:8)
您正在寻找的是gettext
的上下文,它解决了您的示例中的含糊之处。您可以在documentation中找到相关信息。仍然需要的方法pgettext
未在PHP中实现,因此您可以使用php文档中user comment中所述的帮助方法。
if (!function_exists('pgettext')) {
function pgettext($context, $msgid)
{
$contextString = "{$context}\004{$msgid}";
$translation = dcgettext('messages', contextString,LC_MESSAGES);
if ($translation == $contextString) return $msgid;
else return $translation;
}
}
在你的情况下,它将是
echo pgettext('mail', 'Letter');
echo pgettext('character', 'Letter');
答案 1 :(得分:3)
在尝试使用GNU xgettext实用程序从源代码中提取字符串时,我遇到了上面的pgettext()问题。
起初看起来它会起作用。使用--keyword参数我可以运行xgettext实用程序从测试脚本中提取这些上下文和消息字符串:
echo pgettext('Letter','mail');
echo pgettext('Letter','character');
并获得具有预期输出的.pot文件:
...
msgctxt "mail"
msgid "Letter"
msgstr ""
msgctxt "character"
msgid "Letter"
msgstr ""
...
但PHP * gettext()函数不允许我传递上下文字符串 - 所以我无法获取翻译文本。
能够使用GNU实用程序让我更容易,所以我的解决方案就是使用这样的东西:
function _c( $txt ) { return gettext( $txt ); }
echo "<P>", _c( "mail:Letter" ), "\n";
echo "<P>", _c( "character:Letter" ), "\n";
现在我运行xgettext实用程序
xgettext ... --keyword="_c:1" ...
反对我的测试脚本。这会生成一个带有简单msgid的.pot文件,可以通过PHP gettext()函数访问:
...
msgid "mail:Letter"
...
msgid "character:Letter"
...
接下来,我将.pot模板作为.po文件复制到各种LC_MESSAGE文件夹,然后编辑翻译后的文本:
...
msgid "mail:Letter"
msgstr "Russian outputs for Mail: \"письмо\""
msgid "character:Letter"
msgstr "Russian outputs for Letter of the Alphabet: \"буква\""
...
我的测试脚本有效:
...
Russian outputs for Mail: "письмо"
Russian outputs for Letter of the Alphabet: "буква"
...
xgettext的文档在这里: http://www.gnu.org/software/gettext/manual/html_node/xgettext-Invocation.html
(我仍然有poedit和“复数”文字的问题,但这是另一个主题。)
答案 2 :(得分:2)
对于像我这样使用Poedit的人,你需要关注。首先创建函数。我正在使用一个名为_x的WordPress使用的一个:
if (!function_exists('_x')) {
function _x($string, $context)
{
$contextString = "{$context}\004{$string}";
$translation = _($contextString);
if ($translation == $contextString)
return $string;
return $translation;
}
}
然后在poedit上,你需要在Sources Keywords标签上输入以下内容:
_x:1,2c
_
因此,当您需要使用上下文翻译时,您可以使用_x函数。例如:
<?php
echo _x('Letter', 'alphabet');
echo _x('Letter', 'email');
echo _('Regular translation');
我从这些链接中获取了所有信息:
答案 3 :(得分:1)
我制作了一个软件包,以提供一个简单的解决方案来解决PHP中缺少pgettext的问题。
请参见here。
您需要使用composer require datalinx/gettext-context
安装软件包,然后才能使用
echo pgettext('Mail', 'Letter'); // Echoes: письмо
echo pgettext('Character', 'Letter'); // Echoes: буква
还实现了多个和域替代功能(npgettext,dpgettext,dnpgettext)。