Wie bekomme ich übersetzte Zeichenfolgen in Drupal.locale.strings?

9

Daher versuche ich, die Funktion Drupal.t () in einigen meiner benutzerdefinierten Javascript-Codes (in meinem Design) zu verwenden.

Wie erhalte ich die benötigten Zeichenfolgen im Objekt Drupal.locale.strings? Ich sehe dort einige Zeichenfolgen, aber natürlich kann nicht die gesamte Datenbank geladen werden. Was ist der beste Weg, um es hinzuzufügen? Ich möchte die PHP t () -Funktion verwenden, damit die hinzugefügten Zeichenfolgen in der Übersetzungsoberfläche bearbeitet werden können.

JonMcL
quelle

Antworten:

8

Drupal behandelt das Auffüllen der erforderlichen Zeichenfolgen in das Javascript-Objekt. Ähnlich wie die gesamte Sammlung von Zeichenfolgen nicht auf jeder Seite geladen wird, werden dem JavaScript nur die erforderlichen Zeichenfolgen hinzugefügt.

Ich glaube, dies geschieht durch Durchlaufen der Skriptdateien, bevor sie tatsächlich zur Seite hinzugefügt werden.

Wenn Sie also Drupal.t('Some string');Ihrem JavaScript-Code hinzufügen , sollten Sie diesen in der Übersetzungsoberfläche übersetzen können.

googletorp
quelle
Na dann passiert es nicht. (das Durchlaufen des Skripts zum Auffinden der Drupal.t () -Aufrufe). Ich füge das Skript über die .info-Datei des Themas hinzu (scripts [] = scripts / script.js). Vielleicht muss ich über drupal_add_js () hinzufügen?
JonMcL
Du hast Recht. Ich musste nachverfolgen, um ein umfassendes Verständnis zu erlangen, aber es geschieht tatsächlich automatisch. In Drupal 7 lautet die Funktion locale_js_alter () (in locale.module). Es verwendet die vollständige Liste der Javascript-Dateien und analysiert jede in _locale_parse_js_file (). Stellen Sie sicher, dass file_get_contents () Ihre JS-Datei mit dem angegebenen Pfad laden kann (dh beginnen Sie Ihren Pfad nicht mit einem /, wenn er sich in Ihrem Themenordner befindet). Sie können drupal_add_js oder die Einstellung scripts [] in der .info-Datei Ihres Themas verwenden. Stellen Sie natürlich sicher, dass Sie die Caches löschen und die Zeichenfolge übersetzen! :)
JonMcL
6

Ich bin heute auf dasselbe Problem gestoßen und habe es ein bisschen genauer untersucht. Chris oben hat einen guten Kommentar, aber er ist letztendlich falsch. Sie müssen Drupal.behaviors nicht verwenden, damit es funktioniert.

Wie JonMcL selbst in seinem letzten Kommentar bemerkt hat, ist die Funktion _locale_parse_js_file in locale.inc für das Parsen von Drupal.t-Mustern ("somestring") ab Zeile 1493 (in Drupal 7.22) verantwortlich:

preg_match_all('~
[^\w]Drupal\s*\.\s*t\s*                       # match "Drupal.t" with whitespace
\(\s*                                         # match "(" argument list start
(' . LOCALE_JS_STRING . ')\s*                 # capture string argument
(?:,\s*' . LOCALE_JS_OBJECT . '\s*            # optionally capture str args
  (?:,\s*' . LOCALE_JS_OBJECT_CONTEXT . '\s*) # optionally capture context
?)?                                           # close optional args
[,\)]                                         # match ")" or "," to finish
~sx', $file, $t_matches);

Es ist nur eine "dumme" Analysefunktion, die sich nicht um die Semantik kümmert und einfach alle Instanzen von Drupal.t ("etwas") in jeder empfangenen Datei findet.

Ein häufiges Problem könnte sein, dass Sie die gesamte Zeichenfolge in Ihrem Quellcode im Formular Drupal.t ("translateme") haben müssen, da (offensichtlich) kein Javascript ausgeführt wird, wenn die Datei über file_get_contents in PHP geöffnet wird. Das bedeutet, dass Sie niemals Drupal.t (eine Variable) ausführen können und hoffen, dass Drupal alle Zeichenfolgen enthaltenden Javascript-Variablen abfängt, die Sie auf Drupal.t werfen.

Wenn Sie "Frauen" für ein Diagramm übersetzen und der Zeichenfolge einen Kontext geben möchten, lautet die Syntax:

Drupal.t("women", {}, {context: "charts"}

Wenn Sie drush installiert haben, überprüfen Sie außerdem, ob Ihre js-Datei mit dem Befehl analysiert wurde.

drush vget javascript_parsed

Dann können Sie Ihren Cache mit bereinigen

drush cc all

... und wiederholen Sie den obigen Befehl vget, um sicherzustellen, dass die Liste der bereits analysierten Dateien leer ist. Auf diese Weise wird Ihre Datei beim nächsten Lauf repariert (überprüfen Sie dies auch).

user19814
quelle
1
Danke für drush vget javascript_parsed! Eine schnellere Möglichkeit, die Neuerstellung von Übersetzungsskriptdateien zu erzwingen, besteht darin, CSS- und JS-Dateien mit zu entfernen drush @sitealias cc css-js.
lmeurs
0

Einige Fallstricke, auf die ich bei der Implementierung von mehrsprachigem JS in Drupal 7 gestoßen bin:

  1. Stellen Sie zunächst sicher, dass Ihre JS-Datei nicht inline enthalten ist . Ab Drupal 7.22 Drupal.locale.stringsscheint es sich nicht automatisch zu aktualisieren, wenn Sie JavaScript-Dateien in Drupal einbinden . Die Übersetzungsoberfläche hat den String trotzdem aufgenommen, was zu meiner Verwirrung beigetragen hat.

  2. Stellen Sie zweitens sicher, dass Sie Drupal.behaviors verwenden , um Ihre JS an die Seite anzuhängen. Regelmäßige JS-Schließungen lösen nicht Drupals "magische" Analyse von Drupal.t()Aufrufen aus. Das ist technisch etwas, was du sowieso tun solltest;)

Von dort ist es wirklich ziemlich schmerzlos. Verwenden Drupal.t()Sie einfach den zu übersetzenden Text, leeren Sie den Cache jedes Mal, wenn Sie die Datei aktualisieren, und Ihre Übersetzer sollten die neue Zeichenfolge in der Benutzeroberfläche unter sehen /admin/config/regional/translate/translate. Es ist ganz nett, wenn Sie es zum Laufen bringen.

Chris Ruppel
quelle