How can I compile a .po
file using xgettext with PHP files with a single command recursively?
My PHP files exist in a hierarchy, and the straight xget
Here's a solution for Windows. At first, install gettext and find from the GnuWin32 tools collection.
You can run the following command afterwards:
find /source/directory -iname "*.php" -exec xgettext -j -o /output/directory/messages.pot {} ;
The output file has to exist prior to running the command, so the new definitions can be merged with it.
You cannot achieve this with one single command. The xgettext option --files-from
is your friend.
find . -name '*.php' >POTFILES
xgettext --files-from=POTFILES
If you are positive that you do not have too many source files you can also use find
with xargs
:
find . -name "*.php" -print0 | xargs -0 xgettext
However, if you have too many source files, xargs
will invoke xgettext
multiple times so that the maximum command-line length of your platform is not exceeded. In order to protect yourself against that case you have to use the xgettext option -j
, --join-existing
, remove the stale messages file first, and start with an empty one so that xgettext does not bail out:
rm -f messages.po
echo >messages.po
find . -name "*.php" -print0 | xargs -0 xgettext --join-existing
Compare that with the simple solution given first with the list of source files in POTFILES
!
Using find
with --exec
is very inefficient because it will invoke xgettext -j
once for every source file to search for translatable strings. In the particular case of xgettext -j
it is even more inefficient because xgettext has to read the evergrowing existing output file messages.po
with every invocation (that is with every input source file).
Got it:
find . -iname "*.php" | xargs xgettext
I was trying to use -exec
before, but that would only run one file at a time. This runs them on the bunch.
Yay Google!
For WINDOWS command line a simpe solution is:
@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
This is the solution I found for recursive search on Mac:
xgettext -o translations/messages.pot --keyword=gettext `find . -name "*.php"`
Generates entries for all uses of method gettext in files whose extension is php, including subfolders and inserts them in translations/messages.pot .