Importante : assicurati che la tua app non stia utilizzando I18n 0.6.8, abbia un bug che impedisce di impostare correttamente la configurazione .
Risposta breve
Per silenziare l'avviso, modifica il file application.rb e includi la seguente riga all'interno del Rails::Application
corpo
config.i18n.enforce_available_locales = true
I possibili valori sono:
- falso : se tu
- desidera saltare la convalida della locale
- non importa dei locali
- vero : se tu
- desidera che l'applicazione generi un errore se viene passata un'impostazione internazionale non valida (o)
- desidera impostare automaticamente i nuovi comportamenti (o) di Rails
- cura della convalida della locale
Nota:
- Il vecchio comportamento predefinito corrisponde
false
, non true
.
- Se stai configurando la
config.i18n.default_locale
configurazione o altre impostazioni di i18n, assicurati di farlo dopo aver impostato l' config.i18n.enforce_available_locales
impostazione.
- Se si utilizzano gemme di terze parti che includono funzionalità I18n, l'impostazione della variabile tramite l'
config
oggetto Applicazione potrebbe non avere effetto. In questo caso, impostarlo direttamente su I18n
using I18n.config.enforce_available_locales
.
Avvertenze
Esempio
require File.expand_path('../boot', __FILE__)
# ...
module YouApplication
class Application < Rails::Application
# ...
config.i18n.enforce_available_locales = true
# or if one of your gem compete for pre-loading, use
I18n.config.enforce_available_locales = true
# ...
end
end
Risposta lunga
L'avviso di deprecazione viene ora visualizzato sia in Rails 4 (> = 4.0.2) che Rails 3.2 (> = 3.2.14). Il motivo è spiegato in questo commit .
Applicare le versioni locali disponibili
Quando I18n.config.enforce_available_locales
è vero, generiamo un'eccezione I18n :: InvalidLocale se la locale passata non è disponibile.
L'impostazione predefinita è la nil
quale visualizzerà un errore di deprecazione.
Se impostato su false
, ignoreremo del tutto l'applicazione delle impostazioni locali (comportamento precedente).
Questo è stato implementato nei seguenti metodi:
- I18n.config.default_locale =
- I18n.config.locale =
- I18n.translate
- I18n.localize
- I18n.transliterate
Prima di questa modifica, se si passava a una locale non supportata, Rails passava automaticamente a essa se la locale è valida (ovvero se nella /config/locales
cartella è presente un file locale corrispondente ), altrimenti la locale sarebbe predefinita alla config.i18n.default_locale
configurazione (che per impostazione predefinita è: en ).
La nuova versione della gemma I18n, costringe gli sviluppatori ad essere un po 'più consapevoli della gestione delle impostazioni locali.
In futuro, il comportamento cambierà e se un'impostazione internazionale non è valida, l'app Rails genererà un errore.
In preparazione di tale modifica (che potrebbe potenzialmente interrompere diverse applicazioni che fino ad oggi si basavano su valori predefiniti silenziosi), l'avviso ti costringe a dichiarare esplicitamente quale convalida desideri eseguire, durante l'attuale periodo di transizione.
Per ripristinare il comportamento precedente, è sufficiente impostare la seguente configurazione su false
config.i18n.enforce_available_locales = false
in caso contrario, impostarlo su true in modo che corrisponda ai nuovi valori predefiniti di Rails o se si desidera essere più rigidi sulla convalida del dominio ed evitare di passare all'impostazione predefinita in caso di impostazioni internazionali non valide.
config.i18n.enforce_available_locales = true
Avvertimento
Se si imposta la config.i18n.default_locale
configurazione o utilizzando uno dei metodi menzionati in precedenza ( default_locale=
, locale=
, translate
, ecc), assicuratevi di farlo dopo aver impostato l' config.i18n.enforce_available_locales
impostazione. Altrimenti, l'avviso di deprecazione continuerà a spuntare. (Grazie Fábio Batista ).
Se si utilizzano gemme di terze parti che includono funzionalità I18n, l'impostazione della variabile tramite potrebbe non avere effetto. In effetti, il problema è lo stesso descritto nel punto precedente, solo un po 'più difficile da eseguire il debug.
Questo problema è una questione di precedenza. Quando imposti la configurazione nell'app Rails, il valore non viene immediatamente assegnato alla gemma I18n. Rails memorizza ogni configurazione in un oggetto interno, carica le dipendenze (Railties e gemme di terze parti) e quindi passa la configurazione alle classi di destinazione. Se usi una gemma (o plug-in Rails) che chiama uno dei metodi I18n prima che la configurazione sia assegnata a I18n, riceverai l'avviso.
In questo caso, devi saltare lo stack di Rails e impostare immediatamente la configurazione sulla gemma I18n chiamando
I18n.config.enforce_available_locales = true
invece di
config.i18n.enforce_available_locales = true
Il problema è facile da dimostrare. Tenta di generare un nuovo vuote Rails app e vedrete che l'impostazione config.i18n
nel application.rb
funziona bene.
In caso contrario, esiste un modo semplice per eseguire il debug del colpevole. Individua la gemma i18n nel tuo sistema, apri il i18n.rb
file e modifica il metodo enforce_available_locales!
per includere l'istruzione puts caller.inspect
.
Ciò farà sì che il metodo stampi lo stacktrace ogni volta che viene invocato. Sarai in grado di determinare quale gemma lo sta chiamando ispezionando lo stacktrace (nel mio caso era Authlogic).
["/Users/weppos/.rvm/gems/ruby-2.0.0-p247@application/gems/i18n-0.6.9/lib/i18n.rb:150:in `translate'",
"/Users/weppos/.rvm/gems/ruby-2.0.0-p247@application/gems/authlogic-3.1.0/lib/authlogic/i18n/translator.rb:8:in `translate'",
"/Users/weppos/.rvm/gems/ruby-2.0.0-p247@application/gems/authlogic-3.1.0/lib/authlogic/i18n.rb:79:in `translate'",
"/Users/weppos/.rvm/gems/ruby-2.0.0-p247@application/gems/authlogic-3.1.0/lib/authlogic/acts_as_authentic/email.rb:68:in `validates_format_of_email_field_options'",
"/Users/weppos/.rvm/gems/ruby-2.0.0-p247@application/gems/authlogic-3.1.0/lib/authlogic/acts_as_authentic/email.rb:102:in `block in included'",
"/Users/weppos/.rvm/gems/ruby-2.0.0-p247@application/gems/authlogic-3.1.0/lib/authlogic/acts_as_authentic/email.rb:99:in `class_eval'",
"/Users/weppos/.rvm/gems/ruby-2.0.0-p247@application/gems/authlogic-3.1.0/lib/authlogic/acts_as_authentic/email.rb:99:in `included'",
"/Users/weppos/.rvm/gems/ruby-2.0.0-p247@application/gems/authlogic-3.1.0/lib/authlogic/acts_as_authentic/base.rb:37:in `include'",
"/Users/weppos/.rvm/gems/ruby-2.0.0-p247@application/gems/authlogic-3.1.0/lib/authlogic/acts_as_authentic/base.rb:37:in `block in acts_as_authentic'",
"/Users/weppos/.rvm/gems/ruby-2.0.0-p247@application/gems/authlogic-3.1.0/lib/authlogic/acts_as_authentic/base.rb:37:in `each'",
"/Users/weppos/.rvm/gems/ruby-2.0.0-p247@application/gems/authlogic-3.1.0/lib/authlogic/acts_as_authentic/base.rb:37:in `acts_as_authentic'",
"/Users/weppos/Projects/application/app/models/user.rb:8:in `<class:User>'",
"/Users/weppos/Projects/application/app/models/user.rb:1:in `<top (required)>'",
Rails 4.0.1
applicazioni.