Попередження про припинення перевірки рейки I18n


387

Я щойно оновив до рейок 4.0.2 і отримую це попередження:

[застаріле] I18n.enforce_available_locales за умовчанням буде істинним у майбутньому. Якщо ви дійсно хочете пропустити перевірку вашої місцевості, ви можете встановити I18n.enforce_available_locales = false, щоб уникнути цього повідомлення.

Чи є якісь проблеми із безпекою, якщо встановити це значення false?


Мабуть, це трапляється і з Rails 4.0.1додатками.
lucke84

2
У мене те саме на рейках 3.2.16. Відповідно до відповіді Сімоне Карлетті нижче, це в рейках 4 (> = 4.0.2) та рейках 3.2 (> = 3.2.14).
Марк Беррі

Відповіді:


615

Важливо : Переконайтеся, що ваш додаток не використовує I18n 0.6.8, він має помилку, яка не дозволяє правильно встановити конфігурацію .


Коротка відповідь

Щоб заглушити попередження, відредагуйте файл application.rb і додайте наступний рядок всередині Rails::Applicationтіла

config.i18n.enforce_available_locales = true

Можливі значення:

  • помилково : якщо ти
    • хочу пропустити перевірку локалі
    • не хвилюйтесь про місцеві місця
  • правда : якщо ти
    • хочу, щоб програма викликала помилку, якщо передано (або) недійсну локаль
    • хочете встановити за замовчуванням нову поведінку Rails (або)
    • дбайте про перевірку місцевості

Примітка:

  • Старій поведінці за замовчуванням відповідає false, ні true.
  • Якщо ви встановлюєте config.i18n.default_localeконфігурацію чи інші налаштування i18n, переконайтеся, що це зроблено після config.i18n.enforce_available_localesвстановлення.
  • Якщо ви використовуєте сторонні дорогоцінні камені, які містять функції I18n, встановлення змінної через configоб’єкт Application може не мати ефекту. У цьому випадку встановіть його безпосередньо на I18nвикористання I18n.config.enforce_available_locales.

    Коваджі

Приклад

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

Довга відповідь

Попередження про припинення роботи тепер відображається як у Rails 4 (> = 4.0.2), так і в Rails 3.2 (> = 3.2.14). Причина пояснюється в цьому комітеті .

Застосовуйте доступні місцеві мови

Коли I18n.config.enforce_available_localesце правда, ми піднімемо виняток I18n :: InvalidLocale, якщо пропущена локаль недоступна.

За замовчуванням встановлено значення, nilде відображатиметься помилка депресації.

Якщо встановлено значення, falseми взагалі пропустимо застосування загальнодоступних локалів (стара поведінка).

Це було реалізовано в таких методах:

  • I18n.config.default_locale =
  • I18n.config.locale =
  • I18n.перекладати
  • I18n.localize
  • I18n.transliterate

Перед цією зміною, якщо ви передали непідтримуваний локаль, Rails мовчки переходитиме на нього, якщо локал є дійсним (тобто, якщо в /config/localesпапці є відповідний файл локалу), інакше мова буде за замовчуванням для config.i18n.default_localeконфігурації (що за замовчуванням: en ).

Нова версія дорогоцінного каміння I18n змушує розробників бути трохи більш усвідомленими щодо управління локальними ресурсами.

У майбутньому поведінка зміниться, і якщо локальний код недійсний, програма Rails призведе до помилки.

Готуючи таку зміну (яка може потенційно зламати декілька додатків, які до цього часу покладалися на тихі налаштування за замовчуванням), попередження змушує вас чітко заявити, яку перевірку потрібно виконати протягом поточного перехідного періоду.

Щоб відновити попередню поведінку, просто встановіть таку конфігурацію false

config.i18n.enforce_available_locales = false

в іншому випадку встановіть його як істинне, щоб відповідати новим за замовчуванням Rails або якщо ви хочете бути більш жорсткими щодо перевірки домену та уникати перемикання на замовчування у випадку недійсної локалі.

config.i18n.enforce_available_locales = true

Caveat

  1. Якщо ви встановлюєте config.i18n.default_localeконфігурацію або з допомогою будь-якого із згаданих вище методів ( default_locale=, locale=, translate, і т.д.), переконайтеся , що зробити це після установки config.i18n.enforce_available_localesнастройки. В іншому випадку попередження про припинення роботи продовжуватиме з’являтися. (Спасибі Фабіо Батіста ).

  2. Якщо ви використовуєте сторонні дорогоцінні камені, які містять функції I18n, встановлення змінної через не може мати ефект. Насправді, проблема така ж, як описана в попередньому пункті, лише трохи важче налагодити.

    Це питання є пріоритетним. Коли ви встановлюєте конфігурацію в додатку Rails, значення не відразу присвоюється самоцвіту I18n. Rails зберігає кожну конфігурацію у внутрішньому об'єкті, завантажує залежності (Railties та сторонні дорогоцінні камені), а потім передає конфігурацію цільовим класам. Якщо ви використовуєте дорогоцінний камінь (або плагін Rails), який викликає будь-який з методів I18n до того, як конфігурація буде призначена для I18n, ви отримаєте попередження.

    У цьому випадку вам потрібно пропустити стек Rails і негайно встановити конфігурацію на дорогоцінний камінь I18n, зателефонувавши

    I18n.config.enforce_available_locales = true

    замість

    config.i18n.enforce_available_locales = true

    Це питання легко довести. Спробуйте сформувати новий додаток порожнього Rails , і ви побачите , що настройка config.i18nв application.rbвідмінно працює.

    Якщо у вашому додатку цього немає, є простий спосіб налагодити винуватця. Знайдіть дорогоцінний камінь i18n у вашій системі, відкрийте i18n.rbфайл та відредагуйте метод, enforce_available_locales!щоб включити вислів puts caller.inspect.

    Це призведе до того, що метод буде надрукувати стек-трек при кожному виклику. Ви зможете визначити, який саме дорогоцінний камінь викликає його, ознайомившись із стеком (у моєму випадку це був 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)>'",
    

20
Якщо ви встановлюєте config.i18n.default_localeконфігурацію, переконайтеся, що ви це зробите після встановлення нового config.i18n.enforce_available_localesпараметра. В іншому випадку попередження про депресацію буде продовжуватися.
Фабіо Батіста

3
Для мене працює, лише якщо я встановив I18n.enforce_available_locales = true. config.i18n.enforce_available_locales = trueне працює.
Піоз

1
@Pioz Це може бути викликано дорогоцінними каменями, від яких залежить ваша програма. Я оновив пост, щоб пояснити, чому.
Сімоне Карлетті

@SimoneCarletti прямий виклик повинен бути I18n.config.enforce_available_localesНЕ I18n.config.i18n.enforce_available_localesя відредагований свою відповідь. Дякую за виправлення.
Фабіо

1
Слід зазначити, що потрібно встановити, I18n.config.available_locales = [:your_locale, :en]наприклад, інакше ви не зможете запустити свій сервер рейлів.
Тамер Шлаш

45

Просто для повноти картини , зверніть увагу , що ви можете також позбутися від попередження, встановивши I18n.enforce_available_localesна true(або false) в config/application.rb:

require File.expand_path('../boot', __FILE__)
.
.
.
module SampleApp
  class Application < Rails::Application
    .
    .
    .
    I18n.enforce_available_locales = true
    .
    .
    .
  end
end

9
Хіба це не було б охайніше зробити config.i18n.enforce_available_locales = true?
Міща

2
Я в 3.2.16, я встановив I18n.enforce_available_locales = false, але у мене все ще є повідомлення ...
CLod

3
@Міша, яка не працювала для мене, відповідь вище, хоча.
Майк Атлас

1
@Mischa, на жаль, не довелося пережити I18n.configце, щоб мати ефект
dolzenko

3
config.i18n.enforce_available_locales = trueу config / application.rb усунув попередження про депресію для мене в Rails 4.0.2, але тільки якщо я ставлю його над іншими config.i18nрядками.
balexand

15

I18n.config.enforce_available_locales = true працював для мене в Rails 3.2.16 (я помістив його в config / application.rb)


10

Це не здається таким чином - це було б попередньою поведінкою способу роботи i18n - нова поведінка (істина) призведе до помилки, коли ви запитаєте про локальний ресурс не реалізований / недоступний.

Дивіться комісію, яка додала це попередження: https://github.com/svenfuchs/i18n/commit/3b6e56e06fd70f6e4507996b017238505e66608c


0

Якщо ви хочете подбати про локалі, запишіть у appilcation.rbфайл.

config.i18n.enforce_available_locales = true

Ви можете написати помилкове значення, якщо перевірка локалі не переймається цим.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.