5 Stimmen

Extrahieren von gettext-Übersetzungen aus der PHP-Heredoc-Syntax?

Ich verwende die gettext-Funktionen von PHP zur Lokalisierung. Ich benutze Poedit, um die eigentliche Übersetzung vorzunehmen, und mit seiner Funktion "Update from sources" ist es wirklich einfach, alle Strings zu extrahieren, die übersetzt werden müssen - außerhalb der heredoc-Syntax.

Poedit verwendet das xgettext-Programm, um die .po-Dateien aus den PHP-Quellcodedateien zu generieren. Und es funktioniert wunderbar, wenn der PHP-Code so aussieht:

echo "". _("test") ."";

Aber das Folgende wird nicht extrahiert (Beachten Sie, dass ein Pseudo-t-Objekt verwendet werden muss):

echo <<{$->_('test')}
EOD;

In PHP-Code könnten Sie das Problem auf folgende Weise umgehen:

$t
EOD
?>

Aber ich würde wirklich bevorzugen, dass das xgettext-Programm den String aus dem heredoc-Block extrahieren könnte.

Ein Workaround wurde in den Kommentaren der PHP-Dokumentation vorgeschlagen. Der Workaround besteht darin, dem xgettext-Programm mitzuteilen, dass es die PHP-Quelldateien als Python-Code behandeln soll. Aber bei der Verwendung dieses Ansatzes in Poedit erhalte ich viele Syntaxfehler vom xgettext-Parser.

Weiß jemand einen Workaround, um xgettext dazu zu bringen, die Übersetzungen aus der PHP-heredoc-Syntax zu extrahieren?

Ein etwas verwandter Ticket wurde im Ticket-System des gettext-Projekts eröffnet: http://savannah.gnu.org/bugs/?27740 Dies deutet darauf hin, dass die Unterstützung für die heredoc-Syntax verbessert werden könnte?

0 Stimmen

Ich habe speziell für dies ein Ticket erstellt: savannah.gnu.org/bugs/index.php?35944 Ich hoffe, es kommen keine weiteren Puristen, die Workarounds geben möchten. Es ist einfach ärgerlich, dass dies nicht unterstützt wird.

4voto

Ich bin der Berichterstatter des gettext-Tickets, auf das Sie sich in Ihrem Beitrag beziehen. Als ich das Ticket eingereicht habe, hatte ich etwas ganz anderes im Sinn, etwas entlang dieser Linien:

Gettext kann Texte aus solchen heredoc/nowdoc-Strings nicht extrahieren, aber das könnte wirklich nützlich sein, wenn es darum geht, große Textabschnitte zu übersetzen.

In meinem Fall verwende ich gettext in einem CLI-PHP-Skript, um Textabschnitte zu übersetzen, die XML-Markup enthalten. Dieses Markup gehört zum Originaltext und muss ebenfalls übersetzt werden. Jedes Anführungszeichen oder Apostroph im Markup manuell zu escapen, macht die Nachrichten in POedit oder jedem anderen Editor ziemlich schwer lesbar.

In Ihrem Fall scheint es, als würden Sie interpolierten Code in (heredoc/nowdoc)-Strings extrahieren wollen. Sie können dieses Problem leicht umgehen, indem Sie den Text vor der eigentlichen Interpolation vorbereiten:

$t
EOD
?>

Ich glaube nicht, dass dies als Bug betrachtet werden sollte, weil das genaue Äquivalent zum von Ihnen geposteten Code unter Verwendung der heredoc-Syntax wäre:

{$t->_('test')}";
?>

von dem auch gettext die Nachricht "test" nicht extrahieren kann.

0 Stimmen

Vielen Dank für die Antwort! Ups - anscheinend habe ich das gettext-Ticket nicht gründlich genug gelesen. Denn was ich möchte ist - irgendwie - das Gegenteil: das Markup aus extrahierten Strings in Poedit entfernen. Ich war auf dem Weg, den Sie vorschlagen; indem ich den Text außerhalb vor der Interpolation vorbereite. Aber ich sehe das immer noch als Workaround, es wäre wirklich nützlich, Text aus der heredoc-Syntax zu extrahieren (meiner Meinung nach).

0 Stimmen

"Du kannst problemlos umgehen" Uhh, wenn man Heredoc verwendet (wie ich), ist der Inhalt riesig! Das ist ein Bug-Feature. Es sollte behoben werden.

0 Stimmen

Bitte beachten Sie, dass in PHP 7.3 mit heredoc, das nicht am Anfang der Zeile ausgerichtet ist, das folgende _() nach dem heredoc-Block nicht von xgettext extrahiert wird (ich denke, es könnte ein Fehler in gettext sein).

0voto

Stas Trefilov Punkte 173

Als Befürworter von Gettext seit Jahren fällt es schwer, nicht zu bemerken, dass dieses Ticket jetzt 13 Jahre alt ist und anscheinend das Gettext-Projekt die Situation nicht als Bug oder auf irgendeine Weise kritisch ansieht.

Das Problem selbst besteht darin, dass der xgettext-Extraktor die Heredoc/Nowdoc-PHP-Syntax nicht als gültig behandelt, insbesondere die eingerückte Variante, die seit 7.3 verfügbar ist.

Um den Gettext-Workflow und insbesondere POedit weiterhin nutzen zu können, haben wir eine Bibliothek entwickelt, die die Übersetzungsextraktion (über POT-Dateien) ermöglicht, verfügbar unter https://github.com/vertilia/text oder als Composer-Anforderung:

composer require vertilia/text

Dies kann anderen Entwicklern helfen, dem Gettext-Weg treu zu bleiben.

Haftungsausschluss: Ich bin ein Entwickler von vertilia/text.

0 Stimmen

$translation = <<

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X