En la programación con Ruby on Rails el helper pluralize es muy útil, porque te muestra en plural una palabra cuando la cuenta es mayor que uno. Aquí tenemos una versión que funciona en tres idiomas: catalán, español e inglés.
Podemos ver un ejemplo en funcionamiento.
Incluir los siguientes métodos en el ApplicationHelper (application_helper.rb)
Muestra la palabra en concordancia de número con la cuenta. En el código fuente en vez de escribir directamente los caracteres UTF-8 (por ejemplo una "a" acentuada) se ha puesto los códigos numéricos equivalentes. De esta forma no necesitamos que el código fuente esté escrito también con UTF-8.
def pluraliza(cuenta, palabra, idioma=nil)
case idioma || session[:language] || 'es'
when 'en' # English
resultado = pluralize(cuenta, palabra)
when 'es' # Español
if cuenta == 0 then
resultado = (femenina?(palabra) ? 'Ninguna':'Ning'<<195<<186<<'n') + ' ' + palabra
elsif cuenta == 1 then
resultado = (femenina?(palabra) ? 'Una':'Un') + ' ' + palabra
else
# 'vocales' y 'letras' son array de caracteres Unicode
# 'vocales' son 5 vocales normales, 5 vocales con acento agudo y 5 vocales con acento grave
vocales = [97,101,105,111,117, 225,233,237,243,250, 224,232,236,242,249]
letras = palabra.unpack('U*')
ultima_letra = letras.at(-1)
if vocales.include? ultima_letra
resultado = palabra + 's'
else # acaba en consonante
if ultima_letra == 'n'[0]
penultima_letra = letras.at(-2)
if vocales.include? penultima_letra
#Quitar el acento del final
indice_vocal = vocales.index(penultima_letra).modulo(5)
letras[-2,1] = vocales[indice_vocal]
palabra = letras.pack('U*')
end
elsif ultima_letra == 'z'[0]
letras[-1,1] = 'c'[0]
palabra = letras.pack('U*')
end
resultado = palabra + 'es'
end
if cuenta != nil
resultado = cuenta.to_s + ' ' + resultado
end
end
when 'ca' # Català
if cuenta == 0 then
resultado = 'Cap ' + palabra
elsif cuenta == 1
resultado = cuenta.to_s + ' ' + palabra
else
ultima_letra = palabra[-1,1]
palabra[-1,1] = 'e' if ultima_letra == 'a'
resultado = cuenta.to_s + ' ' + palabra + 's'
end
end
resultado
end
Indica si la palabra es de género femenino. Este método sólo funciona para el español
def femenina?(palabra)
excepciones_femeninas = ['miel', 'mano', 'muerte', 'base', 'flor', 'mam'<<195<<161] # mamá
excepciones_masculinas = ['idioma', 'cami'<<195<<179<<'n', 'mapa', 'alud', 'pez', 'l'<<195<<161<<'piz', 'reloj', 'tema'] # camión, láapiz
terminaciones_femeninas = ['a', 'ad', 'ud', 'ez', 'i'<<195<<179<<'n', 'is', 'umbre'] # ión
terminaciones_masculinas = ['l', 'o', 'n', 'e', 'r', 's', ''<<195<<161, ''<<195<<169, ''<<195<<173, ''<<195<<179, ''<<195<<186] # á é í ó ú
return true if excepciones_femeninas.include?(palabra)
return false if excepciones_masculinas.include?(palabra)
# Palabras supuestamente de género femenino
# Ejemplos: casa, verdad, salud, pesadez, nación, tesis, legumbre
for terminacion in terminaciones_femeninas
largo = terminacion.length
return true if palabra[-largo,largo] == terminacion
end
# Palabras supuestamente de género masculino
# Ejemplos: árbol, pelo, cinturón, volante, olor, virus, sofá, café,
for terminacion in terminaciones_masculinas
largo = terminacion.length
return false if palabra[-largo,largo] == terminacion
end
# Si hemos llegado hasta aquí podría ser femenino o masculino
return true
end
def masculino?(palabra)
not femenina?(palabra)
end