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::Application
Text 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
false
nicht true
.
- Wenn Sie die
config.i18n.default_locale
Konfiguration oder andere i18n-Einstellungen vornehmen, stellen Sie sicher, dass Sie dies nach dem Festlegen der config.i18n.enforce_available_locales
Einstellung tun .
- Wenn Sie Edelsteine von Drittanbietern verwenden, die I18n-Funktionen enthalten, hat das Festlegen der Variablen über das Anwendungsobjekt
config
möglicherweise keine Auswirkungen. In diesem Fall stellen Sie es direkt auf I18n
using 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_locales
true, wird eine I18n :: InvalidLocale-Ausnahme ausgelöst, wenn das übergebene Gebietsschema nicht verfügbar ist.
Der Standardwert ist festgelegt, nil
der einen Verfallsfehler anzeigt.
Wenn diese false
Option 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/locales
Ordner befindet). Andernfalls wird standardmäßig die config.i18n.default_locale
Konfiguration 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
Wenn Sie die setzen config.i18n.default_locale
Konfiguration 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_locales
Einstellung. Andernfalls wird die Abwertungswarnung weiterhin angezeigt. (Danke Fábio Batista ).
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.i18n
in den application.rb
Werken 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.rb
Datei 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)>'",
Rails 4.0.1
Anwendungen.