WordPress : Certaines traductions ne fonctionnent pas dans ma classe de modèle
J’ai du mal avec les traductions de mon thème. J’utilise la fonction get_permalink_date
de 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_n
Traduire une chaîne au pluriel_x
Traduire une chaîne avec un contexte_nx
Traduire une chaîne avec un contexte et un pluriel
Toutes ces fonctions ont également des variantes avec esc_html_
ou devantesc_attr_
_e
La _e
variante 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 >
) 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.
0 commentaire