Как извлечь все переводы из файлов YML в Rails I18n
-
26-09-2019 - |
Вопрос
Я предполагаю, что рельсы хранят все анализованные переводы YML файлов в своем роде массива / хеш. Есть ли способ получить доступ к этому?
Например, если у меня файл:
en:
test_string: "testing this"
warning: "This is just an example
Могу ли я сделать что-то вроде, i18n.translations_store [: ru] [: test_string]? Я мог бы разбирать файл YML с YAML :: Load, но в моем случае я разбиваю файлы YML в подпапках для организации, и я уверен, что рельсы уже проанализировали их все.
Решение
Вы должны назвать частный метод на бэкэнде. Вот как вы получаете доступ:
translations = I18n.backend.send(:translations)
translations[:en][:test_string] # => "testing this"
Другие советы
Согласно комментарию 8xx8, более простая версия:
I18n.t(:foo)
I18n.backend.send(:translations)[:en][:test_string]
является
I18n.t(".")[:test_string]
Это смягчает оба предварительна переводами или указывать локаль.
Если вы используете I18n::Fallbacks
К сожалению, вы не можете использовать I18n.t('.')
Поскольку он просто возвращает текущую локаль содержимого (например, 'en-gb') и ничего из любого из неверных локалей (например, EN '). Чтобы обойти это, вы можете перейти за отступы и использовать deep_merge!
объединить их.
module I18n
class << self
def all
fallbacks[I18n.locale].reverse.reduce({}) do |translations, fallback|
translations.deep_merge!(backend.translate(fallback, '.'))
end
end
end
end
По умолчанию I18N Backend I18N :: Backend :: Проще, что не подвергает вас переводам. (I18.backend.translations - защищенный метод.)
Это, как правило, не является хорошей идеей, но если вам действительно нужна эта информация и не может разобрать файл, вы можете продлить класс Backend.
class I18n::Backend::Simple
def translations_store
translations
end
end
Вы можете позвонить I18n.backend.translations_store
чтобы получить анализируемые переводы. Вы, вероятно, не должны полагаться на это как долгосрочную стратегию, но он получает вам необходимую информацию прямо сейчас.
Если вы делаете это в заложении к граблям, не забудьте включить среду, или иначе он не будет загружать свои собственные местности, которые живут под config/locales/
require "./config/environment.rb" # Do not forget this
namespace :i18n do
desc "Import I18n to I18n_active_record"
task :setup do
I18n.t(:foo)
translations = I18n.backend.send(:translations)
end
end
Для людей, блуждающих в этот старый вопрос, существует решение, которое не требует вызывающих охраняемых методов. Изменить свое yml
файл следующим образом:
nl: &all
... translations here ...
all:
<<: *all
Теперь вы можете просто извлечь все переводы, используя I18n.t("all")
, который имеет преимущество автоматического инициализации и перезагрузки переводов в режиме разработки (что-то, что не происходит, если вы называете защищенные методы.)