Je viens de mettre à jour Rails 4.0.2 et je reçois cet avertissement:
[obsolète] I18n.enforce_available_locales sera par défaut à 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 at-il un problème de sécurité dans la définition de false?
Important : Assurez-vous que votre application n'utilise pas I18n 0.6.8, elle a un bug qui empêche la configuration de la configuration correctement =.
Pour faire taire l'avertissement, éditez le fichier application.rb et incluez la ligne suivante dans le corps Rails::Application
config.i18n.enforce_available_locales = true
Les valeurs possibles sont:
Remarque:
false
, pas true
.config.i18n.default_locale
ou d'autres paramètres i18n, assurez-vous de le faire après avoir défini le paramètre config.i18n.enforce_available_locales
.config
risque de ne pas avoir d'effet. Dans ce cas, réglez-le directement sur I18n
à l'aide de I18n.config.enforce_available_locales
. 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
L'avertissement de désapprobation est maintenant affiché à la fois dans Rails 4 (> = 4.0.2) et Rails 3.2 (> = 3.2.14). La raison est expliquée dans this commit .
Appliquer les locales disponibles
Lorsque
I18n.config.enforce_available_locales
est défini sur true, nous déclencherons une exception I18n :: InvalidLocale si les paramètres régionaux transmis ne sont pas disponibles.La valeur par défaut est définie sur
nil
, ce qui affichera une erreur de désapprobation.Si défini sur
false
nous ignorerons 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 passerait en mode silencieux si les paramètres régionaux sont valides (c.-à-d. S'il existe un fichier de paramètres régionaux correspondant dans le dossier /config/locales
), sinon les paramètres régionaux utiliserait par défaut la configuration config.i18n.default_locale
(par défaut: en).
La nouvelle version du joyau I18n oblige les développeurs à être un peu plus conscients de la gestion des paramètres 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éparation de ce changement (qui pourrait potentiellement bloquer plusieurs applications qui jusqu'à présent reposaient 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 qu'il corresponde aux nouveaux paramètres par défaut Rails ou si vous souhaitez être plus strict 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
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.), assurez-vous de le faire après avoir défini la config.i18n.enforce_available_locales
réglage. Sinon, l'avertissement de dépréciation continuera à apparaître. (Merci Fábio Batista ).
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 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 gem I18n. Rails stocke chaque configuration dans un objet interne, charge les dépendances (Railties et gems tiers), puis transmet la configuration aux classes cibles. Si vous utilisez une gemme (ou le plug-in Rails) qui appelle 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 pile 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 réglage de config.i18n
dans le application.rb
fonctionne correctement.
Si ce n'est pas le cas dans votre application, il existe un moyen simple de déboguer le coupable. Recherchez la gemme i18n dans votre système, ouvrez le fichier i18n.rb
et modifiez la méthode enforce_available_locales!
pour inclure l'instruction puts caller.inspect
.
La méthode imprimera le stacktrace à chaque appel. 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)>'",
Par souci d’exhaustivité, notez que vous pouvez également supprimer 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
a travaillé pour moi dans Rails 3.2.16 (je le mets dans config/application.rb)
Cela ne semble pas être le cas - ce serait le comportement précédent de la façon dont i18n fonctionne - un nouveau comportement (true) va générer une erreur lorsque vous demandez des paramètres régionaux non implémentés/disponibles.
Voir le commit qui a ajouté cet avertissement: https://github.com/svenfuchs/i18n/commit/3b6e56e06fd70f6e4507996b017238505e66608c
Si vous voulez vous soucier des locales écrivez dans le fichier appilcation.rb
.
config.i18n.enforce_available_locales = true
Vous pouvez écrire false si la validation des paramètres régionaux vous importe peu.