tapajos / brazilian-rails

Brazilian Rails é um conjunto de gems para serem usadas com Ruby e com o Ruby on Rails e tem como objetivo unir alguns recursos úteis para os desenvolvedores brasileiros.
http://brazilian-rails.rubyforge.org
361 stars 100 forks source link

BrData faz com que os emails cheguem com data 31/12/1969 #25

Closed reinaldomendes closed 12 years ago

reinaldomendes commented 12 years ago

O Código listado abaixo faz com que a data "Mon, 26 Sep 2011" seja convertida "Seg, 26 set 2001"

Isto faz com que a data no cabeçalho do email não seja compreendida pelo "Thunderbird"(não sei se acontece em outros programas). O Thunderbird mostra a data como 31/12/1969

O trecho de código que compromete :

[Time, Date].each do |clazz|
    eval "#{clazz}::MONTHNAMES = [nil] + %w(Janeiro Fevereiro Março Abril Maio Junho Julho Agosto Setembro Outubro Novembro Dezembro)"
    eval "#{clazz}::DAYNAMES = %w(Domingo Segunda-Feira Terça-Feira Quarta-Feira Quinta-Feira Sexta-Feira Sábado)"
    eval "#{clazz}::ABBR_MONTHNAMES = [nil] + %w(Jan Fev Mar Abr Mai Jun Jul Ago Set Out Nov Dez)"
    eval "#{clazz}::ABBR_DAYNAMES = %w(Dom Seg Ter Qua Qui Sex Sab)"
end
eduardohertz commented 11 years ago

Tive esse problema em diversos projetos.

Alguma solução?

mfilipe commented 10 years ago

Fecharam o ticket sem deixar a solução. Como resolver esse problema?

No cabeçalho do e-mail a data chega em português:

Date: Seg, 19 Ago 2013 16:09:50 -0300

É preciso fazer com que o BrData nesse caso não faça a conversão.

mfilipe commented 10 years ago

Criei um monkey patch para resolver esse problema:

module Mail
  class DateField
    def initialize(value = nil, charset = 'utf-8')
      self.charset = charset
      if value.blank?
        value = ::DateTime.now.strftime('%a, %d %b %Y %H:%M:%S %z')
      else
        value = strip_field(FIELD_NAME, value)
        value.to_s.gsub!(/\(.*?\)/, '')
        value = ::DateTime.parse(value.to_s.squeeze(" ")).strftime('%a, %d %b %Y %H:%M:%S %z')
      end

      # FIXME: Esse hack foi adicionado ao projeto, pois existe uma incompatibilidade entre o brazilian-rails e o mail,
      #        fazendo com que as datas dos emails não seguissem o padrão RFC2822 e com isso todos os emails chegassem 
      #        com a data de 31-12-1969.            
      {'Dom'=>'Sun','Seg'=>'Mon','Ter'=>'Tue','Qua'=>'Wed','Qui'=>'Thu','Sex'=>'Fri','Sab'=>'Sat',
       'Fev'=>'Feb','Abr'=>'Apr','Mai'=>'May','Ago'=>'Aug','Set'=>'Sep','Out'=>'Oct','Dez'=>'Dec'}.each do |k, v| 
        value.gsub!(k, v) 
      end

      super(CAPITALIZED_FIELD, value, charset)
    rescue ArgumentError => e
      raise e unless "invalid date"==e.message
    end
  end
end