8

Sto usando devise gem e voglio tradurre mail di conferma. Ho già avuto il mio modello e mailer override metodo:Modello di posta proprio inventato e localizzato

class LocalizedDeviseMailer < Devise::Mailer 
    def confirmation_instructions(record, locale) 
    @locale = locale 
    super 
    end 
end 

Così, nel mio modello posso fare qualcosa di simile:

I18n.locale = @locale 

E poi:

t("it.really.works") 

Ma don So come passare la mia variabile con le impostazioni locali al metodo mailer. Qual è il modo migliore per farlo? Qualsiasi aiuto sarebbe apprezzato.

risposta

1

Penso che il modo più semplice per farlo sia aggiungerlo al record. Così si può aggiungere una colonna locale nel vostro utente o juste aggiungere un attr_accessor :locale nel vostro modello User

quindi basta definire questo locale nel tuo disco e utilizzarlo con I18n.locale = record.locale

8

Devise sta offrendo la localizzazione del modello di posta "nativamente".

dare un'occhiata al codice sorgente concepire

https://github.com/plataformatec/devise/blob/master/lib/devise/mailers/helpers.rb In questo file è spiegato come localizzare il soggetto (da aggiungere ai file locali)

# Setup a subject doing an I18n lookup. At first, it attemps to set a subject 
    # based on the current mapping: 
    # 
    # en: 
    #  devise: 
    #  mailer: 
    #   confirmation_instructions: 
    #   user_subject: '...' 
    # 

Questo è quindi il modello di corpo che è necessario localizzare come qualsiasi altro html.erb

https://github.com/plataformatec/devise/blob/master/app/views/devise/mailer/confirmation_instructions.html.erb

Dep terminando se il tuo nuovo utente firmerà con http://yoursite/it/users/sign_up o http://yoursite/en/users/sign_up (come faresti normalmente nei tuoi percorsi per la tua applicazione localizzata) verrà inviato l'oggetto e la posta localizzati (nel primo caso in italiano, nel secondo in inglese).

+0

Grazie per la risposta. Stavo provando quella soluzione, ma fallisce quando non ho le impostazioni internazionali nel percorso e il modello è personalizzato (creato da me, non fornito da Idea). Sfortunatamente, non sono in grado di modificare il routing, quindi probabilmente solo la soluzione è aggiungere il campo locale nel modello Utente. – zachar

+0

È possibile specificare una localizzazione predefinita nei percorsi http://guides.rubyonrails.org/i18n.html 'scope" (: locale) ",: locale =>/it | it/do risorse: gli utenti fine' e verrà utilizzato il modello personalizzato (il modello sovrascritto da' rails generate devise: views') –

+1

Of Certo, ma non sono autorizzato a farlo in questo progetto. Non dipende da me questa volta. Comunque, grazie per l'aiuto. Ho dovuto aggiungere l'attributo locale al modello utente e ora funziona come un incantesimo. – zachar

6

Si consiglia di aggiungere una colonna locale al modello utente e utilizzare il proprio mailer. In questo modo hai anche più flessibilità, se hai intenzione di impostare i tuoi fogli di stile e i campi from o aggiungere altri messaggi.

in config/initializer/devise.rb:

Devise.setup do |config| 
    ... 
    config.mailer = "UserMailer" 
    ... 
end 

in app/mailers/user_mailer.rb

class UserMailer < Devise::Mailer 
    default from: "[email protected]" 

    def confirmation_instructions(user) 
    @user = user 
    set_locale(@user) 
    mail to: @user.email 
    end 

    def reset_password_instructions(user) 
    @user = user 
    set_locale(@user) 
    mail to: @user.email 
    end 

    def unlock_instructions(user) 
    @user = user 
    set_locale(@user) 
    mail to: @user.email 
    end 

    private 
    def set_locale(user) 
    I18n.locale = user.locale || I18n.default_locale 
    end 
end 
+1

Non è questa la firma del metodo corretta per Devise 3.1rc2? def reset_password_instructions (user, token, opts = {}) –

+1

@IvailoBardarov l'ho appena modificato per usare le firme appropriate con l'ultima idea –

0

più Un modo è quello di aggiungere l'inizializzazione:

require 'devise/mailer' 

module Devise 
    class Mailer 
    module Localized 
     %w(
     confirmation_instructions 
     reset_password_instructions 
     unlock_instructions 
    ).each do |method| 
     define_method(method) do |resource, *args| 
      I18n.with_locale(resource.try(:locale)) do 
      super(resource, *args) 
      end 
     end 
     end 
    end 

    prepend Localized 
    end 
end 

per Ruby < 2.1 è possibile utilizzare la preoccupazione con alias_method_chain.