2016-05-22 6 views
1

Ich habe ein Wordpress-Plugin mit einigen Einstellungen in einem Array mit einem Slug und einem Label für jede Einstellung gespeichert.Wordpress Plugin Internationalisierung: Variablen nicht übersetzt?

Mein Plugin-Klasse basiert, und das ist der Code meiner Konstrukt Funktion

class My_Plugin { 
    function __construct() { 
    $this->_options = array(
     'optionA' => __('Text for first option', 'my-plugin'), 
     'optionB' => __('Text for second option', 'my-plugin'), 
     'optionC' => __('Text for third option', 'my-plugin'), 
    ); 
    } 
} 

ich eine ähnliche Struktur in wenigen Orten verwenden, eine Liste von Werten mit einem Etikett mit get Text zugeordnet zu speichern. Zum Beispiel, später könnte diese Anordnung verwendet werden, ein Formular mit Benutzereinstellungen erstellen

foreach ($this->_options as $option_name => $option_label) { 
    echo '<input type="text" name="' . $option_name . '" value="' . $option_label . '"/>'; 
} 

ich an anderer Stelle auch eine ähnliche Struktur verwenden. Nun, die seltsame (?) Sache, die ich bemerkte, ist, dass, wenn ich das Plugin mit PoEdit übersetze, diese Zeichenfolgen nicht übersetzt werden. Warum passiert das? Gibt es etwas, was ich tun könnte, abgesehen davon, dass ich die Struktur ändere und jedes Eingabefeld oder jede sich wiederholende Struktur direkt schreibe?

+0

Die gettext-Strings – DavidTonarini

Antwort

1

Sie müssen verstehen, wie gettext Bibliotheken (einschließlich der in Wordpress) arbeiten - wenn Sie das tun, ist die Ursache für Probleme wie diese einfach über die Vernunft:

__() ist nicht etwas Magie Marker, sondern eine Ebene alte Funktion. Es nimmt eine Zeichenkette als Eingabe, durchsucht die aktuell geladene MO-Datei für die Domäne, , wenn es eine gibt, und gibt eine Übersetzung zurück, wenn sie eine findet. Andernfalls gibt es die Eingabe unmodifiziert zurück (d. H. Fällt zurück auf Englisch).

So ist die Frage, die Sie sich stellen müssen, mit dem Wissen, der Rest des Codes, die Sie hier nicht enthalten waren, ist: Ist die Übersetzung für den my-plugin Domain zu dem Zeitpunkt geladen, wenn __() aus der aufgerufen wurde Konstrukteure?

Eine vernünftige Schätzung ist, dass nein, war es nicht. Sie haben zuerst das My_Plugin-Objekt erstellt und damit __() aufgerufen, als keine Übersetzungen geladen wurden und die gettext-Bibliothek noch nicht ordnungsgemäß initialisiert wurde. In einer solchen Situation kann die Funktion nur die ursprüngliche englische Zeichenkette zurückgeben. Irgendwann später (chronologisch, nicht unbedingt in der Reihenfolge des Quellcodes) wurde Ihr Gettext-Initialisierungs-Hook ausgeführt und load_plugin_textdomain aufgerufen. Von diesem Zeitpunkt an würde sich __() wie erwartet verhalten. Das war jedoch zu spät für Ihren Konstruktor, weil Sie diese Zeichenfolgen bereits "übersetzt" haben.

Es ist vollkommen in Ordnung, übersetzte Werte wie Sie zu speichern (obwohl es auch ein bisschen sinnlos ist, weil es Ihnen keine sinnvollen Leistungsvorteile gibt). Aber Sie müssen konsequent eine einfache Regel befolgen: Laden Sie zuerst Übersetzungen, dann verwenden Sie sie.