Как перевести тело сообщения электронной почты, используя гем I18n? - PullRequest
10 голосов
/ 12 января 2012

Я использую Ruby on Rails 3.1.1 и пытаюсь перевести текст сообщения электронной почты. Я создал / указал все необходимые «вещи» (файлы YAML, пары ключ / значение, ...), чтобы заставить работать камень I18n: сообщения электронной почты отправляются без проблем с использованием языка по умолчанию (:en).

Затем я добавил новый язык и сделал все, что нужно, чтобы гем I18n работал с другим языком и всегда получал параметр locale=de в URL.

class ApplicationController < ActionController::Base
  before_filter :set_locale

  def set_locale
    if params[:locale] && I18n.available_locales.include?(params[:locale].to_sym)
      I18n.locale = params[:locale]
    end
  end

  ...
end

Однако, когда я отправил электронное письмо, даже если языковой стандарт настроен правильно (например, locale=de), отправленное электронное сообщение не переводится (в них по-прежнему используется язык :en по умолчанию).

Как я могу заставить I18n переводить текстовые сообщения электронной почты?


1 Ответ

17 голосов
/ 13 января 2012

Решение

В вашем Railsproject создайте почтовик (читайте http://guides.rubyonrails.org/action_mailer_basics.html, как его создать). Например, UserMailer.

rails g mailer UserMailer

Определите метод, например, mail_user.

def mail_user(user)
    @user = user
    mail(:to => "test example <testuser@testuser.com>", :subject => "hello")
end

Теперь определите виды. Например: mail_user.de.html.erb и mail_user.en.html.erb. Поместите туда свои переводы. Если вы хотите перевести переменные отдельно, используйте:

<%= I18n.t("foo.bar") %>

Когда вы сделаете это, убедитесь, что у вас есть перевод en.yml и de.yml! Определите перевод, как в следующем примере:

foo:
    bar: hello

Ты должен быть готов к работе.

Как это работает

ActionMailer работает следующим образом. Вы можете создавать модели почтовых программ, которые наследуются от ActionMailer :: Base. Как и ActionController, модели имеют связанные представления (шаблоны) в каталоге / app / views /.

Теперь вот техническая часть и почему это все волшебно работает. ActionController и ActionMailer по умолчанию включают в себя AbstractController :: Rendering прямо или косвенно (ActionController :: Metal :: Rendering). AbstractController :: Rendering использует ActionView в качестве библиотеки по умолчанию для своего механизма визуализации шаблонов и включает AbstractController :: ViewPaths и экземпляр прокси I18n для поиска локализованных представлений. Чтобы узнать больше, я хотел бы обратиться к исходному коду ActionPack на github.

Чтобы добраться до сути. ActionView позволяет использовать локализацию в ваших шаблонах: см. Руководство по Rails: обзор Action View , Глава Локализованные представления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...