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.

Était-ce utile?

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.)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top