Avviso di deprecazione convalida I18n rotaie


387

Ho appena aggiornato a Rails 4.0.2 e ricevo questo avviso:

[obsoleto] I18n.enforce_available_locales sarà impostato su true in futuro. Se vuoi davvero saltare la convalida delle impostazioni locali, puoi impostare I18n.enforce_available_locales = false per evitare questo messaggio.

C'è qualche problema di sicurezza nel impostarlo su false?


Apparentemente questo accade anche per le Rails 4.0.1applicazioni.
lucke84

2
Ho lo stesso su Rails 3.2.16. Secondo la risposta di Simone Carletti di seguito, è in Rails 4 (> = 4.0.2) e Rails 3.2 (> = 3.2.14).
Mark Berry,

Risposte:


615

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::Applicationcorpo

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_localeconfigurazione o altre impostazioni di i18n, assicurati di farlo dopo aver impostato l' config.i18n.enforce_available_localesimpostazione.
  • Se si utilizzano gemme di terze parti che includono funzionalità I18n, l'impostazione della variabile tramite l' configoggetto Applicazione potrebbe non avere effetto. In questo caso, impostarlo direttamente su I18nusing 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 nilquale 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/localescartella è presente un file locale corrispondente ), altrimenti la locale sarebbe predefinita alla config.i18n.default_localeconfigurazione (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

  1. Se si imposta la config.i18n.default_localeconfigurazione o utilizzando uno dei metodi menzionati in precedenza ( default_locale=, locale=, translate, ecc), assicuratevi di farlo dopo aver impostato l' config.i18n.enforce_available_localesimpostazione. Altrimenti, l'avviso di deprecazione continuerà a spuntare. (Grazie Fábio Batista ).

  2. 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.i18nnel application.rbfunziona bene.

    In caso contrario, esiste un modo semplice per eseguire il debug del colpevole. Individua la gemma i18n nel tuo sistema, apri il i18n.rbfile 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)>'",

20
Se stai impostando la config.i18n.default_localeconfigurazione, assicurati di farlo dopo aver impostato la nuova config.i18n.enforce_available_localesimpostazione. Altrimenti, l'avviso di deprecazione continuerà a scoppiare.
Fábio Batista,

3
Per me, funziona solo se ho impostato I18n.enforce_available_locales = true. config.i18n.enforce_available_locales = truenon funziona.
Pioz,

1
@Pioz Potrebbe essere causato dalle gemme da cui dipende l'applicazione. Ho aggiornato il post per spiegare il perché.
Simone Carletti,

La chiamata diretta @SimoneCarletti I18n.config.enforce_available_localesnon dovrebbe essere I18n.config.i18n.enforce_available_locales, ho modificato la tua risposta. Grazie per la correzione.
Fabio,

1
Va detto che è necessario impostare I18n.config.available_locales = [:your_locale, :en]ad esempio, altrimenti non sarà possibile avviare il server rails.
Tamer Shlash,

45

Solo per completezza, nota che puoi anche eliminare l'avviso impostando I18n.enforce_available_localessu true(o false) in config/application.rb:

require File.expand_path('../boot', __FILE__)
.
.
.
module SampleApp
  class Application < Rails::Application
    .
    .
    .
    I18n.enforce_available_locales = true
    .
    .
    .
  end
end

9
Non sarebbe più carino da fare config.i18n.enforce_available_locales = true?
Mischa,

2
Sono il 3.2.16, ho impostato su I18n.enforce_available_locales = false, ma ho ancora il messaggio ...
CLod

3
@Mischa che non ha funzionato per me, la risposta sopra fa però.
Mike Atlas

1
@Mischa purtroppo no, ha dovuto passare I18n.configper questo per avere un effetto
dolzenko

3
config.i18n.enforce_available_locales = truein config / application.rb ho eliminato l'avvertimento di deprecazione per me in Rails 4.0.2, ma solo se l'ho messo sopra le altre config.i18nrighe.
Balexand,

15

I18n.config.enforce_available_locales = true ha funzionato per me in Rails 3.2.16 (l'ho messo in config / application.rb)



0

Se vuoi preoccuparti delle impostazioni locali, scrivi nel appilcation.rbfile.

config.i18n.enforce_available_locales = true

Puoi scrivere false se la convalida delle impostazioni locali non ti interessa.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.