Ważne : upewnij się, że Twoja aplikacja nie używa I18n 0.6.8, ponieważ zawiera błąd uniemożliwiający prawidłowe ustawienie konfiguracji .
Krótka odpowiedź
Aby wyciszyć ostrzeżenie, edytuj plik application.rb i dołącz następujący wiersz do Rails::Applicationtreści
config.i18n.enforce_available_locales = true
Możliwe wartości to:
- false : jeśli ty
- chcesz pominąć sprawdzanie poprawności ustawień regionalnych
- nie przejmuj się lokalizacjami
- prawda : jeśli ty
- chcesz, aby aplikacja zgłosiła błąd, jeśli zostaną przekazane nieprawidłowe ustawienia narodowe (lub)
- chcesz domyślnie zastosować nowe zachowania Railsów (lub)
- dbać o sprawdzanie poprawności ustawień regionalnych
Uwaga:
- Stare domyślne zachowanie odpowiada
false, a nie true.
- Jeśli ustawiasz
config.i18n.default_localekonfigurację lub inne ustawienia i18n, pamiętaj, aby to zrobić po ustawieniu config.i18n.enforce_available_localesustawienia.
- Jeśli używasz klejnotów innych firm, które zawierają funkcje I18n, ustawienie zmiennej poprzez
configobiekt aplikacji może nie mieć żadnego efektu. W takim przypadku ustaw bezpośrednio na I18nużywanie I18n.config.enforce_available_locales.
Ostrzeżenia
Przykład
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
Długa odpowiedź
Ostrzeżenie o wycofaniu jest teraz wyświetlane zarówno w Railsach 4 (> = 4.0.2), jak i Railsach 3.2 (> = 3.2.14). Powód wyjaśniono w tym zatwierdzeniu .
Egzekwuj dostępne ustawienia regionalne
Gdy I18n.config.enforce_available_localesjest to prawdą, zgłoszimy wyjątek I18n :: InvalidLocale, jeśli przekazane ustawienia narodowe są niedostępne.
Domyślnie ustawiona jest wartość, nilktóra spowoduje wyświetlenie błędu przestarzałości.
Jeśli ustawione na false, pomijamy całkowite wymuszanie dostępnych lokalizacji (stare zachowanie).
Zostało to zaimplementowane w następujących metodach:
- I18n.config.default_locale =
- I18n.config.locale =
- I18n.translate
- I18n.localize
- I18n.transliterate
Przed tą zmianą, jeśli przekazałeś nieobsługiwane ustawienia narodowe, Railsy po cichu przełączyłyby się na nie, jeśli ustawienia narodowe są prawidłowe (tj. Jeśli w /config/localesfolderze znajduje się odpowiedni plik ustawień narodowych), w przeciwnym razie ustawienia narodowe domyślnie config.i18n.default_localeskonfigurują się (domyślnie: en ).
Nowa wersja klejnotu I18n zmusza deweloperów do większej świadomości zarządzania lokacjami.
W przyszłości zachowanie się zmieni, a jeśli ustawienia regionalne będą nieprawidłowe, aplikacja Railsy zgłosi błąd.
W ramach przygotowań do takiej zmiany (która może potencjalnie uszkodzić kilka aplikacji, które do tej pory polegały na cichych ustawieniach domyślnych), ostrzeżenie zmusza cię do jawnego zadeklarowania, którą walidację chcesz wykonać w bieżącym okresie przejściowym.
Aby przywrócić poprzednie zachowanie, po prostu ustaw następującą konfigurację na false
config.i18n.enforce_available_locales = false
w przeciwnym razie ustaw wartość true, aby dopasować nowe wartości domyślne Rails lub jeśli chcesz być bardziej sztywny przy sprawdzaniu poprawności domeny i unikaj przełączania na domyślne w przypadku nieprawidłowych ustawień regionalnych.
config.i18n.enforce_available_locales = true
Zastrzeżenie
Jeśli ustawienie config.i18n.default_localekonfiguracji lub przy użyciu jednego z wcześniej wymienionych metod ( default_locale=, locale=, translate, etc), upewnij się, aby to zrobić po ustawieniu config.i18n.enforce_available_localesustawienia. W przeciwnym razie pojawi się ostrzeżenie o wycofaniu. (Dzięki Fábio Batista ).
Jeśli używasz klejnotów innych firm, które zawierają funkcje I18n, ustawienie zmiennej może nie mieć efektu. W rzeczywistości problem jest taki sam, jak opisano w poprzednim punkcie, tylko nieco trudniejszy do debugowania.
Ta kwestia ma pierwszeństwo. Po ustawieniu konfiguracji w aplikacji Rails wartość nie jest natychmiast przypisywana do klejnotu I18n. Railsy przechowują każdą konfigurację w obiekcie wewnętrznym, ładują zależności (Railties i klejnoty stron trzecich), a następnie przekazują konfigurację do klas docelowych. Jeśli użyjesz gem (lub wtyczki Rails), która wywołuje dowolną metodę I18n, zanim konfiguracja zostanie przypisana do I18n, otrzymasz ostrzeżenie.
W takim przypadku musisz pominąć stos Railsów i natychmiast ustawić konfigurację na klejnot I18n, dzwoniąc
I18n.config.enforce_available_locales = true
zamiast
config.i18n.enforce_available_locales = true
Problem jest łatwy do udowodnienia. Spróbuj wygenerować nową aplikację pustych szyn i widać, że ustawienie config.i18nw application.rbszlachetnych uczynków.
Jeśli w aplikacji tak nie jest, istnieje prosty sposób na debugowanie sprawcy. Znajdź klejnot i18n w swoim systemie, otwórz i18n.rbplik i edytuj metodę, enforce_available_locales!aby dołączyć instrukcję puts caller.inspect.

Spowoduje to, że metoda będzie drukować ślad stosu przy każdym wywołaniu. Będziesz mógł określić, który klejnot go wywołuje, sprawdzając stacktrace (w moim przypadku był to 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.1aplikacji.