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

Multilingue

_n_noop() expliqué : pourquoi certaines langues ont besoin de plusieurs pluriels

Que faire quand le nombre à évaluer n'est pas encore connu au moment de déclarer une chaîne traduisible ? La fonction _n_noop() répond exactement à ce cas.

Par WordPress Développement • 25 juin 2021 • 4 min de lecture • Aucun commentaire
_n_noop() expliqué : pourquoi certaines langues ont besoin de plusieurs pluriels

Comment déclarer une chaîne traduisible au pluriel quand on ne connaît pas encore le nombre au moment où on l’écrit dans le code ? C’est exactement la situation que rencontre un développeur qui construit un tableau de messages de statut, définis une bonne fois pour toutes en haut d’un fichier, bien avant de savoir combien d’éléments seront réellement concernés au moment de l’affichage.

La fonction _n(), vue dans d’autres contextes, ne convient pas ici : elle exige un nombre en argument immédiat, ce qui suppose de la connaître au moment de l’appel. WordPress propose pour ce cas précis une fonction moins connue, _n_noop(), pensée pour préparer une paire de chaînes traduisibles sans encore fixer le nombre qui décidera laquelle utiliser.

Le cas d’usage typique : un tableau défini à l’avance

Imaginons un plugin de gestion d’événements qui définit à l’avance ses différents statuts possibles dans un tableau, pour les réutiliser à plusieurs endroits du code :

$statuts = array(
    'places_restantes' => _n_noop(
        '%s place restante',
        '%s places restantes',
        'mon-plugin-evenements'
    ),
    'inscrits'          => _n_noop(
        '%s inscrit confirmé',
        '%s inscrits confirmés',
        'mon-plugin-evenements'
    ),
);

À ce stade, aucune chaîne n’est encore résolue en singulier ou en pluriel : _n_noop() renvoie simplement un tableau structuré contenant les deux formes et le domaine de texte, prêt à être utilisé plus tard, une fois le nombre réel connu.

Résoudre la bonne forme au moment voulu

L'essentiel à retenir : _n_noop() prépare une paire singulier-pluriel sans nombre associé ; Le nombre n'est fourni que plus tard, via translate_nooped_plural() ; Utile pour des tableaux de messages définis à l'avance

Quand le nombre devient enfin disponible, généralement plus loin dans le code, une deuxième fonction entre en jeu pour choisir la forme adaptée et appliquer la traduction :

$nombre_places = 3;

$message = sprintf(
    translate_nooped_plural(
        $statuts['places_restantes'],
        $nombre_places,
        'mon-plugin-evenements'
    ),
    $nombre_places
);

La fonction translate_nooped_plural() effectue exactement ce que ferait _n() directement, mais à partir d’une structure déjà préparée, plutôt qu’à partir de deux chaînes littérales fournies sur place. Le résultat final, une fois passé dans sprintf(), affiche « 3 places restantes » ou « 1 place restante » selon la valeur réelle.

Pourquoi certaines langues ont besoin de plus que deux formes

Le français et l’anglais se contentent de deux catégories de pluriel : singulier pour zéro et un, pluriel au-delà. Ce n’est pas le cas partout. Le polonais ou le russe, par exemple, distinguent plusieurs catégories selon la terminaison numérique du nombre concerné, avec des règles de sélection bien plus complexes que la simple opposition singulier-pluriel.

Le système hérité de gettext, sur lequel s’appuie WordPress, gère cette complexité grâce à une formule de sélection propre à chaque langue, déclarée dans l’en-tête du fichier .po. La fonction _n_noop() ne s’occupe pas elle-même de cette formule : elle se contente de préparer les chaînes source nécessaires, laissant le mécanisme de traduction sous-jacent appliquer la bonne règle selon la langue active du site.

  • _n_noop() ne traduit rien : elle prépare seulement une structure réutilisable.
  • translate_nooped_plural() effectue la traduction réelle, une fois le nombre connu.
  • Le domaine de texte doit être fourni aux deux étapes, de manière cohérente.

Un cas d’usage à ne pas généraliser inutilement

Cette fonction reste pensée pour un besoin précis : des chaînes définies en amont, indépendamment du contexte d’affichage final. Pour la grande majorité des cas, où le nombre est connu immédiatement avant l’affichage du message, _n() reste la fonction la plus directe et la plus lisible, sans passer par cette étape intermédiaire.

Un repère simple pour choisir entre les deux : si le nombre est disponible au moment où la chaîne est écrite dans le code, _n() suffit largement ; s’il ne l’est pas encore, _n_noop() devient la bonne option.

En résumé

Peu de développeurs de thèmes ou d’extensions rencontrent un besoin justifiant _n_noop(), mais ceux qui construisent des tableaux de messages réutilisables gagnent à connaître son existence plutôt que de contourner le problème avec des conditions manuelles fragiles. Cette fonction illustre aussi, une fois de plus, à quel point le système de pluriels de WordPress a été pensé pour couvrir des langues bien plus exigeantes que le français ou l’anglais en la matière.

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