Важливо : Переконайтеся, що ваш додаток не використовує 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
Якщо ви встановлюєте config.i18n.default_localeконфігурацію або з допомогою будь-якого із згаданих вище методів ( default_locale=, locale=, translate, і т.д.), переконайтеся , що зробити це після установки config.i18n.enforce_available_localesнастройки. В іншому випадку попередження про припинення роботи продовжуватиме з’являтися. (Спасибі Фабіо Батіста ).
Якщо ви використовуєте сторонні дорогоцінні камені, які містять функції 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)>'",
Rails 4.0.1додатками.