[Rails][ActionMailer][i18n] ActionMailerでメール毎の言語設定によってメールの内容を切り替えるRailsプラグインを書いた

書いたというかforkして、拡張した。

何がやりたかったのかというと、youRoomであるユーザがルームに登録を完了したときに、管理者に新規参加通知メールが送信されるんだけど、その際にアクセスした人の言語設定でなく、管理者の言語設定でメールを送信できるようにしたかったのです。

現在のRails 2.3.8では、アクセスしている人の言語設定がActionMailerのインスタンスでも反映されるため、送信先がアクセスしている以外であってもアクセスしている人の言語設定で送信されてしまいます。

そこで、見つけたのが以下のプラグイン i18n_action_mailer でした。

http://github.com/Bertg/i18n_action_mailer

こちらのpluginが、ActionMailerのメール毎に言語設定行って、アクセスした人の言語設定と分離して指定の言語でメールを送信できるプラグインでした。

ちょっと気になる点があったので、現在2点だけ修正を加えました。

  • gem化されてなかったので、gemにしてrubygems.orgにpushした
  • 言語設定でテンプレートの切り替えをできるようにした
    • I18n.translation などのメソッドは正しく動作するんやけど、やっぱり個人的にテンプレートを切り替えられる方が便利なので

使い方

いつも通り

config.gem "i18n_action_mailer"

で、gemインストールする

def some_mail(user, content)
  set_locale user.locale

  subject t('actionmailer.some_mail_title') # 上で設定した言語設定で指定された言語で表示される
  recipients user.email

  body :user => user, :content => content
end

# User#locale => ユーザの設定したlocaleを返す
# User#email => メールアドレスを返す

と、 set_locale メソッドで言語設定をメール毎に行えます。

また、テンプレートは、

views/some_mailer/some_mail.erb => views/some_mailer/some_mail.ja.erb
views/some_mailer/some_mail.erb => views/some_mailer/some_mail_ja.erb

と対応するファイルを作って翻訳しておけば、 set_locale の値によってテンプレートを切り替えます。テンプレートを切り替える方法の参考にしたのは以下のpluginを参考にしました。

http://github.com/kusakari/actionmailer_ja

このような感じのプラグインを作成・拡張してみました。お口にあいますでしょうか?

不具合があったので修正しました。

言語別のテンプレートの区切りを . から _ に変えました。 . だとスレッドのI18nのテンプレート切り替えとコンフリクトしてあるケースで不具合が起こった。