Es ist wichtig, E-Mails an die Benutzer Ihrer Website in deren bevorzugter Sprache zu senden. Zu diesem Zweck bietet WPML eine API, um die bevorzugte Sprache des Benutzers zu speichern, während er die Website nutzt, und diese Präferenz dann beim Senden von E-Mails an ihn anzuwenden.
Dieses Dokument erklärt Plugin- und Theme-Autoren, wie sie ihre Produkte mit der Standard-WordPress-Funktion wp_mail() im Kontext der bevorzugten Sprache integrieren können.
Wann müssen Sie benutzerspezifisch lokalisierte E-Mails senden?
Hier sind Beispiele, die einige typische Fälle veranschaulichen, in denen Sie E-Mails in der vom Benutzer bevorzugten Sprache senden müssen:
- Sie sind ein Website-Administrator und senden einen Newsletter an Abonnenten: Der Website-Administrator ist Franzose und lässt sich die Newsletter-Oberfläche auf Französisch anzeigen. Das Ergebnis: Alle E-Mails werden auf Französisch gesendet. Da Ihre Abonnenten aus der ganzen Welt kommen, werden viele diese E-Mail nicht verstehen.
- Sie betreiben eine Social-Networking-Website: Mitglieder dieser Website können ihre Fotos veröffentlichen. Andere Mitglieder können diese Fotos mit „Gefällt mir“ oder Sternen markieren – wenn sie dies tun, wird der Bildautor per E-Mail informiert. Stellen Sie sich nun dieses Szenario vor:
- Mathias, der Deutscher ist, hat sein Foto veröffentlicht.
- Sein Freund Pierre, der Franzose ist, stößt auf das Foto von Mathias und klickt auf den Gefällt mir-Button.
- Da sich Pierre die Seite während dieser Aktion auf Französisch anzeigen ließ, erhält Mathias eine E-Mail-Benachrichtigung auf Französisch.
- Sie betreiben eine E-Commerce-Website: Wenn ein Produkt vorübergehend nicht verfügbar ist, können Benutzer ihre E-Mail-Adresse hinterlassen, um informiert zu werden, sobald das Produkt wieder auf Lager ist. Ein japanischer Besucher hinterlässt seine E-Mail-Adresse unter einigen der Produkte. Dann aktualisiert der Administrator der Website, der Spanier ist, die Verfügbarkeit. Das Ergebnis: Der japanische Kunde erhält eine automatische E-Mail „Produkt x ist wieder verfügbar“ auf Spanisch, nicht auf Japanisch.
Es gibt viele weitere ähnliche Beispiele, und Sie sind die perfekte Person, um zu wissen, ob dies ein Problem für Ihr Plugin oder Theme darstellen wird.
In all diesen Fällen müssen wir irgendwie die bevorzugte Sprache des Empfängers speichern und dann beim Senden von E-Mails für einen Moment zu dieser Sprache wechseln.
Die Funktion wp_mail() mit WPML-spezifischem Code umschließen
Wenn Sie E-Mails senden, müssen Sie Ihrem Plugin- oder Theme-Code drei zusätzliche Schritte hinzufügen:
- Wechseln Sie den Sprachkontext zu der vom E-Mail-Empfänger bevorzugten Sprache.
- Führen Sie dann Ihren gesamten Code zum eigentlichen Senden der E-Mail aus.
- Wechseln Sie die Sprache zurück zur Sprache der Website.
Der zweite Schritt ist zu diesem Zeitpunkt wahrscheinlich schon bereit. Das Einzige, was Sie tun müssen, ist, zwei zusätzliche, WPML-spezifische Zeilen hinzuzufügen – Sie müssen nur die fett gedruckten Zeilen hinzufügen.
$email = get_option('receiver-email');
// Switch language context…
do_action('wpml_switch_language_for_email', $email);
// your code for sending email:
$subject = __('Hello, World!', 'text-domain');
$message = __('This is our newsletter', 'text-domain');
wp_mail($email, $subject, $message);
// switch language back
do_action('wpml_restore_language_from_email');
Wie Sie sehen können, sind die Änderungen klein, aber Sie müssen die folgenden zwei wichtigen Punkte beachten.
1. Wechseln Sie die Sprache, bevor der allererste E-Mail-Inhalt abgerufen wird
Denken Sie daran, dass Sie die Sprache wechseln, um den E-Mail-Inhalt zu übersetzen. Deshalb müssen Sie daran denken, die richtige Sprache einzustellen, bevor Sie irgendwelche E-Mail-Inhalte – Betreff oder Nachrichteninhalt – abrufen.
Der folgende Code wird nicht funktionieren:
$email = my_func_to_get_receiver_email();
$subject = my_func_to_get_title(); // will come in site’s lang
$message = my_func_to_get_msg_body(); // will come in site’s lang
do_action('wpml_switch_language_for_email', $email);
wp_mail($email, $subject, $message);
do_action('wpml_restore_language_from_email');
Stattdessen sollten Sie Folgendes verwenden:
$email = my_func_to_get_receiver_email();
do_action('wpml_switch_language_for_email', $email);
$subject = my_func_to_get_title(); // will come in receiver’s lang
$message = my_func_to_get_msg_body(); // will come in receiver’s lang
wp_mail($email, $subject, $message);
do_action('wpml_reset_language_after_mailing');
2. Senden Sie keine E-Mails an ein Array von Empfängern
Die Funktion wp_mail() erlaubt es, die $email als Parameter-Array von E-Mails zu übergeben. Leider ist dies nicht zulässig, wenn Sie den E-Mail-Inhalt übersetzbar machen möchten.
Wenn Sie also einen Code haben, der nicht funktioniert, wie dieser hier:
$emails = my_func_get_emails_array(); // array(email1, email2...)
do_action('wpml_switch_language_for_email', $emails); // will not work
$subject = my_func_to_get_title();
$message = my_func_to_get_msg_body();
do_action('wpml_restore_language_from_email');
Sollten Sie ihn wie folgt umschreiben:
$emails = my_func_get_emails_array(); // array(email1, email2...)
foreach($emails as $email) :
do_action('wpml_switch_language_for_email', $email); // now is ok
$subject = my_func_to_get_title();
$message = my_func_to_get_msg_body();
do_action('wpml_restore_language_from_email');
endforeach;
Die Sprache des Empfängers speichern
Sprachinformationen für WP-Benutzer
Wenn Ihre Empfänger als Standard-WordPress-Benutzer registriert sind, müssen Sie die Sprachinformationen nicht speichern und keinen Hook erstellen. Sie können Ihre Benutzer einfach darüber informieren, dass sie ihre bevorzugte Sprache im WordPress-Admin-Bereich unter Profile->Ihr Profil einstellen können.
Diese Informationen werden in einem regulären Benutzer-Metafeld gespeichert. Wenn Sie sie also aus irgendeinem Grund abrufen möchten, können Sie dieses praktische Snippet verwenden:
$user = get_user_by( 'email', $email );
if ( $user && isset( $user->ID ) ) {
$lang = get_user_meta( $user->ID, 'icl_admin_language', true );
}
Wenn Empfänger keine regulären WP-Benutzer sind
Jedes Mal, wenn Ihr Plugin oder Theme eine E-Mail-Adresse registriert, sollten Sie auch die bevorzugte Sprache des Empfängers speichern. Sie benötigen dafür keinen speziellen Ort oder Datentyp. Das Einzige, was Sie tun müssen, ist, einen Filter hinzuzufügen, der die Sprachinformationen zurückgibt. Der Name des Filters lautet wpml_user_language.
Ein Beispielcode, den Sie implementieren müssen, könnte wie folgt aussehen:
add_filter(‘wpml_user_language’, ‘my_recipients_language’, 10, 2);
function my_recipient_language($lang, $email) {
return get_language_from_my_database($email); // implement it in your plugin/theme
}
Sprach-Widget
Wenn Sie eine Frontend-Benutzeroberfläche mit einem Konfigurationspanel für Ihre Abonnenten bereitstellen, können Sie sie mit dem folgenden Action-Hook nach ihrer Sprache fragen:
do_action('wpml_user_language_switcher', array('mail'=>'mail@example.com') );
Bitte beachten Sie, dass Sie mail@example.com durch die tatsächliche E-Mail-Adresse eines aktuellen Abonnenten ersetzen müssen.
Dieser Code zeigt eine Auswahlbox mit den verfügbaren Sprachen an. Wenn ein Abonnent eine auswählt, wird dieser Wert über einen AJAX-Aufruf an den Server gesendet.
Anschließend müssen Sie diese Daten in Ihren Datenbanktabellen speichern. Fügen Sie dazu einen Hook für den Filter wpml_user_language_switcher_save hinzu, wie hier:
add_filter('wpml_user_language_switcher_save', 'my_func', 10, 3);
function my_func($saved, $email, $language) { // your code to save email - language pair, i.e.:
save_language_in_my_database($email, $language);
// if you saved data correctly, return true
return true;
}
Wenn Ihr Filter nicht den Wert true zurückgibt, oder Sie gar keinen Filter dafür haben, wird WPML versuchen, die Sprachinformationen in der Benutzer-Metatabelle zu speichern (siehe nächstes Kapitel).
E-Mails an Adressen senden, die nicht gespeichert sind
Manchmal müssen Sie E-Mails an Adressen senden, die in keiner Datenbanktabelle stehen. Da die Empfänger nicht in Ihrer Datenbank sind, speichern Sie auch nicht die Sprachpräferenzen der Empfänger.
Für diese Fälle erwartet WPML, dass der Sprachcode in einer dieser drei globalen Variablen verfügbar ist:
$_POST['wpml_user_email_language']$_GET['wpml_user_email_language']$GLOBALS['wpml_user_email_language']
So übersetzen Sie E-Mails
Das Übersetzen von E-Mail-Inhalten funktioniert genauso wie das Übersetzen aller anderen Strings auf Ihrer Website. Für detailliertere Informationen zu diesem Thema besuchen Sie bitte unsere Dokumentationsseite zur String-Übersetzung.
Kurz gesagt, stellen Sie sicher, dass Folgendes auf alle Strings angewendet wird, die als E-Mail-Inhalt (Betreff oder Nachrichtentext) verwendet werden:
- Wenn es sich um statische Strings handelt, stellen Sie sicher, dass sie mit den gettext-Funktionen _e() oder __()) lokalisiert sind.
- Wenn sie in der WordPress-Optionstabelle gespeichert sind und mit der Funktion get_option() abgerufen werden, müssen Sie WPML „informieren“, dass sie ebenfalls übersetzbar sind. Dies geschieht über die Sprachkonfigurationsdatei.
Wenn diese Bedingungen in Ihrem Plugin oder Theme erfüllt sind, können Benutzer sie auf der Seite WPML->String-Übersetzung übersetzen.
Praktisches Beispiel
Um ein praktischeres Beispiel für die auf dieser Seite präsentierten Informationen zu sehen, besuchen Sie bitte unseren Blogbeitrag über die Verwendung der WPML Mail API-Integration mit dem Sensei-Plugin.