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:

[php]
add_filter( ‘gettext’, ‘rontranslate_filter_gettext’, 10, 3 );

[/php]
 

Die aufzurufende Funktion dafür könnte folgendermaßen aussehen:
[php]
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;
}
[/php]

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:

[php]
/*
* 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;
}
[/php]

 

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