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
-
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).
-
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 `'",