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::Application
corps
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_locale
configuration ou d'autres paramètres i18n, assurez-vous de le faire après avoir défini le config.i18n.enforce_available_locales
paramètre.
- Si vous utilisez des gemmes tierces qui incluent des fonctionnalités I18n, la définition de la variable via l'
config
objet Application peut ne pas avoir d'effet. Dans ce cas, définissez-le directement sur I18n
usingI18n.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 nil
afficher une erreur de dépréciation.
S'il est défini sur, false
nous 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/locales
dossier), sinon les paramètres régionaux seraient par défaut définis dans la config.i18n.default_locale
configuration (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
Si vous définissez la config.i18n.default_locale
configuration 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_locales
réglage. Sinon, l'avertissement de dépréciation continuera d'apparaître. (Merci Fábio Batista ).
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.i18n
dans la application.rb
fin 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.rb
fichier 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)>'",
Rails 4.0.1
applications.