递归xgettext?

时间:2009-12-08 02:32:22

标签: php gettext xgettext

如何使用xgettext与PHP文件一起使用单个命令递归编译.po文件?

我的PHP文件存在于层次结构中,并且直接xgettext命令似乎没有递归地挖掘。

5 个答案:

答案 0 :(得分:18)

知道了:

find . -iname "*.php" | xargs xgettext

我之前尝试使用-exec,但这样一次只能运行一个文件。这将在一堆上运行它们。

耶和华!

答案 1 :(得分:6)

对于WINDOWS命令行,一个简单的解决方案是:

 @echo off
echo Generating file list..
dir html\wp-content\themes\wpt\*.php /L /B /S > %TEMP%\listfile.txt
echo Generating .POT file...
xgettext -k_e -k__ --from-code utf-8  -o html\wp-content\themes\wpt\lang\wpt.pot -L PHP --no-wrap -D html\wp-content\themes\wpt -f %TEMP%\listfile.txt
echo Done.
del %TEMP%\listfile.txt

答案 2 :(得分:0)

这是Windows的解决方案。首先,安装gettext并从GnuWin32工具集中查找。

之后您可以运行以下命令:

find /source/directory -iname "*.php" -exec xgettext -j -o /output/directory/messages.pot {} ;

输出文件必须在运行命令之前存在,因此新定义可以与它合并。

答案 3 :(得分:0)

这是我在Mac上进行递归搜索的解决方案:

xgettext -o translations/messages.pot --keyword=gettext `find . -name "*.php"`

为扩展名为php的文件中的方法gettext的所有用法生成条目,包括子文件夹并将它们插入到translations / messages.pot中。

答案 4 :(得分:0)

使用一个命令无法实现此目的。 xgettext选项--files-from是您的朋友。

find . -name '*.php' >POTFILES
xgettext --files-from=POTFILES

如果您肯定没有太多源文件,那么您也可以find使用xargs

find . -name "*.php" -print0 | xargs -0 xgettext

但是,如果您有太多源文件,xargs将多次调用xgettext,以便不超过您平台的最大命令行长度。为了保护自己免受这种情况的影响,你必须使用xgettext选项-j--join-existing,首先删除陈旧的消息文件,然后从空文件开始,以便xgettext不会挽救:

rm -f messages.po
echo >messages.po
find . -name "*.php" -print0 | xargs -0 xgettext --join-existing

将其与首先给出POTFILES中的源文件列表的简单解决方案进行比较!

find--exec一起使用是非常低效的,因为它会为每个源文件调用xgettext -j一次以搜索可翻译的字符串。在xgettext -j的特定情况下,它的效率更低,因为xgettext必须在每次调用时读取不断增长的现有输出文件messages.po(即每个输入源文件)。