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::Application
treś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_locale
konfigurację lub inne ustawienia i18n, pamiętaj, aby to zrobić po ustawieniu config.i18n.enforce_available_locales
ustawienia.
- Jeśli używasz klejnotów innych firm, które zawierają funkcje I18n, ustawienie zmiennej poprzez
config
obiekt aplikacji może nie mieć żadnego efektu. W takim przypadku ustaw bezpośrednio na I18n
uż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_locales
jest to prawdą, zgłoszimy wyjątek I18n :: InvalidLocale, jeśli przekazane ustawienia narodowe są niedostępne.
Domyślnie ustawiona jest wartość, nil
któ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/locales
folderze znajduje się odpowiedni plik ustawień narodowych), w przeciwnym razie ustawienia narodowe domyślnie config.i18n.default_locale
skonfigurują 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_locale
konfiguracji 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_locales
ustawienia. 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.i18n
w application.rb
szlachetnych 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.rb
plik 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.1
aplikacji.