Я только что обновил до rails 4.0.2 и получаю это предупреждение:
[устарело] I18n.enforce_available_locales по умолчанию будет иметь значение true в будущем. Если вы действительно хотите пропустить проверку вашей локали, вы можете установить I18n.enforce_available_locales = false, чтобы избежать этого сообщения.
Есть ли какие-либо проблемы с безопасностью при установке его в false?
ruby-on-rails
ruby
ruby-on-rails-4
deprecated
rails-i18n
Маурисио Мораес
источник
источник
Rails 4.0.1
приложениями.Ответы:
Важно : убедитесь, что ваше приложение не использует I18n 0.6.8, в нем есть ошибка, препятствующая правильной настройке конфигурации .
Короткий ответ
Для того , чтобы заставить замолчать предупреждение редактировать файл application.rb и включить следующую строку внутри
Rails::Application
телаВозможные значения:
Замечания:
false
, а неtrue
.config.i18n.default_locale
конфигурацию или другие настройки i18n, обязательно сделайте это после установкиconfig.i18n.enforce_available_locales
настройки.config
объект Application может не иметь эффекта. В этом случае установите его непосредственно наI18n
использованиеI18n.config.enforce_available_locales
.Предостережения
пример
Длинный ответ
Предупреждение об устаревании теперь отображается как в Rails 4 (> = 4.0.2), так и в Rails 3.2 (> = 3.2.14). Причина объясняется в этом коммите .
Перед этим изменением, если вы передали неподдерживаемую локаль, Rails молча переключился бы на нее, если локаль действительна (т. Е. Если в
/config/locales
папке есть соответствующий файл локали ), в противном случае локаль по умолчанию будет иметьconfig.i18n.default_locale
конфигурацию (по умолчанию: en ).Новая версия драгоценного камня I18n заставляет разработчиков быть немного более внимательными к управлению языком.
В будущем поведение изменится, и если локаль будет недействительной, приложение Rails выдаст ошибку.
При подготовке такого изменения (которое может потенциально сломать несколько приложений, которые до сегодняшнего дня полагались на умолчания по умолчанию), предупреждение заставляет вас явно объявить, какую проверку вы хотите выполнить в течение текущего переходного периода.
Чтобы восстановить предыдущее поведение, просто установите следующую конфигурацию
false
в противном случае установите для него значение true, чтобы соответствовать новым значениям по умолчанию в Rails, или если вы хотите быть более жесткими при проверке домена и избегать переключения на значение по умолчанию в случае неверной локали.
Предостережение
Если вы устанавливаете
config.i18n.default_locale
конфигурацию или с помощью любого из упомянутых выше методов (default_locale=
,locale=
,translate
, и т.д.), убедитесь , что сделать это после установкиconfig.i18n.enforce_available_locales
настройки. В противном случае предупреждение об устаревании будет продолжать появляться. (Спасибо Фабио Батиста ).Если вы используете сторонние драгоценные камни, которые включают в себя функции I18n, настройка переменной может не иметь эффекта. На самом деле, проблема та же, что описана в предыдущем пункте, но ее немного сложнее отладить.
Эта проблема имеет приоритетное значение. Когда вы устанавливаете конфигурацию в своем приложении Rails, значение не сразу присваивается гему I18n. Rails сохраняет каждую конфигурацию во внутреннем объекте, загружает зависимости (Railties и сторонние гемы), а затем передает конфигурацию целевым классам. Если вы используете gem (или плагин Rails), который вызывает любой из методов I18n до того, как конфиг назначен I18n, вы получите предупреждение.
В этом случае вам нужно пропустить стек Rails и сразу установить конфигурацию для гема I18n, вызвав
вместо
Вопрос легко доказать. Попробуйте сформировать новое приложение пустого Rails , и вы увидите , что настройка
config.i18n
вapplication.rb
отлично работает.Если в вашем приложении этого нет, существует простой способ отладки виновника. Найдите в своей системе гем i18n, откройте
i18n.rb
файл и отредактируйте метод,enforce_available_locales!
включив в него операторputs caller.inspect
.Это заставит метод печатать трассировку стека при каждом вызове. Вы сможете определить, какой гем вызывает его, проверив трассировку стека (в моем случае это был Authlogic).
источник
config.i18n.default_locale
конфигурацию, убедитесь, что вы делаете это после установки новогоconfig.i18n.enforce_available_locales
параметра. В противном случае предупреждение об устаревании будет продолжать появляться.I18n.enforce_available_locales = true
.config.i18n.enforce_available_locales = true
не работает.I18n.config.enforce_available_locales
неI18n.config.i18n.enforce_available_locales
я отредактирован свой ответ. Спасибо за исправление.I18n.config.available_locales = [:your_locale, :en]
например, иначе вы не сможете запустить свой сервер rails.Просто для полноты картины , обратите внимание , что вы можете также избавиться от предупреждения, установив
I18n.enforce_available_locales
наtrue
(илиfalse
) вconfig/application.rb
:источник
config.i18n.enforce_available_locales = true
?I18n.config
это, чтобы иметь эффектconfig.i18n.enforce_available_locales = true
в config / application.rb исключено предупреждение об устаревании для меня в Rails 4.0.2, но только если я поставлю его выше другихconfig.i18n
строк.I18n.config.enforce_available_locales = true
у меня работал в Rails 3.2.16 (я положил его в config / application.rb)источник
Похоже, что это не так - это было бы предыдущим поведением того, как работает i18n - новое поведение (true) вызовет ошибку, когда вы попросите локаль не реализована / недоступна.
Посмотрите коммит, который добавил это предупреждение: https://github.com/svenfuchs/i18n/commit/3b6e56e06fd70f6e4507996b017238505e66608c
источник
Если вы хотите заботиться о локалях, напишите в
appilcation.rb
файл.Вы можете написать false, если проверка локали, и вас это не волнует.
источник