Können Sie ES6-Template-Strings zu normalen Strings "dummen"?

8

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)

%Vor%

Irgendeine bessere und sauberere Idee kommt mir in den Sinn?

    
domokun 19.01.2016, 16:34
quelle

2 Antworten

6

Gute Frage. Es gibt vier Lösungen, die einem einfallen:

1. Brute-Force

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.

2. Fix 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

schreiben %Vor%

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.

3. Verwenden eines Parsers

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 .

4. Unerwartete Hacks

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 :

%Vor%

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:

%Vor%

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.

    
user663031 19.01.2016, 17:43
quelle
0

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%     
AlexMost 31.01.2017 16:38
quelle