WordPress : Certaines traductions ne fonctionnent pas dans ma classe de modèle

Publié par Jean-Michel le

J’ai du mal avec les traductions de mon thème. J’utilise la fonction get_permalink_datede ma classe. L’extrait pertinent est :

$permalink_title = sprintf(
    /* translators: 1 = Post Title, 2 = Author Name */
    esc_html_x( '%1$s by %2$s', 'permalink title', 'themeberger' ),
    __( 'A post', 'themeberger' ),
    get_the_author_meta( 'display_name', $this->post->post_author )
);

Ce que je ne comprends pas, c’est que la traduction de __();fonctionne, mais esc_html_x();ne fonctionne pas. J’espère que quelqu’un pourra m’aider.

La partie pertinente du fichier .po est :

#. translators: %1$s: Post Title. %2$s: Author Name.
#: themeberger/class-themeberger-post-functions.php:237
msgid "%1$s by %2$s"
msgstr "%1$s von %2$s"

#: themeberger/class-themeberger-post-functions.php:238
msgid "A post"
msgstr "Ein Beitrag"

La sortie est<a href="[...]" title="Ein Beitrag by Christian Hockenberger">[...]</a>

Je ne comprends vraiment pas. Dans une autre ligne _x( '%s ago', '%s = human-readable time difference', 'themeberger' )ne fonctionne pas non plus. J’ai d’abord pensé que pour une raison quelconque, les traductions ne sont pas transférées à la classe, mais __();fonctionnent.

Que puis-je faire?

Solution n°1 trouvée

Vous essayez de traduire une chaîne avec un contexte mais dans votre fichier po votre chaîne ne déclare pas de contexte

Pour déclarer un contexte dans votre fichier po, vous devez utilisermsgctxt

msgctxt "permalink title"
msgid "%1$s by %2$s"
msgstr "%1$s von %2$s"

Vous pouvez trouver plus de documentation sur la façon de formater votre fichier PO ici (c’est très simple, il n’y a que 5 déclarations différentes)

Ou supprimez le contexte de votre chaîne comme ceci

esc_html_x( '%1$s by %2$s', 'permalink title', 'themeberger' ); //With context
esc_html__( '%1$s by %2$s', 'themeberger' ); //Without context

Vous pouvez trouver des informations sur la façon d’utiliser les fonctions d’internationalisation de wordpress ici

La documentation est assez incomplète donc je vais ajouter une liste des fonctions disponibles

  • __Traduction de base
  • _nTraduire une chaîne au pluriel
  • _xTraduire une chaîne avec un contexte
  • _nxTraduire une chaîne avec un contexte et un pluriel

Toutes ces fonctions ont également des variantes avec esc_html_ou devantesc_attr__e

La _evariante fera simplement écho à la chaîne au lieu de la renvoyer (je ne recommande pas de l’utiliser car parfois vous voudrez sprintf dans votre chaîne mais si vous utilisez _e dans un sprintf cela ne fonctionnera pas et c’est difficile à attraper)

La esc_html_variante échappera la chaîne à afficher en html (par exemple: >devient &gt;) Vous devriez presque toujours l’utiliser dans les modèles car elle augmente la sécurité en empêchant XSS (certaines traductions sont publiques)

La esc_attr_variante doit TOUJOURS être utilisée dans un attribut html car elle échappera aux guillemets et autres qui casseraient votre attribut

Exemple:

<a href="<?php esc_attr_e('https://domain.com/en/content/', 'domain') ?>"><?php esc_html_e('My link', 'domain') ?></a>

Vous pouvez également regarder le code source pour voir toutes les fonctions déclarées

Solution n°2 trouvée

D’accord, il semble que j’ai été submergé par la quantité de fonctions de traduction des chaînes. Les fonctions avec un ‘x’ dans leur nom ont besoin d’un contexte gettext. Je n’ai pas ça pour mes cordes, donc ça n’a pas marché.

esc_html_x();remplacé par esc_html__();et _x();remplacé par __();est la solution simple.

Embarrassant pour moi, j’espère utile pour quelqu’un d’autre.

Catégories : Wordpress

Jean-Michel

Jean-Michel est en charge de la partie blog du site. Il met en place la stratégie de contenu et répond aux questions fréquentes sur Wordpress.

0 commentaire

Laisser un commentaire

Avatar placeholder

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *