Frage

Ich vermute, dass Schienen speichert alle geparsten Übersetzungen yml Dateien in einer Art von Array / Hash. Gibt es eine Möglichkeit, diese zugreifen?

Zum Beispiel, wenn ich habe eine Datei:

en:
  test_string: "testing this"
  warning: "This is just an example

Kann ich etwas tun, wie, I18n.translations_store [en] [: test_string]? Ich konnte die yml Datei mit YAML :: load analysieren, aber in meinem Fall habe ich die yml Dateien in Unterordner für Organisation gespaltet, und ich bin mir ziemlich sicher, dass Schienen bereits analysierten sie alle.

War es hilfreich?

Lösung

Sie haben eine private Methode auf das Backend zu nennen. Dies ist, wie Sie den Zugriff erhalten:

translations = I18n.backend.send(:translations)
translations[:en][:test_string] # => "testing this"

Andere Tipps

Wie pro 8xx8 Kommentar, eine einfachere Version von:

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

ist

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

Dies mildert sowohl Vorspannung die Übersetzungen mit oder das Gebietsschema angeben.

Wenn Sie mit I18n::Fallbacks leider kann man nicht I18n.t('.') verwenden, da es nur um den Inhalt aktuelle locale zurückgibt (z. B. ‚en-GB‘) und nichts von einem der Ausweich Gegenden (zB ‚en‘). Um diese Runde können Sie die Fallbacks und Verwendung deep_merge! iterieren kombinieren sie.

module I18n
  class << self
    def all
      fallbacks[I18n.locale].reverse.reduce({}) do |translations, fallback|
        translations.deep_merge!(backend.translate(fallback, '.'))
      end
    end
  end
end

Der Standard I18n Backend ist I18n :: Backend :: Simple, die nicht die Übersetzungen Sie aussetzt. (I18.backend.translations ist eine geschützte Methode.)

Dies ist nicht generell eine gute Idee, aber wenn Sie wirklich diese Informationen benötigen und die Datei nicht analysieren können, können Sie die Back-End-Klasse erweitern.

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

Sie können dann I18n.backend.translations_store rufen die geparsten Übersetzungen zu erhalten. Sie sollten wahrscheinlich sich nicht auf diese als langfristige Strategie, aber es wird Ihnen die Informationen, die Sie jetzt brauchen.

Wenn Sie dies in einer Harke Aufgabe tun, denken Sie daran, die Umwelt zu schließen, oder sonst wird es nicht Ihre eigenen Schauplätze laden, die unter config/locales/ leben

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

Für die Menschen in diese alte Frage wandern, gibt es eine Lösung, die nicht geschützten Methoden aufrufen erfordert. Ändern Sie Ihre yml Datei wie folgt:

nl: &all

  ... translations here ...

  all:
    <<: *all

Jetzt können Sie einfach alle Übersetzungen extrahieren mit I18n.t("all"), die den Vorteil der automatisch initialisiert und neu geladen hat, die Übersetzungen im Entwicklungsmodus (etwas, das passiert nicht, wenn Sie die geschützten Methoden aufrufen.)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top