Вопрос

Я предполагаю, что рельсы хранят все анализованные переводы 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"), который имеет преимущество автоматического инициализации и перезагрузки переводов в режиме разработки (что-то, что не происходит, если вы называете защищенные методы.)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top