Рельсы с названием i18n прекращение проверки предупреждение
Я только что обновился до rails 4.0.2 и я получаю это предупреждение:
[deprecated] I18n.enforce_available_locales будет по умолчанию true в будущем. Если вы действительно хотите пропустить проверку своей локали, вы можете установить I18n.enforce_available_locales = false, чтобы избежать этого сообщения.
есть ли какие-либо проблемы безопасности в установке его на false?
4 ответа:
важно: убедитесь, что ваше приложение не использует I18n 0.6.8, он имеет ошибка, которая не позволяет правильно настроить конфигурацию.
короткий ответ:
для того, чтобы заставить замолчать предупреждение отредактировать приложение.rb файл и включить следующую строку внутри
Rails::Application
телоconfig.i18n.enforce_available_locales = true
возможные значения:
- ложные: если вы
- хотите пропустить проверка локали
- не заботьтесь о местах
- правда: если вы
- хотите, чтобы приложение вызывало ошибку, если передается недопустимая локаль (или)
- хотите по умолчанию для новых рельсов поведения (или)
- забота о валидации язык
Примечание:
- старое поведение по умолчанию соответствует
false
, неtrue
.- если вы устанавливаете
config.i18n.default_locale
конфигурация или другие настройки i18n, обязательно сделайте это после установкиconfig.i18n.enforce_available_locales
настройка.- если вы используете сторонние драгоценные камни, которые включают в себя функции I18n, устанавливая переменную через приложение
config
объект, может не иметь эффекта. В этом случае установите его непосредственно в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.язык=
- I18n. translate
- I18n. localize
- как i18n.транслитерация
перед этим изменением, если вы передали неподдерживаемую локаль, 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
будьте осторожны
если вы устанавливаете
config.i18n.default_locale
конфигурация или использование любого из ранее упомянутых методов (default_locale=
,locale=
,translate
и т. д.), Обязательно сделайте это после установкиconfig.i18n.enforce_available_locales
настройка. В противном случае, предупреждение об устаревании будет продолжать появляться. (Спасибо Коэнтрау Батиста).если вы используете сторонние драгоценные камни, которые включают в себя функции I18n, установка переменная через может не иметь эффекта. На самом деле, проблема такая же, как описано в предыдущем пункте, только немного сложнее отлаживать.
этот вопрос является вопросом приоритета. Когда вы устанавливаете конфигурацию в своем приложении Rails, значение не сразу назначается драгоценному камню I18n. Rails хранит каждую конфигурацию во внутреннем объекте, загружает зависимости (Railties и сторонние драгоценные камни), а затем передает конфигурацию целевым классам. Если вы используете gem (или Rails плагин), что вызывает любой из методов I18n до того, как конфигурация будет назначена I18n, тогда вы получите предупреждение.
в этом случае вам нужно пропустить стек Rails и сразу же установить конфигурацию на камень I18n, вызвав
I18n.config.enforce_available_locales = true
вместо
config.i18n.enforce_available_locales = true
этот вопрос легко доказать. Попробуйте создать новое приложение пустые рельсы, и вы увидите, что настройка
config.i18n
наapplication.rb
работает нормально.если в вашем приложении это не так, есть простой способ отладьте виновника. Найдите драгоценный камень i18n в вашей системе, откройте
i18n.rb
файл и редактировать методenforce_available_locales!
включить заявлениемputs caller.inspect
.это приведет к тому, что метод будет печатать stacktrace при каждом вызове. Вы сможете определить, какой камень вызывает его, проверяя stacktrace (в моем случае это был 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)>'",
просто для полноты, обратите внимание, что вы также можете избавиться от предупреждения, установив
I18n.enforce_available_locales
totrue
(илиfalse
) вconfig/application.rb
:require File.expand_path('../boot', __FILE__) . . . module SampleApp class Application < Rails::Application . . . I18n.enforce_available_locales = true . . . end end
I18n.config.enforce_available_locales = true
работал для меня в Rails 3.2.16 (я поставил его в config/application.РБ)
не похоже, что это будет предыдущее поведение способа работы i18n-новое поведение (true) вызовет ошибку, когда вы попросите локаль не реализована/доступна.
см. фиксацию, которая добавила Это предупреждение: https://github.com/svenfuchs/i18n/commit/3b6e56e06fd70f6e4507996b017238505e66608c