Accorder au pluriel

Ceci est une archive périmée mais qui reste intéressante, parfois autant pour l’article que les commentaires associés.

Ce filtre permet d’accorder un ou deux (voire plus en répétant le principe du code) noms au pluriel selon le résultat de la boucle qui le quantifie. Les noms sont passés au singulier en paramètres du filtre (SPIP 1.5a2 et ultérieurs).

Fonctionnalité native depuis SPIP 3.x

Se reporter au filtre https://www.spip.net/fr_article4002.html

Pour les versions précédentes de SPIP

Particulièrement utile selon moi pour afficher le nombre d’articles, de messages dans le forum, ...

/*
 *   +----------------------------------+
 *    Nom du Filtre :    accord_pluriel
 *   +----------------------------------+
 *    Date : mercredi 16 avril 2003
 *    Auteur :  Roustoubi (roustoubi@tiscali.fr)
 *   +-------------------------------------+
 *    Fonctions de ce filtre :
 *    Accorde le nom singulier passé en paramètre avec le nombre qui le quantifie
 *    Exemple : [#TOTAL_BOUCLE (#TOTAL_BOUCLE|accord_pluriel{article})]
 *   +-------------------------------------+ 
 *  
 * Pour toute suggestion, remarque, proposition d'ajout
 * reportez-vous au forum de l'article :
 * http://www.uzine.net/spip_contrib/article.php3?id_article=111
*/

function accord_pluriel ($nombre, $nom1='', $nom2='') {
	if ($nom1=='') { return "Erreur filtre <b>&laquo; accord_pluriel &raquo;</b> : probl&egrave;me de param&egrave;tre"; }
	if ($nom2!='') {
		$nom2 = " ".$nom2;
		$nom2s = $nom2."s";
	}
	if ($nombre == "0" OR $nombre == "1") {
		$texte = $nombre."&nbsp;".$nom1.$nom2 ;
	}
	else {
		$texte = $nombre."&nbsp;".$nom1."s".$nom2s ;
	}
	return $texte ; 
}
// FIN du Filtre accord_pluriel

Par exemple :

[il y a (#TOTAL_BOUCLE|accord_pluriel{article}) dans cette rubrique]

Affichera : « il y a 1 un article dans cette rubrique », ou « il y a 49 articles dans cette rubrique ».

et

[il y a (#TOTAL_BOUCLE|accord_pluriel{article,publie}) dans cette rubrique]

Affichera : « il y a 1 un article publié dans cette rubrique », ou « il y a 49 articles publiés dans cette rubrique ».

Discussion

3 discussions

  • 2
    François Schreuer

    Effectivement tout simple et très utile. Pourquoi ne pas suggérer que cette fonction soit ajoutée dans les prochaines distributions de SPIP ?

    • roustoubi

      Parce qu’il répond de façon simple à un besoin simple et que les situations peuvent être beaucoup plus complexes que de rajouter un « s » (son, ses, ...). Les devs de SPIP sont bien plus malins que moi et veulent le plus souvent se rapprocher de l’universalité de la fonction plutôt que de bidouilles ponctuelles de ce type. Mais c’est impec au cas au par cas.

    • nouvelle difficulté pour accorder par exemple :

      Il y a 1 nouvel article dans cette rubrique depuis 3 jours

      Il y a 2 nouveaux articles dans cette rubrique...

      où il ne s’agit plus seulement d’ajouter (aux) mais aussi de retrancher le « l »... une solution ?

    Répondre à ce message

  • Si j’avais mieux fouillé, je ne me serais pas cassé la tête à faire mon propre filtre ;-)

    Toutefois, le filtre ci-dessous pourrait intéresser :

    /***
    * filtre à appliquer à #TOTAL_BOUCLE
    ***/
    function pluriel($nombre, $singulier, $pluriel='') {
      global $pluriel_renvoie_zero;
      tester_variable("pluriel_renvoie_zero", true);
      if($pluriel_renvoie_zero AND $nombre == 0)
        return _T("local/public/spip:aucun_".$singulier);
      if($nombre == 0) return '';
      if(!$pluriel) $pluriel = $singulier."s";
      $code = $nombre>1?$pluriel:$singulier;
      return $nombre." "._T("local/public/spip:".$code);
    }

    Il s’appuie sur les fichiers de langue de spip, et permet donc d’internationaliser l’accord du pluriel dans un site SPIP.

    Les paramètres à fournir seront donc les codes qu’on utilise aussi sous la forme <:code:>

    exemple :

    [(#TOTAL_BOUCLE|pluriel{article})] renverra selon la valeur de #TOTAL_BOUCLE :

    • 0 —> <:aucun_article :> ou rien si on positionne $pluriel_renvoie_zero à false dans ecrire/mes_options.php3
    • 1 —> <:article :>
    • 2 et plus —> <:articles :>

    [(#TOTAL_BOUCLE|pluriel{article,autre_forme_de_pluriel})] :

    • 2 et plus —> <:autre_forme_de_pluriel :>

    surement améliorable.

    Répondre à ce message

  • 2
    marcopol

    J’ai trouvé 2 problèmes en voulant utiliser ce filtre ; voilà de quoi il s’agit :

    1°) Avec le mot "R&eacute;ponse" (celui que je veux accorder) ça ne passe pas alors que « Réponse » passe. Pas très grave, mais déroutant...

    2°) Lorsque le nombre est égal à 0, le filtre retourne une chaîne de caractère contenant 0 et non une chaîne vide. J’ai donc réalisé une version qui me convient mieux :

    function accord_pluriel ($nombre, $nom='') {
    	switch ($nombre) {
              case 0 : return ""; 
              case 1 : return $nombre."&nbsp;".$nom;
              default : return $nombre."&nbsp;".$nom."s";
    	}
    }

    je l’utilise comme ceci pour afficher le nombre de réponses à un article :

    <BOUCLE_forums_decpt(FORUMS){id_article}{plat}></BOUCLE_forums_decpt>
      [<b><a href="#URL_ARTICLE">(#TOTAL_BOUCLE|accord_pluriel{réponse})</a></b>]
    <//B_forums_decpt>
    • Je n’ai pas réussi à utiliser ta proposition de modification du filtre.

      Avec celle de la contrib, je fais simplement :
      [(#TOTAL_BOUCLE|accord_pluriel{notice, 'trouv&eacute;e'}) &agrave; ce nom]

      la virgule permet déjà d’utiliser plusieurs mots contigus (voir plus haut) et les quotes simples de faire passer le html.

      J’ai donc bien « 1 notice trouvée » et « 3 notices trouvées ». Pour le cas où il n’y a rien, le tout est déjà dans une sous-boucle qui n’affiche rien s’il n’y a pas de résultats à #TOTAL_BOUCLE.

    • et boum ! j’ai pas vu que le filtre supprimait le non affichage en cas de résultat nul de #TOTAL_BOUCLE (ça m’a percé mon gazoduc).

      Donc j’ai modifié le filtre pour résoudre celà :

      function accord_pluriel ($nombre, $nom1='', $nom2='') {
      	if ($nom1=='') { return "Erreur filtre <b>&laquo; accord_pluriel &raquo;</b> : probl&egrave;me de param&egrave;tre"; }
      	if ($nom2!='') {
      		$nom2 = " ".$nom2;
      		$nom2s = $nom2."s";
      	}
      	if ($nombre == "0") {
      		$texte = "" ;
      	}
      	elseif ($nombre == "1") {
      		$texte = $nombre."&nbsp;".$nom1.$nom2 ;
      	}
      	else {
      		$texte = $nombre."&nbsp;".$nom1."s".$nom2s ;
      	}
      	return $texte ; 
      }

      Un petit elseif en plus.

    Répondre à ce message

Ajouter un commentaire

Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparaît.

Merci d’avance pour les personnes qui vous aideront !

Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.

Qui êtes-vous ?
[Se connecter]

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom