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