Ihre Anforderung:
Damit meine Website
als authentifizierter Benutzer in mehreren Sprachen funktioniert
ich in der Lage sein, alle Übersetzungsaufrufe, die in der Codebasis meiner Site gefunden wurden und die mit der Funktion t () ausgeführt wurden, auf einmal zu übersetzen.
Entspricht diese Anforderungsbeschreibung überhaupt dem, wonach Sie fragen?
Crawler
Wie jemand sagte - ein Crawler könnte theoretisch die gesamte Site durchsuchen , um die Registrierung aller t () -Aufrufe zu erzwingen. Aber 1) der Crawler weiß nicht, welche Seiten er crawlen soll; 2) Wir möchten daher keine Liste der zu durchsuchenden Seiten führen. 3) Wir möchten keinen Crawler verwenden, Punkt. Eww. Einfach, eww. Richtig?
Das Problem
- Wir haben keine Liste aller Übersetzungszeichenfolgen.
- Drupal / PHP ist eine dynamische Sprache im Gegensatz zu C, die kompiliert wird. So können wir beispielsweise nicht sagen: Kompilieren Sie diese gesamte Codebasis, suchen Sie alle Instanzen dieser Funktion
t()
, registrieren Sie diese Instanzen in der Datenbank und übersetzen Sie alle registrierten Instanzen vont()
auf einmal. Ich denke nicht, dass wir eine Option auf dem Tisch haben.
- Ein statisches Code-Analyse-Tool wäre aus demselben Grund hilflos, aus dem ein Crawler hilflos wäre. Ich habe das
t()
in dieser Datei gefunden. Groß! In welcher URL wird es verwendet? Was ist der Kontext?
Das Problem mit den aktuellen Tools (Drupal und einigen Contrib-Modulen) und mit den aktuellen Einschränkungen (unter Berufung auf Echtzeit-Themenaufrufe -> Vorlagendateien -> t()
Aufrufe) anzugehen, sieht hier wie eine Gasse ohne Ausgang aus. Wir müssen vielleicht ein bisschen über den Tellerrand schauen.
Was wir brauchen
- Wir brauchen eine Datenquelle, ein Modell, das mir sagt, welche aktuellen Übersetzungszeichenfolgen wir haben und in welchem Kontext sie stehen.
- Proaktives Datenmodell. Das aktuelle Datenmodell ist reaktiv (das Modell wird aktualisiert, wenn ein Aufruf
t()
erfolgt). Wir brauchen ein proaktives Datenmodell, nach dem die Anwendung suchtt()
Instanzen bevor sie tatsächlich vom Kunden ausgeführt werden.
- Wir brauchen Kontext.
t()
allein reicht nicht aus - weil - wir nicht wissen, dass wir 'foo' übersetzen, aber die Zielsprache, in die wir übersetzen, hängt von der URL ab, unter der das t()
vorkommt. Selbst wenn wir die Zielsprache beispielsweise t()
mithilfe eines Wrapper-Aufrufs fest in den Anruf codieren könnten , würde dies für Ihre Zwecke nicht funktionieren.
Ich habe einige der Tools identifiziert, die - wenn wir sie hätten - unserem Problem helfen würden. Mit diesen Werkzeugen könnten wir in das Datenmodell gehen und sagen: Gib mir alle eingewickelten Zeichenkettent()
, die noch nicht ausgefüllt wurden. Fügen Sie nun diese Übersetzungen ein. Vielen Dank.
Und wenn der Kunde das nächste Mal kommt, sind die Übersetzungen da.
Wie würden wir ... diese Werkzeuge bauen?
Einschränkungen
- Die Zielsprache kann nicht in der Vorlage enthalten sein, die von der URL festgelegt wird. Angenommen, die Zeichenfolge muss eine beliebige Sprache unterstützen.
- Die übersetzte Zeichenfolge darf nicht in der Vorlage enthalten sein. Die Übersetzung wird in einer Datenbank gespeichert.
Nachdem ich mir das Problem genauer überlegt und einige Herausforderungen und Einschränkungen herausgearbeitet habe, kann ich mir überlegen, welche Lösungen verfügbar sind oder welche benutzerdefinierten Lösungen ich erarbeiten möchte.
Lösungs-Brainstorming
Ich brauche etwas, das "alles" zusammenhält. Was ist mit ... einer Entität?
- Eine Entität kann das Produkt enthalten, das übersetzt werden muss.
- Entitäten können die Beziehung - den Leim - zwischen dem zu übersetzenden Produkt und seinem Kontext herstellen.
- Die Entität kann beispielsweise in einem Feld den Standard-URL-Speicherort des Produkts angeben.
- Tokens können verwendet werden, um alternative Standorte (Sprachen?) Anzugeben, auf denen das Produkt angezeigt wird.
- Entitäten bieten uns das proaktive Datenmodell, das wir benötigen, und dessen Kontext. Auf diese Weise können wir beispielsweise folgende Aufgaben ausführen: In die Datenbank gehen, alle Produktentitäten abrufen und, falls für die Felder X, Y und Z keine Übersetzungszeichenfolge vorhanden ist, diese Übersetzungszeichenfolgen erstellen.
Wenn der Kunde dann greift /pl/product/200
, machen Sie einen Ausflug in die Datenbank, suchen nach Produkt 200 und greifen auf die bereits vorhandene pl
Übersetzung zu. Sie haben auch ein Titel- und Beschriftungsfeld für dieses Produkt? Die Übersetzungen sollten auch dabei sein.
Beachten Sie, dass ich hier sehr vage und allgemein bin, was das Übersetzungsmodul betrifft, das Sie verwenden. Sie könnten sehr gut Ihr eigenes Übersetzungsmodul verwenden - höchstwahrscheinlich ist dies der Fall. Alle Übersetzungsmodelle, die ich bisher in Drupal gesehen habe (ab D7 hat sich D8 noch nicht angesehen), sind reaktiv und nicht proaktiv.
In einer Nussschale
Theoretisch sind die Werkzeuge vorhanden, mit denen Sie das erstellen können, was Sie benötigen. Entitäten sind die Schlüsselkomponente, die alles zusammenhält: - Daten (Übersetzungszeichenfolge), - Zielsprachen. Sie müssen sich nicht in der Entität selbst befinden, vorzugsweise in einem Taxonomie-Vokabular, beispielsweise für Produktsprachen. oder vielleicht auch eine generische Taxonomie für andere Entitäten. - Kontext. Die URL, unter der die Entität angezeigt wird. Die URL würde ein Token enthalten, und das Token würde wiederum auf die Taxonomie der Zielsprache verweisen.
Mit diesen drei Zutaten können Sie sagen: Ergreifen Sie alle product
Entitäten, gehen Sie zum URL alias
Feld, holen Sie sich das Taxonomietoken, durchlaufen Sie alle möglichen Begriffskombinationen, präsentieren Sie dem aktuellen Benutzer alle Kombinationen entweder in einer sehr großen hässlichen Form - oder mit AJAX - und Formulare mit mehreren Schritten (so ähnlich) und da der aktuell angemeldete Benutzer die verschiedenen Sprachen für Produkt 200 übersetzt, speichern Sie diese irgendwo in der Datenbank
Irgendwo in der Datenbank kann sich ein Feld für die Feld-API in der Entität, das zu jeder Entität gehörende Einstellungsfeld (nicht genau die Feld-API, aber es kann immer noch Daten enthalten) oder eine separate Tabelle befinden, die Sie dafür verwenden. Ich denke, das Speichern der Daten in der Entität würde sowohl den Code als auch die Daten übersichtlicher und einfacher machen.
Building It: Mögliche Lösungen
- D8MI (Drupal 8 Multilingual Initiative)
- Benutzerdefinierter Code: "Index" -Übersetzungen, die von t () in Vorlagen zur Verfügung gestellt werden, indem programmgesteuert verfügbare Bundles und ihre zugehörigen Theme-Hook-Implementierungen abgefragt und gerendert werden.
Pseudocode
Für jede Entität (vom Typ x),
Alle Sprachen suchen (Taxonomie oder Kernsprache des Produkts),
Die Entität
rendern ,
- um ihre t () - Übersetzungszeichenfolgen zu erkennen
- Calls theme () rendern, das die mehrsprachige Präsentationsebene von behandelt das Produkt, nicht das Produktdatenmodell selbst.
Ergebnis:
- Der erste Aufruf zum Rendern der Entitätsvorlage in jeder Sprache gibt die Standardsprachenimplementierung für jeden Aufruf zurück.
- Die t () - Parameter in der Vorlage werden jetzt in Drupal zwischengespeichert und können übersetzt werden (für jede Sprachinstanz, nicht für jede Produktinstanz).
- Benutzer mit der Rolle "Übersetzer" können jetzt die Übersetzungsoberfläche aufrufen und alle verfügbaren t () - Parameter für jede Sprache übersetzen.
- Der Websitebesitzer muss nicht darauf warten, dass Kunden die einzelnen Produktseiten besuchen, oder jede Produktseite manuell aufrufen, da dies programmgesteuert für ihn erfolgt ist.
Offene Fragen:
- Was ist der Kontext? Wenn ich für jedes "Produkt" -Entitätspaket einen programmgesteuerten Aufruf von theme () vornehme, zeichnet es dann den Ort auf, von dem aus der Aufruf erfolgte? Zeichnet es die URL des Knotens auf? Kann der „Kontext“ geändert werden? Wo wird der Kontext aufgezeichnet? Was passiert, wenn Sie "dynamische" Vorlagen haben - dh wenn Sie mehr als eine Vorlage pro Produkt haben und wie Sie vorgehen, um diese Variationen zu erkennen?
Wie immer eignet sich Theoretisieren und Pseudocode nur für Brainstorming. Aber in der Entwicklung werden wir kaum wissen, womit wir wirklich konfrontiert sind, bis wir mit dem Prototyping beginnen. Nachdem ich einige Einschränkungen, mögliche Lösungen und mögliche Probleme oder Fragen formuliert habe, kann ich nun einen Proof of Concept oder einen funktionierenden Prototyp implementieren. Einige der oben genannten offenen Fragen können nur auf diese Weise beantwortet werden. Sobald wir einen Prototyp erstellt haben (unabhängig von Erfolg oder Misserfolg), können wir beginnen, einige dieser Fragen zu beantworten - oder den Ansatz insgesamt zu ändern. Bleib dran ~
wget
oder was auch immer zu verwenden. Hackish, aber du hast gesagt, das war erlaubt (: