26

受信者のロケールを使用してメーラーでメールを送信するにはどうすればよいですか。データベース内の各ユーザーに優先されるロケールがあります。現在のユーザーが受信者である必要がない限り、これは現在のロケール(I18n.locale)とは異なることに注意してください。したがって、難しいのは、I18n.localeを変更せずに別のロケールでメーラーを使用することです。

def new_follower(user, follower)
  @follower = follower
  @user = user
  mail :to=>@user.email
end

メールの前にI18n.locale=@ user.profile.locale:to => ...を使用すると、メーラーの問題は解決されますが、スレッドの残りの部分の動作が変更されます。

4

7 に答える 7

6

この回答は、別の回答にあるI18nのwith_locale方法を無視した汚いハックでした。元の回答 (動作しますが、使用しないでください) は以下のとおりです。

クイックアンドダーティ:

class SystemMailer < ActionMailer::Base
  def new_follower(user, follower)
    @follower = follower
    @user = user
    using_locale(@user.profile.locale){mail(:to=>@user.email)}
  end

  protected
  def using_locale(locale, &block)
    original_locale = I18n.locale
    I18n.locale = locale
    return_value = yield
    I18n.locale = original_locale
    return_value
  end
end
于 2011-07-15T11:56:57.270 に答える
4

現時点でのレールの最新バージョンでは、コントローラーで「I18n.locale = account.locale」を使用し、次の命名戦略で複数のビューを作成するだけで十分ですwelcome.html.erb、welcome.it.html.erbなどWelcome.fr.html.erb

于 2011-06-06T23:22:47.103 に答える
2

バージョン 3 以降、件名とコンテンツの両方を翻訳し、ロケールが元のロケールにリセットされていることを確認してから、上記のどれも実際には機能していません。

class ResourceMailer < ActionMailer::Base

  def mail(headers={}, &block)
    I18n.locale = mail_locale
    super
  ensure
    reset_locale
  end

  def i18n_subject(options = {})
    I18n.locale = mail_locale
    mailer_scope = self.class.mailer_name.gsub('/', '.')
    I18n.t(:subject, options.merge(:scope => [mailer_scope, action_name], :default => action_name.humanize))
  ensure
    reset_locale
  end  

  def set_locale(locale)
    @mail_locale = locale
  end

  protected

  def mail_locale
    @mail_locale || I18n.locale
  end

  def reset_locale
    I18n.locale = I18n.default_locale
  end

end

mail() メソッドを呼び出す前に、ロケールを設定する必要があります。

set_locale @user.locale

すべてが構造化されるように、現在のパスをスコープする i18n_subject メソッドを使用できます。

mail(:subject => i18n_subject(:name => @user.name)
于 2011-09-22T10:30:52.740 に答える
1

上記のプラグインの問題は、すべての状況で機能するとは限らないことです。たとえば、User.human_nameまたはUser.human_attribute_name(...)を実行しても正しく変換されません。以下は、最も簡単で保証された方法です。

これをどこかに貼り付けます(初期化子またはプラグイン内):

  モジュールI18nActionMailer
    def self.included(base)
      base.class_eval do
        InstanceMethodsを含める
        alias_method_chain:create!、:locale
      終わり
    終わり

    モジュールInstanceMethods
      def create_with_locale!(method_name、* parameters)
        original_locale = I18n.locale
        始める
          create_without_locale!(method_name、* parameters)
        確認
          I18n.locale = original_locale
        終わり
      終わり
    終わり
  終わり

  ActionMailer :: Base.send(:include、I18nActionMailer)

次に、メーラークラスで、目的のロケールを設定してメソッドを開始します。次に例を示します。

  defwelcome(ユーザー)
    I18n.locale = user.locale
    #など
  終わり
于 2010-11-13T06:04:33.977 に答える
1

このシンプルなプラグインは Rails 2 用に開発されましたが、Rails 3 でも動作するようです。

http://github.com/Bertg/i18n_action_mailer

それを使用すると、次のことができます。

def new_follower(user, follower)
  @follower = follower
  @user = user
  set_locale user.locale
  mail :to => @user.email, :subject => t(:new_follower_subject)
end

件名とメール テンプレートは、ユーザーのロケールを使用して翻訳されます。

于 2010-08-30T13:53:00.523 に答える
1

これは、'.key' 短縮表記もサポートする更新バージョンです。そのため、各キー全体を綴る必要はありません。

http://github.com/larspind/i18n_action_mailer

于 2010-09-20T19:03:06.820 に答える