Важно : убедитесь, что ваше приложение не использует 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
объект Application может не иметь эффекта. В этом случае установите его непосредственно на 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
конфигурацию (по умолчанию: 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)>'",
Rails 4.0.1
приложениями.