如何.po
使用带有 PHP 文件的 xgettext 以递归方式编译文件?
我的 PHP 文件存在于层次结构中,直接xgettext
命令似乎没有递归挖掘。
知道了:
find . -iname "*.php" | xargs xgettext
我之前尝试过使用-exec
,但一次只能运行一个文件。这会在一堆上运行它们。
耶谷歌!
对于 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
您无法通过一个命令来实现这一点。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
with--exec
效率非常低,因为它会xgettext -j
为每个源文件调用一次以搜索可翻译的字符串。在特定情况下,xgettext -j
它的效率甚至更低,因为 xgettext 必须在messages.po
每次调用时读取不断增长的现有输出文件(即每个输入源文件)。
这是适用于 Windows 的解决方案。首先,安装 gettext 并从 GnuWin32 工具集中找到。
之后您可以运行以下命令:
find /source/directory -iname "*.php" -exec xgettext -j -o /output/directory/messages.pot {} ;
输出文件必须在运行命令之前存在,因此可以将新定义与其合并。
这是我在 Mac 上找到的递归搜索解决方案:
xgettext -o translations/messages.pot --keyword=gettext `find . -name "*.php"`
在扩展名为 php 的文件(包括子文件夹)中为方法 gettext 的所有用途生成条目,并将它们插入到 translations/messages.pot 中。