Ich muss die Begrenzung von gettext
umgehen, um ES6-Template-Strings zu erkennen, und dachte darüber nach, den "nicht interpolierten Wert" der Template-Strings als Kompilierungsschritt zu bekommen, um nur "normale" Strings zu haben der Code.
Was ich am liebsten erreichen möchte, ist das zu transformieren
%Vor%in diese
%Vor% Eine brutale Art, dies zu erreichen, ist sed
, aber es ist sicherlich nicht die elegantere (und wahrscheinlich auch fehleranfällige)
Irgendeine bessere und sauberere Idee kommt mir in den Sinn?
Gute Frage. Es gibt vier Lösungen, die einem einfallen:
Ein Brute-Force-Ersatz von Backticks mit Anführungszeichen vor dem Scannen nach übersetzbaren Strings, wie Sie es vorgeschlagen haben, ist keine schreckliche Idee, solange Sie die Risiken verstehen. Betrachten Sie zum Beispiel:
%Vor%Ein weiterer Randfall ist
%Vor%Bei diesem Ansatz werden auch mehrzeilige Vorlagenzeichenfolgen unterbrochen.
xgettext
Natürlich besteht die "richtige" Lösung darin, eine Verzweigung von xgettext
zu schreiben, die sich mit Template-Strings beschäftigt. Dann könntest du einfach
Leider könnte das schwieriger sein, als es scheint. Es gibt eine Menge festverdrahteter Logik in xgettext, die mit Strings verbunden ist. Wenn Sie dieses Projekt unternehmen würden, würden viele Ihnen danken.
Die robustere Alternative ist die Verwendung eines JavaScript-Parsers wie Esprima. Diese Parser bieten die Möglichkeit, Token (z. B. Vorlagenzeichenfolgen) aufzunehmen. Wie Sie in Ссылка sehen können, ist der relevante Tokentyp, nach dem gesucht werden soll, TemplateLiteral
.
Eine andere (schlechte?) Idee besteht darin, Template-Strings als reguläre Strings zu schreiben und sie dann zur Laufzeit als Template-Strings zu behandeln. Wir definieren eine Funktion eval_template
:
eval_template
konvertiert eine Zeichenfolge in eine ausgewertete Vorlage. Jede Variable im lokalen Bereich, die in der Vorlagenzeichenfolge verwendet wird, muss eval_template
als Teil des im zweiten Parameter übergebenen Objekts bereitgestellt werden (da Funktionen, die mit Function
erstellt wurden, im globalen Gültigkeitsbereich liegen und nicht auf lokale Variablen zugreifen können um sie zu übergeben). Es ist wie folgt implementiert:
Zugegeben, das ist ein bisschen peinlich. Der einzige Vorteil dieses Ansatzes besteht darin, dass kein Pre-Scan-Neuschreiben erforderlich ist.
Kleiner Punkt, aber wenn der ursprüngliche Vorlagenstring mehrzeilig ist, können Sie ihn nicht direkt als reguläre Zeichenfolge umschreiben. In diesem Fall können Sie es als eine mit einem Häkchen versehene Vorlagen-Zeichenfolge belassen, aber die $
als $
auslassen, und alles wird gut:
Bottom line: Wenn du xgettext
nicht umschreiben willst, benutze einen Parser oder beteilige dich an einem anderen Hacker, mach den Brute-Force-Ersatz.
Momentan arbeite ich an einer Lokalisierungslösung, die auf es6 Vorlagenliteralen basiert. Sie können es hier auschecken - Ссылка . Dieses Projekt verfügt über Extraktionsfunktionen (basierend auf dem babel-Plugin). Außerdem können Sie damit lokalisierte js erstellen. So sieht es aus:
%Vor%Tags und Links javascript localization ecmascript-6 gettext template-strings