it-swarm.com.ru

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

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

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

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

386
Mauricio Moraes

Важно: убедитесь, что ваше приложение не использует I18n 0.6.8, в нем есть ошибка, препятствующая правильной настройке конфигурации .


Короткий ответ

Чтобы отключить предупреждение, отредактируйте файл application.rb и включите следующую строку в тело Rails::Application

config.i18n.enforce_available_locales = true

Возможные значения:

  • false: если вы
    • хотите пропустить проверку локали
    • не заботится о локалях
  • true: если вы
    • хотите, чтобы приложение выдало ошибку, если передана неверная локаль (или)
    • хотите по умолчанию использовать новое поведение Rails (или)
    • заботиться о проверке локали

Замечания:

  • Старое поведение по умолчанию соответствует false, а не true.
  • Если вы настраиваете конфигурацию config.i18n.default_locale или другие настройки i18n, обязательно сделайте это после настройки config.i18n.enforce_available_locales.
  • Если вы используете сторонние гемы, которые включают в себя функции I18n, установка переменной через объект Application 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.i18n.default_locale (по умолчанию : еп).

Новая версия драгоценного камня 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]/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)>'",
    
613
Simone Carletti

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

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

15
SpeedyWizard

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

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

10
Justin

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

config.i18n.enforce_available_locales = true

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

0
Foram Thakral