Wie übersetze ich "Neue benutzerdefinierte Inhalte" in ein Panel?

7

Ich habe viele Panels, denen ich mithilfe der Option "Neuer benutzerdefinierter Inhalt" des Panels-Moduls Text- / HTML-Elemente hinzugefügt habe.

Standardmäßig wird dieser Text nicht auf dem Bildschirm "Schnittstelle übersetzen" angezeigt. Wie soll ich sie übersetzen?

Zwei Ansätze, die ich gefunden habe, sind:

  • Ändern des benutzerdefinierten Inhaltstextformats in PHP codeund Drucken der Textzeichenfolge (n) mit t (). Auf diese Weise kann ich die Zeichenfolgen auf dem Bildschirm "Schnittstelle übersetzen" übersetzen. Ich mache mir jedoch Sorgen, dass das Einfügen von PHP-Code wie diesem ein schlechter Präzedenzfall ist.
  • Da ich nur zwei Sprachen habe, kann ich einen zweiten benutzerdefinierten Inhalt hinzufügen, der in der anderen Sprache lokalisiert ist. Anschließend kann ich jedem benutzerdefinierten Inhalt in Panels eine Sichtbarkeitsregel hinzufügen und festlegen, dass jedes Element nur angezeigt wird, wenn die Sprache des Benutzers mit der Inhaltssprache übereinstimmt. Dies funktioniert, ist aber im Backend zeitaufwändig und hässlich. Es wäre noch schlimmer, wenn ich mich entschließen würde, meiner Website in Zukunft weitere Sprachen hinzuzufügen, was ich möglicherweise tun werde.

Gibt es eine effizientere und wartbarere Möglichkeit, solche benutzerdefinierten Inhalte zu übersetzen?

Patrick Kenny
quelle

Antworten:

4

Zunächst möchte ich erklären, warum dies nicht "nur funktioniert", so dass Sie fair gewarnt wurden, bevor ich Ihnen neue Probleme gebe. :) Betrachten Sie einen benutzerdefinierten Inhaltsbereich wie:

Welcome %user:name, you have %field_num_messages new messages waiting.

Der Text hier wird ersetzt, bevor er an t () übergeben wird. Dies bedeutet, dass Sie für jede Variation des Benutzers und der Anzahl der Nachrichten eine völlig neue Zeichenfolge zum Übersetzen erhalten. Verwenden Sie für solche Scheiben zwei separate Scheiben.

An einer langfristigen Lösung wird hier langsam gearbeitet: Übersetzbare Paneltitel: Implementieren Sie i18n_strings , konzentrieren Sie sich jedoch zunächst auf die Fenstertitel .

Im Allgemeinen besteht die Lösung darin, benutzerdefinierte Inhaltsfenster zu vermeiden, aber mir ist auch klar, dass die Verwendung manchmal sehr bequem sein kann.

Schließlich ist hier ein Teil des Codes, mit dem ich Fenstertitel "erzwingen" musste, um übersetzbar zu werden. Ich werde versuchen, es später besser an Ihre Situation anzupassen, aber ich dachte, eine nützliche Antwort schnell zu haben, wäre besser als nicht. :) Sie sollten in der Lage sein, mit $ pane herauszufinden, ob dies ein benutzerdefinierter Bereich ist, und dann den Text durch t () zu übergeben.

/**
 * Implements hook_panels_pane_content_alter().
 */
function HOOK_panels_pane_content_alter($content, $pane, $args, $context) {
  if ($content->title) {
    $content->title = t($content->title);
  }
  return $content;
}
Letharion
quelle
OK danke! In diesem Fall habe ich keinen benutzerdefinierten Inhalt, der die Kontexte verwendet, sodass ich zumindest nicht das erste von Ihnen erwähnte Problem habe.
Patrick Kenny
Dies ist nicht mehr erforderlich, siehe drupal.stackexchange.com/a/108970/10086
Pere
@Pere Das ist die Verwendung des PHP-Moduls, was eine Katastrophe ist, die darauf wartet, passiert zu werden.
Letharion
@ Letharion nein, Panels Übersetzungsmodul ist jetzt Teil von Panels und verwendet nicht das PHP-Modul
Pere
@Pere Du hast recht, entschuldige. Aus irgendeinem Grund zeigte mir der Link auf meinem Telefon die Antwort über Ihrer, also habe ich sie falsch verstanden.
Letharion
3

Ich verwende immer eine einfache Seite (vorhandener Knoten gegen benutzerdefinierten Inhalt). Auf diese Weise haben Sie durch die Entity-Übersetzung die Möglichkeit, mit Sprachen und Fallback umzugehen. Um Probleme mit doppelten SEO-Inhalten zu vermeiden, installieren Sie das Rabbit-Hole-Modul und verwenden Sie die Weiterleitung zu Ihrer Panel-Seite für diese Knoten.

pedrosp
quelle
2

Wenn Sie einige benutzerdefinierte "Blöcke" (mangels eines besseren Begriffs) exportieren möchten, um sie zu codieren und zu übersetzen, können Sie das Feldmodul mit i18n_boxes verwenden, mit dem Sie Felder in der Benutzeroberfläche übersetzen können (z. B. mit l10n_client) ) und exportieren Sie die Standard-Sprachversion in Code. Sie können dann die Felder in Ihren Panels verwenden.

James Wilson
quelle
Das ist eine gute Idee, aber leider gibt es derzeit einen Fehler in Boxen, der verhindert, dass Einstellungen gespeichert werden, es sei denn, Sie verwenden auch das Kontextmodul. Boxen + Kontext ist dafür viel zu viel Aufwand. drupal.org/node/1444544
Patrick Kenny
Verwenden Sie keine Panels für die Anzeige? Die Sichtbarkeitseinstellungen einer Box oder eines Blocks (vom Kern) werden nicht mit Panels verwendet, die für sich genommen eine eigene Anzeige-Engine sind. Daher glaube ich nicht, dass Sie in diesem Fall einen Kontext benötigen.
James Wilson
Ah, das stimmt. Wenn ich diesen Weg gehen würde, würde ich jedoch eine große Anzahl von Boxen erstellen, die insbesondere für Übersetzer schwierig zu verwalten wären, da sie zwei Schnittstellen (Panels + Boxen) handhaben müssten. Ich schätze die Idee jedoch.
Patrick Kenny
Zu Ihrer Information: i18n_boxes macht den Inhalt und den Titel der Boxen als mit i18n_strings kompatible übersetzbare Zeichenfolgen verfügbar. Sie können dann l10n_clientdie Bildschirmübersetzungssymbolleiste des Moduls verwenden - die sublim blaue Leiste am unteren Rand aller Seiten -, um Übersetzungen für Übersetzer ganz einfach zu machen. Ich weiß nicht, wie weit der Rest der benutzerdefinierten Inhaltsfenster von Panels in i18n_strings integriert ist, aber ich gehe davon aus, dass es defekt ist, wie im OP angegeben.
James Wilson