我正在使用Ruby on Rails 3.1.1,我正在尝试翻译电子邮件正文。我创建/声明了所有必要的“东西”(YAML文件,键/值对,......)以使I18n gem工作:使用默认语言(:en
)发送电子邮件时没有问题。
然后我添加了一种新语言并完成了所有必须完成的工作,以使I18n gem能够与另一种语言一起使用,并在URL中始终获得locale=de
参数。
class ApplicationController < ActionController::Base
before_filter :set_locale
def set_locale
if params[:locale] && I18n.available_locales.include?(params[:locale].to_sym)
I18n.locale = params[:locale]
end
end
...
end
但是,当我发送电子邮件时,即使正确设置了区域设置(例如:locale=de
),也不会翻译已发送的电子邮件(仍然使用默认的:en
语言)。
如何让I18n翻译电子邮件正文?
params
方法......)?有更好的解决方案吗?答案 0 :(得分:17)
在您的railsproject中制作邮件程序(阅读http://guides.rubyonrails.org/action_mailer_basics.html如何制作邮件)。例如UserMailer。
rails g mailer UserMailer
定义一个方法,例如mail_user。
def mail_user(user)
@user = user
mail(:to => "test example <testuser@testuser.com>", :subject => "hello")
end
现在定义视图。例如:mail_user.de.html.erb和mail_user.en.html.erb。把你的翻译放在那里。如果要分别翻译变量,请使用:
<%= I18n.t("foo.bar") %>
执行此操作时,请确保您拥有en.yml和de.yml翻译!定义如下例所示的翻译:
foo:
bar: hello
你应该准备好了。
ActionMailer按以下方式工作。您可以创建从ActionMailer :: Base继承的邮件程序模型。与ActionController一样,模型在/ app / views /目录中具有关联的视图(模板)。
现在这里是技术部分,为什么这一切都神奇地起作用。 ActionController和ActionMailer默认包括直接或间接的AbstractController :: Rendering(ActionController :: Metal :: Rendering)。 AbstractController :: Rendering使用ActionView作为其模板渲染引擎的默认库,并包含AbstractController :: ViewPaths和I18n代理实例以查找本地化视图。要了解更多信息,我想参考github上的ActionPack源代码。
要明白这一点。 ActionView允许您在模板中使用本地化:请参阅Rails guide: Action View Overview,本地化视图章节。