Вопрос по ruby-on-rails-3, actionmailer – Ruby on Rails 3.2 Mailer, локализовать почтовое поле

7

В настоящее время я пишу почтовую программу в 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
  ...

Короче говоря, в этом случае я хотел бы локализовать: subject с помощью @locale, но не запустив: I18n.locale = locale

Ваш Ответ

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
Извините, я набрал опечатку I18n, в конце она имеет 'n'. Simon Perepelitsa
Я попробовал этот подход, но он дает мнеNameError: uninitialized constant UserMailer::I18 Есть какие-нибудь подсказки? piffy
Я принял твой ответ, так как он больше похож на Rails Oktav
4

следующим образом:

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 переменная должна быть символом.

7

Направляет 4 пути:

# config/locales/en.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 - Переводит тему с использованием класса Rails I18n в области [mailer_scope, action_name]. Если он не найдет перевод для предмета в указанной области, он по умолчанию будет использовать гуманизированную версию имени действия. Если у субъекта есть интерполяции, вы можете передать их через параметр интерполяции.

Похожие вопросы