2009-10-07 4 views
9

J'ai beaucoup d'informations à afficher à partir d'une base de données. Certains sont français, d'autres sont anglais. Certains sont un unique, une liste ...pluralize en PHP

La question: comment gérez-vous tous cette option différente en PHP

SI AUTRE INTERRUPTEUR MATRICE (avec tout le texte)

autres méthode ...

maintenant la montée des problèmes sur une liste d'odeurs, d'autres ont une (odeur) autres ont beaucoup (odeurs) mettre les s ou non est une douleur ..... aider!

grâce

+2

Pouvez-vous expliquer mieux? Votre question est très floue. – rogeriopvl

+0

Pourquoi ne pas reformuler la question pour demander comment pluraliser les mots en php pour le français et l'anglais –

Répondre

6

La meilleure façon est l'OMI d'avoir un tableau de toutes vos règles pour chaque langue pluriel des noms, à savoir array('man'=>'men', 'woman'=>'women'); et écrire une fonction pluralize() pour chaque mot singulier.

Vous voudrez peut-être jeter un oeil à l'inflecteur CakePHP pour un peu d'inspiration.

https://github.com/cakephp/cakephp/blob/master/src/Utility/Inflector.php

+1

Ce lien est actuellement mort; source peut être trouvé ici: https://github.com/cakephp/cakephp/blob/c2f298a8b7b461584dfdbe6a1c3feb81ba47e525/lib/Cake/Utility/Inflector.php – mpen

+0

merci l'homme cela m'aide – netto

22

Vous pouvez regarder le gettext extension. Plus précisément, il semble que ngettext() va faire ce que vous voulez: il pluralises correctement des mots aussi longtemps que vous avez un certain nombre de compter à partir.

print ngettext('odor', 'odors', 1); // prints "odor" 
print ngettext('odor', 'odors', 4); // prints "odors" 
print ngettext('%d cat', '%d cats', 4); // prints "4 cats" 

Vous pouvez également faire gérer correctement traduire les formes plurielles, ce qui est son objectif principal, mais il est tout à fait beaucoup de travail supplémentaire à faire.

+3

en fait ce serait 'printf (ngettext ('% d cat ','% d cats ', 4), 4); // imprime "4 chats" ' – Bot

+0

Ce n'est pas cool en combinaison avec printf. Peut-être que PHP a quelque chose de nouveau aujourd'hui? :-) – Alex2php

20

Vous pouvez cette fonction je l'ai écrit:

/** 
* Pluralizes a word if quantity is not one. 
* 
* @param int $quantity Number of items 
* @param string $singular Singular form of word 
* @param string $plural Plural form of word; function will attempt to deduce plural form from singular if not provided 
* @return string Pluralized word if quantity is not one, otherwise singular 
*/ 
public static function pluralize($quantity, $singular, $plural=null) { 
    if($quantity==1 || !strlen($singular)) return $singular; 
    if($plural!==null) return $plural; 

    $last_letter = strtolower($singular[strlen($singular)-1]); 
    switch($last_letter) { 
     case 'y': 
      return substr($singular,0,-1).'ies'; 
     case 's': 
      return $singular.'es'; 
     default: 
      return $singular.'s'; 
    } 
} 

Utilisation:

pluralize(4, 'cat'); // cats 
pluralize(3, 'kitty'); // kitties 
pluralize(2, 'octopus', 'octopii'); // octopii 
pluralize(1, 'mouse', 'mice'); // mouse 

Il y a évidemment beaucoup de mots exceptionnels que cette fonction ne sera pas pluralize correctement, mais c'est ce que l'argument $plural est pour :-)

Jetez un oeil à Wikipedia pour voir à quel point pluralisation est compliqué!

+0

ne fonctionne pas avec "Ranch"/"Ranches" – Francesco

+3

@Francesco Bien sûr que oui. Utilisation: 'pluralize (3, 'Ranch', 'Ranches')'. Le 3ème argument n'est optionnel que pour les mots les plus basiques. – mpen

0

Solution personnalisée, transparente et sans extension. Je ne suis pas certain de sa vitesse.

/** 
* Custom plural 
*/ 
function splur($n,$t1,$t2,$t3) { 
    settype($n,'string'); 
    $e1=substr($n,-2); 
    if($e1>10 && $e1<20) { return $n.' '.$t3; } // "Teen" forms 
    $e2=substr($n,-1); 
    switch($e2) { 
     case '1': return $n.' '.$t1; break; 
     case '2': 
     case '3': 
     case '4': return $n.' '.$t2; break; 
     default: return $n.' '.$t3; break; 
    } 
} 

Utilisation en ukrainien/russe:

splur(5,'сторінка','сторінки','сторінок') // 5 сторінок 
splur(4,'сторінка','сторінки','сторінок') // 4 сторінки 
splur(1,'сторінка','сторінки','сторінок') // 1 сторінка 
splur(12,'сторінка','сторінки','сторінок') // 12 сторінок 

splur(5,'страница','страницы','страниц') // 5 страниц 
splur(4,'страница','страницы','страниц') // 4 страницы 
splur(1,'страница','страницы','страниц') // 1 страница 
splur(12,'страница','страницы','страниц') // 12 страниц