ruby-on-rails - spanish - rails i18n with parameters
Método Ruby para eliminar acentos de los caracteres internacionales UTF-8 (3)
Estoy tratando de crear una copia ''normalizada'' de una cadena, para ayudar a reducir los nombres duplicados en una base de datos. Los nombres contienen muchos caracteres internacionales (es decir, letras con acento) y quiero crear una copia con los acentos eliminados.
Encontré el método a continuación, pero no puedo hacerlo funcionar. Parece que no puedo encontrar lo que es el plugin Unicode Hacks.
# Utility method that retursn an ASCIIfied, downcased, and sanitized string.
# It relies on the Unicode Hacks plugin by means of String#chars. We assume
# $KCODE is ''u'' in environment.rb. By now we support a wide range of latin
# accented letters, based on the Unicode Character Palette bundled inMacs.
def self.normalize(str)
n = str.chars.downcase.strip.to_s
n.gsub!(/[à áâãäåÄÄ?]/u, ''a'')
n.gsub!(/æ/u, ''ae'')
n.gsub!(/[ÄÄ?]/u, ''d'')
n.gsub!(/[çÄ?ÄÄ?Ä?]/u, ''c'')
n.gsub!(/[èéêëÄ?Ä?Ä?Ä?Ä?]/u, ''e'')
n.gsub!(/Æ?/u, ''f'')
n.gsub!(/[ÄÄ?Ä¡Ä£]/u, ''g'')
n.gsub!(/[ĥħ]/, ''h'')
n.gsub!(/[ììÃîïīĩÄ]/u, ''i'')
n.gsub!(/[įıijĵ]/u, ''j'')
n.gsub!(/[ķĸ]/u, ''k'')
n.gsub!(/[Å?ľĺļÅ?]/u, ''l'')
n.gsub!(/[ñÅ?Å?Å?Å?Å?]/u, ''n'')
n.gsub!(/[òóôõöøÅÅ?ÅÅ]/u, ''o'')
n.gsub!(/Å?/u, ''oe'')
n.gsub!(/Ä?/u, ''q'')
n.gsub!(/[Å?Å?Å?]/u, ''r'')
n.gsub!(/[Å?Å¡Å?ÅÈ?]/u, ''s'')
n.gsub!(/[ťţŧÈ?]/u, ''t'')
n.gsub!(/[ùúûüūůűÅũų]/u,''u'')
n.gsub!(/ŵ/u, ''w'')
n.gsub!(/[ýÿŷ]/u, ''y'')
n.gsub!(/[žżź]/u, ''z'')
n.gsub!(//s+/, '' '')
n.gsub!(/[^/sa-z0-9_-]/, '''')
n
end
¿Necesito ''requerir'' una biblioteca / gema en particular? O tal vez alguien podría recomendar otra forma de hacerlo.
No estoy usando Rails, ni pienso hacerlo.
El método de parameterize podría ser una solución agradable y simple para eliminar caracteres especiales para usar la cadena como identificador legible por humanos:
> "Françoise Isaïe".parameterize
=> "francoise-isaie"
Generalmente uso I18n para manejar esto:
1.9.3p392 :001 > require "i18n"
=> true
1.9.3p392 :002 > I18n.transliterate("Hé les mecs!")
=> "He les mecs!"
Hasta ahora, la siguiente es la única forma en que he podido lograr lo que necesito:
str.tr(
"ÀÁÂÃÄÅàáâãäåĀāĂ㥹ÇçĆćĈĉĊċČčÐðĎďĐđÈÉÊËèéêëĒēĔĕĖėĘęĚěĜĝĞğĠġĢģĤĥĦħÌÍÎÏìíîïĨĩĪīĬĭĮįİıĴĵĶķĸĹĺĻļĽľĿŀŁłÑñŃńŅņŇňʼnŊŋÒÓÔÕÖØòóôõöøŌōŎŏŐőŔŕŖŗŘřŚśŜŝŞşŠšſŢţŤťŦŧÙÚÛÜùúûüŨũŪūŬŭŮůŰűŲųŴŵÝýÿŶŷŸŹźŻżŽž",
"AAAAAAaaaaaaAaAaAaCcCcCcCcCcDdDdDdEEEEeeeeEeEeEeEeEeGgGgGgGgHhHhIIIIiiiiIiIiIiIiIiJjKkkLlLlLlLlLlNnNnNnNnnNnOOOOOOooooooOoOoOoRrRrRrSsSsSsSssTtTtTtUUUUuuuuUuUuUuUuUuUuWwYyyYyYZzZzZz")
Pero el uso de este se siente muy ''hackish'', y me encantaría encontrar una mejor manera.