8

私は現在、ユーザーの言語に基づいてローカライズする必要があるメールを送信する RoR 3.2 のメーラーを作成しています。正しいローカライズされたビューをレンダリングすることができましたが、ロケールの変更が必要なフィールド (件名など) で問題が発生しています。メールを送信する前に、ロケールの変更に反対する投稿をいくつか読みました。ユーザーはさまざまな言語を使用しているため、ユーザーにメールが送信されるたびにロケールを変更することになります。

ロケールを変更したり、電子メールを送信したり、ロケールを元に戻したりできることはわかっています。これはレールのようには感じません。これを行う正しい方法はありますか?

ここにスニペットがあります:

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

4

3 に答える 3

30

グローバル ロケールを一時的に変更しても問題ありません。そのための便利な 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
于 2012-06-28T15:50:44.693 に答える
8

レール 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 が使用されます。サブジェクトに補間がある場合は、補間パラメータを介して渡すことができます。

于 2015-08-12T08:37:36.500 に答える
4

次のように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変数はシンボルである必要があることに注意してください。

于 2012-06-28T15:21:55.570 に答える