Localização de mensagens de erro e datas no Rails
20/11/06
O pessoal da 37signals já apontou que não tem muito interesse em tornar o Ruby on Rails localizado. Até entendo o lado deles, já que estão muito mais preocupados em desenvolver seus próprios aplicativos web. Enquanto isso, existem alguns projetos de localização do Rails, como os plugins Globalize e GLoc. Mas se você não precisa do suporte total à localização (apenas datas e o texto da validação), veja como pode resolver este problema.
Datas
No arquivo config/environment.rb de seu projeto, adicione o seguinte código:
# Include your application configuration below
Date::MONTHNAMES = [nil] + %w(Janeiro Fevereiro Março Abril Maio Junho Julho Agosto Setembro Outubro Novembro Dezembro)
Date::DAYNAMES = %w(Domingo Segunda-Feira Terça-Feira Quarta-Feira Quinta-Feira Sexta-Feira Sábado)
Date::ABBR_MONTHNAMES = [nil] + %w(Jan Fev Mar Abr Mai Jun Jul Aug Set Out Nov Dez)
Date::ABBR_DAYNAMES = %w(Dom Seg Ter Qua Qui Sex Sab)
Time::MONTHNAMES = Date::MONTHNAMES
Time::DAYNAMES = Date::DAYNAMES
Time::ABBR_MONTHNAMES = Date::ABBR_MONTHNAMES
Time::ABBR_DAYNAMES = Date::ABBR_DAYNAMES
Mensagens de erro
Eu não gosto da maneira como o Rails exibe as mensagens de erro. Particularmente, prefiro exibir as mensagens de erro dentro de uma dl. Então, modifiquei a maneira como são exibidas as mensagens. Seu arquivo app/helpers/application_helper.rb deve ficar da seguinte maneira:
# Methods added to this helper will be available to all templates in the application.
module ApplicationHelper
def error_messages_for(object_name, options = {})
options = options.symbolize_keys
object = instance_variable_get("@#{object_name}")
unless object.errors.empty?
items = []
object.errors.each { |attribute, message| items << content_tag("dd", message) }
content_tag("dl",
content_tag("dt", "Para prosseguir, verifique os itens abaixo:") +
items.join(""),
"id" => options[:id] || "error", "class" => options[:class] || "error"
)
end
end
end
Update: Saiu a versão 1.2 RC1 do Ruby on Rails. O mais interessante é que Rails oferecerá suporte nativo a Unicode. Dê uma olhada no anúncio oficial. Se for muito preguiçoso, veja a versão traduzida pelo Akita.
Update 2: Não sei o porquê, mas hoje a substituição feita na classe Time parou de funcionar. Se você enfrentar o mesmo problema, substitua pelo código abaixo. Visto em poocs.net
class Time
alias :strftime_nolocale :strftime
def strftime(format)
format = format.dup
format.gsub!(/%a/, Date::ABBR_DAYNAMES[self.wday])
format.gsub!(/%A/, Date::DAYNAMES[self.wday])
format.gsub!(/%b/, Date::ABBR_MONTHNAMES[self.mon])
format.gsub!(/%B/, Date::MONTHNAMES[self.mon])
self.strftime_nolocale(format)
end
end - Permalink
- Trackback
- Feed dos comentários
- Ao som de: blink-182 – Please Take Me Home

Comentários #
Grandes dicas ! :)
Eu também não gosta da forma de exibição das mensagens de erro do Rails, porém eu utilizo essa forma:
'app' => Model (@app)
'description' => campo da tabela
'campo ' => é um prefixo da mensagem de erro
Desta forma eu coloco a mensagem de erro ao lado do campo que tem erro. Mas tem a chatice de vir em uma div que as vezes atrapalha na formação da página.
Mais informações sobre o error_message_on:
http://railsmanual.org/module/ActionView%3A%3AHelpers%3A%3AActiveRecordHelper/error_message_on/1.1.6
Até mais.
Heheh.. Tem mais gente usando do mesmo artifício para lidar com as datas … http://forum.rubyonbr.org/forums/1/topics/261
[]'s
- Walter
Acho que nem muito pra onde fugir…. :)
É, ontem eu coloquei esse lance no meu código e não mudou nada… Realmente achei estranho, achei que eu tivesse fazendo algo errado, mas não tinha como errar!
Valeu a dica ae! :-)
Bom, coloquei todo esse código no enviroment.rb, mas continua aparecendo as datas em inglês…
Sabe onde posso estar falhando?
Abraço!
Davis: você reiniciou o WEBrick? Não esqueça que qualquer alteração no environment.rb precisa disso!
Opa, valeu essa dica, mas quando eu alterei ele não estava nem rodando hehe!
Esquisito que copiei e colei do jeito que está aqui.
Vou ver aqui o que pode ser, quando ele inicia, até acusa que as constantes já haviam sido definidas…
Estes "warnings" são normais. Apesar de serem constantes, o Ruby permite que você redefina seus valores, porém ele dá esse aviso. É possível desativar esse erro quando rodando um script diretamente de um arquivo, mas não sei como seria no Rails.
Boa Ferdinando!
Usei aqui o error_messages_for e funcionou que é uma belezura! :D
Hmmm é impressão minha ou não aparece confirmação alguma (além do próprio comentário na listagem) que o comentário foi recebido?
Hehehe… Finalmente Klaus! Os comentários são bloqueados caso ainda não tenha nenhum aprovado. :P
[...] Se você seguiu o post Localização de mensagens de erro e datas no Rails, deve ter percebido que toda vez que você inicia o WEBRick, mensagens avisando que você está sobrescrevendo constantes aparecem. Isso acontece por que o Ruby permite que você redefina constantes, diferente de outras linguagens, mas avisa quando isso acontece. [...]
Olá Nando, vlw pelas dicas.
Bom como esse post tem um bom tempo, essa ainda é a melhor forma de tratar as datas para o formato brasileiro?
E sobre a mensagem de erro, você falou como mudar a forma de exibição das mesmas porém poderia dar um dica para traduzir elas?
Grato,
Thiago
Thiago, eu adiciono minha própria mensagem para cada um dos validadores no Rails. Por exemplo:
validates_presence_of :name, :message => 'Informe seu nome'Na minha opinião, esta é a maneira mais simples.
Eu até fiz isso, porém tem uma mensagem que eu não consigo traduzir, olha como ficou.
11 errors prohibited this record from being saved
There were problems with the following fields:
* Local O campo local não pode ficar em branco.
* Cargo O campo cargo não pode ficar em branco.
* Situacao O campo situação não pode ficar em branco.
Consegui ajustar isso aqui, vlw.
Valeu pela dica de localização de data e tempo em português. Exatamente o que estava procurando.
Opa, legal seu blog
Eu particularmente uso outro modo bem diferente, usando helper tambem, mas basicamente da na mesma, só não uso dd, dl e dt..
Acho que vou começar a usar o seu, parece mais melhor de bom :D
Deixe um comentário