2009-12-08 5 views
8

Comment compiler un fichier .po en utilisant xgettext avec des fichiers PHP avec une seule commande de manière récursive?Xgettext récusive?

Mes fichiers PHP existent dans une hiérarchie, et la commande directe xgettext ne semble pas déterrer récursivement.

Répondre

17

Got it:

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

Je tentais d'utiliser -exec avant, mais cela ne fonctionnera qu'un seul fichier à la fois. Cela les dirige sur le tas.

Yay Google!

+0

Eh bien ça ne marche pas pour moi, mais vous m'avez montré un moyen de possibilité sinon serait accepté et vivre avec lui comme s'il n'y avait pas de meilleure façon que cela –

+0

Salut, Beau travail, mais becarefull d'ajouter -j à la fin de la commande, sauf si cela ne marche pas – Ata

+2

Ceci est faux, car s'il y a trop de fichiers pour tenir sur une ligne de commande, xargs exécutera xgettext plusieurs fois, provoquant les invocations précédentes à être clobées. Il ne suffit pas non plus d'ajouter -j, car vous devez d'abord supprimer le fichier ou vous joindre aux anciennes données. –

0

Voici une solution pour Windows. Dans un premier temps, installez gettext et trouvez dans la collection d'outils GnuWin32.

Vous pouvez exécuter la commande suivante après:

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

Le fichier de sortie doit exister avant l'exécution de la commande, de sorte que les nouvelles définitions peuvent être fusionnées avec elle.

+0

Peut-être installer et utiliser Cygwin? Je sais que ce n'est pas une solution native, mais devrait vous obtenir le même résultat. – neezer

6

Pour la ligne de commande WINDOWS une solution simpe est:

@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

Avertissement au cas où: 'pygettext.py' ne supporte pas l'option' -f'. – Morwenn

0

Ceci est la solution que je trouve pour la recherche récursive sur Mac:

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

Génère entrées pour toutes les utilisations de méthode gettext dans des fichiers dont l'extension est php, y compris les sous-dossiers et les insère dans translations/messages.pot.

+2

Laissez un petit texte descriptif –

0

Vous ne pouvez pas réaliser cela avec une seule commande. L'option xgettext --files-from est votre ami.

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

Si vous êtes certain que vous n'avez pas trop de fichiers source, vous pouvez également utiliser find avec xargs:

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

Cependant, si vous avez trop de fichiers source, xargs appellerez xgettext multiples fois afin que la longueur maximale de la ligne de commande de votre plate-forme ne soit pas dépassée. Afin de vous protéger contre ce cas, vous devez utiliser l'option xgettext -j, --join-existing, supprimez le fichier des messages obsolètes d'abord, et commencer par un vide de sorte que xgettext ne sous caution pas:

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

Comparez cela avec la solution simple donnée d'abord avec la liste des fichiers source dans POTFILES!

L'utilisation de find avec --exec est très inefficace car elle appellera xgettext -j une fois pour chaque fichier source pour rechercher des chaînes traduisibles.Dans le cas particulier de xgettext -j, il est encore plus inefficace car xgettext doit lire le fichier de sortie existant toujours croissant messages.po à chaque invocation (c'est-à-dire avec chaque fichier source d'entrée).