如何使用 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 从特定域获取(可翻译的)字符串的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 poedit 解析 Timber (twig) 模板并检测引用的字符串以进行翻译