Tornare alla lingua predefinita se manca la traduzione

in un’applicazione Rails (2.3.5) internazionalizzata, mi piacerebbe mostrare una traduzione dalle impostazioni internazionali predefinite invece di “traduzione mancante”: c’è un ticket ma sembra che sia ancora in sospeso:

https://rails.lighthouseapp.com/projects/8994/tickets/2637-patch-i18n-look-up-a-translation-with-the-default-locale-when-its-missed-with-another-specific- località

Ad esempio (tratto dal ticket), con due file di traduzione, en.yml e es.yml:

en: hello: 'hello' hello_world: 'hello world' es: hello_world: 'hola mundo' 

Quando eseguo questo codice:

 I18n.t :hello, :locale => :es 

Rails restituisce “ciao” invece di uno span con “traduzione mancante”.

    Poiché il ticket è ancora in sospeso, come posso implementare questa funzionalità? So che potrei passare e cambiare tutte le mie chiamate I18n.t per avere l’opzione: default, ma preferirei non dover passare attraverso tutte le visualizzazioni se posso evitarlo! Dato che si tratta di un cerotto, suppongo che potrei applicarlo alle gemme congelate di Rails, ma preferirei evitarlo se potessi.

    Se si utilizza Rails 2 , purché si usi l’ultima gem I18n, aggiungerla a un inizializzatore:

     I18n.backend.class.send(:include, I18n::Backend::Fallbacks) 

    Quindi puoi aggiungere i tuoi fallback in questo modo:

     I18n.fallbacks.map('es' => 'en') 

    Oggigiorno non è necessario utilizzare gem i18n separata, su semplice installazione di Rails 3.0.6 e versioni successive (5.0 inclusa), il valore di fallbacks può essere uno dei seguenti :

     # application.rb # rails will fallback to config.i18n.default_locale translation config.i18n.fallbacks = true # rails will fallback to en, no matter what is set as config.i18n.default_locale config.i18n.fallbacks = [:en] # fallbacks value can also be a hash - a map of fallbacks if you will # missing translations of es and fr languages will fallback to english # missing translations in german will fallback to french ('de' => 'fr') config.i18n.fallbacks = {'es' => 'en', 'fr' => 'en', 'de' => 'fr'} 

    Penso che il più semplice sia aggiungere questo ai tuoi file di configurazione (ad esempio application.rb):

      config.i18n.fallbacks = true 

    È molto utile per le impostazioni internazionali locali come en-US, en-CA, ecc. Perché possono essere automaticamente convertite in impostazioni internazionali.

    Come fa notare Jimmy, puoi anche alterare il meccanismo di fallback con:

     I18n.fallbacks.map('es' => 'en') 

    Se non vuoi applicare la patch alla tua gem Rails, puoi creare il tuo codice contenente le patch e mescolarle con la gem.

    Quando si guarda la patch, è necessario aggiornare il codice in due punti (il terzo posto è la parte di test).

    La prima parte ( i18n.rb ) è un modulo, quindi scrivendo un file contenente qualcosa di simile

     module I18n @@use_default_locale_on_missing_translation = false ...etc... end 

    puoi aggiungere il codice modificato. Il secondo file ( simple.rb ) può essere aggiornato in modo simile, tranne che si tratta di una class che si sta aggiornando.

    Dopo aver creato i 2 file contenenti le modifiche, è necessario includere questi due file in application.rb o in una posizione simile. E il codice della gem Rails dovrebbe essere aggiornato con il tuo codice personalizzato.