Я только что обновил rails 4.0.2, и я получаю это предупреждение:
[устарело] I18n.enforce_available_locales по умолчанию будет true в будущем. Если вы действительно хотите пропустить проверку своего языка, вы можете установить I18n.enforce_available_locales = false, чтобы избежать этого сообщения.
Есть ли проблема с безопасностью при настройке на false?
Важно: убедитесь, что ваше приложение не использует I18n 0.6.8, в нем есть ошибка, препятствующая правильной настройке конфигурации.
Чтобы заглушить предупреждение, отредактируйте файл application.rb и включите следующую строку в тело Rails::Application
config.i18n.enforce_available_locales = true
Возможные значения:
Замечания:
false
, а не true
.config.i18n.default_locale
или другие параметры i18n, обязательно сделайте это после установки параметра config.i18n.enforce_available_locales
.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
Если вы настраиваете конфигурацию 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
Вопрос легко доказать. Попробуйте сгенерировать новое пустое приложение Rails, и вы увидите, что настройка config.i18n
в application.rb
работает нормально.
Если в вашем приложении этого нет, существует простой способ отладки виновника. Найдите гем i18n в вашей системе, откройте файл i18n.rb
и отредактируйте метод enforce_available_locales!
чтобы включить выражение puts caller.inspect
.
Это заставит метод печатать трассировку стека при каждом вызове. Вы сможете определить, какой гем вызывает его, проверив трассировку стека (в моем случае это был 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)>'",
config.i18n.default_locale
, убедитесь, что вы делаете это после установки нового параметра config.i18n.enforce_available_locales
. В противном случае предупреждение об устаревании будет продолжать появляться.
I18n.enforce_available_locales = true
. config.i18n.enforce_available_locales = true
не работает.
Просто для полноты, обратите внимание, что вы также можете избавиться от предупреждения, установив 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
config.i18n.enforce_available_locales = true
?
I18n.config.enforce_available_locales = true
работал у меня в Rails 3.2.16 (я положил его в config/application.rb)
Не похоже на то, что было бы предыдущим поведением о том, как работает i18n - новое поведение (true) вызовет ошибку при запросе локали, которая не была реализована/доступна.
См. фиксацию, которая добавила это предупреждение: https://github.com/svenfuchs/i18n/commit/3b6e56e06fd70f6e4507996b017238505e66608c
Если вы хотите позаботиться о локалях, напишите в файл appilcation.rb
.
config.i18n.enforce_available_locales = true
Вы можете написать false, если проверка локали, и вас это не волнует.
Rails 4.0.1
.