如何使用I18n gem翻译电子邮件正文?

时间:2012-01-12 14:40:50

标签: ruby-on-rails ruby ruby-on-rails-3 internationalization rubygems

我正在使用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翻译电子邮件正文?


1 个答案:

答案 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,本地化视图章节。