Rails i18n validation deprecation warning
Właśnie zaktualizowałem do rails 4.0.2 i dostaję ostrzeżenie:
[deprecated] I18n. enforce_available_locales będzie domyślnie ustawione na true w przyszłości. Jeśli naprawdę chcesz pominąć walidację ustawień regionalnych, możesz ustawić I18n. enforce_available_locales = false, aby uniknąć tego komunikatu.
Czy jest jakiś problem z bezpieczeństwem przy ustawianiu go na false?
4 answers
Ważne : upewnij się, że Twoja aplikacja nie używa I18n 0.6.8, ma błąd , który uniemożliwia prawidłowe ustawienie konfiguracji .
Krótka odpowiedź
W celu wyciszenia Ostrzeżenia edytuj aplikację.plik rb i dołącz następującą linię wewnątrz Rails::Application
body
config.i18n.enforce_available_locales = true
Możliwe wartości to:
-
false : if you
- chcesz pominąć walidację locale
- don ' t care about locales
-
true : if you
- chcesz, aby aplikacja zgłosiła błąd, jeśli podano nieprawidłowe ustawienia regionalne (or)
- chcesz domyślać się nowych zachowań Rails (or)
- dbaj o walidację lokalizacji
Uwaga:
- stare domyślne zachowanie odpowiada
false
, a nietrue
. - jeśli ustawiasz konfigurację
config.i18n.default_locale
lub inne ustawienia i18n, upewnij się, że zrobisz to po ustawieniuconfig.i18n.enforce_available_locales
ustawienie. - Jeśli używasz klejnotów innych firm, które zawierają funkcje I18n, ustawienie zmiennej za pomocą obiektu
config
aplikacji, może nie mieć efektu. W tym przypadku ustaw bezpośrednio naI18n
używającI18n.config.enforce_available_locales
.Caveats
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 Rails 4 (>=4.0.2), jak i w Rails 3.2 (>= 3.2.14). Powód jest wyjaśniony w niniejszym zatwierdzeniu .
Locales
Gdy
I18n.config.enforce_available_locales
jest prawdą, podniesiemy Wyjątek i18n:: InvalidLocale, jeśli przekazane ustawienia regionalne są niedostępne.Wartość domyślna jest ustawiona na
nil
, co spowoduje wyświetlenie błędu deprecacji.Jeśli ustawione na
false
pominiemy 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. Transliteracja
Przed tą zmianą, jeśli przekazałeś nieobsługiwane ustawienia regionalne, Rails przełączy się na nie po cichu, jeśli Ustawienia regionalne są poprawne (tzn. jeśli w folderze /config/locales
znajduje się odpowiedni plik locale), w przeciwnym razie ustawienia regionalne będą domyślnie ustawione na config.i18n.default_locale
(domyślnie :en).
Nowa wersja Gem I18n zmusza deweloperów do bycia trochę bardziej świadomym lokalizacji zarządzanie.
W przyszłości zachowanie ulegnie zmianie i jeśli Ustawienia regionalne są nieprawidłowe, aplikacja Rails wyświetli błąd.
W przygotowaniu takiej zmiany (która może potencjalnie złamać kilka aplikacji, które do dziś opierały się 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 ją na true, aby pasowała do nowych domyślnych Rails lub jeśli chcesz być bardziej sztywny przy walidacji domeny i uniknąć przełączania na domyślne w przypadku nieprawidłowego ustawienia lokalnego.
config.i18n.enforce_available_locales = true
Zastrzeżenie
Jeśli ustawiasz konfigurację
config.i18n.default_locale
lub używasz którejkolwiek z wyżej wymienionych metod (default_locale=
,locale=
,translate
, itd), upewnij się, że to zrobisz po ustawieniuconfig.i18n.enforce_available_locales
. W przeciwnym razie ostrzeżenie o deprecjacji będzie się pojawiać. (Dzięki Fábio Batista ).-
Jeśli używasz klejnotów innych firm, które zawierają funkcje I18n, ustawienie zmiennej through może nie mieć wpływu. W rzeczywistości problem jest taki sam, jak opisano w poprzednim punkcie, tylko trochę trudniej debugować.
Ta kwestia jest sprawą nadrzędną. Gdy ustawisz konfigurację w aplikacji Rails, wartość nie zostanie natychmiast przypisana do gem I18n. Rails przechowuje każdą konfigurację w wewnętrznym obiekcie, ładuje zależności (Railties i third party gems), a następnie przekazuje konfigurację do klas docelowych. Jeśli używasz gem (lub wtyczki Rails), która wywołuje którąkolwiek z metod I18n, zanim konfiguracja zostanie przypisana do I18n, otrzymasz ostrzeżenie.
W tym przypadku musisz pominąć stos Rails i natychmiast ustawić konfigurację na gem I18n przez wywołanie
I18n.config.enforce_available_locales = true
Zamiast
config.i18n.enforce_available_locales = true
Problem jest łatwy do udowodnienia. Spróbuj wygenerować nową aplikację empty Rails, a zobaczysz to ustawienie
config.i18n
W Działa dobrze.Jeśli w Twojej aplikacji tak nie jest, istnieje łatwy sposób na debugowanie sprawcy. Znajdź gem i18n w swoim systemie, otwórz plik
i18n.rb
i edytuj metodęenforce_available_locales!
, aby dołączyć instrukcjęputs caller.inspect
.Spowoduje to, że metoda wyświetli znacznik stosu, gdy zostanie wywołana. Będziesz w stanie określić, który gem 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)>'",
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:35
Dla kompletności, zauważ, że możesz również pozbyć się ostrzeżenia, ustawiając I18n.enforce_available_locales
na true
(lub false
) w config/application.rb
:
require File.expand_path('../boot', __FILE__)
.
.
.
module SampleApp
class Application < Rails::Application
.
.
.
I18n.enforce_available_locales = true
.
.
.
end
end
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-04 00:44:54
I18n.config.enforce_available_locales = true
działa mi w Rails 3.2.16 (umieściłem go w config/application.rb)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-04 09:40:00
Nie wydaje się w ten sposób-byłoby to poprzednie zachowanie i18n - nowe zachowanie (true) spowoduje błąd, gdy poprosisz o Ustawienia regionalne nie zaimplementowane/dostępne.
Zobacz commit, który dodał to Ostrzeżenie: https://github.com/svenfuchs/i18n/commit/3b6e56e06fd70f6e4507996b017238505e66608c
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-03 21:25:55