Динамическая загрузка переводов I18n из gem в Rails Engine

Я создал гем (TranslationsGem), который использую в нескольких проектах (движок и приложение Rails). Этот гем устанавливает несколько хэшей, которые загружаются в серверную часть I18n.

Метод #store_dynamic_translations устанавливает несколько хэшей, которые загружаются в серверную часть I18n. В основном это работает так:

I18n.backend.store_translations(:en, { test: { property: 'value' } })

Мои тесты подтверждают, что метод и загрузка перевода работают корректно. Однако я не могу заставить его работать в хост-движке и приложении Rails. В моей тестовой среде я должен выполнить метод в моем test_helper, чтобы убедиться, что переводы загружаются правильно. Вне тестовой среды я не могу заставить его работать правильно. Я могу убедиться, что метод выполняется, но переводы не загружаются.

Я пробовал множество вещей в течение нескольких часов, например, выполняя метод в Инициализатор движка и использование перехватчиков ActiveSupport. В хост-приложении Rails я попытался выполнить #store_dynamic_translations в инициализаторе, но безрезультатно.

Как ни странно, если я выполняю #store_dynamic_translations в своем контроллере или представлении приложения Rails, это работает. Есть ли способ настроить это во время загрузки приложения?


EDIT: я установил пример репозитория, который содержит текущую настройку.

  1. Gem, который динамически сохраняет переводы в бэкэнд I18n.

  2. Rails Engine, который загружает гем и должен иметь доступный перевод

В данном тесте раскомментирование директивы MyI18n::Translations.store_dynamic_translations делает тест пройденным. Но это должно быть возможно сделать из инициализатор движка Я думаю?


person richard    schedule 25.06.2016    source источник
comment
Я написал ответ SO о различных способах добавления переводов, возможно, вы захотите попробовать создать конкретный бэкэнд перевода и добавить его, используя цепочку, как описано здесь: stackoverflow.com/questions/25386964/   -  person Marc Lainez    schedule 29.06.2016
comment
В Rails есть хук after_initialize, который вы можете вызвать. Или вы можете вызвать это в блоке before_action в вашем контроллере приложений.   -  person ekampp    schedule 04.07.2016
comment
@EmilKampp похоже, что after_initialize действительно работает, судя по тесту, который я только что провел! В отличие от всех других крючков, которые я пробовал. Сегодня постараюсь в этом убедиться.   -  person richard    schedule 06.07.2016
comment
Хороший. Дайте мне знать, как это происходит.   -  person ekampp    schedule 06.07.2016


Ответы (1)


Согласно предложению Эмиля Камппа, правильный хук был after_initialize. Я указал это в engine.rb:

module Blorgh
  class Engine < ::Rails::Engine
    isolate_namespace Blorgh

    config.after_initialize do
      MyI18n::Translations.store_dynamic_translations
    end
  end
end
person richard    schedule 07.07.2016