Как отправлять сообщения электронной почты в 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 = > ... решит проблему с почтой, но изменит поведение в остальной части потока.
Ответы
Ответ 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