Wie kann man Plugin-Übersetzungen nach Updates behalten?

9

http://wordpress.org/extend/plugins/bbpress/ Der Sprachordner von bbpress (wp-content / plugins / bbpress / bbp-language) enthält diese Warnung:

/**
 * Do not put custom translations here. They will be deleted on bbPress updates.
 *
 * Keep custom bbPress translations in /wp-content/languages/
 */

Eigentlich ist das kein neues Problem und ja, sie haben Recht. Dies ist ein großes Problem, wenn Sie WordPress-Plugins mit einer nicht englischen Sprache verwenden.

Grundsätzlich habe ich bbpress übersetzt und .po und .mo Dateien erstellt. Dateien funktionieren, wenn ich sie in ihren normalen Ordner wp-content / plugins / bbpress / bbp-Languages ​​lege. Aber wie oben angegeben, wird die Warnung beim Update gelöscht. Aber das Problem ist, dass das Übersetzen nicht funktioniert, wenn ich sie in den Ordner wp-content / Languages ​​/ lege, wie in bbpress vorgeschlagen.

Ich denke, es muss einen Haken geben oder etwas, das ich aktivieren kann, aber was ist die beste Lösung dafür? Ich möchte einfach Plugin-Sprachdateien in wp-content / language / behalten

Ünsal Korkmaz
quelle
Nun, nachdem ich die bbpress-Codes überprüft habe, muss ich anscheinend Dateien in / wp-content / Languages ​​/ bbpress / nicht direkt in / wp-content / language / ablegen. Jetzt funktioniert es für bbpress, aber die Frage muss noch beantwortet werden für andere Plugins imo
Ünsal Korkmaz

Antworten:

3

Sie müssen den Aufruf der Sprachdatei von BBpress ersetzen.

Ein guter Ort, um dies zu tun, ist eine sprachspezifische Datei in Ihrem allgemeinen Sprachverzeichnis. Für Türkisch wäre es wahrscheinlich eine Datei mit dem Namen tr_TR.php. Dies wird automatisch geladen und nur, wenn es mit der Sprache Ihres Blogs übereinstimmt. Es wird nicht überschrieben.

BBPress verwendet die Funktion nicht load_plugin_textdomain, load_textdomainsondern. Hier finden Sie einen Filter:

$mofile = apply_filters( 'load_textdomain_mofile', $mofile, $domain );

Fügen Sie in Ihrer Sprach-PHP-Datei einfach einen Filter hinzu, um den Pfad zu ändern:

function load_bbpress_tr_mofile( $mofile, $domain )
{
    if ( 'bbpress' == $domain )
    {
        // replace this. :)
        return 'FULL_PATH_TO_YOUR_FILE';
    }
    return $mofile;
}
add_filter( 'load_textdomain_mofile', 'load_bbpress_tr_mofile', 10, 2 );
Fuxia
quelle
Es scheint, dass es einen Fehler gibt. bbpress.trac.wordpress.org/ticket/1647 untersucht ihn. Ich werde den Standard-Sprachordner wp-content / language / verwenden. Was ist Ihr Vorschlag für 'FULL_PATH_TO_YOUR_FILE'?
Ünsal Korkmaz
Der Pfad zu Ihrem Sprachverzeichnis ( WP_LANG_DIR) und Ihrer Mo-Datei.
Fuxia
1
Gute Antwort. Hinweis für Plugin-Entwickler: load_plugin_textdomain()Führen Sie Ihre Aufrufe während der Aktion "init" durch, andernfalls können wir uns nicht in den Filter "load_textdomain_mofile" einbinden. Dann ist es schon zu spät.
Geert
2

Sie müssen lediglich ein einfaches Plugin erstellen, das die text_domain der installierten Plugins verwaltet. Wenn Sie keine globale Lösung wünschen, können Sie den Code zu Ihrer functions.php in Ihrem Thema hinzufügen.

Die Idee ist, WordPress anzuweisen, wo Übersetzungen zu finden sind. Intern erfolgt dies in allen Plugins mit etwas ähnlichem wie

load_plugin_textdomain( 'regenerate-thumbnails', false, '/regenerate-thumbnails/localization' );

Dies ist die Funktion, die Sie verwenden werden. Wie Sie hier sehen können , wird das letzte Argument verwendet, um den relativen Pfad zum Plugin festzulegen, in dem sich die Übersetzungsdateien befinden.

Sie können tun, was Sie wollen, indem Sie für jedes Plugin, dessen Sprachordner Sie ändern möchten, eine Zeile wie folgt einfügen.

load_plugin_textdomain('bbpress', false, '../../languages/bbpress');

Dadurch wird WordPress angewiesen, Ihre benutzerdefinierten Übersetzungsdateien aus einem Ordner neben einem pluginsOrdner mit einem Ordner bbpressmit den Übersetzungsdateien zu laden, wobei der gleiche Name wie für jedes Plugin verwendet wird.

Ihre Methode, die die Textdomänen für alle Plugins anweist, sollte in der folgenden initPhase ausgeführt werden

function set_myplugins_languages() {
     .... your code here.....
}
add_action('init', 'set_myplugins_languages');

(Vergessen Sie nicht, dies als Antwort zu markieren, wenn Sie es nützlich fanden.)

Odys
quelle
0

Damit dies funktioniert, müssen die WordPress-Übersetzungsdateien bereits im WP_LANG_DIR vorhanden sein und das globale Gebietsschema auf diese Sprache eingestellt sein. Wenn Sie nur Übersetzungen für bbPress einfügen, ohne das Gebietsschema zu ändern oder die wichtigsten Übersetzungsdateien von WordPress zu haben, wird nichts übersetzt, obwohl Sie sie geladen haben.

Wenn Sie das Gebietsschema nur für bbPress überschreiben möchten, müssen Sie 'bbpress_locale' einen Filter hinzufügen, mit dem Sie die bbPress mo-Datei überschreiben können.

Während es stimmt, dass bbPress 2.0 die Funktion load_textdomain () verwendet, ist load_plugin_textdomain () sowieso nur ein Wrapper für load_textdomain (). Die bbPress 2.0-Methode ist robuster und ermöglicht die globale Platzierung von Übersetzungsdateien, sodass Sie sie während des Plugin-Updates nicht verlieren.

John James Jacoby
quelle
-1

In meinem Fall erfordert das Erstellen einer permanenten benutzerdefinierten Übersetzung für das Plugin die folgenden Schritte (Beispiele für die Übersetzung des ACF-Plugins):

  1. wp-content/languages/plugins/Verzeichnis erstellen
  2. Kopieren Sie die ausgewählte Übersetzungsdatei .poaus dem Plugin- lang/Ordner (oder einer anderen mit Übersetzungen) in die erstellte Datei wp-content/languages/plugins/(z. B. von lang/acf-pl_PL.pobis wp-content/languages/plugins/acf-pl_PL.po).
  3. passen Sie die Übersetzung mit zB Poedit oder einem anderen Programm zum Bearbeiten von .poDateien und dann generieren .mound speichert in wp-content/languages/plugins/(zB wp-content/languages/plugins/acf-pl_PL.mo)

Auf diese Weise sollte die Übersetzung auch nach dem Plugin-Update erhalten bleiben.

Ich bin nicht sicher, ob diese Strategie für alle Plugins funktioniert, aber das ist definitiv einen Versuch wert.

jmarceli
quelle