如何使用 POEdit 从特定域获取(可翻译的)字符串

Posted

技术标签:

【中文标题】如何使用 POEdit 从特定域获取(可翻译的)字符串【英文标题】:How to get (translatable) strings from specific domain with POEdit 【发布时间】:2012-09-26 10:19:59 【问题描述】:

我已经尝试了几个小时来寻找一种设置 POEdit 的方法,以便它只能从特定域中获取文本

我的 gettext 函数如下所示:

function ri($id, $parameters = array(), $domain = 'default', $locale = null)

一个示例调用:

echo ri('Text %xyz%', array('%xyz%'=>100), 'myDomain');

我只需要获取域为 myDomain 的文本进行翻译,或者至少我希望 POEdit 将这些文本放入域特定的文件中。有办法吗?

我发现了几个相似的问题,但答案并没有真正告诉我该怎么做(我想我是个菜鸟,必须用简单的英语解释才能理解):

How to set gettext text domain in Poedit?

How to get list of translatable messages

【问题讨论】:

【参考方案1】:

所以我经过几天的搜索终于弄明白了,我终于在这里找到了答案:

http://sourceforge.net/mailarchive/message.php?msg_id=27691818

xgettext 识别字符串中的上下文,并在 *.pot 文件中给出一个 msgctxt 字段,翻译软件将其识别为 上下文并显示为这样(检查显示上下文的 Pootle 的图像 下面)

这可以通过 3 种方式完成:

    代码中的字符串格式应为 _t('context','string');和 xgettext 调用应采用 --keyword=_t:1c,2 形式 (这基本上向 xgettext 解释了其中有 2 个参数 关键字函数,第一个是上下文,第二个是字符串) 代码中的字符串格式为 _t('string','context');并且 xgettext 调用应采用 --keyword=_t:1,2c 的形式 代码中的字符串应为 _t('context|string'),xgettext 调用应采用 --keyword=_t:1g 形式

所以为了回答我自己的问题,我将其添加到 Poedit 的“来源关键字”选项卡中:

ri:1,3c

ri是函数名,1是stringid的位置,3是context/domain的位置

希望这对其他人有所帮助,我讨厌所有这些神秘的文件

【讨论】:

您好,谢谢您,但是您在哪里指定文本域?在你的情况下myDomain 啊我明白了,现在所有字符串都将被提取,每个字符串都包含它的文本域,所以我们不能只基于某些文本域生成 .po? 是的,我正在寻找答案太久了,我没有看到您实际上在哪里写了域名? 但是域和上下文是两个不同的东西。 不知道为什么这是公认的答案。没有解决问题。【参考方案2】:

(这是我对同一件事here的回答的转贴。)

GNU gettext 工具和 Poedit(使用它们)都不支持这种对 gettext 的特殊滥用。

在 gettext 中,domain 大致是“一个软件”——一个程序、一个库、一个插件、一个主题。因此,它通常驻留在单个目录树中并且单独在那里 - 或者至少,如果您有多个片段=域,您可以将它们合理地组织到一些您可以限制的子目录中提取到。

在一个单个文件中混合和匹配域并不是你想要使用 gettext 的方式,除了使用你自己的辅助函数之外,没有合理的解决方案来处理它,例如通过将所有 myDomain 文本包装到 __mydomain (显然,您必须定义)并在为 myDomain 提取时将其添加到 Poedit 中的关键字列表中,而 not 将其添加到其他域的关键字列表中' 文件。

【讨论】:

以上是关于如何使用 POEdit 从特定域获取(可翻译的)字符串的主要内容,如果未能解决你的问题,请参考以下文章

PHP:如何在 Poedit 中使用换行符

如何使用 poedit 解析 Timber (twig) 模板并检测引用的字符串以进行翻译

用 poedit 和 zend translate 翻译数据库

如何使用 poedit 从 js 文件生成 po 文件

从 JSON 文件解析可翻译的消息

打开po文件时poEdit编码错误