2012-06-19 10 views
7

Attualmente sto scrivendo un mailer in RoR 3.2 che invierà mail che dovrebbero essere localizzate in base alla lingua degli utenti. Sono riuscito a visualizzare correttamente le viste localizzate, ma ho qualche difficoltà con alcuni campi che richiedono la modifica delle impostazioni internazionali (come l'oggetto). Ho già letto alcuni post che sono contrari alla modifica delle impostazioni internazionali prima di inviare l'e-mail. Gli utenti hanno molte lingue diverse e ciò significherebbe cambiare la mia localizzazione ogni volta che un utente riceve un'e-mail.Ruby on Rails 3.2 Mailer, localize mail subject field

So che sarebbe possibile modificare le impostazioni locali, inviare l'e-mail, modificare le impostazioni internazionali. Questo non sembra il modo delle rotaie. C'è un modo corretto per farlo?

Ecco un frammento:

class AuthMailer < ActionMailer::Base 
    add_template_helper(ApplicationHelper) 
    default :from => PREDEF_MAIL_ADDRESSES::System[:general] 

    [...] 

    def invite(address, token, locale) 
    @token = token 
    @locale = locale 
    @url = url_for(:controller => "signup_requests", :action => "new", :token => token.key, :locale => locale) 

    mail(:subject => "Invitation", :to => address) do |format| 
     format.html { render ("invite."+locale) } 
     format.text { render ("invite."+locale) } 
    end 
    end 

    [...] 
end 

Le mie opinioni

auth_mailer 
    invite.en.html.erb 
    invite.en.text.erb 
    invite.it.html.erb 
    invite.it.text.erb 
    ... 

In breve, in questo caso, mi piacerebbe di localizzare il: soggetto utilizzando il @locale, ma non eseguendo: I18n.locale = locale

risposta

30

È possibile modificare temporaneamente le impostazioni internazionali globali. C'è un pratico metodo I18n.with_locale per quello. Inoltre ActionMailer traduce automaticamente un soggetto.

class AuthMailer 
    def invite(address, token, locale) 
    @token = token 
    @locale = locale 
    @url = url_for(:controller => "signup_requests", :action => "new", :token => token.key, :locale => locale) 

    I18n.with_locale(locale) do 
     mail(:to => address) 
    end 
    end 
end 

Nella localizzazione:

en: 
    auth_mailer: 
    invite: 
     subject: Invitation 
+0

ho accettato la risposta come cuciture più Rails-ish – Oktav

+0

ho provato questo approccio, ma mi dà un 'NameError: non inizializzata UserMailer costante :: I18' Degli indizi? – piffy

+0

Spiacente, ho scritto male I18n, ha 'n' alla fine. –

4

si dovrebbe essere in grado di passare un locale quando si chiama I18n in questo modo:

mail(:subject => I18n.t("app.invite.subject", :locale => locale), :to => address) do |format| 
    format.html { render ("invite."+locale) } 
    format.text { render ("invite."+locale) } 
end 

Ricordare che la variabile locale deve essere un simbolo.

6

Rails 4 modo:

# config/locales/en.yml 
en: 
    user_mailer: 
    welcome: 
     subject: 'Hello, %{username}' 

# app/mailers/user_mailer.rb 
class UserMailer < ActionMailer::Base 
    def welcome(user) 
    mail(subject: default_i18n_subject(username: user.name)) 
    end 
end 

default_i18n_subject - traduce il soggetto utilizzando la classe Rails I18n sotto [mailer_scope, action_name] ambito. Se non trova una traduzione per l'argomento nell'ambito specificato, verrà automaticamente impostato su una versione umanizzata di action_name. Se il soggetto ha interpolazioni, è possibile passarle attraverso il parametro interpolazioni.