Ostrzeżenie o rezygnacji z walidacji I18n

387

Właśnie zaktualizowałem do wersji 4.0.2 i otrzymuję to ostrzeżenie:

[przestarzałe] I18n.enforce_available_locales domyślnie przyjmie wartość true w przyszłości. Jeśli naprawdę chcesz pominąć sprawdzanie poprawności ustawień regionalnych, możesz ustawić I18n.enforce_available_locales = false, aby uniknąć tego komunikatu.

Czy jest jakiś problem z bezpieczeństwem przy ustawianiu wartości false?

Mauricio Moraes
źródło
Najwyraźniej dzieje się tak również w przypadku Rails 4.0.1aplikacji.
lucke84
2
Mam to samo na Railsach 3.2.16. Zgodnie z odpowiedzią Simone Carletti poniżej, jest w Railsach 4 (> = 4.0.2) i Railsach 3.2 (> = 3.2.14).
Mark Berry

Odpowiedzi:

615

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

  1. 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 ).

  2. 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)>'",
    
Simone Carletti
źródło
20
Jeśli config.i18n.default_localekonfigurujesz konfigurację, upewnij się, że robisz to po ustawieniu nowego config.i18n.enforce_available_localesustawienia. W przeciwnym razie ostrzeżenie o wycofaniu będzie się pojawiać.
Fábio Batista,
3
Dla mnie działa tylko, jeśli ustawię I18n.enforce_available_locales = true. config.i18n.enforce_available_locales = truenie działa.
Pioz,
1
@Pioz Może to być spowodowane klejnotami, od których zależy twoja aplikacja. Zaktualizowałem post, aby wyjaśnić, dlaczego.
Simone Carletti,
@ Bezpośrednie połączenie SimoneCarletti I18n.config.enforce_available_localesnie powinno być I18n.config.i18n.enforce_available_locales, zredagowałem twoją odpowiedź. Dzięki za poprawkę.
Fabio,
1
Należy wspomnieć, że należy ustawić I18n.config.available_locales = [:your_locale, :en]na przykład, w przeciwnym razie nie będzie można uruchomić serwera Railsowego.
Tamer Shlash
45

Tylko dla kompletności, uwaga, że można również pozbyć się ostrzeżenia, ustawiając I18n.enforce_available_localessię 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
mhartl
źródło
9
Czy nie byłoby to rozsądniejsze config.i18n.enforce_available_locales = true?
Mischa,
2
Mam 3.2.16, ustawiłem na I18n.enforce_available_locales = false, ale nadal mam komunikat ...
CLod
3
@ Mischa, która nie działała dla mnie, powyższa odpowiedź jednak działa.
Mike Atlas,
1
@Mischa niestety nie musiał, musiał przejść przez I18n.configto, aby mieć efekt
dolzenko
3
config.i18n.enforce_available_locales = truew config / application.rb wyeliminowałem ostrzeżenie o przestarzałości w Railsach 4.0.2, ale tylko jeśli ustawię je powyżej innych config.i18nlinii.
balexand
15

I18n.config.enforce_available_locales = true pracował dla mnie w Railsach 3.2.16 (umieszczam go w config / application.rb)

SpeedyWizard
źródło
0

Jeśli chcesz dbać o ustawienia regionalne, napisz do appilcation.rbpliku.

config.i18n.enforce_available_locales = true

Możesz wpisać fałsz, jeśli sprawdzanie poprawności ustawień regionalnych i nie przejmuj się tym.

Foram Thakral
źródło