我刚刚更新到Rails 4.0.2,并且收到以下警告:
[不建议使用] I18n.enforce_available_locales将来将默认为true。如果您确实要跳过对区域设置的验证,则可以设置I18n.enforce_available_locales = false以避免出现此消息。
将其设置为false是否存在任何安全问题?
我刚刚更新到Rails 4.0.2,并且收到以下警告:
[不建议使用] I18n.enforce_available_locales将来将默认为true。如果您确实要跳过对区域设置的验证,则可以设置I18n.enforce_available_locales = false以避免出现此消息。
将其设置为false是否存在任何安全问题?
Answers:
重要提示:请确保您的应用未使用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
using 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。音译
进行此更改之前,如果您传递了不受支持的语言环境,则如果语言环境有效(即,/config/locales
文件夹中有相应的语言环境文件),Rails会静默切换到该语言环境,否则该语言环境将默认为config.i18n.default_locale
配置(默认为:en )。
I18n gem的新版本迫使开发人员更加注意区域设置管理。
将来,行为将发生变化,如果语言环境无效,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
设置。否则,弃用警告将继续弹出。(感谢FábioBatista)。
如果您使用包含I18n功能的第三方宝石,则通过设置变量可能无效。实际上,问题与上一点中描述的相同,只是调试起来有点困难。
这个问题是当务之急。当您在Rails应用程序中设置配置时,该值不会立即分配给I18n gem。Rails将每个配置存储在一个内部对象中,加载依赖项(Railties和第三方gem),然后将配置传递给目标类。如果您在将配置分配给I18n之前使用gem(或Rails插件)调用任何I18n方法,则会收到警告。
在这种情况下,您需要跳过Rails堆栈,并通过调用立即将配置设置为I18n gem
I18n.config.enforce_available_locales = true
代替
config.i18n.enforce_available_locales = true
这个问题很容易证明。尝试生成一个新的空Rails应用程序,你会看到,设置config.i18n
在application.rb
工作正常。
如果您的应用程序中没有,则有一种简单的方法来调试罪魁祸首。在您的系统中找到i18n gem,打开i18n.rb
文件并编辑方法enforce_available_locales!
以包括语句puts caller.inspect
。
这将导致该方法在调用时打印堆栈跟踪。您可以通过检查stacktrace(在我的情况下为Authlogic)来确定哪个gem在调用它。
["/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.config.enforce_available_locales
没有I18n.config.i18n.enforce_available_locales
的,我编辑你的答案。感谢修复。
I18n.config.available_locales = [:your_locale, :en]
,例如必须进行设置,否则您将无法启动Rails服务器。
仅出于完整性考虑,请注意,您还可以通过在中将(或)设置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
这一过程才能产生效果
config.i18n.enforce_available_locales = true
在config / application.rb中,在Rails 4.0.2中为我消除了弃用警告,但前提是我将其放在其他config.i18n
行的上方。
似乎不是这样-这可能是i18n工作方式的先前行为-当您请求未实现/不可用的语言环境时,新行为(true)将引发错误。
请参阅添加了此警告的提交:https : //github.com/svenfuchs/i18n/commit/3b6e56e06fd70f6e4507996b017238505e66608c
Rails 4.0.1
应用程序中。