2009-10-07 10 views
9

Tengo mucha información para mostrar desde una base de datos. Algunos son franceses, otros son ingleses. Algunos son un único, un poco de una lista ...pluralizar en PHP

La pregunta: ¿cómo gestionar toda esa opción diferente en PHP

SI ELSE INTERRUPTOR ARRAY (con todo el texto)

otra método ...

ahora el aumento del problema en una lista de olores, algunos tienen uno (olor) otros tienen muchos (olores) poner el "s" o no es un dolor ... ¡ayuda!

gracias

+2

Puede explicar mejor? Tu pregunta no está clara. – rogeriopvl

+0

¿Por qué no reformulas la pregunta para preguntar cómo pluralizar palabras en php para francés e inglés? –

Respuesta

6

La mejor manera OMI es tener una matriz con todas sus reglas de pluralización para cada idioma, es decir array('man'=>'men', 'woman'=>'women'); y escribir una función pluralizar() para cada palabra en singular.

Es posible que desee echar un vistazo al inflador CakePHP para obtener inspiración.

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

+1

Ese enlace está actualmente muerto; fuente se puede encontrar aquí: https://github.com/cakephp/cakephp/blob/c2f298a8b7b461584dfdbe6a1c3feb81ba47e525/lib/Cake/Utility/Inflector.php – mpen

+0

gracias, esto me ayuda a – netto

22

Es posible que desee ver el gettext extension. Más específicamente, suena como ngettext() hará lo que quiera: pluraliza las palabras correctamente siempre que tenga un número para contar.

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

También puede hacer que manejar formas plurales traducidos correctamente, lo que es su objetivo principal, aunque es un buen montón de trabajo extra.

+3

en realidad sería 'printf (ngettext ('% d cat ','% d cats ', 4), 4); // imprime "4 gatos" ' – Bot

+0

Eso no es genial en combinación con printf. Tal vez PHP tiene algo nuevo hoy? :-) – Alex2php

20

Usted puede tratar esta función me escribió:

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

Uso:

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

Obviamente hay una gran cantidad de palabras excepcionales que esta función no pluralizar correctamente, pero eso es lo que el argumento $plural es para :-)

¡Eche un vistazo a Wikipedia para ver cuán complicado es el pluralismo!

+0

no funciona con "rancho"/"Ranchos" – Francesco

+3

@Francesco Claro que sí. Uso: 'pluralize (3, 'Ranch', 'Ranches')'. El tercer argumento es solo opcional para las palabras más básicas. – mpen

0

Solución personalizada, transparente y sin extensión. No estoy seguro sobre su velocidad.

/** 
* 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 en Ucrania/Rusia:

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

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