Come recuperare tutte le traduzioni da file YML in Rails I18n
-
26-09-2019 - |
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.
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.)