8

Estoy utilizando gema de diseño y quiero traducir el correo de confirmación. Ya tengo mi propia plantilla y anuncio publicitario reemplazado método:Diseño y plantilla de correo propio localizado

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

Por lo tanto, en mi plantilla que pueda hacer algo así:

I18n.locale = @locale 

Y luego:

t("it.really.works") 

Pero Don No sé cómo pasar mi variable con el método de configuración regional a remitente. ¿Cuál es la mejor manera de hacer eso? Cualquier ayuda sería apreciada.

Respuesta

1

Creo que la forma más sencilla de hacerlo es agregarlo en el registro. Así que usted puede agregar una columna local en su Usuario o juste añadir una attr_accessor :locale en su modelo de usuario

lo que sólo necesita definir esta configuración regional en su registro y utilizarlo con I18n.locale = record.locale

8

Diseñar está ofreciendo la localización de la plantilla de correo "nativamente".

echar un vistazo al código fuente legado

https://github.com/plataformatec/devise/blob/master/lib/devise/mailers/helpers.rb En este archivo se explica cómo localizar el sujeto (que se añade a los archivos locales)

# 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: '...' 
    # 

Esta es entonces la plantilla del cuerpo que necesita para localizar como cualquier otro html.erb

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

Dep finalizando si su nuevo usuario se registrará usando http://yoursite/it/users/sign_up o http://yoursite/en/users/sign_up (como lo haría normalmente en sus rutas para su aplicación localizada) se enviará el asunto y el correo bien localizados (en el primer caso en italiano, en este último en inglés).

+0

Gracias por su respuesta. Estaba probando esa solución, pero falla cuando no tengo locale in path y la plantilla es personalizada (hecha por mí, no provista por idee). Desafortunadamente, no puedo cambiar el enrutamiento, por lo que probablemente la única solución sea agregar el campo de configuración regional en el modelo de Usuario. – zachar

+0

Puede especificar una configuración regional predeterminada en sus rutas http://guides.rubyonrails.org/i18n.html 'alcance "(: locale)",: locale =>/es | it/do recursos: usuarios end' y su plantilla personalizada se utiliza en su lugar (la plantilla sobrescrito de' rieles generar legado: views') –

+1

De Por supuesto, pero no estoy autorizado a hacer eso en este proyecto. No depende de mí esta vez. De todos modos, gracias por la ayuda. Tuve que agregar el atributo de configuración regional al modelo de usuario, y ahora funciona como un amuleto. – zachar

6

Recomiendo agregar una columna locale a su modelo de Usuario y usar su propio anuncio publicitario. De esta manera también tiene más flexibilidad, si planea establecer sus propios stylesheets y campos from o agregar correos adicionales.

en config/initializer/devise.rb:

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

en 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

¿No es esta la firma de método correcta para idear 3.1rc2? reset_password_instructions def (usuario, ficha, opta = {}) –

+1

@IvailoBardarov i acaba de editar para utilizar las firmas correspondientes con el último legado –

0

Uno más forma es añadir el inicializador:

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 

para Ruby < 2.1 puede utilizar preocupación por alias_method_chain.

Cuestiones relacionadas