java jsp jsp-tags

java - Manera efectiva de manejar la palabra singular/plural basada en algún tamaño de colección



jsp jsp-tags (4)

Eche un vistazo a inflector , un proyecto java que le permite hacer Noun.pluralOf("user") , o Noun.pluralOf("user", userList.size()) , y que maneja un montón de variaciones y casos inusuales (persona -> personas, pan -> panes, etc.), así como también le permite definir reglas de mapeo personalizadas cuando sea necesario.

Hay muchos casos en mis proyectos de trabajo donde necesito mostrar el tamaño de alguna colección en una oración. Por ejemplo, si el tamaño de la colección es 5, dirá "5 usuarios". Si tiene un tamaño de 1 o 0, dirá "1 usuario" o "0 usuario". En este momento, lo hago con sentencias if-else para determinar si se imprime la "s" o no, lo cual es tedioso.

Me pregunto si hay una biblioteca de etiquetas personalizadas JSP de código abierto que me permita lograr esto. Sé que puedo escribir uno yo mismo ... básicamente, tendrá 2 parámetros como este: <lib:display word="user" collection="userList" /> . Dependiendo del tamaño de la colección, determinará si agregar una "s" o no. Pero entonces, esta implementación no va a ser demasiado robusta porque también necesito manejar "ies" y algunas palabras no usan ninguna de ellas. Entonces, en lugar de crear una herramienta a medias, espero que haya una biblioteca más sólida que pueda utilizar de inmediato. No estoy demasiado preocupado por el prefijo de la palabra con es / son en este caso.

Yo uso Java, por cierto.

Muchas gracias.


Esta funcionalidad está integrada en Ruby on Rails. No sé exactamente dónde, pero debería ser lo suficientemente fácil de encontrar en el código fuente, y luego usted podría simplemente copiar el código.

EDITAR: Te encontré un código:

Si recuerdo correctamente, es principalmente una cuestión de agregar una "s" a la mayoría de las palabras, aunque creo que hay una lista (probablemente hash, error de diccionario) de algunas excepciones comunes. Notable es la conversión de "persona" a "personas" :)

Por supuesto, te enfrentarás a un mundo de dolor si decides que quieres internacionalizarlo a otros idiomas además del inglés. ¡Bienvenido al mundo de las gramáticas altamente irregulares, y buena suerte!


Esto se complica en otros idiomas además del inglés, que el inflector pretende apoyar en el futuro.

Estoy familiarizado con el checo donde el usuario = uživatel y:

1 uživatel 2 uživatelé 3 uživatelé 4 uživatelé 5 uživatelů

...

Puede ver por qué los programas escritos con singular codificado en plural + obtendrían un-i18n-able.


Hmm, no entiendo bien por qué necesitas una biblioteca para esto. Creo que la función para hacerlo es trivial:

public String singlePlural(int count, String singular, String plural) { return count==1 ? singular : plural; }

Las llamadas se verían como:

singlePlural(count, "user", "users"); singlePlural(count, "baby", "babies"); singlePlural(count, "person", "people"); singlePlural(count, "cherub", "cherubim"); ... etc ...

Tal vez esta biblioteca hace un montón de otras cosas que la hacen útil. Supongo que podría decir que proporciona un diccionario de lo que son todas las formas plurales, pero en cualquier programa dado no le importan los plurales de todas las palabras en el idioma, solo las que está usando en este programa. Supongo que si la palabra que podría ser singular o plural no se conoce en tiempo de compilación, si es algo ingresado por el usuario, entonces querría un diccionario de terceros en lugar de intentar construir uno por mi cuenta.

Editar

De repente, se me ocurre que lo que buscaba era una función para hacer plurales de forma genérica, incorporando un conjunto de reglas como "normalmente solo agrega ''s'', pero si la palabra termina en ''y'', cambie la ''y'' por ''s'' '', si termina en'' s ''cámbielo a'' ses '', ... "etc. Creo que en inglés sería imposible para cualquier propósito práctico: hay demasiados casos especiales, como" persona / gente "y" niño / niños ", etc. Creo que lo mejor que podría hacer sería tener una regla genérica de" agregar una ''s'' ", tal vez algunos otros casos comunes, y luego una larga lista de excepciones. Quizás en otros idiomas se pueda llegar a una regla bastante simple.

Entonces, como digo, si la palabra no se conoce en el momento de la compilación pero proviene de alguna entrada del usuario, entonces sí, un diccionario de terceros es altamente deseable.