Support » Allgemeine Fragen » Emails übersetzen in die Sprache des Users

  • Hallo zusammen,

    folgendes Szenario: Ein Admin schaltet eine Funktion o.ä. für einen User frei (im WordPress Frontend). Nun soll der User darüber per Mail informiert werden. Deshalb wird ein AJAX Call ans WordPress Backend gesendet. Dort soll die Mail in der vom User eingestellten Sprache versendet werden.

    Hier mein Code dazu:

    add_action('wp_ajax_handle_action', 'handle_action');
    function handle_action(){
    	$username = $_POST['username'];
    	$user = get_user_by('login', $username);
    	$user_id = $user->ID;
    	$email = $user->user_email;
            // To check if user lang is set correct; it is set to 'en'; all good
    	$lang = get_user_meta( $user_id, 'icl_admin_language', true );
    	// Switch language to user language
    	$locale_switched = switch_to_locale( get_user_locale($user_id) );
    
            $subject = __('Mein Betreff, 'mydomain');
            $message = __('Nur ein Test', 'mydomain');
            $headers = array('From: John <john@test.de>', 'Reply-To: john@test.de', 'Content-Type: text/html; charset=UTF-8');
    
            wp_mail( $email, $subject, $message, $headers );
    
            if ( $locale_switched ) {
    		restore_previous_locale();
    	}
            echo 'success';
            die();
    }

    Aber leider wird die Mail auf Deutsch gesendet. Die Strings werden nicht übersetzt, obwohl zu diesen Strings Übersetzung vorliegen (die auch an anderer Stelle korrekt funktionieren beispielsweise wenn der User in seiner Sprache eine Seite aufruft).

    Was übersehe ich? Warum werden die Strings nicht in die Sprache des Users (en) übersetzt?

    Viele Dank für eure Meinung!

Ansicht von 7 Antworten - 1 bis 7 (von insgesamt 7)
  • $subject = __('Mein Betreff, 'mydomain');

    Abgesehen vom Syntaxfehler ergibt das so keinen Sinn.

    Die Übersetzungsfunktion wird in der Referenz so angegeben:

    __( string $text, string $domain = 'default' )

    Hier ist die Zeichenkette $text der Originaltext in Englisch als Weltsprache, also z.B. My Subject.

    Mit der Zeichenkette $domain wird ein Bereich in WordPress angegeben, für den die Übersetzung gelten soll. Damit soll vermieden werden, dass mehrdeutige Begriffe („Absatz“ am Schuh und im Text, „Bank“ zum Sitzen, fürs Geld …) im falschen Kontext falsch übersetzt werden.

    mydomain als Textdomain macht aber nur Sinn, wenn du auch eine Textdomain mydomain lädst. In Plugins verwendest du dafür die Funktion load_plugin_textdomain():

    add_action( 'init', 'wpdocs_load_textdomain' );
      
    /**
     * Load plugin textdomain.
     */
    function wpdocs_load_textdomain() {
      load_plugin_textdomain( 'mydomain', false, dirname( plugin_basename( __FILE__ ) ) . '/languages' ); 
    }

    Unter https://developer.wordpress.org/plugins/internationalization/how-to-internationalize-your-plugin/ kannst du die bis hierhin genannten Punkte nachlesen.

    Mit einem externen Programm wie z.B. Poedit kannst du dann noch für dein Plugin eine Übersetzungsvorlage (.pot-Datei) erstellen, die alle zu übersetzenden Zeichenketten enthält. Mit dieser Vorlage kannst du dann die Übersetzung erstellen und als pluginname-de_DE.po und pluginname-de_DE.mo im Verzeichnis languages deines Plugins ablegen.

    Du setzt nirgendwo die Sprache. Du fragst sie nur ab.

    Vielleicht irgendwie so

    $get_language = get_user_meta( get_current_user_id(), 'user_language', true );
     do_action( 'wpml_switch_language', $get_language );
    

    https://wpml.org/forums/topic/set-users-default-language-using-php/

    Im wpml forum wäre die Frage wohl besser aufgehoben.

    • Diese Antwort wurde geändert vor 2 Jahren, 8 Monaten von danthefan.

    @danthefan Woraus entnimmst du, dass @thehotte84 WPML verwendet?

    Ich vermute mein Beitrag ist quatsch.
    Danke.

    Thread-Starter thehotte84

    (@thehotte84)

    Danke für eure Hinweis.

    1. Oh sorry, da ist mir ein ‚ durchgegangen. Ist aber im Quellcode natürlich enthalten.
    2. Den Ablauf habe ich so auch verstanden. Laden tue ich die domain auch im selben Plugin:

    function my_plugin_load_plugin_textdomain() {
        load_plugin_textdomain( 'mydomain', FALSE, basename( dirname( __FILE__ ) ) . '/' );
    }
    add_action( 'init', 'my_plugin_load_plugin_textdomain' );

    Das funktioniert auch mit allen Sprachen und allen übersetzen Strings wunderbar, nur halt in diesem konkreten Fall leider nicht.

    3. Warum ergibt das keinen Sinn? Da meine Hauptsprache deutsch ist, definiere ich alle zu übersetzenden Strings im Code auf deutsch. Dies entspricht ja dann nachher praktisch dem Identifier für diesen String. Mit dem Plugin Loco Translate übersetze ich die Strings dann, wobei .mo und .po Files erzeugt werden. Funktioniert so wie gesagt wunderbar. Wurde ein String noch nicht übersetzt, wird halt der deutsche Identifier angezeigt. Spricht da etwas gegen?

    4. Abgelegt habe ich die .mo und .po Files allerdings im Root Verzeichnis der Plugins. Also unter / und nicht unter /languages. Könnte das ein Problem sein? Würde mich aber wundern, da es an allen anderen Stellen wunderbar funktioniert.

    5. Für mein Verständnis brauche ich die Sprache nicht explizit auswählen. Die Zeile

    $locale_switched = switch_to_locale( get_user_locale($user_id) );

    sollte das erledigen. Die Sprache wird anhand der User ID ausgewählt und auf diese wird umgeschaltet. Oder sehe ich das falsch? Denke ich da zu einfach?

    6. In der Tat nutze ich WPML für die Übersetzung von Seiten, Menüführung, Sprachumschalter etc. Allerdings nicht für Strings im PHP Code. Dafür hat sich der Weg mit Loco Translate für mich bewährt und deshalb nutze ich „String Translate“ von WPML nicht. Aus meiner Sicht müsste das hier also komplett entkoppelt von WPML sein. Oder kann da ein Konflikt liegen? Wenn ja: Warum funktioniert das alles dann problemlos an anderen Stellen (beispielsweise wenn ich einen Short-Code einbinde und die Strings innerhalb dieses Short-Code übersetze)?

    Du nimmst vieles als gegeben hin, das wir erst einmal hinterfragen müssen.

    Falsche Syntax, aber in deinem Quellcode stimmt’s? OK, aber woher sollen wir das wissen?
    Du kennst die Funktion load_plugin_textdomain(), erwähnst sie aber mit keiner Silbe? OK, aber woher sollen wir das wissen?
    Du verwendest die Übersetzungsfunktion für eine deutschsprachige Zeichenkette? Natürlich spricht nichts dagegen, dass du das zuhause machst. Wenn du hier fragst, werde ich dir antworten, wie es sonst üblich ist oder in der Referenz beschrieben wird. Da die Plugin-Übersetzung üblicherweise aus dem Englischen erfolgt, ergibt für mich die Übersetzung eines deutsprachigen Texts erst einmal keinen Sinn. Für dich schon? OK, aber woher … naja, siehe oben.

    Wo du deine Sprachdateien ablegst, hängt von der Textdomain ab, die du angibst. Wenn du kein Verzeichnis /languages verwendest, sondern statt dessen alles in eine große Sockenschublade wirfst, ist das völlig OK.

    Thread-Starter thehotte84

    (@thehotte84)

    Völlig ok. Deshalb habe ich es erläutert, war mir nicht bewusst.

    Hast du eine Idee warum es scheitern könnte? Was könnte ich noch versuchen?

Ansicht von 7 Antworten - 1 bis 7 (von insgesamt 7)
  • Das Thema „Emails übersetzen in die Sprache des Users“ ist für neue Antworten geschlossen.