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.
Aquí hay una versión actualizada que también es compatible con la notación corta ''.key'', para que no tenga que deletrear cada una de las teclas en su totalidad.
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