Le WordPress d'aujourd'hui, décodé pour les développeurs

Multilingue

Concaténer des morceaux de phrases traduites séparément casse la grammaire

Un antipatron discret qui fonctionne en français mais brise l'ordre des mots dès qu'on change de langue : la concaténation de fragments traduits isolément.

Par WordPress Développement • 23 juillet 2022 • 5 min de lecture • Aucun commentaire
Concaténer des morceaux de phrases traduites séparément casse la grammaire

__( 'Livré' ) . ' ' . __( 'le' ) . ' ' . $date : cette ligne fonctionne parfaitement en français. Elle devient incompréhensible, ou grammaticalement fausse, dans la moitié des langues du monde. C’est pourtant un motif qu’on retrouve régulièrement dans du code WordPress écrit sans intention malveillante, simplement parce que chaque petit bout de phrase semblait plus simple à traduire séparément.

Cet article détaille pourquoi ce découpage casse la grammaire dès qu’on sort du français, et comment le remplacer par des chaînes complètes assemblées avec des espaces réservés numérotés.

Le piège : traduire des fragments plutôt que des phrases

Le réflexe vient souvent d’une volonté de factoriser : au lieu d’écrire une phrase complète pour chaque contexte, un développeur assemble une phrase à partir de petits morceaux réutilisables. Par exemple, pour afficher un statut de commande :

echo __( 'Commande' ) . ' n°' . $id . ' ' . __( 'expédiée' ) . ' ' . __( 'le' ) . ' ' . $date;

En français, l’ordre « Commande n°42 expédiée le 12 juillet » est correct. Mais en allemand, l’ordre des mots dans une phrase de ce type diffère selon que le verbe est conjugué ou non ; en japonais, le verbe se place en fin de phrase ; en arabe, la structure sujet-verbe peut s’inverser selon le contexte. Le traducteur reçoit des fragments isolés — « Commande », « expédiée », « le » — sans jamais voir la phrase complète qu’ils doivent former. Il ne peut ni réordonner les mots, ni adapter les accords.

La correction : une chaîne complète avec des placeholders numérotés

La fonction sprintf() de PHP accepte des espaces réservés numérotés au format %1$s, %2$s, qui peuvent être répétés ou réordonnés librement dans la chaîne traduite, indépendamment de leur ordre d’apparition dans le code source.

L'essentiel à retenir : Chaque fragment traduit isolément perd son contexte grammatical ; sprintf avec placeholders numérotés résout l'ordre des mots ; Les commentaires translators guident le traducteur
/* translators: 1: numéro de commande, 2: date d'expédition */
echo sprintf(
    __( 'Commande n°%1$s expédiée le %2$s', 'mon-theme' ),
    $id,
    $date
);

Cette fois, le traducteur reçoit une phrase entière, avec son sens complet, et peut la reconstruire dans l’ordre naturel de sa langue en plaçant %2$s avant %1$s si nécessaire. Rien n’oblige à respecter l’ordre du code source : c’est justement l’intérêt des placeholders numérotés par rapport aux %s non numérotés, qui imposent un ordre fixe.

Le rôle du commentaire translators

Un commentaire commençant par /* translators: ... */, placé juste avant l’appel à la fonction de traduction, est extrait automatiquement par l’outil wp i18n make-pot et affiché au traducteur dans son logiciel de traduction. Sans ce commentaire, un traducteur qui ne lit pas le code source ne sait pas que %1$s désigne un numéro de commande et %2$s une date : il devine, et se trompe parfois.

  • Un commentaire par chaîne contenant un espace réservé, pas un commentaire générique en tête de fichier.
  • Une description courte de ce que représente chaque %d dans l’ordre.
  • Aucune abréviation obscure : le traducteur ne connaît pas forcément le jargon du projet.

Pourquoi ce n’est pas qu’une question de grammaire

Le problème dépasse l’ordre des mots. Certaines langues déclinent les mots selon leur fonction dans la phrase : un nom traduit isolément dans un fragment ne porte pas la même forme selon qu’il est sujet, complément ou précédé d’une préposition. En finnois par exemple, un même substantif prend des suffixes différents selon le cas grammatical requis par la phrase. Traduire ce substantif seul, hors contexte, produit une forme qui ne s’accorde avec rien une fois réinséré dans la phrase concaténée.

Le pluriel pose un problème voisin : « 1 article » et « 3 articles » ne se traduisent pas en ajoutant simplement un « s » dans toutes les langues. WordPress fournit _n() précisément pour cela, en laissant le fichier de traduction définir ses propres règles de pluriel via l’en-tête Plural-Forms.

printf(
    _n( '%d article dans le panier', '%d articles dans le panier', $count, 'mon-theme' ),
    $count
);

Repérer le motif dans une base de code existante

Une recherche de motifs comme __( ' suivi de plusieurs occurrences sur la même ligne, séparées par des points de concaténation, permet de repérer rapidement les cas suspects dans un thème ou une extension. Ce n’est pas infaillible — certaines concaténations de fragments traduits sont légitimes, par exemple pour assembler une liste d’éléments dynamiques — mais cela suffit à cibler une revue de code plus fine.

En résumé

Un fragment de phrase traduit isolément n’est jamais garanti de bien se recombiner dans une autre langue : ni l’ordre, ni les accords, ni les formes de pluriel ne suivent les mêmes règles qu’en français. Écrire des chaînes complètes avec des espaces réservés numérotés, accompagnées d’un commentaire translators précis, coûte quelques secondes de plus à la rédaction et évite des heures de correction une fois le site traduit dans une langue à la structure éloignée du français.

Laisser un commentaire

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

Partager :

À propos de l'auteur

WordPress Développement

Développeur WordPress, passionné par Elementor, le FSE et l’automatisation par IA.

Voir tous ses articles

Dans la même veine

À lire aussi