it-swarm.com.de

So drucken Sie übersetzungsunterstützten Text mit HTML-URL

Ich bin etwas neu in WordPress, wenn es um "tiefere" Anpassungen geht.

Jetzt habe ich diese Funktion:

esc_html_e( 'Dear Guest, with Your information we not find any room at the moment. Please contact us per email [email protected]', 'awebooking' );

Und der Text wird bis jetzt angezeigt.

Aber welche Funktion muss ich verwenden, wenn ich eine ahref (HTML-Link) hinzufügen möchte?

Deshalb möchte ich diesen Text haben:

Sehr geehrter Gast, mit Ihren Angaben finden wir zur Zeit kein Zimmer.

Bitte kontaktieren Sie uns unter unserem <a href="http://www.whitesandsamuiresort.com/contact-us/">contact page</a> oder per email [email protected].

Ich habe Probleme beim Unterstützen der Übersetzung (Internationalisierung/Lokalisierung) und beim gleichzeitigen Ausblenden von HTML-Links.

5
Simon Vetterli

Da esc_html_e den HTML-Link übergeht (daher wird der HTML-Anker als einfacher Text angezeigt), müssen Sie den Text segmentieren und den Nicht-HTML-Teil mit esc_html_e oder esc_html__ übergehen und den HTML-Code drucken LINK-Teil ohne HTML-Escapezeichen.

Methode-1 (nur für Ihr Verständnis):

Sie können es in Teilen so machen:

esc_html_e( 'Dear Guest, with Your information we could not find any room at the moment.', 'text-domain' );
echo "<br><br>";

printf(
    esc_html__( '%1$s %2$s', 'text-domain' ),
    esc_html__( 'Please contact us on our', 'text-domain' ),
    sprintf(
        '<a href="%s">%s</a>',
        esc_url( 'http://www.example.com/contact-us/' ),
        esc_html__( 'Contact Page', 'text-domain' )
    )
);

printf(
    ' or <a href="%s">%s</a>',
    esc_url( 'mailto:[email protected]', array( 'mailto' ) ),
    esc_html__( 'Email', 'text-domain' )
);

Methode-2 (nur für Ihr Verständnis):

Offensichtlich haben verschiedene Sprachen eine unterschiedliche Reihenfolge von Texten. Um den Übersetzern mehr Flexibilität zu bieten (mit dem Ausblenden und Sortieren von Texten), können Sie dies stattdessen auf folgende Weise tun:

printf(
    esc_html__( '%1$s%2$s%3$s%4$s%5$s', 'text-domain' ),
    esc_html__( 'Dear Guest, with Your information we could not find any room at the moment.', 'text-domain' ),
    nl2br( esc_html__( "\n\n", 'text-domain' ) ),
    sprintf(
        esc_html__( '%1$s %2$s', 'text-domain' ),
        esc_html__( 'Please contact us on our', 'text-domain' ),
        sprintf(
            '<a href="%s">%s</a>',
            esc_url( 'http://www.example.com/contact-us/' ),
            esc_html__( 'Contact Page', 'text-domain' )
        )
    ),
    esc_html__( ' or ', 'text-domain' ),
    sprintf(
        '<a href="%s">%s</a>',
        esc_url( 'mailto:[email protected]', array( 'mailto' ) ),
        esc_html__( 'Email', 'text-domain' )
    )
);

So wird es gemacht:

  1. Entfliehen Sie allen notwendigen übersetzten Texten.

  2. Erlaube HTML für Link, Email (mit mailto: Syntax) etc.

  3. Ermöglichen Sie Übersetzern, die unterschiedlichsten Texte für verschiedene Sprachen zu sortieren. Die Argument-Austauschnotation (%1$s, %2$s usw.) wird verwendet, damit die Übersetzer den übersetzten Text bei Bedarf neu anordnen können.


Methode 3 (aktualisiert und empfohlen):

Wie @shea zu Recht hervorhob , Methode-2 funktioniert gut, aber es kann für die Übersetzer schwierig sein, Unterstützung für verschiedene Sprachen hinzuzufügen. Wir brauchen also eine Lösung, die:

  1. Hält die Sätze intakt (unterbricht keine Sätze).

  2. Ist richtig zu entkommen.

  3. Bietet Möglichkeiten, die Reihenfolge der Kontakt- und E-Mail-Links (oder ähnliches) innerhalb des übersetzten Satzes zu ändern.

Um die Komplikation von method-2 zu vermeiden, werden bei der folgenden Lösung die übersetzbaren Sätze intakt gehalten und gleichzeitig die richtigen URL-Escapezeichen und Argumente ausgetauscht (weitere Hinweise in CODE-Kommentaren):

// sample contact url (may be from an unsafe place like user input)
$contact_url = 'http://www.example.com/contact-us/';
// escaping $contact_url
$contact_url = esc_url( $contact_url );

// sample contact email (may be from an unsafe place like user input)
$contact_email = '[email protected]';
// escaping, sanitizing & hiding $contact_email.
// Yes, you may still need to sanitize & escape email while using antispambot() function
$contact_email = esc_url( sprintf( 'mailto:%s', antispambot( sanitize_email( $contact_email ) ) ), array( 'mailto' ) );

esc_html_e( 'Dear Guest, with Your information we could not find any room at the moment.', 'text-domain' );
echo "<br><br>";

printf(
    esc_html__( 'Please contact us on our %1$s or per %2$s.', 'text-domain' ),
    sprintf(
        '<a href="%s">%s</a>',
        $contact_url,
        esc_html__( 'Contact Page', 'text-domain' )
        ),
    sprintf(
        '<a href="%s">%s</a>',
        $contact_email,
        esc_html__( 'Email', 'text-domain' )
        )
    );

Auf diese Weise erhalten Übersetzer zwei vollständige Sätze und zwei separate Wörter zum Übersetzen. Ein Übersetzer muss sich also nur um die folgenden einfachen Zeilen kümmern (während sich der CODE um den Rest kümmert):

esc_html_e( 'Dear Guest, with Your information we could not find any room at the moment.', 'text-domain' );
// ...
esc_html__( 'Please contact us on our %1$s or per %2$s', 'text-domain' )
// ...
esc_html__( 'Contact Page', 'text-domain' )
// ...
esc_html__( 'Email', 'text-domain' )

Das ist es, einfache Struktur und es werden auch die richtigen Flucht- und Argumente ausgetauscht.


Lesen Sie mehr über Internationalisierung für Themen & Internationalisierung für Plugins .

4
Fayaz

Ich finde die Antwort von @Fayaz sehr gut; Sie sind auf jeden Fall auf dem richtigen Weg, da Sie sprintf () verwenden sollten, um Übersetzungen mit HTML und Links zu versehen.

Ich glaube jedoch nicht, dass es eine gute Idee ist, Sätze zur Übersetzung in Teile aufzuteilen, da viele Sprachen unterschiedliche Satzstrukturen haben, die überhaupt nicht mit Englisch kompatibel sind. Durch das Aufteilen einzelner Wörter wird ein Großteil des Kontexts, in dem ein bestimmtes Wort übersetzt wird, unübersetzt, was möglicherweise zu Mehrdeutigkeiten und Übersetzungsfehlern führt.

Stattdessen empfehle ich, Phrasen und Sätze als Ganzes zu übersetzen und dann gegebenenfalls sprintf oder andere Ausweichfunktionen zu verwenden.

Für Ihren Text kann der erste Teil einfach von selbst mit esc_html_e übersetzt werden:

esc_html_e( 'Dear Guest, with your information we not find any room at the moment. ', 'text-domain' );

Der zweite Teil ist etwas schwieriger. Nun gehe ich davon aus, dass Sie die Seiten-URL und die E-Mail-Adresse irgendwie aus der Datenbank abrufen, wahrscheinlich mit get_the_permalink() oder get_option() oder einer anderen Funktion. Ich gehe also davon aus, dass sie in den Variablen $contact_page_url und $contact_email gespeichert sind.

Der erste Schritt besteht darin, die Zeichenfolge ohne die Verknüpfungen zu übersetzen. Beachten Sie, dass wir __() verwenden müssen, ohne an dieser Stelle zu flüchten - das wird später kommen.

__( 'Please contact us on our <a href="%1$s">contact page</a> or by email %2$s.', text-domain' );

Auf diese Weise kann der Übersetzer den Satz nach Bedarf abfassen und die Link-URL und die E-Mail-Adresse an der gewünschten Stelle platzieren.

Der nächste Schritt ist die Verwendung von sprintf(), um die Link-URL und die E-Mail einzufügen. Beachten Sie, dass wir hier esc_url() verwenden, um die URL zu umgehen, und antispambot(), um die E-Mail-Adresse zu verschlüsseln, um einen minimalen Schutz gegen Kratzer zu bieten:

$text = sprintf(
    __( 'Please contact us on our <a href="%1$s">contact page</a> or by email %2$s.', 'text-domain' );
    esc_url( $contact_page_url ),
    sprintf( '<a href="mailto:%1$s">%1$s</a>', antispambot( $contact_email ) );
);

Anstatt esc_html() zu verwenden, müssen wir wp_kses() verwenden, um nur Linkelemente im übersetzten HTML zuzulassen:

echo wp_kses( $text, array( 'a' => array( 'href'  => array() ) ) );

Und das ist es! Der endgültige Code lautet:

esc_html_e( 'Dear Guest, with your information we not find any room at the moment. ', 'text-domain' )

$text = sprintf(
    __( 'Please contact us on our <a href="%1$s">contact page</a> or by email %2$s.', 'text-domain' );
    esc_url( $contact_page_url ),
    sprintf( '<a href="mailto:%1$s">%1$s</a>', antispambot( $contact_email ) );
);

echo wp_kses( $text, array( 'a' => array( 'href'  => array() ) ) );
1
shea