Domanda

sto cercando di indovinare che Rails memorizza i file di tutte le traduzioni YML parsed in una sorta di matrice / hash. C'è un modo per accedere a questo?

Per esempio, se ho un file:

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

Potrei fare qualcosa di simile, I18n.translations_store [: it] [: test_string]? Ho potuto analizzare il file yml con YAML :: load, ma nel mio caso ho spacco i file YML in sottocartelle per l'organizzazione, e sono abbastanza sicuro che le rotaie già tutti analizzati.

È stato utile?

Soluzione

Hai avuto modo di chiamare un metodo privato sul backend. Questo è come si ottiene l'accesso:

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

Altri suggerimenti

Come per il commento di 8xx8, una versione più semplice di:

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

è

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

Questo mitiga hanno a che sia il precarico delle traduzioni o specificare le impostazioni internazionali.

Se si utilizza I18n::Fallbacks purtroppo non è possibile utilizzare I18n.t('.') in quanto restituisce solo il contenuto locale corrente (ad es. 'It-IT') e non da uno qualsiasi dei locali di ripiego (ad esempio 'en'). Per ovviare a questo è possibile iterare il fallback e l'uso deep_merge! di combinarli.

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

Il backend predefinito I18n è I18n :: backend :: Simple, che non espone le traduzioni a voi. (I18.backend.translations è un metodo protetto.)

Questa non è una buona idea, ma se si ha realmente bisogno di queste informazioni e non è possibile analizzare il file, è possibile estendere la classe backend.

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

È quindi possibile chiamare I18n.backend.translations_store per ottenere le traduzioni analizzati. Probabilmente non dovrebbe fare affidamento su questo come una strategia a lungo termine, ma si ottiene le informazioni necessarie al momento.

Se stai facendo questo in un compito rastrello, ricordi comprendere l'ambiente, o altrimenti non caricherà i propri locali, che vive sotto 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

Per le persone che vagano in questa vecchia domanda, c'è una soluzione che non richiede di chiamare metodi protetti. Modificare il file yml nel seguente modo:

nl: &all

  ... translations here ...

  all:
    <<: *all

Ora si può semplicemente estrarre tutte le traduzioni che utilizzano I18n.t("all"), che ha il vantaggio di inizializzazione e ricaricare le traduzioni in modalità di sviluppo automaticamente (cosa che non avviene se si chiama i metodi protetti.)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top