Rails I18n предупреждение о предупреждении валидации

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

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

Есть ли проблема с безопасностью при настройке на false?

Ответ 1

Важно: убедитесь, что ваше приложение не использует 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 приложения может не иметь эффекта. В этом случае установите его непосредственно в 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 имеет значение true, мы вызовем исключение I18n :: InvalidLocale, если переданный языковой стандарт недоступен.

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

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

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

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

Перед этим изменением, если вы передали неподдерживаемую локаль, Rails молча переключился бы на нее, если локаль действительна (т.е. Если в папке /config/locales есть соответствующий файл /config/locales), иначе локаль по умолчанию будет config.i18n.default_locale Конфигурация 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/[email protected]/gems/i18n-0.6.9/lib/i18n.rb:150:in 'translate'",
     "/Users/weppos/.rvm/gems/[email protected]/gems/authlogic-3.1.0/lib/authlogic/i18n/translator.rb:8:in 'translate'",
     "/Users/weppos/.rvm/gems/[email protected]/gems/authlogic-3.1.0/lib/authlogic/i18n.rb:79:in 'translate'",
     "/Users/weppos/.rvm/gems/[email protected]/gems/authlogic-3.1.0/lib/authlogic/acts_as_authentic/email.rb:68:in 'validates_format_of_email_field_options'",
     "/Users/weppos/.rvm/gems/[email protected]/gems/authlogic-3.1.0/lib/authlogic/acts_as_authentic/email.rb:102:in 'block in included'",
     "/Users/weppos/.rvm/gems/[email protected]/gems/authlogic-3.1.0/lib/authlogic/acts_as_authentic/email.rb:99:in 'class_eval'",
     "/Users/weppos/.rvm/gems/[email protected]/gems/authlogic-3.1.0/lib/authlogic/acts_as_authentic/email.rb:99:in 'included'",
     "/Users/weppos/.rvm/gems/[email protected]/gems/authlogic-3.1.0/lib/authlogic/acts_as_authentic/base.rb:37:in 'include'",
     "/Users/weppos/.rvm/gems/[email protected]/gems/authlogic-3.1.0/lib/authlogic/acts_as_authentic/base.rb:37:in 'block in acts_as_authentic'",
     "/Users/weppos/.rvm/gems/[email protected]/gems/authlogic-3.1.0/lib/authlogic/acts_as_authentic/base.rb:37:in 'each'",
     "/Users/weppos/.rvm/gems/[email protected]tion/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)>'",
    

Ответ 2

Просто для полноты, обратите внимание, что вы также можете избавиться от предупреждения, установив 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

Ответ 3

I18n.config.enforce_available_locales = true работал у меня в Rails 3.2.16 (я положил его в config/application.rb)

Ответ 4

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

См. фиксацию, которая добавила это предупреждение: https://github.com/svenfuchs/i18n/commit/3b6e56e06fd70f6e4507996b017238505e66608c

Ответ 5

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

config.i18n.enforce_available_locales = true

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