使用POEdit——仅在特定域中搜索字符串

9

我创建了一个WordPress主题,希望进行翻译。

在我的主题中,我使用了一些来自woocommerce的翻译(例如:<?php _('Your cart', 'woocommerce'); ?>)。

这些来自woocommerce的字符串,我不想重新翻译,因为它们已经被翻译过了。但是当我使用poedit扫描我的主题时,它会找到所有文本域。

所以我的问题是:

我怎样告诉POEdit只捕获特定文本域中的字符串?

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

我找到了这个答案:

然而,对我来说似乎并没有起作用。我按照说明将ri:1,3c添加到列表中,但它没有改变任何内容,我也不知道该怎么办。

看看我是怎么做的:

poedit sources keywords


你真的完全没有理解你链接的那个答案(和问题)吗?ri:1,3c不是什么神奇的调用,它只是针对名为ri的特定函数使用的。 - Václav Slavík
3
那个链接的回答非常错误,它混淆了“域”和“上下文”这两个完全不同的东西,正如Andy在那里所说的那样。 - Václav Slavík
2个回答

3

GNU gettext工具和使用它们的Poedit都不支持gettext的这种特定误用。

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

混合和匹配域在一个单独的文件中并不是gettext的预期使用方式,除了使用自己的辅助函数,例如将所有的woocommerce文本包装成__woo(显然必须定义)并且将其添加到Poedit的关键字列表中,没有其他合理的解决方案来处理它。


这真的很有趣,但同时也非常令人失望...那么在WordPress中为什么还要使用文本域呢? - GDY
@GDY 因为你的WordPress实例通常同时运行多个包,即(WP本身、主题和所有插件),你不希望它们的翻译发生冲突。这就是域的作用。 - Václav Slavík

2

最好的解决方案是 gettext 或 Poedit 能够将翻译限制在特定的域内。正如 Václav 指出 的那样,这是不可能的。

一种解决方法可能是对 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接