390 Stimmen

Rails I18n Validierung Veraltet Warnung

Ich habe gerade auf Rails 4.0.2 aktualisiert und erhalte diese Warnung:

[deprecated] I18n.enforce_available_locales wird in Zukunft standardmäßig auf true gesetzt. Wenn Sie die Validierung Ihrer Lokalisierung wirklich überspringen möchten, können Sie I18n.enforce_available_locales = false setzen, um diese Meldung zu vermeiden.

Gibt es ein Sicherheitsproblem, wenn ich es auf false setze?

617voto

Simone Carletti Punkte 168374

Wichtig: Stellen Sie sicher, dass Ihre App nicht I18n 0.6.8 verwendet, es hat einen Fehler, der verhindert, dass die Konfiguration korrekt gesetzt wird.


Kurze Antwort

Um die Warnung zu unterdrücken, bearbeiten Sie die application.rb-Datei und fügen Sie die folgende Zeile innerhalb des Rails::Application-Körpers ein

config.i18n.enforce_available_locales = true

Die möglichen Werte sind:

  • false: wenn Sie
    • die Lokalvalidierung überspringen möchten
    • die Lokaleinträge nicht interessieren
  • true: wenn Sie
    • möchten, dass die Anwendung einen Fehler ausgibt, wenn eine ungültige Lokale übergeben wird (oder)
    • zu den neuen Rails-Verhaltensweisen standardmäßig wechseln möchten (oder)
    • an der Lokalvalidierung interessiert sind

Hinweis:

  • Das alte Standardverhalten entspricht false, nicht true.
  • Wenn Sie die config.i18n.default_locale-Konfiguration oder andere i18n-Einstellungen festlegen, stellen Sie sicher, dass dies nach dem Setzen der config.i18n.enforce_available_locales-Einstellung erfolgt.
  • Wenn Sie Drittanbieter-Gems verwenden, die I18n-Funktionen enthalten, kann das Setzen der Variable über das Anwendungs-config-Objekt möglicherweise keine Auswirkung haben. Setzen Sie es in diesem Fall direkt auf I18n mit I18n.config.enforce_available_locales.

    Einschränkungen

Beispiel

require File.expand_path('../boot', __FILE__)

# ...

module YouApplication
  class Application < Rails::Application

    # ...

    config.i18n.enforce_available_locales = true
    # oder wenn eines Ihrer Gems um das Vorladen konkurriert, verwenden Sie
    I18n.config.enforce_available_locales = true

    # ...

  end
end

Lange Antwort

Die Veraltet-Warnung wird jetzt sowohl in Rails 4 (>= 4.0.2) als auch in Rails 3.2 (>= 3.2.14) angezeigt. Der Grund wird in diesem Commit erläutert.

Verfügbare Lokale durchsetzen

Wenn I18n.config.enforce_available_locales true ist, werden wir eine I18n::InvalidLocale-Ausnahme auslösen, wenn die übergebene Lokale nicht verfügbar sind.

Der Standardwert ist auf nil gesetzt, was eine Veraltungsfehlermeldung anzeigt.

Wenn auf false gesetzt, werden wir die Durchsetzung verfügbarer Lokale vollständig überspringen (altes Verhalten).

Dies wurde in den folgenden Methoden implementiert:

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

Vor dieser Änderung würde Rails stillschweigend zu einer nicht unterstützten Lokale wechseln, wenn die Lokale gültig sind (d.h. wenn es eine entsprechende Lokale-Datei im /config/locales-Ordner gibt), andernfalls würde die Lokale auf die config.i18n.default_locale-Konfiguration (die standardmäßig auf :en gesetzt ist) zurückgreifen.

Die neue Version des I18n-Gems zwingt Entwickler dazu, etwas bewusster mit der Lokalverwaltung umzugehen.

In Zukunft wird sich das Verhalten ändern und wenn eine Lokale ungültig ist, wird die Rails-App einen Fehler auslösen.

In Vorbereitung auf eine solche Änderung (die möglicherweise mehrere Anwendungen zerstören könnte, die bis heute auf stillschweigenden Standardeinstellungen basierten), zwingt Sie die Warnung, während des aktuellen Übergangszeitraums explizit zu erklären, welche Validierung Sie durchführen möchten.

Um das frühere Verhalten wiederherzustellen, setzen Sie einfach die folgende Konfiguration auf false

config.i18n.enforce_available_locales = false

ansonsten setzen Sie ihn auf true, um den neuen Rails-Standard zu entsprechen oder wenn Sie strenger auf die Domänenvalidierung sein möchten und das Wechseln zum Standard bei ungültiger Lokale vermeiden möchten.

config.i18n.enforce_available_locales = true

Einschränkung

  1. Wenn Sie die config.i18n.default_locale-Konfiguration festlegen oder eines der zuvor genannten Methoden verwenden (default_locale=, locale=, translate, usw.), stellen Sie sicher, dass dies nach dem Setzen der config.i18n.enforce_available_locales-Einstellung erfolgt. Andernfalls wird die Veraltungs-Warnung weiterhin angezeigt (Danke an Fábio Batista).

  2. Wenn Sie Drittanbieter-Gems verwenden, die I18n-Funktionen enthalten, kann das Setzen der Variable über keine Auswirkung haben. Tatsächlich handelt es sich um das gleiche Problem wie im vorherigen Punkt beschrieben, nur etwas schwieriger zu debuggen.

    Das Problem betrifft die Reihenfolge. Wenn Sie die Konfiguration in Ihrer Rails-App festlegen, wird der Wert nicht sofort dem I18n-Gem zugewiesen. Rails speichert jede Konfiguration in einem internen Objekt, lädt die Abhängigkeiten (Railties und Drittanbieter-Gems) und übergibt dann die Konfiguration an die Zielsklassen. Wenn Sie ein Gem (oder ein Rails-Plugin) verwenden, das eine der I18n-Methoden aufruft, bevor die Konfiguration I18n zugewiesen wird, erhalten Sie die Warnung.

    In diesem Fall müssen Sie den Rails-Stack überspringen und die Konfiguration sofort dem I18n-Gem zuweisen, indem Sie

    I18n.config.enforce_available_locales = true

    anstatt

    config.i18n.enforce_available_locales = true

    Die Ursache lässt sich leicht überprüfen. Versuchen Sie, eine neue leere Rails-App zu generieren, und Sie werden sehen, dass das Festlegen von config.i18n in der application.rb einwandfrei funktioniert.

    Wenn es in Ihrer App nicht funktioniert, gibt es eine einfache Möglichkeit, den Übeltäter zu finden. Suchen Sie das i18n-Gem in Ihrem System, öffnen Sie die Datei i18n.rb und bearbeiten Sie die Methode enforce_available_locales!, um die Anweisung puts caller.inspect einzuschließen.

    Dadurch wird die Methode den Stapelabruf drucken, wenn sie aufgerufen wird. Sie können feststellen, welches Gem es aufruft, indem Sie den Stapelabruf überprüfen (in meinem Fall war es 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 `'",

45voto

mhartl Punkte 1931

Nur der Vollständigkeit halber sei darauf hingewiesen, dass Sie die Warnung auch loswerden können, indem Sie I18n.enforce_available_locales auf true (oder false) in config/application.rb setzen:

require File.expand_path('../boot', __FILE__)
.
.
.
module SampleApp
  class Application < Rails::Application
    .
    .
    .
    I18n.enforce_available_locales = true
    .
    .
    .

15voto

SpeedyWizard Punkte 568

I18n.config.enforce_available_locales = true hat für mich in Rails 3.2.16 funktioniert (Ich habe es in config/application.rb platziert)

10voto

Justin Punkte 4899

Das scheint nicht so zu sein - das wäre das vorherige Verhalten der Funktionsweise von i18n - das neue Verhalten (true) wird einen Fehler anzeigen, wenn Sie nach einem nicht implementierten/verfügbaren Standort fragen.

Sehen Sie den Commit, der diese Warnung hinzugefügt hat: https://github.com/svenfuchs/i18n/commit/3b6e56e06fd70f6e4507996b017238505e66608c

0voto

Foram Punkte 456

Wenn Sie sich um Ländereinstellungen kümmern möchten, schreiben Sie in die application.rb Datei.

config.i18n.enforce_available_locales = true

Sie können false schreiben, wenn die Ländereinstellungen ungültig sind und es Ihnen egal ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X