yml with spanish rails in18 i18n example internationalization ruby-on-rails-3 actionmailer

internationalization - spanish - rails i18n with parameters



¿Cómo puedo enviar correos electrónicos en Rails 3 utilizando la configuración regional del destinatario? (7)

¿Cómo puedo enviar correos en una aplicación de correo usando la configuración regional del destinatario? Tengo la configuración regional preferida para cada usuario en la base de datos. Tenga en cuenta que esto es diferente de la configuración regional actual (I18n.locale), siempre que el usuario actual no tenga que ser el destinatario. Entonces, lo difícil es usar el programa de correo en una ubicación diferente sin cambiar I18n.locale:

def new_follower(user, follower) @follower = follower @user = user mail :to=>@user.email end

Usar I18n.locale = @ user.profile.locale antes de mail: to => ... resolvería el problema del correo, pero cambiaría el comportamiento en el resto del hilo.



Creo que la mejor manera de hacerlo es con el gran método I18n.with_locale , que te permite cambiar temporalmente I18n.locale dentro de un bloque, puedes usarlo así:

def new_follower(user, follower) @follower = follower @user = user I18n.with_locale(@user.profile.locale) do mail to: @user.email end end

Y cambiará la configuración regional solo para enviar el correo electrónico, cambiando inmediatamente después de que finalice el bloqueo.

Fuente: http://www.rubydoc.info/docs/rails/2.3.8/I18n.with_locale


El problema con los complementos mencionados es que no funcionan en todas las situaciones, por ejemplo, hacer User.human_name o User.human_attribute_name (...) no se traducirán correctamente. El siguiente es el método más fácil y garantizado para trabajar:

pegar esto en algún lugar (en inicializadores o un plugin):

module I18nActionMailer def self.included(base) base.class_eval do include InstanceMethods alias_method_chain :create!, :locale end end module InstanceMethods def create_with_locale!(method_name, *parameters) original_locale = I18n.locale begin create_without_locale!(method_name, *parameters) ensure I18n.locale = original_locale end end end end ActionMailer::Base.send(:include, I18nActionMailer)

y luego, en su clase de correo, inicie su método configurando la configuración regional deseada, por ejemplo:

def welcome(user) I18n.locale = user.locale # etc. end


Esta respuesta fue un truco sucio que ignoró el método with_locale de with_locale , que se encuentra en otra respuesta. La respuesta original (que funciona pero no debes usarla) está abajo.

Rápido y sucio:

class SystemMailer < ActionMailer::Base def new_follower(user, follower) @follower = follower @user = user using_locale(@user.profile.locale){mail(:to=>@user.email)} end protected def using_locale(locale, &block) original_locale = I18n.locale I18n.locale = locale return_value = yield I18n.locale = original_locale return_value end end


Este sencillo complemento fue desarrollado para los rieles 2, pero también parece funcionar en los rieles 3.

http://github.com/Bertg/i18n_action_mailer

Con él podrás hacer lo siguiente:

def new_follower(user, follower) @follower = follower @user = user set_locale user.locale mail :to => @user.email, :subject => t(:new_follower_subject) end

El asunto y las plantillas de correo se traducen utilizando la configuración regional del usuario.


Ninguno de los anteriores funciona realmente desde la versión 3 para traducir tanto el tema como el contenido, y asegúrese de que la configuración regional se restablezca de nuevo a la original ... así que hice lo siguiente (todos los correos se heredan de esa clase:

class ResourceMailer < ActionMailer::Base def mail(headers={}, &block) I18n.locale = mail_locale super ensure reset_locale end def i18n_subject(options = {}) I18n.locale = mail_locale mailer_scope = self.class.mailer_name.gsub(''/'', ''.'') I18n.t(:subject, options.merge(:scope => [mailer_scope, action_name], :default => action_name.humanize)) ensure reset_locale end def set_locale(locale) @mail_locale = locale end protected def mail_locale @mail_locale || I18n.locale end def reset_locale I18n.locale = I18n.default_locale end end

Solo necesita establecer la configuración regional antes de llamar al método mail ():

set_locale @user.locale

Puede usar el método i18n_subject que abarca la ruta actual para que todo esté estructurado:

mail(:subject => i18n_subject(:name => @user.name)


en la versión más reenviada de rieles en este momento es suficiente usar "I18n.locale = account.locale" en el controlador y hacer múltiples vistas con la siguiente estrategia de nombres welcome.html.erb, welcome.it.html.erb y, por ejemplo, bienvenido.fr.html.erb