Top > 開発ガイド > コンポーネント開発Tips集 > 多言語化(メール)

多言語化(メール)

対象バージョン

当ドキュメントはRubricks-0.6.x向けです。

クラスの定義

Mailerクラスは「RubricksMailer」を継承してください。「RubricksMailer」は「ActionMailer::Base」を継承しています。

class Sample::SampleMailer < RubricksMailer
end

テンプレートの準備

テンプレートは通常のRHTMLと同様の命名規約で準備をする必要があります。具体的には、上記のSampleMailerクラスの場合は「components/sample/sample_mailer」ディレクトリ内にテンプレートを準備することになります。

言語毎にテンプレートを準備して、各deliverメソッド内で上手く振り分けるようにしてください。その際、大抵の場合はRubricksUserが判定に必要になると思われます。

class Sample::SampleMailer < RubricksMailer
  def sample_mail(ru)
    template    "sample_mail_#{ru.language}"
    recipients  ru.email_by_admin
    from        system_mail_address
    subject     'Subject'
    body        :name => ru.login_name
  end
end

 => components/sample/sample_mailer/sample_mail_chinese.rhtml
                                   /sample_mail_english.rhtml
                                   /sample_mail_japanese.rhtml

文字コード変換

メールの送信時に言語に合わせて文字コードの変換が必要となります。以下のいずれかの方法でRubricksMailerに言語をしらせることで、自動的に文字コード変換を行わせることができます。

1. 各deliverメソッドに「:language」オプションを渡す

class Sample::SampleMailer < RubricksMailer
  def sample_mail(c1, c2, c3, options = {})
    template    "sample_mail_#{options[:language]}"
    ...
  end
end

Sample::SampleMailer.deliver_sample_mail('C1', 'C2', 'C3', {:language => 'japanese'})

2. 各deliverメソッドの第一引数をRubricksUserオブジェクトとする

class Sample::SampleMailer < RubricksMailer
  def sample_mail(ru)
    template    "sample_mail_#{ru.language}"
    ...
  end
end

Sample::SampleMailer.deliver_sample_mail(RubricksLib.current_user)

3. 各deliverメソッドに「:ru」オプションを渡す

class Sample::SampleMailer < RubricksMailer
  def sample_mail(c1, c2, c3, options = {})
    template    "sample_mail_#{options[:ru].language}"
    ...
  end
end

Sample::SampleMailer.deliver_sample_mail('C1', 'C2', 'C3', {:ru => RubricksLib.current_user})

指定された言語によって、以下の通り文字コード変換が実施されます。

言語変換後文字コード
chineseUTF8
englishUTF8
japaneseJIS(ISO-2022-JP)

なお、変換が行われる対象は「from」「subject」「body」となっています。 「subject」に多言語化キーを渡すと自動で多言語展開されます。多言語化キーを利用したい場合は、必ずキーのままで渡してください。sprintfフォーマットを利用したい場合は配列指定してください。

良い例:
class Sample::SampleMailer < RubricksMailer
  def sample_mail(ru)
    template    "sample_mail_#{ru.language}"
    recipients  ru.email_by_admin
    from        system_mail_address
    subject     ['[_Sample_XXXXX]', ru.login_name]
    body        :name => ru.login_name
  end
end

悪い例:
class Sample::SampleMailer < RubricksMailer
  def sample_mail(ru)
    template    "sample_mail_#{ru.language}"
    recipients  ru.email_by_admin
    from        system_mail_address
    subject     RubricksLib.hl('[_Sample_XXXXX]', ru.login_name)
    body        :name => ru.login_name
  end
end