Forum: Rails-ES Traducir correos I18n

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Mario S. (Guest)
on 2009-03-24 22:20
Hola,
estoy escribiendo una aplicación y tengo una duda sobre la
localización... quiero enviar el correo de recuperar la contraseña en el
idioma por defecto del usuario, tanto el subject como el cuerpo del
mail, puede ser inglés o castellano:

  def password_reset_instructions(user)
     from            "demo <removed_email_address@domain.invalid>"
    sent_on         Time.now
    #I18n.locale = user.language
    subject       t("models.notifier.password_reset_instructions")
    recipients    user.email
    body          :edit_password_reset_url =>
edit_password_reset_url(user.perishable_token)
  end

Luego tengo 2 vistas,

password_reset_instructions.en.html.erb y
password_reset_instructions.es.html.erb

Sí uso la línea:

I18n.locale = user.language

El correo le llega en el idioma que toca al usuario, pero por un momento
estoy haciendo que la aplicación se configure con el idioma de ese
usuario en cuestión, machacando lo que tengo en applicacion_controller:

  def set_locale
    I18n.locale = @ current_user && @current_user.language ? @
current_user.language : extract_locale_from_accept_language_header
  end

¿Es así como se debe de hacer o existe otra manera?
Muchas gracias a todos.
Borja Martín (Guest)
on 2009-03-24 23:04
(Received via mailing list)
Tal como yo lo veo, al ser la selección del idioma 'thread safe', en
principio no pasa nada porque cambies la locale de la aplicación. Lo que
si deberías hacer es guardarla en algún momento(o igual no te hace falta
porque puedes recuperarla de  I18n.default_locale) para volver a
asignarla cuando termines de mandar el correo.
También te podría ocurrir es que te saltase alguna excepción con la
locale cambiada, por lo que igual te interesa capturar el posible error
y asignar la locale de la aplicación.

(si se me permite voy a irme un poco por las ramas con este tema por si
alguien se encuentra alguien en esta situación)
Este tema con globalize2 se soluciona asignando la locale a la clase en
plan MiModelo.locale = 'en' y así no tienes porque tocar la locale de tu
aplicación(puedes estar trabajando con un objeto cuyo contenido quieres
que esté en inglés pero tu quieres mantener tu aplicación y los mensajes
en castellano por ej.)
De todas maneras la implementación de globalize2 tiene un pequeño
problema, y es que usa variables estáticas para asignar la locale de la
clase con lo por el funcionamiento de ruby con éstas te podría ocurrir
que cambiar la locale de una clase te afecte a *TODAS* las demás clases
que trabajan con globalize:
Foo.locale = 'en'
Bar.locale = 'es'
Foo.locale           # es <--- WTF?!!

hice un miniparche que soluciona esto utilizando los atributos
heredables de rails para que tenga un comportamiento más lógico:
Foo.locale = 'en'
Bar.locale = 'es'
Foo.locale           # en OK!!

http://github.com/dagi3d/globalize2/tree/master
http://github.com/dagi3d/globalize2/commit/5026a20...

Salud!
This topic is locked and can not be replied to.