Railsガイドによると、Action Mailer の件名は
mailメソッドに件名が渡されなかった場合、Action Mailerは既存の訳文の利用を試みます。「<mailer_scope>.<action_name>.subject」というパターンでキーが構築されます。
4.6 Action Mailerメールの件名を訳文に置き換える | Rails 国際化 (i18n) API - Railsガイド
となります。
ただ、
module Foo class BarMailer < ApplicationMailer # ...
のような名前空間付きのAction Mailerの場合、ロケールファイルではどのように指定すればよいか迷ったためメモを残します。
目次
環境
- Rails 6.1.4
名前空間付きのAction Mailerに対するロケールファイルの書き方
例えば
module Foo class BarMailer < ApplicationMailer def hello mail(to: 'baz@example.com') end end end
というAction Mailerに hello
というメソッドがあり、Controllerで
class HomeController < ApplicationController def index Foo::BarMailer.hello.deliver_now end end
のように呼ぶとします。
この場合は、 config/locales/en.yml
などのロケールファイルに
en: hello: "Hello world" foo: bar_mailer: hello: subject: My Subject
と、module Foo
に対して1階層 foo
を用意します。
ちなみに、Controllerでの呼び出しでは
::Foo::BarMailer.hello.deliver_now
でも良いです。
先頭の ::
については、以下が参考になりました。
さらに、以降も余談を続けます。
Mailerのメソッドがネストしている場合
例えば、Action Mailerが
module Foo class BarMailer < ApplicationMailer def hey send_mail end def send_mail mail(to: 'send_mail@example.com') end end end
と、 hey
メソッドの中で別のpublicなメソッド send_mail
を呼び出しているとします。
また、Controllerでは
class HomeController < ApplicationController def index Foo::BarMailer.hey.deliver_now end end
と hey
メソッドを呼ぶとします。
この時、件名に対応するロケールファイルのキーは
- hey
- send_mail
のどちらになるか迷いました。
試してみたところ、ロケールファイルでは
en: hello: "Hello world" foo: bar_mailer: hey: subject: Hey subject
と、Controllerで呼ぶ時のメソッド名 hey
をキーとして作れば良さそうです。
Mailerに対するロケールファイルのキーが存在しない場合
例えば
module Foo class BarMailer < ApplicationMailer def no_subject mail(to: 'no_subject@example.com') end end end
というメソッド no_subject
があるものの、ロケールファイルにキーが存在しない場合はどうなるか気になりました。
この時はメソッドの名前が件名に使われるようです。
ソースコード
Githubに上げました。
https://github.com/thinkAmi-sandbox/rails_i18n_app