Avertissement de déchéance de validation Rails I18n

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

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

Existe-t-il un problème de sécurité en le définissant comme faux?

Important : assurez-vous que votre application n’utilise pas I18n 0.6.8, elle contient un bogue qui empêche la configuration d’être définie correctement .


Réponse courte

Pour faire taire l’avertissement, éditez le fichier application.rb et incluez la ligne suivante dans le corps de Rails::Application

 config.i18n.enforce_available_locales = true 

Les valeurs possibles sont:

  • faux : si vous
    • vouloir ignorer la validation des parameters régionaux
    • ne vous souciez pas des localités
  • vrai : si vous
    • voulez que l’application génère une erreur si un paramètre local incorrect est transmis (ou)
    • vouloir par défaut aux nouveaux comportements Rails (ou)
    • se soucient de la validation des parameters régionaux

Remarque:

  • L’ancien comportement par défaut correspond à false , pas true .
  • Si vous définissez la configuration config.i18n.default_locale ou d’autres parameters i18n, veillez à le faire après avoir défini le paramètre config.i18n.enforce_available_locales .
  • Si vous utilisez des gems tiers qui incluent des fonctionnalités I18n, la définition de la variable via l’object de config Application peut ne pas avoir d’effet. Dans ce cas, réglez-le directement sur I18n aide de I18n.config.enforce_available_locales .

    Mises en garde

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 parameters régionaux disponibles

Lorsque I18n.config.enforce_available_locales true, nous générons une exception I18n :: InvalidLocale si les parameters régionaux transmis ne sont pas disponibles.

La valeur par défaut est nil ce qui affichera une erreur de dépréciation.

Si défini sur false nous ignorerons la conformité des parameters 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 ce changement, si vous transmettiez des parameters régionaux non pris en charge, Rails y basculerait silencieusement si les parameters régionaux étaient valides (c.-à-d. S'il y a un fichier de parameters régionaux correspondant dans le dossier /config/locales ). config.i18n.default_locale configuration (par défaut à: en).

La nouvelle version du bijou I18n oblige les développeurs à être un peu plus conscients de la gestion des parameters régionaux.

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

En prévision d'un tel changement (qui peut potentiellement casser plusieurs applications qui reposaient jusqu'à présent sur des valeurs par défaut silencieuses), l'avertissement vous oblige à déclarer explicitement la validation que vous souhaitez effectuer, au cours de 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 nouvelles valeurs 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 parameters régionaux non valides.

 config.i18n.enforce_available_locales = true 

Caveat

  1. Si vous définissez la configuration config.i18n.default_locale ou utilisez l'une des méthodes mentionnées précédemment ( default_locale= , locale= , translate , etc.), veillez à le faire après avoir défini le paramètre config.i18n.enforce_available_locales . Sinon, l'avertissement de dépréciation continuera à s'afficher. (Merci Fábio Batista ).

  2. Si vous utilisez des gemmes tierces incluant des fonctionnalités I18n, la définition de la variable peut ne pas avoir d'effet. En fait, le problème est le même que décrit dans le point précédent, 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 atsortingbuée au joyau I18n. Rails stocke chaque configuration dans un object interne, charge les dépendances (Railties et gems tiers), puis transmet la configuration aux classes cibles. Si vous utilisez un gem (ou plug-in Rails) qui appelle l'une des méthodes I18n avant que la configuration ne soit affectée à I18n, vous recevrez l'avertissement.

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

     I18n.config.enforce_available_locales = true 

    au lieu de

     config.i18n.enforce_available_locales = true 

    La question est facile à prouver. Essayez de générer une nouvelle application Rails vide et vous verrez que le paramètre config.i18n dans l’ application.rb fonctionne config.i18n .

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

    Cela entraînera la méthode pour imprimer le stacktrace à chaque appel. Vous serez en mesure de déterminer quel bijou l'appelle en inspectant la trace de la stack (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 `'", "/Users/weppos/Projects/application/app/models/user.rb:1:in `'", 

Pour plus de I18n.enforce_available_locales , notez que vous pouvez également vous débarrasser de l’avertissement en définissant I18n.enforce_available_locales sur 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 

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

Cela ne semble pas être le cas – ce serait le comportement précédent de la façon dont fonctionne i18n – un nouveau comportement (true) provoquera une erreur lorsque vous demanderez une locale non implémentée / disponible.

Voir le commit qui a ajouté cet avertissement: https://github.com/svenfuchs/i18n/commit/3b6e56e06fd70f6e4507996b017238505e66608c