ProInf.net

Traducción de "pluralize"

Francisco 12-02-07
Género y número

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)

pluraliza

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&agrave;
    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

femenina?

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&aacute;
  excepciones_masculinas = ['idioma', 'cami'<<195<<179<<'n', 'mapa', 'alud', 'pez', 'l'<<195<<161<<'piz', 'reloj', 'tema'] # cami&oacute;n, l&aacute;apiz
  terminaciones_femeninas = ['a', 'ad', 'ud', 'ez', 'i'<<195<<179<<'n', 'is', 'umbre'] # i&oacute;n
  terminaciones_masculinas = ['l', 'o', 'n', 'e', 'r', 's', ''<<195<<161, ''<<195<<169, ''<<195<<173, ''<<195<<179, ''<<195<<186] # &aacute; &eacute; &iacute; &oacute; &uacute;
     
  return true if excepciones_femeninas.include?(palabra)
  return false if excepciones_masculinas.include?(palabra)
  
  # Palabras supuestamente de g&eacute;nero femenino
  # Ejemplos: casa, verdad, salud, pesadez, naci&oacute;n, tesis, legumbre
  for terminacion in terminaciones_femeninas
    largo = terminacion.length
    return true if palabra[-largo,largo] == terminacion
  end
  
  # Palabras supuestamente de g&eacute;nero masculino
  # Ejemplos: &aacute;rbol, pelo, cintur&oacute;n, volante, olor, virus, sof&aacute;, caf&eacute;, 
  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

masculino?

def masculino?(palabra)
  not femenina?(palabra)
end
Compartir

 

Artículos relacionados:

Ir arriba