Wie alle Übersetzungen von yml Dateien in Rails I18n abrufen
-
26-09-2019 - |
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.
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.)