2009-12-08 8 views
8

Come posso compilare un file .po usando xgettext con file PHP con un singolo comando in modo ricorsivo?Recusive xgettext?

I file PHP sono presenti in una gerarchia e il comando diretto xgettext non sembra scorrere in modo ricorsivo.

risposta

17

capito:

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

stavo cercando di usare -exec prima, ma che avrebbe eseguito un solo file alla volta. Questo li gestisce sul gruppo.

Yay Google!

+0

beh non funziona per me, ma mi hai mostrato un modo per la possibilità altrimenti sarebbe accettato e vivere con esso come se non ci fosse modo migliore che questo –

+0

Ciao, buon lavoro, ma è necessario aggiungere -j alla fine di il comando, a meno che non funzioni – Ata

+2

Questo è sbagliato, perché se ci sono troppi file per adattarsi a una linea di comando, xargs eseguirà xgettext più volte, causando il bombardamento delle invocazioni precedenti. Anche l'aggiunta di -j non è corretta, poiché è necessario eliminare prima il file o ci si unirà ai vecchi dati. –

0

Ecco una soluzione per Windows. Inizialmente, installa gettext e trova dalla raccolta di strumenti di GnuWin32.

È possibile eseguire il seguente comando in seguito:

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

Il file di output deve esistere prima di eseguendo il comando, così le nuove definizioni possono essere unite con esso.

+0

Forse installando e usando Cygwin? So che non è una soluzione nativa, ma dovrebbe ottenere lo stesso risultato. – neezer

6

Per la linea di comando di Windows una soluzione 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 
+0

Alcuni avvertimenti nel caso in cui: 'pygettext.py' non supporta l'opzione' -f'. – Morwenn

0

Questa è la soluzione che ho trovato per la ricerca ricorsiva su Mac:

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

Genera voci per tutti gli usi di metodo gettext nel file i cui l'estensione è php, incluse le sottocartelle e le inserisce in translation/messages.pot.

+2

Lascia un piccolo testo descrittivo –

0

Non è possibile ottenere questo con un singolo comando. L'opzione xgettext --files-from è tua amica.

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

Se si è certi che non si dispone di troppi file sorgente è anche possibile utilizzare find con xargs:

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

Tuttavia, se si dispone di troppi file di origine, xargs sarà invocare xgettext multipla volte in modo che la lunghezza massima della riga di comando della piattaforma non venga superata. Al fine di proteggere se stessi contro questo caso è necessario utilizzare l'opzione xgettext -j, --join-existing, rimuovere il file prima i messaggi stantii, e iniziare con uno vuoto in modo che xgettext non bail out:

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

Confronti che, con la soluzione semplice fornita prima con l'elenco dei file sorgente in POTFILES!

L'utilizzo di find con --exec è molto inefficace perché invocherà xgettext -j una volta per ogni file sorgente per cercare stringhe traducibili.Nel caso particolare di xgettext -j è ancora più inefficiente perché xgettext deve leggere il file di output esistente sempre crescente messages.po con ogni chiamata (cioè con ogni file sorgente di input).