【问题标题】:Ruby on Rails 3.2 Mailer, localize mail subject fieldRuby on Rails 3.2 Mailer,本地化邮件主题字段
【发布时间】:2012-06-19 09:09:26
【问题描述】:

我目前正在用 RoR 3.2 编写一个邮件程序,它会发送应该根据用户语言进行本地化的邮件。我设法渲染了正确的本地化视图,但在某些需要更改语言环境的字段(如主题)方面遇到了一些困难。 在发送电子邮件之前,我已经阅读了一些反对更改语言环境的帖子。用户有许多不同的语言,这意味着每次向用户发送电子邮件时都要更改我的语言环境。

我知道可以更改语言环境、发送电子邮件、更改回语言环境。这感觉不像是铁轨方式。有正确的方法吗?

这是一个sn-p:

class AuthMailer < ActionMailer::Base
  add_template_helper(ApplicationHelper)
  default :from => PREDEF_MAIL_ADDRESSES::System[:general]

  [...]

  def invite(address, token, locale)
    @token = token
    @locale = locale
    @url = url_for(:controller => "signup_requests", :action => "new", :token => token.key, :locale => locale)

    mail(:subject => "Invitation", :to => address) do |format|
      format.html { render ("invite."+locale) }
      format.text { render ("invite."+locale) }
    end
  end

  [...]
end

我的看法

auth_mailer
  invite.en.html.erb
  invite.en.text.erb
  invite.it.html.erb
  invite.it.text.erb
  ...

简而言之,在这种情况下,我想使用 @locale 本地化 :subject,而不是通过运行:I18n.locale = locale

【问题讨论】:

    标签: ruby-on-rails-3 actionmailer


    【解决方案1】:

    暂时更改全局语言环境是可以的。有一个方便的 I18n.with_locale 方法。 ActionMailer 也会自动翻译主题。

    class AuthMailer
      def invite(address, token, locale)
        @token = token
        @locale = locale
        @url = url_for(:controller => "signup_requests", :action => "new", :token => token.key, :locale => locale)
    
        I18n.with_locale(locale) do
          mail(:to => address)
        end
      end
    end
    

    在语言环境中:

    en:
      auth_mailer:
        invite:
          subject: Invitation
    

    【讨论】:

    • 我试过这种方法,但它给了我一个NameError: uninitialized constant UserMailer::I18任何线索?
    • 对不起,我打错了 I18n,它的末尾有 'n'。
    【解决方案2】:

    Rails 4 路

    # config/locales/en.yml
    en:
      user_mailer:
        welcome:
          subject: 'Hello, %{username}'
    
    # app/mailers/user_mailer.rb
    class UserMailer < ActionMailer::Base
      def welcome(user)
        mail(subject: default_i18n_subject(username: user.name))
      end
    end
    

    default_i18n_subject - 使用 [mailer_scope, action_name] 范围内的 Rails I18n 类翻译主题。如果在指定范围内找不到主题的翻译,它将默认为 action_name 的人性化版本。如果主体有插值,可以通过插值参数传递。

    【讨论】:

      【解决方案3】:

      当您像这样调用 I18n 时,您应该能够传递语言环境:

      mail(:subject => I18n.t("app.invite.subject", :locale => locale), :to => address) do |format|
        format.html { render ("invite."+locale) }
        format.text { render ("invite."+locale) }
      end
      

      记住locale 变量必须是一个符号。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-06-14
        • 2010-11-30
        • 2011-12-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-19
        • 1970-01-01
        相关资源
        最近更新 更多