在尝试使用 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 和“复数”文本有问题,但这是另一个主题。)