Pergunta
Como posso compilar um .po
Arquivo usando XGetText com arquivos PHP com um único comando recursivamente?
Meus arquivos PHP existem em uma hierarquia e o reto xgettext
O comando não parece cavar recursivamente.
Solução
Entendi:
find . -iname "*.php" | xargs xgettext
Eu estava tentando usar -exec
Antes, mas isso executaria apenas um arquivo por vez. Isso os executa no grupo.
Yay Google!
Outras dicas
Para a linha de comando do Windows, uma solução 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
Aqui está uma solução para o Windows. No início, instale o GetText e encontre na coleção GNUWIN32 Tools.
- http://gnuwin32.sourceforge.net/packages/getText.htm
- gnuwin32.sourceforge.net/packages/findutils.htm
Você pode executar o seguinte comando depois:
find /source/directory -iname "*.php" -exec xgettext -j -o /output/directory/messages.pot {} ;
O arquivo de saída deve existir antes da execução do comando, para que as novas definições possam ser mescladas com ele.
Esta é a solução que encontrei para pesquisa recursiva no Mac:
xgettext -o translations/messages.pot --keyword=gettext `find . -name "*.php"`
Gera entradas para todos os usos do método getText em arquivos cuja extensão é PHP, incluindo subpastas e insere -os em traduções/mensagens.pot.
Você não pode conseguir isso com um único comando. A opção XGETTEXT --files-from
é seu amigo.
find . -name '*.php' >POTFILES
xgettext --files-from=POTFILES
Se você tem certeza de que não tem muitos arquivos de origem, também pode usar find
com xargs
:
find . -name "*.php" -print0 | xargs -0 xgettext
No entanto, se você tiver muitos arquivos de origem, xargs
irá invocar xgettext
várias vezes para que o comprimento máximo da linha de comando da sua plataforma não seja excedido. Para se proteger contra esse caso, você deve usar a opção XGetText -j
, --join-existing
, remova o arquivo de mensagens obsoletas primeiro e comece com um vazio para que o XGetText não resgate:
rm -f messages.po
echo >messages.po
find . -name "*.php" -print0 | xargs -0 xgettext --join-existing
Compare isso com a solução simples fornecida primeiro com a lista de arquivos de origem em POTFILES
!
Usando find
com --exec
é muito ineficiente porque invocará xgettext -j
uma vez para cada arquivo de origem pesquisar strings traduzíveis. No caso particular de xgettext -j
É ainda mais ineficiente porque o XGetText precisa ler o eterno arquivo de saída existente messages.po
com cada invocação (ou seja, com cada arquivo de origem de entrada).