Rails I18n Предупреждение об устаревании валидации

387

Я только что обновил до rails 4.0.2 и получаю это предупреждение:

[устарело] I18n.enforce_available_locales по умолчанию будет иметь значение true в будущем. Если вы действительно хотите пропустить проверку вашей локали, вы можете установить I18n.enforce_available_locales = false, чтобы избежать этого сообщения.

Есть ли какие-либо проблемы с безопасностью при установке его в false?

Маурисио Мораес
источник
Видимо, это происходит и с Rails 4.0.1приложениями.
lucke84
2
У меня так же на Rails 3.2.16. Согласно ответу Симоне Карлетти ниже, это в Rails 4 (> = 4.0.2) и Rails 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_localestrue, мы вызовем исключение I18n :: InvalidLocale, если переданный языковой стандарт недоступен.

По умолчанию установлено, nilчто будет отображать ошибку устаревания.

Если установлено значение, falseмы вообще пропустим принудительное применение доступных локалей (старое поведение).

Это было реализовано следующими способами:

  • I18n.config.default_locale =
  • I18n.config.locale =
  • I18n.translate
  • I18n.localize
  • I18n.transliterate

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

Новая версия драгоценного камня I18n заставляет разработчиков быть немного более внимательными к управлению языком.

В будущем поведение изменится, и если локаль будет недействительной, приложение Rails выдаст ошибку.

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

Чтобы восстановить предыдущее поведение, просто установите следующую конфигурацию false

config.i18n.enforce_available_locales = false

в противном случае установите для него значение true, чтобы соответствовать новым значениям по умолчанию в Rails, или если вы хотите быть более жесткими при проверке домена и избегать переключения на значение по умолчанию в случае неверной локали.

config.i18n.enforce_available_locales = true

Предостережение

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

  2. Если вы используете сторонние драгоценные камни, которые включают в себя функции I18n, настройка переменной может не иметь эффекта. На самом деле, проблема та же, что описана в предыдущем пункте, но ее немного сложнее отладить.

    Эта проблема имеет приоритетное значение. Когда вы устанавливаете конфигурацию в своем приложении Rails, значение не сразу присваивается гему I18n. Rails сохраняет каждую конфигурацию во внутреннем объекте, загружает зависимости (Railties и сторонние гемы), а затем передает конфигурацию целевым классам. Если вы используете gem (или плагин 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не работает.
Pioz
1
@Pioz Это может быть вызвано драгоценными камнями, от которых зависит ваше приложение. Я обновил пост, чтобы объяснить, почему.
Симона Карлетти
@SimoneCarletti прямой вызов должен быть I18n.config.enforce_available_localesне I18n.config.i18n.enforce_available_localesя отредактирован свой ответ. Спасибо за исправление.
Фабио
1
Следует упомянуть, что необходимо установить, I18n.config.available_locales = [:your_locale, :en]например, иначе вы не сможете запустить свой сервер rails.
Тамер Шлаш
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
mhartl
источник
9
Разве это не было бы лучше сделать config.i18n.enforce_available_locales = true?
Миша
2
Я нахожусь на 3.2.16, я установил I18n.enforce_available_locales = false, но у меня все еще есть сообщение ...
CLod
3
@ Миша, которая не работает для меня, ответ выше, хотя.
Майк Атлас
1
@ Миша, к сожалению, нет, пришлось пройти через 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)

SpeedyWizard
источник
10

Похоже, что это не так - это было бы предыдущим поведением того, как работает i18n - новое поведение (true) вызовет ошибку, когда вы попросите локаль не реализована / недоступна.

Посмотрите коммит, который добавил это предупреждение: https://github.com/svenfuchs/i18n/commit/3b6e56e06fd70f6e4507996b017238505e66608c

Джастин
источник
0

Если вы хотите заботиться о локалях, напишите в appilcation.rbфайл.

config.i18n.enforce_available_locales = true

Вы можете написать false, если проверка локали, и вас это не волнует.

Форам Такрал
источник