Разработать и локализовать собственный почтовый шаблон - PullRequest
8 голосов
/ 16 февраля 2012

Я использую devise gem и хочу перевести письмо с подтверждением. Я уже получил свой собственный шаблон и переопределенный метод почтовой программы:

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

Итак, в моем шаблоне я могу сделать что-то подобное:

I18n.locale = @locale

А потом:

t("it.really.works")

Но я не знаю, как передать мою переменную с локали в метод почтовой программы. Каков наилучший способ сделать это? Любая помощь будет оценена.

Ответы [ 4 ]

8 голосов
/ 16 февраля 2012

Devise предлагает локализацию почтового шаблона "нативно".

взгляните на исходный код устройства

https://github.com/plataformatec/devise/blob/master/lib/devise/mailers/helpers.rb В этом файле объясняется, как локализовать тему (для добавления в файлы локалей)

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

Это шаблон тела, который нужно локализовать, как и любой другой html.erb

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

В зависимости от того, будет ли ваш новый пользователь подписываться, используя http://yoursite/it/users/sign_up или http://yoursite/en/users/sign_up (как вы обычно делаете в своих маршрутах для вашего локализованного приложения), хороший локализованный предмет и почта (в первом случае на итальянском, во втором - в Английский) будет отправлен.

7 голосов
/ 21 сентября 2012

Я рекомендую добавить столбец locale к вашей модели пользователя и использовать свой собственный почтовый.Таким образом, у вас также больше гибкости, если вы планируете устанавливать свои собственные таблицы стилей и поля from или добавлять дополнительные письма.

в config/initializer/devise.rb:

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

в app/mailers/user_mailer.rb

class UserMailer < Devise::Mailer
  default from: "noreply@yourdomain.com"

  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 голос
/ 25 октября 2014

Еще один способ - добавить инициализатор:

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

Для ruby ​​<2.1 вы можете использовать значение <code>alias_method_chain.

1 голос
/ 16 февраля 2012

Я думаю, что самый простой способ сделать это - добавить его в протокол.Таким образом, вы можете добавить столбец локали в вашем Пользователе или просто добавить attr_accessor :locale в вашей модели пользователя

Так что вам просто нужно определить эту локаль в вашей записи и использовать ее с I18n.locale = record.locale

...