Überschreiben Sie eine WordPress-Plugin-Übersetzungsdatei beim Laden

Lesezeit: 5 Minuten

Ich verwende WordPress auf Französisch mit dem Plugin Der Veranstaltungskalender.

Dieses Plugin wird mit einer gebündelten französischen Übersetzung geliefert, enthält jedoch einige Fehler. Ich möchte sie beheben, aber das Ersetzen der Originaldatei ist keine gute Idee, da sie mit dem nächsten Update ersetzt wird. Ich habe den Entwickler kontaktiert, um einen Fix einzureichen, aber es kann einige Zeit dauern.

In der Zwischenzeit möchte ich ein Duplikat laden, das ich aus meinem Vorlagenverzeichnis erstellt habe. Ich habe bereits mehrere Dinge ausprobiert, z.

load_plugin_textdomain( 'tribe-events-calendar', get_template_directory() . '/languages' );

Oder mit

add_filter('override_load_textdomain', …)

in meiner functions.php, aber es scheint nicht zu funktionieren. Das einzige, was ich tun konnte, war das Laden der ursprünglichen Übersetzungsdatei zu deaktivieren.

Gibt es eine Möglichkeit, eine Plugin-Übersetzungsdatei beim Laden zu ersetzen? Ich verwende auch WPML, aber im Modus „Mit .mo-Dateien übersetzen“, nicht im Modus „Mit WPML übersetzen“, daher kann ich die Plugin-Übersetzung nicht im laufenden Betrieb ändern. Vielleicht kann WPML meine eigene Übersetzung des Veranstaltungskalenders laden?

Benutzeravatar von Jiwoks
Jiwoks

Sie können diese paar Zeilen in Ihre Theme-Datei functions.php einfügen

$text_domain = 'the-events-calendar';
$original_language_file = ABSPATH . DIRECTORY_SEPARATOR . 'wp-content' . DIRECTORY_SEPARATOR . 'plugins' . DIRECTORY_SEPARATOR . 'the-events-calendar' . DIRECTORY_SEPARATOR . 'languages' . DIRECTORY_SEPARATOR . 'the-events-calendar-fr_FR.mo';
$override_language_file = ABSPATH . DIRECTORY_SEPARATOR . 'wp-content' . DIRECTORY_SEPARATOR . 'themes' . DIRECTORY_SEPARATOR . 'your-own-theme' . DIRECTORY_SEPARATOR . 'languages' . DIRECTORY_SEPARATOR . 'the-events-calendar-fr_FR.override.mo'; 

// Unload the translation for the text domain of the plugin
unload_textdomain($text_domain);
// Load first the override file
load_textdomain($text_domain, $override_language_file );
// Then load the original translation file
load_textdomain($text_domain, $original_language_file );

Sie müssen die beiden Dateivariablen durch die tatsächliche Sprachdatei ersetzen.

Aber wir nehmen an, dass sich die französische Sprachdatei im Plugin-Sprachordner befindet und Ihre Override-Sprachdatei im Sprachthemenordner.

Die Idee ist:

  • Entladen Sie die Sprache, die bereits automatisch von WP geladen wurde
  • Laden Sie zuerst Ihre Override-Datei. Dies ist wichtig, um es zuerst zu laden, da bereits definierte Übersetzungen übersprungen werden, wenn Sie eine andere Sprachdatei für diese Textdomäne laden (siehe WP-Kern).
  • Laden Sie die ursprüngliche Übersetzungsdatei, die tatsächlich alle nicht übersetzten Zeichenfolgen der Überschreibungsdatei lädt.

Dies funktioniert nur mit kompilierter mo-Datei.

Sie können Ihrer Überschreibungsdatei nur die wenigen Zeichenfolgen hinzufügen, die Sie überschreiben möchten.

  • Dies sollte die akzeptierte Antwort sein. Ich glaube, das ist der Weg von WordPress

    – Alexandre Bourlier

    31. Januar 2017 um 17:16 Uhr

  • Exzellent. Sie sollten einfach das “$path” loswerden. auf der letzten Zeile

    – Christer Fernstrom

    20. März 2017 um 13:40 Uhr

  • @ChristerFernstrom du hast recht, ich habe es gerade entfernt

    – Jiwoks

    20. März 2017 um 15:07 Uhr

  • Dadurch werden ALLE Sprachen überschrieben.

    – v

    11. April 2017 um 12:23 Uhr

  • Ja kurze Lösung hier. Es wäre besser, den Hook load_textdomain zu verwenden, um zu prüfen, ob die geladene Datei die Datei ist, die Sie überschreiben möchten oder nicht

    – Jiwoks

    12. April 2017 um 10:24 Uhr

Benutzeravatar von oferwald
oferwald

Ich bin der Autor des Transposh-Plugins,

Ihre Antwort liegt tatsächlich in den folgenden vier Filtern:

   add_filter('gettext', ......, 3);
   add_filter('gettext_with_context', ......, 3);
   add_filter('ngettext', ......, 4);
   add_filter('ngettext_with_context', ....., 4);

(Anstelle von ….. müssen Sie natürlich die Funktion und die Priorität hinzufügen.)

Diese Funktionen erhalten die Zeichenfolgen und die Domäne, und Sie können diese verwenden, um Funktionen wie die folgenden auszuführen:

function gettext_filter($translation, $orig, $domain) {
    if ($domain == 'plugin_domain') {
        if ($orig == 'some text') {
            return "some translation";
        }
    }
    return $translation;
}

  • Eigentlich möchte ich die gesamte Übersetzungsdatei ersetzen, nicht jede Zeichenfolge manuell. Danke trotzdem.

    – LeBen

    8. Oktober 2013 um 9:08 Uhr

  • Ich habe das gleiche für ein anderes Plugin gesucht. Diese Lösung ist praktisch, scheint aber aus Performance-Sicht ziemlich schlecht zu sein. Hinzufügen eines Filters, um eine Funktion für jeden einzelnen Aufruf von gettext auszuführen, mit einer bedingten Prüfung, um zu sehen, ob eine Zeichenfolge, die zu dem gegebenen Zeitpunkt verarbeitet wird, zufällig diejenige ist, an der wir interessiert sind. Dies erfordert die gettext_filter-Funktion, die möglicherweise hunderte Male für jeden Seitenladevorgang ausgeführt wird, nur um eine Zeichenfolge zu übersetzen, die nur einen Bruchteil der Zeit vorhanden ist. Dies kann nicht gut sein, wenn Sie eine stark frequentierte Website auf Leistung optimieren möchten.

    – mikkelbreum

    5. Dezember 2013 um 14:07 Uhr


  • Der bessere Weg, dies zu tun, wäre, die gesamte .mo-Datei auf die gleiche Weise zu überschreiben, wie viele Plugin-Vorlagen das Überschreiben von Vorlagen ermöglichen, indem einfach alternative Versionen im Stammverzeichnis des Themas platziert werden.

    – mikkelbreum

    5. Dezember 2013 um 14:12 Uhr

  • Es scheint der richtige Weg zu sein, tatsächlich die gesamte mo-Datei zu überschreiben. Ich habe noch nicht viel damit gearbeitet und bin mir nicht sicher, ob es eine spezielle Unterstützung durch das betreffende Plugin erfordert, aber schau dir diesen Thread an, um eine Anleitung zu erhalten: wordpress.stackexchange.com/questions/30555/…

    – mikkelbreum

    5. Dezember 2013 um 14:16 Uhr

  • Beachten Sie jedoch, dass das Ersetzen der gesamten mo-Datei bedeutet, dass Sie überhaupt keine Aktualisierungen für die Plugin-Übersetzungen erhalten, selbst wenn sich die Zeichenfolgen im Quell-PHP ändern. Wenn das Plugin einen seiner Strings ändert, haben Sie keine Übersetzung dafür in Ihrer eigenen Datei.

    – Ariane

    22. April 2020 um 20:08 Uhr

Benutzeravatar von George Dimitriadis
Georg Dimitriadis

Diese Lösung verwendet die automatischen Loader von WordPress, um das Plugin zu überschreiben, und benötigt keine zusätzliche Programmierlogik, sondern lässt das CMS die Überschreibung vornehmen.

Angenommen, Sie möchten ein Plugin namens übersetzen my-plugin. Ein richtig gebautes Plugin hätte zwei übersetzte Dateien im Verzeichnis wp-content/languages/plugins/ genannt my-plugin-fr_FR.po und my-plugin-fr_FR.mo. (Das Gebietsschema fr_FR ist nur mein Beispiel für die französische Übersetzung, es funktioniert entsprechend für andere Sprachübersetzungen).

Wenn Ihr Plugin diese Struktur hat, überschreiben die folgenden Schritte die Übersetzungen, wenn nicht, können Sie es trotzdem versuchen:

  1. Kopieren Sie die oben genannten .po- und .mo-Dateien in das Verzeichnis wp-content/languages/my-plugin. Wenn das Verzeichnis nicht existiert, erstellen Sie es.
  2. Bearbeiten Sie die Übersetzungsdateien nach Belieben und speichern Sie sie.

1392140cookie-checkÜberschreiben Sie eine WordPress-Plugin-Übersetzungsdatei beim Laden

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy