3

(真的很惊讶,网上的任何地方都没有回答;过去几年有几篇帖子有类似的问题,但从未回答过。让我们希望 Stackoverflow 的工作人员能来救援)

情况:

当使用 gettext 支持应用程序本地化时,有时希望使用 dgettext('domain', 'some text string') 指定一个“域”。但是,当运行xgettext时,所有用 dgettext(...) 包裹的字符串都被吐出到一个文件中(默认值:messages.po)。

给定以下示例:

dgettext('menus', 'login link');
dgettext('menus', 'account link');
dgettext('footer', 'copyright notice');
dgettext('footer', 'contact form');

有什么办法可以结束

menus.po 页脚
.po

使用诸如 xgettext 之类的提取器?

需要 PHP 响应,尽管我相信这应该适用于所有语言

4

3 回答 3

2

我发现这样做的唯一方法是重新定义 gettext 函数......

例子:

function _menus ($str) {
    return dgettext('menus', $str);
}

function _footer ($_str) {
    return dgettext('footer', $str);
}

_menus('login link');
_menus('account link');
_footer('copyright notice');
_footer('contact form');

否则,您只需运行以下命令:

xgettext [usual options] -k --keyword=_menus:1 -d menus
xgettext [usual options] -k --keyword=_footer:1 -d footer

再见!

于 2011-03-18T15:39:26.457 回答
1

最好通过代码分离或使用上下文消歧来实现这一点。

如果您可以将菜单代码与页脚代码分开,那么您可以真正将它们视为不同的域并从已知位置相应地提取它们。

如果模块化分离是不可能的并且所有代码都在一起,那么你真的应该使用上下文而不是域。例如

translate( 'A string', 'myproject', 'some module' ) 

您的域在哪里"myproject""some module"消除了字符串的歧义。

然而,现实并不总是符合最佳实践,所以如果你不能像 Asevere 建议的那样重构你的代码(这可能是最好的答案),那么我可以提供大量的技巧。


您可以利用鲍里斯回答中提到的上下文标志 - 我们可以重新调整它的用途,但前提是我们不打算使用上下文。

我会重复一遍。只有当您的代码不使用 contexts 时,此 hack 才会起作用

一些 PHP 拥有两个域(包括两个域中使用的一个字符串) -

<?php // test.php
dgettext( 'abc', 'foo' );
dgettext( 'abc', 'bar' );
dgettext( 'xyz', 'bar' );

我们可以作弊,并把域参数当作我们打算将它作为消息上下文(msgctxt 字段)。从命令行提取:

xgettext -LPHP --keyword=dgettext:1,2c -o - test.php \
         | sed 's/CHARSET/utf-8/' \
         > combined.pot

这会生成一个combined.pot包含所有字符串的文件,其中包含我们的上下文 hack。(请注意,我们还修复了会破坏下一位的占位符字符集字段)

我们现在可以使用msggrep. 请注意,我们还会丢弃上下文字段,因为我们没有使用它。

msggrep -J -e foo -o - combined.pot | sed '/^msgctxt/d' > foo.pot
msggrep -J -e bar -o - combined.pot | sed '/^msgctxt/d' > bar.pot

不正确,但它有效。

于 2015-04-01T14:31:27.270 回答
1

我不知道如何将不同的上下文放在不同的文件中,但我确实发现 xgettext 可以将域名提取到 po 文件中的 msgctxt 字段中。对于 PHP,默认情况下不这样做。要启用此功能,请使用例如 --keyword=dgettext:1c,2(在 poedit 中,添加“dgettext:1c,2”)到关键字列表。

也可以看看:

http://developer.gnome.org/glib/2.28/glib-I18N.html

https://www.gnu.org/savannah-checkouts/gnu/gettext/manual/html_node/xgettext-Invocation.html

于 2012-05-08T15:18:54.297 回答