Catucando no I18n do rails

Publicado por joaolins, 08.08.08

Depois de dar uma olhada no artigo do Carlos Brando e do Diego Carrion, resolvi dar uma catucada no I18n. Comecei com um exemplo simples citado nos blogs dos mesmos. Resolvi ir um pouco mais longe, usar o ActiveRecord e tentar internacionalizar mensagens pré-customizadas do rails e atributos das tabelas.

Bom, o resultado do meu arquivo de internacionalização foi esse:

Depois com seu arquivo de internacionalização pronto você pode criar um scaffold (scaffold é ótimo para exemplos/testes):
script/generate scaffold post title:string description:text author:string
Adicione algumas validações no model post:
class Post < ActiveRecord::Base
  validates_presence_of :title
  validates_length_of   :author, :within => 3..10
end

Depois de rodar os migrations acesse a URL de posts http://localhost:3000/posts/new tente criar um post sem digitar nada nos campos e veja todas as mensagens devidamente traduzidas.

Para traduzir os atributos da sua tabela/model você deverá usar algo como:
:human_attribute_names => { 
      :post => { 
        :title => "Título" 
      } 
}
Se você quizer ser mais especifico para uma determinada validação de um atributo você pode fazer isso da seguinte forma:
:active_record => {
  :error_messages => {
     :custom => { 
        :post => { 
          :title => { 
            :blank => "erro especifico para título em branco no post" 
        }
      }
    }
 }
}
#observe que isso tem que ser feito dentro do 
#contexto do active_record.error_messages

Nota: Para minha surpresa acabei descobrindo um bug que acontece quando você não especifica mensagens default para o ActiveRecord no seu arquivo de localização. O que acontece é que o método full_messages do ActiveRecord procura por mensagens padrões para os validations e quando não encontra a chave, ele retorna um Array ao invés de uma String, por consequência o error_messages_for usa o full_messages esperando dele uma mensagem string, mas recebe esse bendito Array que não deveria ter sido retornado e ao concatenar a string com o Array dá pau. O erro na minha opinião é bem bobo mais é uma coisa que deve ser tratada…

Mais informações sobre I18n: http://www.artweb-design.de/2008/7/18/the-ruby-on-rails-i18n-core-api

Tags: catucando Rails rails

Comentários

  1. Thiago Arrais 08.09.08 / 11AM

    Legal, JP. Mas em português é “erros”, não “errors”. ;-)

  2. João 08.10.08 / 09AM

    Corrigido!

  3. João 12.15.08 / 15PM

    - tradução dos campos dos models teve algumas modificações

    http://tudoquequerosaber.com/?p=71