web-dev-qa-db-fra.com

Comment faire un texte avec hyperlien traduisible dans WordPress?

J'ai vu différentes façons de créer un texte avec un lien hypertexte à traduire. Cependant, je suis incapable de trouver une seule pratique exemplaire.

Alors, voici certaines des solutions que j'ai trouvées:

// METHOD 1
sprintf( __( 'Please read %1$sthis%2$s.', 'tacoverdo-example-domain' ), '<a target="_blank" href="' . esc_url( 'https://goo.gl' ) . '">', '</a>' );

// METHOD 2
echo '<a target="_blank" href="' . esc_url( 'https://goo.gl' ) . '">';
_e( 'Please read this.', 'tacoverdo-example-domain' );
echo '</a>';

// METHOD 3
sprintf( __( 'Please read <a href="%s">this</a>.', 'tacoverdo-example-domain' ), esc_url( 'https://goo.gl' ) );

// METHOD 4
sprintf( __( 'Please read %sthis%s.', 'tacoverdo-example-domain' ), '<a target="_blank" href="' . esc_url( 'https://goo.gl' ) . '">', '</a>' );

// METHOD 5
_e( 'Please read <a target="_blank" href="' . esc_url( 'https://goo.gl' ) . '">this</a>', 'tacoverdo-example-domain' );

Ma première pensée serait que la méthode 1 serait la meilleure. Il n'est pas nécessaire que vos traducteurs connaissent le HTML. Mais cela ne permet pas non plus à ceux qui le font de jouer avec. Il est également assez DRY (ne vous répétez pas) car vous n'avez pas à traduire toute la partie HTML, encore et encore.

Cependant, en postant cette question sur Twitter, les gens ont répondu que la méthode 3 serait la meilleure solution, comme vous pouvez le constater ici .

Alors, comment dois-je créer un texte avec hyperlien à traduire dans WordPress?

12
Taco Verdo

C'est un problème très complexe. Il combine les problèmes de contenu HTML inhérents à une nouvelle charge de traduction, telle que l'analyse des chaînes, le processus de traduction lui-même et sa vérification.

Nous devons donc combiner:

  1. Texte (sous forme traduisible)
  2. Balisage HTML (dans une forme difficile à casser, mais de préférence flexible)
  3. Destination de l'URL (sous forme sécurisée et de préférence traduisible, peut être spécifique à la langue!)

Nous devons également tenir compte de la familiarité et de l’état de la technique, en d’autres termes - de ce que ferait le noyau. Ok, cela n’aide en rien que la vérification rapide permette au noyau de le faire dans la plupart (sinon toutes) de ces manières.

De ces facteurs et de la discussion qui entoure je dirais qu'il existe trois catégories d'approches, en fonction des besoins et des priorités.

Simple - une chaîne avec tout

__( 'Please read <a href="https://goo.gl">this</a>', 'example-domain' );
  • facile à suivre dans le code
  • permet de traduire toutes les parties (texte, balises, URL) dans leur ensemble
  • URL codée en dur
  • sujet aux sauts de HTML
  • populaire dans le noyau

Équilibré - URL éclatée

sprintf( 
    __( 'Please read <a href="%s">this</a>', 'example-domain' ), 
    esc_url( 'https://goo.gl' ) 
);
  • facile à suivre
  • peut traduire toutes les parties, mais les URL nécessitent un appel de traduction séparé
  • L'URL peut être dynamique et échappé
  • sujet aux sauts de HTML
  • populaire dans le noyau
  • anecdotique populaire auprès des développeurs/traducteurs

Partiel - Balisage éclaté

sprintf( 
    __( 'Please read %1$sthis%2$s.', 'example-domain' ), 
    '<a href="' . esc_url( 'https://goo.gl' ) . '">',
    '</a>' 
);

ou par concaténation

'<a href="' . esc_url( 'https://goo.gl' ) . '">' 
. __( 'Please read this.', 'example-domain' );
. '</a>';
  • moins lisible
  • plus résistant aux ruptures HTML
  • moins populaire dans le noyau
  • besoin de plus de contexte fourni pour la traduction

Règle du pouce (pour autant que je le voie)

  1. simple pour le garder le plus simple possible
  2. morcellement pour éviter les ruptures HTML
  3. équilibré pour tous les autres cas (probablement le plus fréquent)
14
Rarst

De nos jours, je travaille avec de nombreux sites Web multilingues et je dois dire:

  1. Les URL des liens doivent souvent être traduisibles.
  2. La sortie de la fonction de traduction de confiance est mauvaise. Je n’utilise pratiquement jamais __() mais toujours esc_html__()/esc_attr__(). Ce qui signifie que la chaîne à traduire ne peut contenir aucun code HTML.
  3. En anglais, nous ne réalisons souvent pas que dans d'autres langues, un mot peut être écrit de différentes manières en fonction du contexte. Ainsi, lorsque le texte contient 1 ou quelques mots, il est toujours préférable d’utiliser la variante *_x() de la traduction de fonctions.
  4. inclure plus d'un espace réservé pour chaque chaîne traduisible peut être "dangereux". Si le traducteur n'est pas un développeur, il va facilement interrompre le rendu de la page. Dans l'exemple %1$sthis%2$s, un traducteur non technique ne comprend pas que s juste avant this est nécessaire pour un rendu correct et peut également penser que le développeur voulait taper this mais avait une faute de frappe et écrit sthis.

Pour toutes ces raisons, traduire correctement le texte contenant des liens est difficile. La seule solution viable qui prend en compte tout ce qui précède est:

$anchor = esc_html_x( 'Google', 'link text for google.com', 'txt-domain' );
$domain = esc_url( __( 'google.com', 'txt-domain' ) );  
$link   = sprintf( '<a href="https://%s">%s</a>', $domain, $anchor );

 /* translators: 1 is a link with text "Google" and URL google.com */
echo sprintf( esc_html__( 'Use %1$s to search.', 'example-domain' ), $link );

Ce qui est sûr et facile à traduire par des personnes non techniques, mais aussi verbeux et un PITA à mettre en œuvre, surtout si cela doit être fait pour plusieurs liens ...

Cependant, pour un code publié dans la nature avec des milliers d'utilisateurs (réels ou potentiels) parlant plusieurs langues, c'est ce que je prendrais.

C’est ce que je retiens même pour le code à usage interne uniquement, mais c’est moi.


Note:

Il peut sembler excessif de rendre le mot "Google" traduisible séparément, ce qui est probablement vrai pour ce cas particulier. Mais parfois, même supposer que les noms de marque est faux. Pour citer un exemple, en Italie, nous avons la marque "Algida" qui est connue avec ~ 30 noms différents dans le monde entier .

Dans ce cas, le codage en dur de l'URL et/ou du nom de la marque posera problème.

Fournir un contexte pour la traduction aidera les traducteurs à décider s'ils ont besoin de traduire le nom de marque ou non.

5
gmazzap

Vous devez conserver le balisage dans la chaîne à traduire, car les traducteurs doivent savoir / il existe un lien. Dans certaines langues, le texte du lien résultant peut couvrir plusieurs mots, il peut même y avoir une virgule (ou un équivalent) à l'intérieur ou un autre balisage à imbriquer correctement.

Il est également important de créer un lien texte parlant, pas this ou here .

2 ou 3 sont les seules options traduisibles, mais vous devez également rendre l'URL traduisible.

2
fuxia