Рельсы: как я могу переопределить переопределить локаль на основе поддомен?
Я интернационализировал и локализовал свое приложение, используя стандартные механизмы рельсов. Все хранится в файлах 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 и дайте мне знать ваши отзывы.