gettext,如何处理同音异义词?

时间:2013-04-28 07:49:30

标签: php gettext

使用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如何识别同义词的正确翻译?

4 个答案:

答案 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)。