Как установить локаль движка Rails (он использует: en даже у жесткого хост-приложения другой локаль) - PullRequest
0 голосов
/ 23 февраля 2020

Я следовал великому руководству Rails по двигателям (https://guides.rubyonrails.org/engines.html) и сумел заставить мой двигатель работать в хост-приложении.

Однако двигатель загружает только en.yml locale, даже если в хост-приложении I18n.default_locale и I18n.locale установлены оба значения pt-br, и у меня в движке есть файл config/locales/pt-br.yml.

В руководстве только указано, что "Для локалей: просто поместите файлы локали в каталог config / locales, как в приложении. "Но, очевидно, мне нужно сделать что-то еще.

Как заставить движок загружать правильные файлы локали I18n на основании настроек хост-приложения? Если это невозможно, как приложение хоста может установить эту локаль в файле инициализатора, например, в параметре конфигурации?

1 Ответ

0 голосов
/ 24 февраля 2020

Мне удалось это решить. Главное, помнить, что I18n.locale - это настройка, которую следует устанавливать при каждом запросе.

Поэтому в точке входа моего двигателя (lib/cron_monitor.rb) я определил настройку:

module CronMonitor

  class << self

    attr_accessor :i18n

  end

  self.i18n = I18n.default_locale

Затем в моем движке ApplicationController, следуя документации Rails i18n :

module CronMonitor
  class ApplicationController < ActionController::Base
    around_action :switch_locale

    private

    def switch_locale(&action)
      locale = CronMonitor.i18n || I18n.default_locale
      I18n.with_locale(locale, &action)
    end

  end
end

Кроме того, если у вас есть код в моделях или объектах обслуживания, который вы также хотите перевести, вы следует также использовать I18n. Пример:


module CronMonitor
  class Category < ApplicationRecord

  def self.some_method

        message = I18n.translate(
          "cron_monitor.starting_or_finishing.failure",
          title: self.title,
          locale: CronMonitor.i18n
        )
  end

end

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