Рельсы: как я могу переопределить переопределить локаль на основе поддомен?

Я интернационализировал и локализовал свое приложение, используя стандартные механизмы рельсов. Все хранится в файлах en, fr, de.yml.

Мое приложение мультитенантно, основано на поддомене.

Я хотел бы разрешить моим пользователям переопределять определенные переводы в приложении (например, изменить "Сотрудник" на "Ассоциированный", потому что это соответствует их собственной терминологии).

Я пытался изменить путь загрузки моих файлов yml для каждого запроса, но безрезультатно.

Любая идея, как я мог бы, для каждого запроса, искать сначала в моем пользовательском файле yaml и возвращаться к файлу yaml по умолчанию, если перевод не был переопределен?

3 ответа

Предполагая, что вы храните субдомен в переменной экземпляра из фильтра контроллера, вы можете переопределить помощник по переводу, чтобы сначала выполнить поиск с определенной для субдомена областью, а затем вернуться к указанной или области по умолчанию. Что-то вроде этого:

module ApplicationHelper

  def t(key, original_options = {})
    options = original_options.dup
    site_translation_scope = ['subdomain_overrides', @subdomain.name]
    scope =
      case options[:scope]
      when nil
        site_translation_scope
      when Array
        options[:scope] = site_translation_scope + options[:scope]
      when String
        [site_translation_scope, options[:scope]].join(".")
      end
    translate(key, options.merge(:scope => scope, :raise => true))
  rescue I18n::MissingTranslationData
    translate(key, original_options)
  end

end

Затем вы добавляете свои поддомены, такие как:

en:
  customer: Customer
  subdomain_overrides:
    subdomain_1:
      customer: Buyer

Если вы хотите разрешить арендаторам использовать определенный язык, но отступить от значения по умолчанию, я написал микробиблиотеку, которая выполнит работу:

https://github.com/ElMassimo/i18n_multitenant

Он заботится о настройке I18n откат к базовой локали, что позволяет вам использовать специфичные для арендатора переводы, если они доступны. Он предназначен для работы со статическим бэкэндом по умолчанию .yml файлы, но он также должен работать с другими I18n движки.

Я недавно создал I18n_global_scope gem, который делает именно то, что вы описываете, пожалуйста, проверьте исходный код https://github.com/mobilityhouse/i18n_global_scope и дайте мне знать ваши отзывы.

Другие вопросы по тегам