Рельсы с названием i18n прекращение проверки предупреждение


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

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

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

4 383

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

будьте осторожны

  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
    

    этот вопрос легко доказать. Попробуйте создать новое приложение пустые рельсы, и вы увидите, что настройка 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 to true (или 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