Eigene Übersetzung der WordPress Core Dateien, ohne im WordPress Code selbst herumzufummeln und die auch noch nach dem WordPress Update vorhanden ist?
Ja, das ist möglich.
Zwar nicht mit der bekannten load_theme_textdomain
– oder load_textdomain
-Methode, aber es ist möglich.
Der dazu benötigte Filter-Hook lautet: gettext
Dazu notieren wir in der functions.php
unseres Themas:
add_filter( 'gettext', 'rontranslate_filter_gettext', 10, 3 );
Die aufzurufende Funktion dafür könnte folgendermaßen aussehen:
function rontranslate_filter_gettext( $translated, $original, $domain ) { $locale = get_locale(); // if the website language is german AND //the Text Domain of a WordPress core file is loaded if ( $locale == 'de_DE' && $domain == 'default' ) { // This is an array of original strings // and what they should be replaced with include_once 'includes/core_translations_german.php'; // load own translations into $strings-Array $strings = german_core_translation(); } // See if there is $strings // and if the current original-string is in the $strings array // If so, replace it's translation if ( isset( $strings ) && ! empty( $strings[$original] ) ) { // This accomplishes the same thing as __() // but without running it through the filter again $translations = get_translations_for_domain( $domain ); $translated = $translations->translate( $strings[$original] ); } return $translated; }
Die eigenen Übersetzungen habe ich in eine eigene include Datei ausgelagert um sie für weitere Projekte einzusetzen.
Es ist auch nicht leicht, auf den ersten Blick zu erkennen, welche Übersetzung aus dem Theme selbst und welche von den WP Core Dateien stammt.
Die zu übersetzenden Texte habe ich direkt der de_DE.po aus dem Verzeichnis wp-content/languages
entnommen, wobei ich mich auf Texte beschränkt habe, die der User im Frontent sieht. (In der Admin-Ansicht ist mir die „Du“-Ansprache und die Übersetzung ja herzlich egal. Im gezeigten Beispiel sind einige Texte rund um die Kommentare angeführt.
Der Code in der includes/core_translations_german.php
sieht nun wie folgt aus:
/* * German Translations of WordPress Core * called by functions.php */ function german_core_translation() { // initialize $s locally when it appears in the text strings $s = ''; $strings = array( // Überschrift über Kommentareingabe // wp-includes/theme-compat/comments.php:75 "Leave a Reply" => "Ihr Kommentar zu diesem Artikel:", // wp-includes/comment-template.php:2123 // Steht als Hinweis unter der Überschrift "Your email address will not be published." => "Ihre E-Mail-Adresse erscheint nicht beim Kommentar. Sie wird gemäß unseren Datenschutzrichtlinien auch nicht an Dritte weitergegeben. </br>", // wp-includes/class-walker-comment.php:335 // Nachdem ein Kommentar abgegeben wurde, sieht der Kommentator: "Your comment is awaiting moderation." => "Ihr Kommentar wartet auf Freischaltung.", // wp-includes/comment.php:2764 "Sorry, you must be logged in to post a comment." => "Um einen Kommentar zu hinterlassen, müssen Sie angemeldet sein.", // wp-includes/comment-template.php:1683 "Log in to leave a Comment" => "Melden Sie sich an, um einen Kommentar zu hinterlassen", // wp-includes/theme-compat/comments-popup.php:107 "Sorry, the comment form is closed at this time." => "Das Kommentarformular ist für diesen Beitrag geschlossen.", // comments-popup.php:68 "Leave a comment" => "Schreiben Sie einen Kommentar", // wp-includes/theme-compat/comments-popup.php:118 "Sorry, no posts matched your criteria." => "Es passt leider kein Beitrag zu Ihrer Suche.", // wp-includes/theme-compat/comments-popup.php:91 "Your Comment" => "Ihr Kommentar", // wp-includes/comment-template.php:1839 wp-includes/comment-template.php:2131 // wp-includes/theme-compat/comments.php:75 "Leave a Reply to %s" => "Schreiben Sie einen Kommentar zu %s", // wp-includes/class-wp-xmlrpc-server.php:5751 "You do not have permission to upload files." => "Sie haben nicht die erforderlichen Rechte, um Dateien hochzuladen.", // wp-includes/comment-template.php:2137 "Post Comment" => "Kommentar senden", ); return $strings; }
Es kann praktisch jeder zu übersetzende Text aus der WP_LAN_DIR/de_DE.po übernommen werden. Die vorgestellte Lösung ist updatesicher, da von WordPress Updates völlig unabhängig. Taucht in einer neuen Version ein neuer Text auf, den man anders übersetzen will, einfach aus der WP_LAN_DIR/de_DE.po übernehmen! |
WordPress-Version zur Artikelerstellung: 4.4.1
Quellen:
www.viper007bond.com/2011/07/13/changing-core-wordpress-strings/
codex.wordpress.org/I18n_for_WordPress_Developers
codex.wordpress.org/Plugin_API/Filter_Reference/gettext
Super, suche gerade nach einer Lösung für update-sichere WP-Core-Sprachänderungen und finde Deinen Artikel hier …
Aber: ist denn der Gettext-Filter nicht ein Horror?! Der wird ja tausendfach während eines Requests aufgerufen! Und jedesmal der Test, ob die Datei nicht schon included ist!? Und dann noch die übrige Logik. Das sieht auf den ersten Blick nach einem echten Performance-Hit aus … gibt’s da nicht einen Hook in load_textdomain(), denn dann liefe das nur einmal und nicht inflationär oft.
Hast Du die Lösung so im Einsatz? Und auch mal den Pagespeed vorher und nachher gemessen – tät‘ mich furchtbar interessieren!
Danke für die Idee,
Frank
Hallo Frank,
danke für deinen Kommentar.
Hab´s bei mir in einem Plugin ausgelagert und mit dem Query Monitor getestet. Seitenaufbau scheint um 0,02 sek. langsamer zu sein.
Grüße,
Ronnie
> Ihre E-Mail-Adresse wird gemäß unseren Datenschutzrichtlinien nicht an Dritte weitergegeben.
Stimmt strenggenommen nicht! Du sendest sie reversibel codiert nach Californien, wo der Zugriff gespeichert wird.
Ist es möglich, anstatt der PHP Datei eine eigene mo File zu „inkludieren“?
Danke