Важливо : Переконайтеся, що ваш додаток не використовує 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
додатками.