Flexões de nomes com Ruby On Rails

As vezes temos necessidade (ou preferência ) em criar aplicações Ruby On Rails com palavras em nosso idioma, isso pode ocasionar alguns problemas ao tentar pluralizar ou singularizar essas palavras. Por exemplo:

[source language="ruby"]
"permissao".pluralize
= "permissaos" 	#E também
"permissoes".singularize
= "permisso"          [/source]

A Para resolver esse problema basta criar regras no arquivo inflections.rb de modo a pluralizar esse tipo de “irregularidade” de modo correto. Bom isso seria muito trabalhoso se já não tivessem feito um arquivo bem completinho que eu vou disponibilizar aqui pra vocês.

[source language="ruby"]
Inflector.inflections do |inflect|
inflect.clear

#general rule: add "s" to the end of the word
#casa - casas
inflect.plural /^([a-zA-z]*)a$/i, '1as'
#pe - pes
inflect.plural /^([a-zA-z]*)e$/i, '1es'
#no example
inflect.plural /^([a-zA-z]*)i$/i, '1is'
#carro - carros
inflect.plural /^([a-zA-z]*)o$/i, '1os'
#pneu - pneus
inflect.plural /^([a-zA-z]*)u$/i, '1us'

#if word ends in "r" or "z", add "es"
#luz - luzes
#flor - flores
#arroz - arrozes
inflect.plural /^([a-zA-z]*)r$/i, '1res'
inflect.plural /^([a-zA-z]*)z$/i, '1zes'

#if word ends in "al", "el", "ol", "ul": trade "l" with "is"
#farol - farois
#hospital - hospitais
#telemovel - telemoveis
#pincel - pinceis
#anzol - anzois
inflect.plural /^([a-zA-z]*)al$/i, '1ais'
inflect.plural /^([a-zA-z]*)el$/i, '1eis'
inflect.plural /^([a-zA-z]*)ol$/i, '1ois'
inflect.plural /^([a-zA-z]*)ul$/i, '1uis'

#if word ends in "il" and has tónic accent in last syllable, trade "il" with "is"
#cantil - cantis
inflect.plural /^([a-zA-z]*)il$/i, '1is'

#TODO
#if word ends in "il" and has tónic accent in penultimate syllable, trade "il" with "eis"
#no example

#if word ends in "m", trade "m" with "ns"
#armazem - armazens
#portagem - portagens
inflect.plural /^([a-zA-z]*)m$/i, '1ns'

#TODO
#if word ends in "s" and has one silable, trade "s" with "es"
#no example
#inflect.plural /^([a-zA-z]*)e$/i, '1es'

#TODO
#if word ends in "x" stays the same
#no example... professor X, maybe?
#inflect.plural /^([a-zA-z]*)x$/i, '1xes'

#if word ends in "ão", there are three ways of plural: ãos, ães, ões
#NOTE: hard to detect, so I'll use the most common case
#and then use irregular cases for the others.  if someone knows of
#more cases please add to the list & mail me. thanks!
#
#cão - cães
#colchão - colchões
#portão - portões
#pão - pães
#alemão - alemães
#chão - ?
#pilhão - pilhões
#canhão - canhões
#bidão - bidões
#mão - mãos
inflect.plural /^([a-zA-z]*)ao$/i, '1oes'
# inflect.irregular 'cao', 'caes'
# inflect.irregular 'pao', 'paes'
#inflect.irregular 'mao', 'maos'
#inflect.irregular 'alemao', 'alemaes'

############################
#singularize rules         #
############################

#pes - pe
#carros - carro
#pneus - pneu
inflect.singular /^([a-zA-z]*)as$/i, '1a'
inflect.singular /^([a-zA-z]*)es$/i, '1e'
inflect.singular /^([a-zA-z]*)is$/i, '1i'
inflect.singular /^([a-zA-z]*)os$/i, '1o'
inflect.singular /^([a-zA-z]*)us$/i, '1u'

#luzes - luz
#flores - flor
#arrozes - arroz
inflect.singular /^([a-zA-z]*)res$/i, '1r'
inflect.singular /^([a-zA-z]*)zes$/i, '1z'

#cantis - cantil
inflect.singular /^([a-zA-z]*)is$/i, '1il'

#farois - farol
#hospitais - hospital
#telemoveis - telemovel
#pinceis - pincel
#anzois - anzol
inflect.singular /^([a-zA-z]*)ais$/i, '1al'
inflect.singular /^([a-zA-z]*)eis$/i, '1el'
inflect.singular /^([a-zA-z]*)ois$/i, '1ol'
inflect.singular /^([a-zA-z]*)uis$/i, '1ul'

#armazens - armazem
#portagens - portagem
inflect.singular /^([a-zA-z]*)ns$/i, '1m'

#cães - cão
#colchões - colchão
#portões - portão
#pães - pão
#alemães - alemão
inflect.singular /^([a-zA-z]*)oes$/i, '1ao'
inflect.singular /^([a-zA-z]*)aes$/i, '1ao'
inflect.singular /^([a-zA-z]*)aos$/i, '1ao'

# inflect.plural /^(ox)$/i, '1en'
# inflect.singular /^(ox)en/i, '1'
# inflect.irregular 'person', 'people'
# inflect.uncountable %w( fish sheep )

inflect.irregular 'alias', 'aliases' #Melhor entendido se continuar com a regra do inglês
inflect.irregular 'mailbox', 'mailboxes' #Melhor entendido se continuar com a regra do inglês
end

[/source]