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?

Author: Simone Carletti, 2013-12-04

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 nie true.
  • jeśli ustawiasz konfigurację config.i18n.default_locale lub inne ustawienia i18n, upewnij się, że zrobisz to po ustawieniu config.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 na I18n używając I18n.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

  1. 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 ustawieniu config.i18n.enforce_available_locales. W przeciwnym razie ostrzeżenie o deprecjacji będzie się pojawiać. (Dzięki Fábio Batista ).

  2. 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)>'",
    
 612
Author: Simone Carletti,
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
 45
Author: mhartl,
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)

 15
Author: SpeedyWizard,
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

 10
Author: Justin,
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