2009-10-07 3 views
9

Ho molte informazioni da visualizzare da un database. Alcuni sono francesi, altri sono inglesi. Alcuni sono un unico, un po 'di un elenco ...pluralize in PHP

La domanda: come si fa a gestire tutto ciò che un'opzione diversa in PHP

SE ELSE INTERRUTTORE ARRAY (con tutto il testo)

altro metodo ...

ora il problema sorge su un elenco di odori, alcuni hanno uno (odore) altri hanno molti (odori) mettendo il s o no è un dolore ..... aiuto!

grazie

+2

Può spiegare meglio? La tua domanda è molto poco chiara. – rogeriopvl

+0

Perché non riformulare la domanda per chiedere come pluralizzare le parole in php sia per il francese che per l'inglese –

risposta

6

Il modo migliore IMO è quello di avere una matrice di tutte le regole di pluralizzazione per ogni lingua, vale a dire array('man'=>'men', 'woman'=>'women'); e scrivere una funzione pluralize() per ogni parola singolare.

Si consiglia di dare un'occhiata al gonfiatore CakePHP per qualche ispirazione.

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

+1

Questo link è attualmente morto; fonte può essere trovata qui: https://github.com/cakephp/cakephp/blob/c2f298a8b7b461584dfdbe6a1c3feb81ba47e525/lib/Cake/Utility/Inflector.php – mpen

+0

grazie man questo mi aiuta – netto

22

Si potrebbe desiderare di guardare il gettext extension. Più precisamente, sembra che ngettext() farà ciò che vuoi: pluralizza correttamente le parole finché hai un numero da cui contare.

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

Si può anche rendere gestire forme plurali tradotta correttamente, che è il suo scopo principale, anche se si tratta di un bel po 'di lavoro extra da fare.

+3

effettivamente sarebbe 'printf (ngettext ('% d cat ','% d cats ', 4), 4); // stampa "4 gatti" ' – Bot

+0

Non è bello in combinazione con printf. Forse PHP ha qualcosa di nuovo oggi? :-) – Alex2php

20

Si può provare questa funzione ho scritto:

/** 
* 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'; 
    } 
} 

Usage:

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

C'è ovviamente un sacco di parole eccezionali che questa funzione non plurale in modo corretto, ma è quello che l'argomento $plural è per :-)

Dai uno sguardo allo Wikipedia per capire quanto sia complicata la pluralizzazione!

+0

non funziona con "Ranch"/"Ranches" – Francesco

+3

@Francesco Certo che lo fa. Uso: 'pluralize (3, 'Ranch', 'Ranches')'. Il terzo argomento è facoltativo solo per le parole di base. – mpen

0

Soluzione personalizzata, trasparente e priva di estensione. Non sono sicuro della sua velocità.

/** 
* 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; 
    } 
} 

Uso in Ucraino/Russo:

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

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