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

Comentários #


#1 Luciano Pacheco disse:
21 Nov 06, 11:28AM

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.

#2 Walter Cruz disse:
23 Nov 06, 11:40AM

Heheh.. Tem mais gente usando do mesmo artifício para lidar com as datas … http://forum.rubyonbr.org/forums/1/topics/261

[]'s
- Walter

#3 Nando Vieira disse:
24 Nov 06, 08:28AM

Acho que nem muito pra onde fugir…. :)

#4 Davis disse:
29 Nov 06, 03:22PM

É, 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! :-)

#5 Davis disse:
29 Nov 06, 03:29PM

Bom, coloquei todo esse código no enviroment.rb, mas continua aparecendo as datas em inglês…
Sabe onde posso estar falhando?

Abraço!

#6 Nando Vieira disse:
29 Nov 06, 06:39PM

Davis: você reiniciou o WEBrick? Não esqueça que qualquer alteração no environment.rb precisa disso!

#7 Davis disse:
30 Nov 06, 02:06PM

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…

#8 Nando Vieira disse:
30 Nov 06, 03:12PM

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.

#9 Klaus Paiva disse:
03 Jan 07, 02:22PM

Boa Ferdinando!

Usei aqui o error_messages_for e funcionou que é uma belezura! :D

#10 Klaus Paiva disse:
03 Jan 07, 02:23PM

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?

#11 Nando Vieira disse:
03 Jan 07, 02:34PM

Hehehe… Finalmente Klaus! Os comentários são bloqueados caso ainda não tenha nenhum aprovado. :P

#12 Simples Idéias. Por Nando Vieira. » Arquivo » Suprim... disse:
17 Jan 07, 09:49AM

[...] 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. [...]

#13 Thiago Antonius disse:
08 Ago 07, 10:37AM

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

#14 Nando Vieira disse:
08 Ago 07, 12:33PM

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.

#15 Thiago Antonius disse:
08 Ago 07, 06:41PM

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.

#16 Thiago Antonius disse:
08 Ago 07, 06:50PM

Consegui ajustar isso aqui, vlw.

#17 Leonardo Favre disse:
14 Maio 08, 04:10PM

Valeu pela dica de localização de data e tempo em português. Exatamente o que estava procurando.

#18 Andrey Viana disse:
17 Jun 08, 05:14PM

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




Este blog usa o Gravatar.


Não é aceito código HTML:
adicione-o no pastie.caboo.se ou paste.milk-it.net e poste apenas o link.

Se este é seu primeiro comentário, ele terá que ser aprovado antes de ser exibido.