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

Bac*_*cko 10 ruby rubygems ruby-on-rails internationalization ruby-on-rails-3

我正在使用Ruby on Rails 3.1.1,我正在尝试翻译电子邮件正文.我创建/声明了所有必要的"东西"(YAML文件,键/值对,......)以使I18n gem工作:使用默认语言(:en)发送电子邮件消息没有问题.

然后我添加了一种新语言并完成了所有必须完成的工作,以使I18n gem能够与其他语言一起使用并始终locale=de在URL中获取参数.

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
Run Code Online (Sandbox Code Playgroud)

但是,当我发送电子邮件时,即使正确设置了区域设置(例如:) locale=de,发送的电子邮件也不会被翻译(那些仍然使用默认:en语言).

如何让I18n翻译电子邮件正文?


Ant*_*cki 17

在你的railsproject制作一个邮件程序(阅读http://guides.rubyonrails.org/action_mailer_basics.html如何制作一个邮件).例如UserMailer.

rails g mailer UserMailer
Run Code Online (Sandbox Code Playgroud)

定义一个方法,例如mail_user.

def mail_user(user)
    @user = user
    mail(:to => "test example <testuser@testuser.com>", :subject => "hello")
end
Run Code Online (Sandbox Code Playgroud)

现在定义视图.例如:mail_user.de.html.erb和mail_user.en.html.erb.把你的翻译放在那里.如果要分别翻译变量,请使用:

<%= I18n.t("foo.bar") %>
Run Code Online (Sandbox Code Playgroud)

执行此操作时,请确保您具有en.yml和de.yml翻译!定义类似以下示例的翻译:

foo:
    bar: hello
Run Code Online (Sandbox Code Playgroud)

你应该准备好了.

这是如何工作的

ActionMailer按以下方式工作.您可以创建从ActionMailer :: Base继承的邮件程序模型.与ActionController一样,模型在/ app/views /目录中具有关联的视图(模板).

现在这里是技术部分,为什么这一切都神奇地起作用.ActionController和ActionMailer默认包括直接或间接的AbstractController :: Rendering(ActionController :: Metal :: Rendering).AbstractController :: Rendering使用ActionView作为其模板渲染引擎的默认库,并包含AbstractController :: ViewPaths和I18n代理的实例以查找本地化视图.要了解更多信息,我想在github上参考ActionPack源代码.

为了达到目的.ActionView允许您在模板中使用本地化:请参阅Rails指南:操作视图概述,本地化视图章节.

  • mailer_name.en.html.erb技巧是一个很棒的提示!完全有效 - 它在哪里记录? (3认同)