Как получить все переводы из файлов yml в Rails I18n - PullRequest
32 голосов
/ 29 сентября 2010

Я предполагаю, что 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 ]

59 голосов
/ 29 октября 2010

Вы должны вызвать частный метод на сервере. Вот как вы получаете доступ:

translations = I18n.backend.send(:translations)
translations[:en][:test_string] # => "testing this"
18 голосов
/ 04 мая 2015

Согласно комментарию 8xx8, более простая версия:

I18n.t(:foo)
I18n.backend.send(:translations)[:en][:test_string]

есть

I18n.t(".")[:test_string]

Это устраняет необходимость предварительно загружать переводы или указывать локаль.

3 голосов
/ 15 июля 2016

Если вы используете 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
2 голосов
/ 29 сентября 2010

Бэкэнд по умолчанию I18n - I18n :: Backend :: Simple, который не предоставляет вам переводы.(I18.backend.translations - защищенный метод.)

Обычно это не очень хорошая идея, но если вам действительно нужна эта информация и вы не можете разобрать файл, вы можете расширить класс бэкенда.1003 *

class I18n::Backend::Simple
  def translations_store
    translations
  end
end

Затем вы можете позвонить I18n.backend.translations_store, чтобы получить проанализированные переводы.Вы, вероятно, не должны полагаться на это как на долгосрочную стратегию, но она дает вам необходимую информацию прямо сейчас.

1 голос
/ 15 января 2016

Если вы делаете это в задании на грабли, не забудьте включить окружение, иначе оно не будет загружать ваши собственные локали, которые живут под 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
0 голосов
/ 25 февраля 2015

Для людей, интересующихся этим старым вопросом, есть решение, которое не требует вызова защищенных методов. Измените файл yml следующим образом:

nl: &all

  ... translations here ...

  all:
    <<: *all

Теперь вы можете просто извлечь все переводы, используя I18n.t("all"), преимущество которого заключается в автоматической инициализации и перезагрузке переводов в режиме разработки (чего не происходит, если вы вызываете защищенные методы.)

...