2015-09-25 15 views
6

Ricevo un'eccezione I18n::InvalidLocale: "zh-CN" is not a valid locale che voglio evitare.Modo pulito per evitare I18n :: InvalidLocale?

per risolverlo, ho sentito parlare di due hack:

# meh 
config.i18n.enforce_available_locales = false 

# Ever heard of convention over configuration? 
config.i18n.available_locales = [:fr, :en, "zh-CN", "zh-TW"] 

nessuno di loro sembra pulito per me, perché senza toccare quelle variabili di configurazione, ho già un sacco di locali disponibili che sono automagicamente preriempita:

mie available_locales attuali sono:

> I18n.available_locales 
=> [:en, :fr] (misses zh-CN and zh-TW) 

Nella mia cartella config/locales, ho:

en.yml 
fr.yml 
zh-CH.yml (newly added, and unavailable) 
zh-TW.yml (newly added, and unavailable) 

Nel mio config/application.rb, ho:

config.i18n.default_locale = :fr 

Non capisco come fr ha automagically entrato I18n.available_locales, quando il zh-CN e zh-TW non hanno .

Eppure, avendo fr immetterlo senza me impostare config.i18n.available_locales mi dice che toccare questa variabile di configurazione non è il modo pulito di andare.

Avete un suggerimento per evitare l'eccezione I18n::InvalidLocale allo corretto livello?

+0

riavviare il server? –

+0

Grazie huan, ma non fa il trucco. –

+0

José, cosa significa 'config.i18n.fallbacks = true'? –

risposta

5

La libreria i18n utilizza un approccio pragmatico alle chiavi locali, inclusa solo la parte locale ("lingua"), come: en,: pl, non la parte region, come: en-US o: en-GB, se vuoi questo tipo di controllo di definizione Poche gemme come Globalize3 possono aiutarti.

controllare anche questo descussion anche passare con this

E anche rimuovere il config.i18n.default_locale = :fr Perché con la gente del posto di default lo farà attraverso lo stesso errore che lei ha citato così dopo la rimozione defaullt uso questo config.i18n.available_locales = [:fr, :en, "zh-CN", "zh-TW"]

+0

Questa non era davvero la domanda, ma grazie. Quando dovrò affrontare problemi con le traduzioni cinesi, mi ricorderò di controllare il tuo link. La * domanda del giorno * è: come nutrire I18n con le sue localizzazioni disponibili senza impostare le opzioni available_locales globali? –

+0

@ GwendalRoué ha aggiornato la risposta controllalo – Arvind

+0

Va bene, Arv. Grazie per i link! –

0

Don' t imposta le impostazioni locali su un valore non valido.

class ApplicationController < ActionController::Base 
    before_action :set_locale 

    def set_locale 
    [params[:locale], cookies[:locale], extract_locale, I18n.default_locale].each do |l| 
     if l && I18n.available_locales.index(l.to_sym) 
     I18n.locale = l 
     break 
     end 
    end 
    cookies[:locale] = params[:locale] if params[:locale] 
    end 

    def extract_locale 
    request.env['HTTP_ACCEPT_LANGUAGE'].scan(/^[a-z]{2}/).first if request.env['HTTP_ACCEPT_LANGUAGE'] 
    end 

Verificare che la lingua locale esista prima di impostarla.

Problemi correlati