Ich habe ein paar Anrufe zu t()
in * .tpl.php-Dateien. Nehmen wir zum Beispiel an, ich spreche über Produkte und die Datei product.tpl.php.
Zeichenfolgen in Vorlagen werden erst bei der ersten Verwendung erkannt. Darüber gab es auf Drupal.org einen Thread , und ich fand ihn richtig. Wenn ich zum Beispiel http://example.com/pl/product/200 gehe , wird diese Zeichenfolge leider in einer {locales_source}
Tabelle gespeichert, deren location
Feld auf festgelegt ist /pl/product/200
.
Meine Benutzer müssen in der Lage sein, mit dem Übersetzungstool des Localization Client- Moduls vor Ort zu übersetzen, damit sie sehen können, was sie übersetzen, und es im richtigen Kontext haben. Wenn der Quellspeicherort auf festgelegt ist, /pl/product/200
ist das Produkt mit der ID 200 das einzige, auf dem die Zeichenfolge als zu übersetzend angezeigt wird. Und noch schlimmer, wenn ich Benutzer zwingen kann, für dieses bestimmte Produkt zu übersetzen, muss ich sie auch in die russische Sprache übersetzen können, und es gibt kein Produkt, dessen Standort auf festgelegt ist/ru/product/PID
.
Gibt es eine Möglichkeit, die Positionszeichenfolge in der Datenbank neu zu formatieren, um alle Zeichenfolgen in allen Produkten und allen Sprachen im Tool l10n_client sichtbar zu machen?
Ich habe versucht, es auf Folgendes einzustellen:
; sites/default/themes/mytheme/product.tpl.php
,sites/default/themes/mytheme/product.tpl.php
,sites/default/modules/mymodule/mymodule.module
(Modul, das thematische Daten generiert)
Aber es machte sie nur für das Übersetzungstool unsichtbar.
Ich bin mir ziemlich sicher, dass es kein Fehler im Lokalisierungs-Client ist. Es zeigt die Zeichenfolge, in der diese Zeichenfolge aufgetreten ist. Und es scheint, dass es auch für das Drupal 7-Übersetzungssystem "so ist, wie es funktioniert" - wurde bereits besprochen und berichtet, und nichts hat sich geändert. Das ist also kein Fehlerbericht, ich frage nur, wie wir mit dem arbeiten sollen, womit wir arbeiten müssen.
Ich spreche von Texten , die haben nichts zu tun mit dem Datenmodul arbeitet auf. Ich möchte keine Produkte übersetzen, sondern nur Vorlagenzeichenfolgen, die nichts mit dem Produkt selbst zu tun haben, wie z. B. Zurück - Weiter in der Produktbildgalerie-Vorlage.
Das Modul gibt beispielsweise 15 Miniaturansichten zurück, und es ist Aufgabe des Themas, jeweils 5 anzuzeigen. Und vorherige / nächste Links Bedürfnisse alt
und title
Attribute. Übersetzt. Aber mein Modul weiß das nicht. Und sollte es niemals brauchen.
wget
oder was auch immer zu verwenden. Hackish, aber du hast gesagt, das war erlaubt (:Antworten:
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
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.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
t()
erfolgt). Wir brauchen ein proaktives Datenmodell, nach dem die Anwendung suchtt()
Instanzen bevor sie tatsächlich vom Kunden ausgeführt werden.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 dast()
vorkommt. Selbst wenn wir die Zielsprache beispielsweiset()
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 Zeichenketten
t()
, 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
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?
Wenn der Kunde dann greift
/pl/product/200
, machen Sie einen Ausflug in die Datenbank, suchen nach Produkt 200 und greifen auf die bereits vorhandenepl
Ü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 zumURL 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 DatenbankIrgendwo 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
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 ~
quelle
Ok, ich habe mehr Zeit mit dem Übersetzungsmodul für Lokalisierungsclients und Entitäten verbracht, um dasselbe Szenario zu reproduzieren. Da sich diese Antwort völlig von meiner vorherigen unterscheidet, füge ich als separaten Kommentar hinzu:
Die für eine Sprache in einem / ersten Knoten hinzugefügte Übersetzung ist für alle Knoten verfügbar.
Hier ist ein Beispiel:
Wenn ich ein neues Produkt des gleichen Typs wie nid 200 hinzufüge und den neuen Knoten pl translation (sprich pl / product / 204) besuche, würde ich die gleiche Übersetzungszeichenfolge in pl / product / 200 sehen.
Der einzige Unterschied besteht darin, dass es im Lokalisierungs-Client nicht angezeigt wird. Wir können diese Funktion in der Ausgabe-Warteschlange des Moduls anfordern, sie würde jedoch mehr Verwirrung stiften, da die Übersetzung nicht spezifisch für die aktuelle Seite ist und alle Seiten betrifft (dh sowohl pl / product / 200 als auch pl / product / 204).
Wenn die beiden Knoten von zwei verschiedenen Personen erstellt wurden und der spätere die Übersetzung ändern möchte, muss er die Schnittstellenübersetzung verwenden.
Die Zeichenfolge ist im Lokalisierungsclient für die erste Sprache verfügbar, die Sie für denselben Knoten besuchen
Hier ist ein Beispiel:
quelle
Ihr Ansatz zum Hinzufügen der Übersetzungszeichenfolge auf Vorlagen- oder Moduldateiebene funktioniert möglicherweise für die Benutzeroberfläche der Schnittstellenübersetzung, nicht jedoch für den Lokalisierungsclient.
Wenn Sie über eine russische Version des Produkts 200 verfügen, handelt es sich natürlich um einen neuen Knoten, z. B. / ru / product / 201, auf dem Sie mit dem Lokalisierungsclient übersetzen können.
Nur ein Gedanke: Suchen Sie nach einer Zeichenfolge, die in der Benutzeroberfläche für die Schnittstellenübersetzung für alle Sprachen übersetzt werden kann, und bitten Sie den Kunden, die Produktebene zu übersetzen, wenn dies wirklich erforderlich ist. Hier ist ein Beispiel:
"Dies ist ein Produkt der Kategorie bar"
und wenn wir sicher sind, dass andere als 'foo' & 'bar' üblich sein können, können wir hinzufügen
im Vorprozess.
und die .tpl.php Datei wird
quelle
title
Texte für Pfeile in Image Rotator. Meinem Modul ist es egal, wie das Thema 15 Bilder anzeigt. Und Thema zeigt 5 auf einmal, mit "prev" und "next" Pfeilen, diealt
undtitle
und übersetzt werden müssen. Das Modul jedes Mal zu ändern, wenn sich mein Front-End ändert, ist möglich, sollte aber auf keinen Fall erforderlich sein. Diese Zeichenfolgen haben nichts mit dem Modul selbst zu tun. Last but not least kann es sein, dass ich einfach keine Ahnung habe, dass die Zeichenfolgen im Thema geändert wurden. Oder nicht verfügbar, um sie in das Modul zu migrieren.AFAIK Mit dem Translation Template Extractor können Sie die Zeichenfolge in all Ihren Aufrufen der
t()
Funktion extrahieren .Read this Wie übersetze ich ein Modul?
quelle