我正在使用devise gem并希望翻译确认邮件。我已经有了自己的模板和重写的邮件方法:
class LocalizedDeviseMailer < Devise::Mailer
def confirmation_instructions(record, locale)
@locale = locale
super
end
end
所以,在我的模板中,我可以做类似的事情:
I18n.locale = @locale
然后:
t("it.really.works")
但我不知道如何将带有locale的变量传递给mailer方法。最好的方法是什么?任何帮助将不胜感激。
答案 0 :(得分:8)
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
一样本地化的正文模板取决于您的新用户是使用http://yoursite/it/users/sign_up
还是http://yoursite/en/users/sign_up
进行sign_up(正如您在本地化应用程序的路径中所做的那样),这是一个好的本地化主题和邮件(前一种情况是意大利语,在后者的英文)将被发送。
答案 1 :(得分:7)
我建议您在用户模型中添加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
答案 2 :(得分:1)
我认为最简单的方法是将其添加到记录中。因此,您可以在用户中添加区域设置列,或者在用户模型中添加attr_accessor :locale
因此,您只需在记录中定义此区域设置,并将其与I18n.locale = record.locale
答案 3 :(得分:1)
另一种方法是添加初始化程序:
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&lt; 2.1,您可以使用alias_method_chain
。