Comment récupérer toutes les traductions de fichiers YML dans Rails I18n
-
26-09-2019 - |
Question
Je devine que tous les rails stocke les fichiers de traductions analysable dans une sorte de tableau / hachage. Est-il possible d'accéder à ce?
Par exemple, si j'ai un fichier:
en:
test_string: "testing this"
warning: "This is just an example
Puis-je faire quelque chose comme, I18n.translations_store [: en] [: test_string]? Je pourrais analyser le fichier YML avec YAML :: charge, mais dans mon cas, j'ai les fichiers fente YML dans les sous-dossiers pour l'organisation, et je suis sûr que les rails déjà les parsés tous.
La solution
Vous devez appeler une méthode privée sur le back-end. Voici comment vous avez accès:
translations = I18n.backend.send(:translations)
translations[:en][:test_string] # => "testing this"
Autres conseils
Comme par le commentaire de 8xx8, une version simplifiée de:
I18n.t(:foo)
I18n.backend.send(:translations)[:en][:test_string]
est
I18n.t(".")[:test_string]
Cette mitige ayant à la fois pré-charge les traductions ou spécifier les paramètres régionaux.
Si vous utilisez I18n::Fallbacks
, malheureusement, vous ne pouvez pas utiliser I18n.t('.')
car il retourne juste le contenu locale en cours (par exemple. « En-GB ») et rien de l'un des lieux de repli (par exemple « en »). Pour contourner cela, vous pouvez parcourir la deep_merge!
et l'utilisation des solutions de repli pour les combiner.
module I18n
class << self
def all
fallbacks[I18n.locale].reverse.reduce({}) do |translations, fallback|
translations.deep_merge!(backend.translate(fallback, '.'))
end
end
end
end
Le backend I18n par défaut est I18n :: Backend :: Simple, qui ne pas exposer les traductions à vous. (I18.backend.translations est une méthode protégée.)
Ceci est généralement pas une bonne idée, mais si vous avez vraiment besoin de cette information et ne peut pas analyser le fichier, vous pouvez étendre la classe de back-end.
class I18n::Backend::Simple
def translations_store
translations
end
end
Vous pouvez ensuite appeler I18n.backend.translations_store
pour obtenir les traductions analysable. Vous ne devriez probablement pas compter sur cela comme une stratégie à long terme, mais il vous obtient les informations dont vous avez besoin en ce moment.
Si vous faites cela dans une tâche de râteau, souvenez-vous d'inclure l'environnement, ou sinon il ne se charge pas vos propres lieux qui vit sous 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
Pour les personnes errantes dans cette vieille question, il y a une solution qui ne nécessite pas d'appeler des méthodes protégées. Modifiez votre fichier yml
comme suit:
nl: &all
... translations here ...
all:
<<: *all
Maintenant, vous pouvez simplement extraire toutes les traductions en utilisant I18n.t("all")
, qui a l'avantage d'initialisation automatiquement et rechargeant les traductions en mode développement (ce qui ne se produit pas si vous appelez les méthodes protégées.)