Wie kann ich Zeichenfolgen aus Vorlagen auf allen Seiten übersetzbar machen, auf denen sie angezeigt werden?

14

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 locationFeld 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/200ist 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 altund titleAttribute. Übersetzt. Aber mein Modul weiß das nicht. Und sollte es niemals brauchen.

Mołot
quelle
Ich bin mir nicht sicher, ob ich alles verstanden habe, was Sie wollen, aber würde es ausreichen, die Site in allen Sprachen zu crawlen? Sie könnten zB verwenden. xmlsitemap, um die Links in mehreren Sprachen zu generieren und dann wgetoder was auch immer zu verwenden. Hackish, aber du hast gesagt, das war erlaubt (:
Andy
Mit @Andy Localization Client können Benutzer eine Leiste am unteren Rand einer Seite öffnen und Texte, die auf dieser Seite angezeigt werden, direkt übersetzen, wenn sie sie sehen. Ich kann alle Texte exportieren, aber genau darum geht es nicht.
Mołot
1
Ich erinnere mich von drupal_set_message () und dpm (), dass diese Nachrichten für die nächste Anfrage in die Warteschlange gestellt werden, wenn sie zB von page.tpl.php aufgerufen werden. Dies ist darauf zurückzuführen, dass Vorlagen in einer Anforderung in der Regel relativ spät verarbeitet werden, nachdem Nachrichten verarbeitet wurden. Ähnliches könnte bei t () und dem Lokalisierungsclient der Fall sein.
donquixote
Gute Frage. Nettes Problem.
Amateur Barista
Nur ein Vorschlag ... wenn Sie möchten, dass Ihre Benutzer Ihre tpl t () - Zeichenfolgen jederzeit in einer beliebigen Sprache übersetzen können, können Sie diese Zeichenfolgen mit Translation Template Extractor ( drupal.org/project/potx ) extrahieren und ihnen die geben original .po, dass sie mit einem Tool wie Poedit übersetzen könnten? ( poedit.net ). Wenn Sie diese Zeichenfolgen als statische Zeichenfolgen präsentieren, erledigt jeder Übersetzer diese Aufgabe auf einmal ...
Kojo,

Antworten:

5

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

  1. Wir haben keine Liste aller Übersetzungszeichenfolgen.
  2. 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.
  3. 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

  1. Wir brauchen eine Datenquelle, ein Modell, das mir sagt, welche aktuellen Übersetzungszeichenfolgen wir haben und in welchem ​​Kontext sie stehen.
  2. 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.
  3. 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

  1. Die Zielsprache kann nicht in der Vorlage enthalten sein, die von der URL festgelegt wird. Angenommen, die Zeichenfolge muss eine beliebige Sprache unterstützen.
  2. 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 productEntitäten, gehen Sie zum URL aliasFeld, 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 ~

Amateur Barista
quelle
1
Auch ohne den ganzen Beitrag zu lesen, diese Art von Antwort verdient eine upvote
OV
Der Punkt ist - Tool, das behauptet, es tut genau das, was ich für Drupal 7 brauche, ist bereits vorhanden. Es ist nur ein Problem, wenn Drupal diese Zeichenfolgen mit falschen Metadaten speichert. Aber ich kann die Metadaten in db ändern, sobald Zeichenfolgen gesammelt wurden, kein Problem. Ich muss nur wissen, auf was ich sie einstellen soll, damit das Tool es sehen kann. Zumindest glaubte ich, dass es das ist, was ich brauche. Und das Wichtigste: Ich möchte keine Produkte übersetzen, sondern nur Vorlagenzeichenfolgen, die nichts mit dem Produkt selbst zu tun haben, z .
Mołot
2

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:

  1. 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.

  2. Die Zeichenfolge ist im Lokalisierungsclient für die erste Sprache verfügbar, die Sie für denselben Knoten besuchen

    Hier ist ein Beispiel:

    • Wenn ich das neue Produkt nid 199 hinzufüge und eine Übersetzung für die Sprache 'pl' (nid 200) und die Übersetzung für die Sprache 'rs' (nid 201) erstelle, wird die Zeichenfolge nur auf der Seite 'pl' und nicht auf der Seite 'rs' angezeigt. Auch dies scheint eine Einschränkung im Lokalisierungs-Client-Modul zu sein.
vijaycs85
quelle
1

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

$vars['product_title'] = t('This is product @product of category @category')

im Vorprozess.

und die .tpl.php Datei wird

<?php t($product_title, array('@product' => t('foo'),  '@category' => t('bar')); ?>
vijaycs85
quelle
Es geht mehr um titleTexte 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, die altund titleund ü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.
Mołot
IMHO sollte dieser Fall in der Benutzeroberfläche der Schnittstellenübersetzung anstelle des Lokalisierungsclients behandelt werden.
Vijaycs85
Der Lokalisierungsclient soll es ermöglichen, "Übersetzungen auf Ihrer Site zu korrigieren, sobald Sie die Probleme sehen". - Warum sollte es nicht für Vorlagendateien gelten? Strings in tpl sind sogar noch kontextsensitiver, wenn überhaupt.
Mołot
1

AFAIK Mit dem Translation Template Extractor können Sie die Zeichenfolge in all Ihren Aufrufen der t()Funktion extrahieren .

Der Translation Template Extractor bietet eine webbasierte und eine Befehlszeilenschnittstelle zum Extrahieren von Gettext-Übersetzungsvorlagen für Drupal sowie eine wiederverwendbare API, um nach übersetzbaren Zeichenfolgen und Übersetzungsfehlern zu suchen. Dieses Tool wird unter der Haube von http://localize.drupal.org/ verwendet und dient auch als Parsing-Maschine für Drupal.org-Projekt-Releases.

Read this Wie übersetze ich ein Modul?

Adrian Cid Almaguer
quelle