Rails I18n Validierungs-Verfallswarnung

387

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

[veraltet] I18n.enforce_available_locales wird in Zukunft standardmäßig auf true gesetzt. Wenn Sie die Überprüfung Ihres Gebietsschemas wirklich überspringen möchten, können Sie I18n.enforce_available_locales = false festlegen, um diese Meldung zu vermeiden.

Gibt es ein Sicherheitsproblem, wenn es auf false gesetzt wird?

Mauricio Moraes
quelle
Anscheinend passiert dies auch bei Rails 4.0.1Anwendungen.
Glück 84
2
Ich habe das gleiche auf Rails 3.2.16. Laut der Antwort von Simone Carletti unten ist es in Rails 4 (> = 4.0.2) und Rails 3.2 (> = 3.2.14).
Mark Berry

Antworten:

615

Wichtig : Stellen Sie sicher, dass Ihre App nicht I18n 0.6.8 verwendet. Es gibt einen Fehler, der verhindert, dass die Konfiguration korrekt eingestellt wird .


Kurze Antwort

Um die Warnung auszuschalten, bearbeiten Sie die Datei application.rb und fügen Sie die folgende Zeile in den Rails::ApplicationText ein

config.i18n.enforce_available_locales = true

Die möglichen Werte sind:

  • false : wenn du
    • Ich möchte die Gebietsschemaüberprüfung überspringen
    • Orte interessieren mich nicht
  • wahr : wenn du
    • möchte, dass die Anwendung einen Fehler auslöst, wenn ein ungültiges Gebietsschema übergeben wird (oder)
    • möchte standardmäßig das neue Rails-Verhalten verwenden (oder)
    • Sorge um die Validierung des Gebietsschemas

Hinweis:

  • Das alte Standardverhalten entspricht falsenicht true.
  • Wenn Sie die config.i18n.default_localeKonfiguration oder andere i18n-Einstellungen vornehmen, stellen Sie sicher, dass Sie dies nach dem Festlegen der config.i18n.enforce_available_localesEinstellung tun .
  • Wenn Sie Edelsteine ​​von Drittanbietern verwenden, die I18n-Funktionen enthalten, hat das Festlegen der Variablen über das Anwendungsobjekt configmöglicherweise keine Auswirkungen. In diesem Fall stellen Sie es direkt auf I18nusing ein I18n.config.enforce_available_locales.

    Vorsichtsmaßnahmen

Beispiel

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

Lange Antwort

Die Verfallswarnung 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 .

Erzwingen Sie verfügbare Gebietsschemas

Wenn I18n.config.enforce_available_localestrue, wird eine I18n :: InvalidLocale-Ausnahme ausgelöst, wenn das übergebene Gebietsschema nicht verfügbar ist.

Der Standardwert ist festgelegt, nilder einen Verfallsfehler anzeigt.

Wenn diese falseOption aktiviert ist, wird das Erzwingen verfügbarer Gebietsschemas insgesamt übersprungen (altes Verhalten).

Dies wurde in den folgenden Methoden implementiert:

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

Wenn Sie vor dieser Änderung ein nicht unterstütztes Gebietsschema übergeben haben, wechselt Rails stillschweigend zu diesem Gebietsschema, wenn das Gebietsschema gültig ist (dh wenn sich eine entsprechende Gebietsschemadatei im /config/localesOrdner befindet). Andernfalls wird standardmäßig die config.i18n.default_localeKonfiguration verwendet (standardmäßig: en) ).

Die neue Version des I18n-Edelsteins zwingt Entwickler dazu, sich der Verwaltung des Gebietsschemas etwas bewusster zu werden.

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

In Vorbereitung auf eine solche Änderung (die möglicherweise mehrere Anwendungen beschädigen kann, die bis heute auf stillen Standardeinstellungen beruhten) werden Sie durch die Warnung gezwungen, explizit anzugeben, welche Validierung Sie während der aktuellen Übergangszeit durchführen möchten.

Um das vorherige Verhalten wiederherzustellen, setzen Sie einfach die folgende Konfiguration auf false

config.i18n.enforce_available_locales = false

Andernfalls setzen Sie den Wert auf true, um den neuen Rails-Standardeinstellungen zu entsprechen, oder wenn Sie die Domänenüberprüfung strenger gestalten möchten, und vermeiden Sie den Wechsel zum Standard bei ungültigem Gebietsschema.

config.i18n.enforce_available_locales = true

Vorbehalt

  1. Wenn Sie die setzen config.i18n.default_localeKonfiguration oder unter Verwendung eines der zuvor genannten Verfahren ( default_locale=, locale=, translate, usw.), stellen Sie sicher , dass es nach dem Einstellen der tun config.i18n.enforce_available_localesEinstellung. Andernfalls wird die Abwertungswarnung weiterhin angezeigt. (Danke Fábio Batista ).

  2. Wenn Sie Edelsteine ​​von Drittanbietern verwenden, die I18n-Funktionen enthalten, hat das Durchsetzen der Variablen möglicherweise keine Auswirkungen. Tatsächlich ist das Problem das gleiche wie im vorherigen Punkt beschrieben, nur ein bisschen schwieriger zu debuggen.

    Dieses Problem hat Vorrang. Wenn Sie die Konfiguration in Ihrer Rails-App festlegen, wird der Wert nicht sofort dem I18n-Juwel zugewiesen. Rails speichert jede Konfiguration in einem internen Objekt, lädt die Abhängigkeiten (Railties und Edelsteine ​​von Drittanbietern) und übergibt die Konfiguration an die Zielklassen. Wenn Sie ein Gem (oder Rails-Plugin) verwenden, das eine der I18n-Methoden aufruft, bevor die Konfiguration I18n zugewiesen wird, wird die Warnung angezeigt.

    In diesem Fall müssen Sie den Rails-Stack überspringen und die Konfiguration durch Aufrufen sofort auf das I18n-Juwel setzen

    I18n.config.enforce_available_locales = true

    anstatt

    config.i18n.enforce_available_locales = true

    Das Problem ist leicht zu beweisen. Versuchen Sie, eine neue leere Rails - Anwendung zu generieren , und Sie werden diese Einstellung sehen config.i18nin den application.rbWerken in Ordnung.

    Wenn dies in Ihrer App nicht der Fall ist, gibt es eine einfache Möglichkeit, den Täter zu debuggen. Suchen Sie das i18n-Juwel in Ihrem System, öffnen Sie die i18n.rbDatei und bearbeiten Sie die Methode enforce_available_locales!, um die Anweisung einzuschließen puts caller.inspect.

    Dies führt dazu, dass die Methode die Stapelverfolgung bei jedem Aufruf druckt. Sie können feststellen, welcher Edelstein ihn aufruft, indem Sie die Stapelverfolgung ü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 `<class:User>'",
     "/Users/weppos/Projects/application/app/models/user.rb:1:in `<top (required)>'",
Simone Carletti
quelle
20
Wenn Sie die config.i18n.default_localeKonfiguration festlegen, stellen Sie sicher, dass Sie dies nach dem Festlegen der neuen config.i18n.enforce_available_localesEinstellung tun . Andernfalls wird die Abwertungswarnung weiterhin angezeigt.
Fábio Batista
3
Funktioniert bei mir nur wenn ich einstelle I18n.enforce_available_locales = true. config.i18n.enforce_available_locales = truefunktioniert nicht
Pioz
1
@Pioz Es kann durch die Edelsteine ​​verursacht werden, von denen Ihre Anwendung abhängt. Ich habe den Beitrag aktualisiert, um zu erklären, warum.
Simone Carletti
@ SimoneCarletti direkter Anruf sollte I18n.config.enforce_available_localesnicht sein I18n.config.i18n.enforce_available_locales, ich habe deine Antwort bearbeitet. Vielen Dank für das Update.
Fabio
1
Es sollte erwähnt werden, dass man I18n.config.available_locales = [:your_locale, :en]zum Beispiel einstellen muss , sonst können Sie Ihren Rails-Server nicht starten.
Tamer Shlash
45

Beachten Sie der Vollständigkeit halber, dass Sie die Warnung auch entfernen können, indem Sie I18n.enforce_available_localesin true(oder false) Folgendes einstellen config/application.rb:

require File.expand_path('../boot', __FILE__)
.
.
.
module SampleApp
  class Application < Rails::Application
    .
    .
    .
    I18n.enforce_available_locales = true
    .
    .
    .
  end
end
mhartl
quelle
9
Wäre es nicht ordentlicher zu tun config.i18n.enforce_available_locales = true?
Mischa
2
Ich bin am 3.2.16, ich habe I18n.enforce_available_locales = false gesetzt, aber ich habe immer noch die Nachricht ...
CLod
3
@ Mischa, das hat bei mir nicht funktioniert, die obige Antwort jedoch.
Mike Atlas
1
@ Mischa leider nicht, musste durchmachen, I18n.configdamit dies eine Wirkung hat
Dolzenko
3
config.i18n.enforce_available_locales = trueIn config / application.rb wurde die Verfallswarnung für mich in Rails 4.0.2 entfernt, aber nur, wenn ich sie über die anderen config.i18nZeilen setze .
Balexand
15

I18n.config.enforce_available_locales = true arbeitete für mich in Rails 3.2.16 (ich habe es in config / application.rb gestellt)

SpeedyWizard
quelle
0

Wenn Sie sich für Gebietsschemas interessieren möchten, schreiben Sie in eine appilcation.rbDatei.

config.i18n.enforce_available_locales = true

Sie können false schreiben, wenn das Gebietsschema überprüft wird, und das interessiert Sie nicht.

Foram Thakral
quelle