2009-12-08 3 views
8

Wie kann ich eine .po Datei mit Xgettext mit PHP-Dateien mit einem einzigen Befehl rekursiv kompilieren?Wiederkehrender xgettext?

Meine PHP-Dateien existieren in einer Hierarchie, und der gerade xgettext Befehl scheint nicht rekursiv zu graben.

Antwort

17

Verstanden:

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

ich versuche -exec vor, zu verwenden, aber das wäre nur eine Datei zu einem Zeitpunkt ausgeführt. Dies führt sie auf dem Haufen.

Yay Google!

+0

gut es funktioniert nicht für mich, aber Sie zeigten mir einen Weg für die Möglichkeit, sonst würde akzeptiert werden und damit leben, als ob es keinen besseren Weg gibt, dass diese –

+0

Hallo, Nette Arbeit, aber vorsichtig zu -J am Ende hinzufügen der Befehl, es sei denn, es funktioniert nicht – Ata

+2

Das ist falsch, weil, wenn es zu viele Dateien gibt, um auf eine Befehlszeile zu passen, xargs xgettext mehrere Male ausführen wird, wodurch die früheren Aufrufe verfälscht werden. Auch das Hinzufügen von -j ist nicht richtig, da Sie zuerst die Datei löschen müssen oder Sie sich den alten Daten anschließen. –

0

Hier ist eine Lösung für Windows. Installieren Sie zunächst gettext und suchen Sie in der GnuWin32 Tools-Sammlung.

Sie können anschließend den folgenden Befehl ausführen:

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

Die Ausgabedatei vor existieren muss Ausführen des Befehls, damit die neuen Definitionen mit ihm zusammengeführt werden können.

+0

Vielleicht Cygwin installieren und verwenden? Ich weiß, dass es keine native Lösung ist, aber Sie sollten das gleiche Ergebnis erzielen. – neezer

6

Für Windows-Befehlszeile ein simpe Lösung ist:

@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

Einige Warnung nur für den Fall: 'pygettext.py' unterstützt die Option' -f' nicht. – Morwenn

0

Dies ist die Lösung, die ich für rekursive Suche auf Mac gefunden:

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

Erzeugt Einträge für alle Anwendungen von Verfahren gettext in Dateien, deren Erweiterung ist PHP, einschließlich Unterordner und fügt sie in Übersetzungen/messages.pot.

+2

Hinterlassen Sie einen kleinen beschreibenden Text –

0

Sie können dies nicht mit einem einzigen Befehl erreichen. Die xgettext Option --files-from ist dein Freund.

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

Wenn Sie sicher sind, dass Sie nicht zu viele Quelldateien haben Sie auch find mit xargs verwenden können:

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

Wenn Sie jedoch zu viele Quelldateien haben, werden xargsxgettext mehrere aufrufen Zeiten, damit die maximale Befehlszeilenlänge Ihrer Plattform nicht überschritten wird. Um sich gegen diesen Fall zu schützen, haben Sie die xgettext Option verwenden -j, --join-existing, entfernen Sie die veralteten Nachrichten zuerst, Datei und mit einer leeren beginnen, damit xgettext schließt nicht aus der Patsche helfen:

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

Vergleichen Sie das mit die einfache Lösung zuerst mit der Liste der Quelldateien in POTFILES gegeben!

Die Verwendung von find mit --exec ist sehr ineffizient, da xgettext -j einmal für jede Quelldatei aufgerufen wird, um nach übersetzbaren Strings zu suchen.In dem speziellen Fall von xgettext -j ist es noch ineffizienter, weil xgettext die ständig wachsende Ausgabedatei messages.po mit jedem Aufruf lesen muss (das heißt mit jeder Eingabequelldatei).

Verwandte Themen