web-dev-qa-db-fra.com

Comment imprimer un texte pris en charge par la traduction avec une URL HTML

Je suis un peu nouveau dans WordPress s'il s'agit d'une personnalisation "plus profonde".

Maintenant, j'ai cette fonction:

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

Et le texte montre jusqu'à présent.

Mais que function dois-je utiliser lorsque j'aime ajouter une variable ahref (lien HTML)?

Donc j'aime bien avoir ce texte:

Cher client, avec votre information, nous ne trouvons aucune chambre pour le moment.

S'il vous plaît contactez-nous sur notre <a href="http://www.whitesandsamuiresort.com/contact-us/">contact page</a> ou par email [email protected].

J'ai des problèmes pour supporter la traduction (internationalisation/localisation) et échapper en même temps aux liens HTML.

5
Simon Vetterli

Puisque esc_html_e échappera au lien HTML (et affichera donc l'ancre HTML sous forme de texte brut), vous devrez segmenter le texte et échapper à la partie non HTML avec esc_html_e ou esc_html__ _, et imprimer la partie HTML LINK sans échappement HTML.

Méthode 1 (juste pour votre compréhension):

Vous pouvez le faire en plusieurs parties, comme ceci:

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' )
);

Méthode 2 (juste pour votre compréhension):

Évidemment, les textes des différentes langues auront un ordre de texte différent. Par conséquent, pour donner plus de flexibilité aux traducteurs (avec l'échappement et le classement du texte), vous pouvez le faire de la manière suivante:

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' )
    )
);

Cette façon de faire va:

  1. Échapper à tous les textes traduits nécessaires.

  2. Autoriser le code HTML pour le lien, le courrier électronique (avec la syntaxe mailto:), etc.

  3. Autoriser les traducteurs à avoir toutes sortes de commandes de textes pour différentes langues. La notation de substitution d'argument (%1$s, %2$s etc.) est utilisée afin que les traducteurs puissent réorganiser le texte traduit si nécessaire.


Méthode 3 (mise à jour et recommandée):

Comme @shea a fait remarquer à juste titre } _, Méthode-2 ci-dessus fonctionne bien, mais il peut être difficile pour les traducteurs d'ajouter la prise en charge de différentes langues. Nous avons donc besoin d'une solution qui:

  1. Garde les phrases intactes (ne casse pas les phrases).

  2. Est-ce que s'échapper correctement.

  3. Fournit des moyens d'avoir différents ordres pour les liens de contact et de courrier électronique (ou quelque chose de similaire) dans la phrase traduite.

Donc, pour éviter la complication de method-2 , la solution ci-dessous conserve les phrases traduisibles et fait en sorte que l'URL appropriée s'échappe et permute les arguments en même temps (plus de notes dans les commentaires CODE):

// 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' )
        )
    );

Cette façon de faire donnera aux traducteurs deux phrases complètes et deux mots distincts à traduire. Ainsi, un traducteur n'aura à se soucier que des lignes simples suivantes (pendant que CODE s'occupe du reste):

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' )

C'est ça, une structure simple et une évasion correcte et un échange d'arguments.


En savoir plus sur internationalisation pour les thèmes _ et internationalisation pour les plug-ins .

4
Fayaz

Je pense que la réponse de @Fayaz est très bonne; ils sont vraiment sur le bon chemin car vous devez utiliser sprintf () entourant les traductions pour inclure des éléments tels que HTML et des liens.

Cependant, je ne pense pas que ce soit une bonne idée de scinder les phrases en parties pour la traduction, car de nombreuses langues ont des structures de phrases différentes qui ne sont pas du tout compatibles avec l'anglais. En séparant des mots individuels, une grande partie du contexte dans lequel un mot spécifique est traduit est complexe, ce qui peut conduire à une ambiguïté et à des erreurs de traduction.

Au lieu de cela, je recommande de traduire les phrases et les phrases dans leur ensemble, puis d'utiliser sprintf ou différentes fonctions esccaping, le cas échéant.

Pour votre texte, la première partie peut simplement être traduite par elle-même avec esc_html_e:

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

La deuxième partie est légèrement plus dure. Maintenant, je suppose que vous récupérez l'URL de la page et le courrier électronique de la base de données d'une manière ou d'une autre, en utilisant probablement get_the_permalink() ou get_option() ou une autre fonction. Je suppose donc qu'elles sont stockées dans les variables $contact_page_url et $contact_email.

La première étape consiste à traduire la chaîne, sans les liens. Notez que nous devons utiliser __() sans nous échapper à ce stade - cela viendra plus tard.

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

De cette façon, le traducteur est libre de rédiger la phrase si nécessaire et de placer l'URL du lien et le courrier électronique à l'endroit souhaité.

L'étape suivante consiste à utiliser sprintf() pour insérer l'URL du lien et le courrier électronique. Notez que nous utilisons esc_url() ici pour échapper à l'URL, ainsi que antispambot() pour coder l'adresse électronique afin de fournir une protection minimale contre les scrapers:

$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 ) );
);

Enfin, plutôt que d'utiliser esc_html(), nous devons utiliser wp_kses() pour n'autoriser que les éléments de lien dans le code HTML traduit:

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

Et c'est tout! Le code final est:

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