389 votes

Rails I18n avertissement de désapprobation de la validation

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 vrai à 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.

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

616voto

Simone Carletti Points 77653

Important: assurez-vous que votre application n'est pas en utilisant I18n 0.6.8, il a un bug qui empêche la configuration de l'être réglées correctement.


Réponse courte

Afin de réduire au silence l'avertissement de modifier l'application.rb fichier et inclure la ligne suivante à l'intérieur de l' Rails::Application corps

config.i18n.enforce_available_locales = true

Les valeurs possibles sont:

  • faux: si vous
    • souhaitez ignorer les paramètres régionaux de validation
    • ne vous souciez pas des paramètres régionaux
  • vrai: si vous
    • l'application doit générer une erreur si une défaillance de paramètres régionaux est passé (ou)
    • voulez par défaut pour les nouveaux Rails de comportements (ou)
    • soins sur les paramètres régionaux de validation

Note:

  • L'ancien comportement par défaut correspond à l' false, pas true.
  • Si vous réglez l' config.i18n.default_locale configuration ou d'autres i18n paramètres, assurez-vous de le faire après la mise à l' config.i18n.enforce_available_locales réglage.
  • Si votre utilisation du tiers des gemmes qui comprennent I18n caractéristiques, définition de la variable par le biais de l'Application config objet, ne peut pas avoir un effet. Dans ce cas, réglez-le directement à l' I18n l'aide 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

Réponse longue

La dépréciation d'avertissement s'affiche désormais à la fois dans les Rails 4 (>= 4.0.2) et les Rails 3.2 (>= 3.2.14). La raison est expliquée dans ce commit.

Appliquer les locales disponibles

Lors de l' I18n.config.enforce_available_locales est vrai que nous allons lever un I18n::InvalidLocale exception, si le passé locale n'est pas disponible.

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

Si la valeur est false nous allons passer de l'application de jeux de paramètres régionaux disponibles au total (ancien comportement).

Cela a été mis en œuvre dans les méthodes suivantes :

  • I18n.config.paramètre default_locale=
  • I18n.config.locale=
  • I18n.traduire
  • I18n.localiser
  • I18n.translittérer

Avant ce changement, si vous avez passé une non prise en charge locale, les Rails serait silencieusement passer si la locale est valide (c'est à dire si il existe un fichier de paramètres régionaux dans l' /config/locales le dossier), sinon les paramètres régionaux est par défaut à l' config.i18n.default_locale de configuration (par défaut :fr).

La nouvelle version de l'I18n gem, oblige les développeurs à être un peu plus conscients de la gestion des paramètres régionaux.

Dans l'avenir, le comportement change et si les paramètres régionaux n'est pas valide, l'application Rails déclenchera une erreur.

Dans la préparation de ce changement (qui peut potentiellement briser plusieurs applications qui, jusqu'à aujourd'hui ont été en s'appuyant sur silencieux par défaut), l'avertissement est de vous forcer à déclarer explicitement que la validation que vous souhaitez effectuer, au cours de la période de transition actuelle.

Pour restaurer le comportement précédent, il suffit de définir la configuration suivante pour false

config.i18n.enforce_available_locales = false

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

config.i18n.enforce_available_locales = true

Mise en garde

  1. Si vous réglez l' config.i18n.default_locale de la configuration ou de l'utilisation de méthodes (default_locale=, locale=, translate, etc), assurez-vous de le faire après la mise à l' config.i18n.enforce_available_locales réglage. Sinon, la désapprobation avertissement garder sur popping up. (Merci Fábio Batista).

  2. Si vous utilisez tiers des gemmes qui comprennent I18n fonctions, la définition de la variable par le biais peuvent 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 préséance. Lorsque vous définissez la config de votre application Rails, la valeur n'est pas immédiatement affecté à l'I18n gem. Rails de magasins chaque config dans un objet interne, charge les dépendances (Railties et la troisième partie des gemmes), puis il passe à la configuration de la cible classes. Si vous utilisez un bijou (ou Rails plugin) qui appelle tout de l'I18n méthodes avant de la config est affecté à l'I18n, vous obtenez le message d'avertissement.

    Dans ce cas, vous devez ignorer les Rails de la pile et de l'ensemble de la config immédiatement à l'I18n, joyau de l'appel

    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 un vide nouvelle application Rails, et vous verrez que le paramètre config.i18n dans la application.rb fonctionne très bien.

    Si dans votre application, elle ne le fait pas, il est un moyen facile de déboguer le coupable. Localiser l'i18n gem dans votre système, ouvrez l' i18n.rb le fichier et modifier la méthode de enforce_available_locales! d'inclure l'énoncé puts caller.inspect.

    Ce sera la cause de la méthode pour imprimer le stacktrace chaque fois que invoquée. Vous serez en mesure de déterminer la gem est de l'appeler par l'inspection de la 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)>'",
    

45voto

mhartl Points 1373

Pour être complet, 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
 

15voto

SpeedyWizard Points 320

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

10voto

Justin Points 2723

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X