使用POEdit - 仅搜索特定域中的字符串

时间:2015-05-24 10:03:31

标签: php wordpress translation poedit po

我创建了一个我希望翻译的WordPress主题。

在我的主题中,我使用woocommerce的一些翻译(即<?php _('Your cart', 'woocommerce'); ?>)。

Theese woocommerce字符串,我不想再翻译,因为它们已经翻译过了。但是当我使用poedit扫描我的主题时,它当然会找到所有文本域。

所以我的问题是:

如何告诉POEdit只选择特定文本域中的字符串?

  • __('Something', 'my-text-domain')
  • _e('Something else', 'my-text-domain')

我找到了这个答案:

但它似乎对我不起作用。我已按照说明将ri:1,3c添加到列表中,但它并没有改变任何内容,而且我没有其他任何关于如何处理它的线索。

看看我是怎么做到的:

poedit sources keywords

2 个答案:

答案 0 :(得分:1)

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

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

单个文件中混合和匹配域不是如何使用gettext的,除了使用自己的帮助函数之外,没有合理的解决方案来处理它,例如:通过将所有woocommerce文本包装到__woo(显然必须定义)和将其添加到Poedit中的关键字列表中。

答案 1 :(得分:1)

最好的解决方案是,如果gettext或Poedit能够将翻译限制到某个域。作为瓦茨拉夫points out,这是不可能的。

解决方法可能是对my-text-domain.pot或* .po文件进行后期处理,并删除实际来自其他插件的所有字符串,例如woocommerce:

#!/bin/bash

# DRY_RUN="echo"
DRY_RUN=""
MY_DOMAIN="my-text-domain"

for PO in *.po; do
  echo "Removing other domains from file: $PO"
  # OTHER_DOMAINS are all the domain that are not MY_DOMAIN
  OTHER_DOMAINS=`grep "# @ " $PO  | grep -v $MY_DOMAIN | sort | uniq | grep -o '\w*'`
  for OTHER_DOMAIN in $OTHER_DOMAINS; do
    echo "  Removing ${OTHER_DOMAIN}..."
    # Replace ever "foreign" strings with a linebreak
    # Begins with "# @ OTHER_DOMAIN" and ends with an empty line
    $DRY_RUN perl -0777 -i -pe "s/# @ ${OTHER_DOMAIN}\n.+?\n\n//smg" $PO
  done
done