Ответ 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
Предостережение
-
Если вы настраиваете конфигурацию
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/[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)>'",