Подтвердить что ты не робот

Как отправлять сообщения электронной почты в Rails 3 с помощью локали получателя?

Как отправить почту в почтовом ящике, используя локализацию получателя. У меня есть предпочтительный язык для каждого пользователя в базе данных. Обратите внимание, что это отличается от текущей локали (I18n.locale), если текущий пользователь не должен быть получателем. Поэтому трудно использовать почтовый сервер в другом локали без изменения I18n.locale:

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

Использование I18n.locale = @user.profile.locale перед отправкой почты: to = > ... решит проблему с почтой, но изменит поведение в остальной части потока.

4b9b3361

Ответ 1

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

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

И он изменит локаль, чтобы просто отправить электронное письмо, сразу же отменив его после завершения блока.

Источник: http://www.rubydoc.info/docs/rails/2.3.8/I18n.with_locale

Ответ 2

Этот ответ был грязным хаком, который игнорировал метод I18n with_locale, который находится в другом ответе. Оригинальный ответ (который работает, но вы не должны его использовать) ниже.

Быстрая и грязная:

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

Ответ 3

в наиболее распространенной версии рельсов в это время достаточно использовать   "I18n.locale = account.locale" в контроллере и сделать несколько просмотров со следующей стратегией именования  welcome.html.erb,  welcome.it.html.erb и, например,  welcome.fr.html.erb

Ответ 4

Ничего из вышеперечисленного действительно не работает с версии 3, чтобы перевести как тему, так и контент, и убедитесь, что языковой стандарт был возвращен обратно к исходному... поэтому я сделал следующее (весь почерк наследует от этого класса:

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

Вам просто нужно установить локаль, прежде чем вы вызовете метод mail():

set_locale @user.locale

Вы можете использовать метод i18n_subject, который охватывает текущий путь, чтобы все было структурировано:

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

Ответ 5

Этот простой плагин был разработан для рельсов 2, но, похоже, работает и в рельсах 3.

http://github.com/Bertg/i18n_action_mailer

С его помощью вы можете сделать следующее:

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

Тема и почтовые шаблоны затем переводятся с использованием пользовательской локали.

Ответ 6

Здесь представлена ​​обновленная версия, которая также поддерживает короткую нотацию ".key", поэтому вам не нужно указывать каждую клавишу целиком.

http://github.com/larspind/i18n_action_mailer

Ответ 7

Проблема с упомянутыми плагинами заключается в том, что они не работают во всех ситуациях, например, при использовании User.human_name или User.human_attribute_name (...) не будут правильно переведены. Ниже приведен самый простой и гарантированный способ работы:

привяжите это где-нибудь (в инициализаторах или плагине):

  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)

а затем в вашем классе mailer запустите свой метод, установив желаемый язык, например:

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