2009-12-08 9 views
8

¿Cómo puedo compilar un archivo .po usando xgettext con archivos PHP con un solo comando de forma recursiva?xgettext Recusive?

Mis archivos PHP existen en una jerarquía, y el comando xgettext directo no parece cavar de forma recursiva.

Respuesta

17

¡Gracias:

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

yo estaba tratando de utilizar -exec antes, pero que sólo correría un archivo a la vez. Esto los ejecuta en el grupo.

Yay Google!

+0

Bueno, no funciona para mí, pero me mostró una forma de posibilidad de lo contrario sería aceptada y viviría con ella como si no hubiera mejor manera de que este –

+0

Hola, buen trabajo, pero se preocupó por agregar -j al final de el comando, a menos que no funcione – Ata

+2

Esto es incorrecto, porque si hay demasiados archivos para caber en una línea de comandos, xargs ejecutará xgettext varias veces, provocando que las invocaciones anteriores sean destruidas. Solo agregar -j tampoco es correcto, ya que primero debe eliminar el archivo o se unirá a los datos anteriores. –

0

Aquí hay una solución para Windows. Al principio, instale gettext y find desde la colección de herramientas GnuWin32.

Puede ejecutar el siguiente comando después:

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

El archivo de salida tiene que existir antes de ejecutando el comando, para que las nuevas definiciones puedan fusionarse con él.

+0

¿Quizás instalando y usando Cygwin? Sé que no es una solución nativa, pero debería obtener el mismo resultado. – neezer

6

Para la línea de comandos de Windows una solución simpe es:

@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

Algunas advertencias por si acaso: 'pygettext.py' no admite la opción' -f'. – Morwenn

0

Esta es la solución que encontré para la búsqueda recursiva en Mac:

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

Genera entradas para todos los usos de gettext método en archivos cuyos la extensión es php, incluidas las subcarpetas y las inserta en translations/messages.pot.

+2

Deje un pequeño texto descriptivo –

0

No puede lograr esto con un solo comando. La opción xgettext --files-from es tu amiga.

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

Si está seguro de que usted no tiene demasiados archivos de origen también se puede utilizar find con xargs:

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

Sin embargo, si usted tiene demasiados archivos de origen, xargs invocará xgettext múltiple veces para que no se exceda la longitud máxima de línea de comando de su plataforma. Con el fin de protegerse contra ese caso, usted tiene que utilizar la opción xgettext -j, --join-existing, eliminar archivo en primer lugar los mensajes obsoletos, y comenzar con una vacía para que xgettext no rescata a:

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

compararlo con la solución simple dada primero con la lista de archivos fuente en POTFILES!

Usar find con --exec es muy ineficiente porque invocará xgettext -j una vez por cada archivo fuente para buscar cadenas traducibles.En el caso particular de xgettext -j, es incluso más ineficiente porque xgettext tiene que leer el archivo de salida existentecon cada invocación (es decir, con cada archivo fuente de entrada).