Как получить все переводы из файлов yml в Rails I18n
Я предполагаю, что rails хранит все проанализированные переводы YML-файлов в виде массива / хэша. Есть ли способ получить доступ к этому?
например, если у меня есть файл:
en:
test_string: "testing this"
warning: "This is just an example
могу ли я сделать что-то вроде, I18n.translations_store [: en] [: test_string] ? Я мог бы проанализировать файл yml с помощью YAML:: load, но в моем случае я разделил файлы yml в подпапках для организации, и я уверен, что rails уже проанализировал их все.
6 ответов
вы должны вызвать частный метод на бэкэнде. Вот как вы получаете доступ:
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::Simple, который не предоставляет вам переводы. (I18.базовая программа.переводы-это защищенный метод.)
обычно это не очень хорошая идея, но если вам действительно нужна эта информация и вы не можете разобрать файл, вы можете расширить класс backend.
class I18n::Backend::Simple
def translations_store
translations
end
end
затем вы можете позвонить I18n.backend.translations_store
для получения проанализированных переводов. Вероятно, вам не следует полагаться на это как на долгосрочную стратегию, но она дает вам необходимую информацию сейчас.
для людей, блуждающих в этом старом вопросе, есть решение, которое не требует вызова защищенных методов. Измените свой yml
файл выглядит следующим образом:
nl: &all
... translations here ...
all:
<<: *all
Теперь вы можете просто извлечь все переводы через I18n.t("all")
, что имеет преимущество автоматической инициализации и перезагрузки переводов в режиме разработки (чего не происходит, если вы вызываете защищенные методы.)
Если вы делаете это в задаче rake, не забудьте включить окружающую среду, или в противном случае она не будет загружать ваши собственные локали, которые живут под 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