Avertissement de dépréciation de validation Rails I18n

387

Je viens de mettre à jour vers rails 4.0.2 et je reçois cet avertissement:

[obsolète] I18n.enforce_available_locales sera défini par défaut sur true à l'avenir. Si vous voulez vraiment ignorer la validation de vos paramètres régionaux, vous pouvez définir I18n.enforce_available_locales = false pour éviter ce message.

Y a-t-il un problème de sécurité à le définir sur faux?

Mauricio Moraes
la source
Apparemment, cela se produit également pour les Rails 4.0.1applications.
lucke84
2
J'ai la même chose sur Rails 3.2.16. Selon la réponse de Simone Carletti ci-dessous, c'est dans Rails 4 (> = 4.0.2) et Rails 3.2 (> = 3.2.14).
Mark Berry

Réponses:

615

Important : assurez-vous que votre application n'utilise pas I18n 0.6.8, elle contient un bogue qui empêche la configuration correcte de la configuration .


Réponse courte

Pour désactiver l'avertissement, modifiez le fichier application.rb et incluez la ligne suivante dans le Rails::Applicationcorps

config.i18n.enforce_available_locales = true

Les valeurs possibles sont:

  • faux : si vous
    • veulent ignorer la validation des paramètres régionaux
    • ne se soucient pas des lieux
  • vrai : si vous
    • veulent que l'application génère une erreur si un paramètre régional non valide est transmis (ou)
    • veulent par défaut les nouveaux comportements Rails (ou)
    • se soucient de la validation des paramètres régionaux

Remarque:

  • L'ancien comportement par défaut correspond à false, non true.
  • Si vous définissez la config.i18n.default_localeconfiguration ou d'autres paramètres i18n, assurez-vous de le faire après avoir défini le config.i18n.enforce_available_localesparamètre.
  • Si vous utilisez des gemmes tierces qui incluent des fonctionnalités I18n, la définition de la variable via l' configobjet Application peut ne pas avoir d'effet. Dans ce cas, définissez-le directement sur I18nusingI18n.config.enforce_available_locales .

    Avertissements

Exemple

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

Longue réponse

L'avertissement de dépréciation est maintenant affiché à la fois dans Rails 4 (> = 4.0.2) et Rails 3.2 (> = 3.2.14). La raison est expliquée dans ce commit .

Appliquer les paramètres régionaux disponibles

Quand I18n.config.enforce_available_locales est vrai, nous lèverons une exception I18n :: InvalidLocale si les paramètres régionaux transmis ne sont pas disponibles.

La valeur par défaut est définie pour nilafficher une erreur de dépréciation.

S'il est défini sur, falsenous ignorerons complètement l'application des paramètres régionaux disponibles (ancien comportement).

Cela a été implémenté dans les méthodes suivantes:

  • I18n.config.default_locale =
  • I18n.config.locale =
  • I18n.translate
  • I18n.localize
  • I18n.transliterate

Avant cette modification, si vous transmettiez des paramètres régionaux non pris en charge, Rails y basculerait silencieusement si les paramètres régionaux sont valides (c'est-à-dire s'il existe un fichier de paramètres régionaux correspondant dans le /config/localesdossier), sinon les paramètres régionaux seraient par défaut définis dans la config.i18n.default_localeconfiguration (par défaut: en ).

La nouvelle version de la gemme I18n oblige les développeurs à être un peu plus conscients de la gestion locale.

À l'avenir, le comportement changera et si un paramètre régional n'est pas valide, l'application Rails générera une erreur.

En préparation d'un tel changement (qui peut potentiellement casser plusieurs applications qui reposaient jusqu'à aujourd'hui sur des valeurs par défaut silencieuses), l'avertissement vous oblige à déclarer explicitement la validation que vous souhaitez effectuer, pendant la période de transition en cours.

Pour restaurer le comportement précédent, définissez simplement la configuration suivante sur false

config.i18n.enforce_available_locales = false

sinon, définissez-le sur true pour correspondre aux nouveaux paramètres par défaut de Rails ou si vous souhaitez être plus rigide sur la validation de domaine et éviter de passer à la valeur par défaut en cas de paramètres régionaux non valides.

config.i18n.enforce_available_locales = true

Caveat

  1. Si vous définissez la config.i18n.default_localeconfiguration ou en utilisant l' une des méthodes (mentionnées précédemment default_locale=, locale=, translate, etc.), assurez - vous de le faire après avoir réglé le config.i18n.enforce_available_localesréglage. Sinon, l'avertissement de dépréciation continuera d'apparaître. (Merci Fábio Batista ).

  2. Si vous utilisez des gemmes tierces qui incluent des fonctionnalités I18n, la définition de la variable via peut ne pas avoir d'effet. En fait, le problème est le même que celui décrit dans le point précédent, juste un peu plus difficile à déboguer.

    Cette question est une question de priorité. Lorsque vous définissez la configuration dans votre application Rails, la valeur n'est pas immédiatement attribuée à la gemme I18n. Rails stocke chaque configuration dans un objet interne, charge les dépendances (Railties et gemmes tierces) puis transmet la configuration aux classes cibles. Si vous utilisez une gemme (ou un plugin Rails) qui appelle l'une des méthodes I18n avant que la configuration ne soit affectée à I18n, vous obtiendrez l'avertissement.

    Dans ce cas, vous devez ignorer la pile Rails et définir immédiatement la configuration sur la gemme I18n en appelant

    I18n.config.enforce_available_locales = true

    au lieu de

    config.i18n.enforce_available_locales = true

    Le problème est facile à prouver. Essayez de générer une nouvelle application Rails vides et vous verrez ce paramètre config.i18ndans la application.rbfin des travaux.

    Si ce n'est pas le cas dans votre application, il existe un moyen simple de déboguer le coupable. Localisez la gemme i18n dans votre système, ouvrez le i18n.rbfichier et modifiez la méthode enforce_available_locales!pour inclure l'instruction puts caller.inspect.

    Cela entraînera la méthode pour imprimer la trace de pile chaque fois qu'elle est invoquée. Vous pourrez déterminer quelle gemme l'appelle en inspectant le stacktrace (dans mon cas c'était 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)>'",
Simone Carletti
la source
20
Si vous définissez la config.i18n.default_localeconfiguration, assurez-vous de le faire après avoir défini le nouveau config.i18n.enforce_available_localesparamètre. Sinon, l'avertissement de dépréciation continuera à apparaître.
Fábio Batista
3
Pour moi, ne fonctionne que si je mets I18n.enforce_available_locales = true. config.i18n.enforce_available_locales = truene fonctionne pas.
Pioz
1
@Pioz Cela peut être dû aux gemmes dont dépend votre application. J'ai mis à jour le message pour expliquer pourquoi.
Simone Carletti
L'appel direct @SimoneCarletti ne devrait I18n.config.enforce_available_localespas l' être I18n.config.i18n.enforce_available_locales, j'ai modifié votre réponse. Merci pour le correctif.
Fabio
1
Il convient de mentionner qu'il faut I18n.config.available_locales = [:your_locale, :en]par exemple le paramétrer , sinon vous ne pourrez pas démarrer votre serveur rails.
Tamer Shlash
45

Juste pour être complet, notez que vous pouvez également vous débarrasser de l'avertissement en définissant I18n.enforce_available_localessur true(ou false) dans config/application.rb:

require File.expand_path('../boot', __FILE__)
.
.
.
module SampleApp
  class Application < Rails::Application
    .
    .
    .
    I18n.enforce_available_locales = true
    .
    .
    .
  end
end
mhartl
la source
9
Ne serait-il pas plus pratique de le faire config.i18n.enforce_available_locales = true?
Mischa
2
Je suis sur 3.2.16, j'ai mis I18n.enforce_available_locales = false, mais j'ai toujours le message ...
CLod
3
@Mischa qui n'a pas fonctionné pour moi, la réponse ci-dessus le fait cependant.
Mike Atlas
1
@Mischa malheureusement pas, a dû passer par I18n.configpour que cela ait un effet
dolzenko
3
config.i18n.enforce_available_locales = truedans config / application.rb a éliminé l'avertissement de dépréciation pour moi dans Rails 4.0.2, mais seulement si je le place au-dessus des autres config.i18nlignes.
balexand
15

I18n.config.enforce_available_locales = true travaillé pour moi dans Rails 3.2.16 (je l'ai mis dans config / application.rb)

SpeedyWizard
la source
0

Si vous voulez vous soucier des paramètres régionaux, écrivez dans un appilcation.rbfichier.

config.i18n.enforce_available_locales = true

Vous pouvez écrire false si la validation des paramètres régionaux et ne vous en souciez pas.

Foram Thakral
la source