Рекультивирующий xgettext?

Как я могу скомпилировать файл .po с помощью xgettext с файлами PHP с помощью одной команды рекурсивно?

Мои PHP-файлы существуют в иерархии, и прямая команда xgettext , похоже, не рекурсивно выкапывает.

    Понял:

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

    Я пытался использовать -exec раньше, но это будет запускать только один файл за раз. Это запускает их на связке.

    Yay Google!

    Для командной строки WINDOWS решение simpe:

      @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 

    Вот решение для 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"` 

    Создает записи для всех видов использования метода gettext в файлах с расширением php, включая подпапки и вставляет их в translations / messages.pot.

    Вы не можете добиться этого с помощью одной команды. Опция --files-from это ваш друг.

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

    Если вы xargs что у вас слишком много исходных файлов, вы также можете использовать 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 с каждым вызовом (то есть с каждым исходным исходным файлом).