Comment rendre un texte avec hyperlien traduisible dans WordPress?

15

J'ai vu différentes façons de faire un texte avec un lien hypertexte traduisible. Cependant, je n'ai pas pu trouver une seule meilleure pratique.

Voici donc quelques-unes 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 ne nécessite pas que vos traducteurs connaissent le HTML. Mais cela ne permet pas non plus à ceux qui le font de jouer avec. Il est également assez SEC (ne vous répétez pas) car vous n'avez pas à traduire la partie HTML entière encore et encore.

Cependant, lors de la publication de cette question sur Twitter, les gens ont répondu que la méthode 3 serait la meilleure comme vous pouvez le voir ici .

Alors, comment dois-je faire pour traduire un texte avec un lien hypertexte dans WordPress?

Taco Verdo
la source

Réponses:

17

C'est un problème très complexe. Il combine des problèmes de contenu HTML inhérents avec une nouvelle charge de défis de traduction, tels que la recherche de 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 (sous une forme difficile à casser, mais de préférence flexible)
  3. Destination 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 - ce que le noyau ferait. Ok, cela n'aide pas que, grâce à une vérification rapide, le noyau le fasse dans la plupart (sinon la totalité) de ces façons.

D'après ces facteurs et la discussion qui l'entoure, je dirais qu'il existe trois catégories d'approches, selon les besoins et les 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, balisage, URL) dans leur ensemble
  • URL codée en dur
  • sujettes aux ruptures 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 distinct
  • L'URL peut être dynamique et échappée
  • sujettes aux ruptures HTML
  • populaire dans le noyau
  • anecdotique populaire auprès des développeurs / traducteurs

Morceau par morceaux - balisage éclaté

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

ou via 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
  • nécessite plus de contexte pour la traduction

Règle générale (pour autant que je le vois)

  1. simple pour le garder aussi simple que possible
  2. au coup par coup pour éviter les ruptures HTML
  3. équilibré pour tous les autres cas (probablement le plus courant)
Rarst
la source
+1. J'aime l'option "Balanced", peut-être peut-être améliorée en ajoutant du contexte en utilisant _xau lieu de__
gmazzap
Je voulais des extraits de code comme exemples de base plutôt que exhaustifs. Il y aura probablement des variations dans chacun en raison du grand nombre de scénarios et de fonctions de traduction.
Rarst
L'option équilibrée a également le problème que les traducteurs peuvent créer un mauvais balisage. Pour une traduction sûre et sécurisée, il vaut mieux que vous excluiez html. Je vote également pour des fonctions de traduction avec contexte Cela donne aux traducteurs la chance de comprendre comment sans connaître la position, le contexte dans le plugin, le thème.
bueltge
J'ai déjà entendu l'argument «les traducteurs ont besoin de contexte», mais cela me fait me demander. Pour quoi ont-ils besoin de contexte dans cet exemple ? Je pense que c'est une bonne pratique de fournir du contexte en cas de besoin, mais les traducteurs en ont-ils vraiment besoin dans ce cas? Ont -ils besoin de savoir si %ssignifie <strong>ou <a href target="#">? Cela influence-t-il leur traduction?
Taco Verdo
@TacoVerdo si le lien est réparti Je suppose que le texte sans que cela pourrait très bien être ambiguë, dans ce cas , le contexte devrait dire quelle destination le texte est pour. Le contexte sert à remplir les informations jusqu'à ce qu'elles soient complètes et sans ambiguïté. Lorsque vous divisez du texte en petits morceaux autonomes, chacun d'eux a besoin de plus de contexte pour savoir où il s'intègre dans l'ensemble.
Rarst
7

Ces jours-ci, 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 quasiment jamais __()mais toujours esc_html__()/ esc_attr__(). Ce qui signifie que la chaîne à traduire ne peut contenir aucun code HTML.
  3. En écrivant en anglais, nous ne réalisons pas souvent que dans d'autres langues, un mot peut être écrit de différentes manières selon le contexte. Ainsi, lorsque le texte contient 1 ou quelques mots, il est toujours préférable d'utiliser la *_x()variante des fonctions de traduction.
  4. inclure plusieurs espaces réservés pour chaque chaîne traduisible peut être "dangereux". Si le traducteur n'est pas un développeur, il interrompra facilement le rendu de la page. Dans l'exemple, %1$sthis%2$sun traducteur non technique ne comprend pas que le sjuste avant thisest nécessaire pour un rendu correct, et peut également penser que le développeur voulait taper thismais avait une faute de frappe et a écrit sthis.

Pour toutes ces raisons, la traduction "correcte" du 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 à implémenter, 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 la voie que je prendrais.

C'est en fait la façon dont je prends même pour le code à usage interne uniquement, mais c'est moi.


Remarque :

Cela peut sembler trop pour rendre le mot "Google" traduisible séparément, et c'est probablement vrai pour ce cas spécifique. Mais parfois, même supposer que les noms de marque sont faux. Pour ne citer qu'un exemple, en Italie nous avons la marque "Algida" qui est connue avec environ 30 noms différents dans le monde .

Dans ce cas, le codage en dur de l'URL et / ou du nom de la marque entraînera des problèmes.

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

gmazzap
la source
2

Vous devez conserver le balisage dans la chaîne traduisible, car les traducteurs doivent savoir qu'il existe un lien. Dans certaines langues, le texte du lien résultant peut s'étendre sur plusieurs mots, il peut même y avoir une virgule (ou un équivalent) à l'intérieur ou un autre balisage qui doit être imbriqué correctement.

Il est également important de créer un texte de lien parlant, pas celui-ci ou ici .

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

fuxia
la source