Rails I18n验证弃用警告


387

我刚刚更新到Rails 4.0.2,并且收到以下警告:

[不建议使用] I18n.enforce_available_locales将来将默认为true。如果您确实要跳过对区域设置的验证,则可以设置I18n.enforce_available_locales = false以避免出现此消息。

将其设置为false是否存在任何安全问题?


显然,这也发生在Rails 4.0.1应用程序中。
lucke84

2
我在Rails 3.2.16上也是如此。根据西蒙娜·卡莱蒂(Simone Carletti)的以下回答,它位于Rails 4(> = 4.0.2)和Rails 3.2(> = 3.2.14)中。
Mark Berry 2014年

Answers:


615

重要提示:请确保您的应用未使用I18n 0.6.8,它存在一个错误,导致无法正确设置配置


简短答案

为了使警告静音,请编辑application.rb文件,并将以下行包含在Rails::Application正文中

config.i18n.enforce_available_locales = true

可能的值为:

  • :如果你
    • 想要跳过语言环境验证
    • 不在乎语言环境
  • true:如果你
    • 如果传递了无效的语言环境,则希望应用程序引发错误(或)
    • 想要默认为新的Rails行为(或)
    • 关心语言环境验证

注意:

  • 旧的默认行为对应于false,而不是true
  • 如果要设置config.i18n.default_locale配置或其他i18n设置,请确保在设置后进行config.i18n.enforce_available_locales设置。
  • 如果您使用包含I18n功能的第三方gem,则通过Application config对象设置变量可能不会起作用。在这种情况下,请将其直接设置为I18nusing 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

警告

  1. 如果要设置的config.i18n.default_locale配置或使用任何前面提到的方法(default_locale=locale=translate等),确保设置后做config.i18n.enforce_available_locales设置。否则,弃用警告将继续弹出。(感谢FábioBatista)。

  2. 如果您使用包含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.i18napplication.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)>'",

20
如果要设置config.i18n.default_locale配置,请确保设置新config.i18n.enforce_available_locales设置进行配置。否则,弃用警告将持续弹出。
法比奥·巴蒂斯塔

3
对我来说,只有在设置时才有效I18n.enforce_available_locales = trueconfig.i18n.enforce_available_locales = true不起作用。
Pioz 2013年

1
@Pioz可能是由您的应用程序依赖的宝石引起的。我更新了帖子以解释原因。
Simone Carletti

@SimoneCarletti直接调用应该是I18n.config.enforce_available_locales没有I18n.config.i18n.enforce_available_locales的,我编辑你的答案。感谢修复。
法比奥

1
应该提到的是I18n.config.available_locales = [:your_locale, :en],例如必须进行设置,否则您将无法启动Rails服务器。
塔默·斯拉什

45

仅出于完整性考虑,请注意,您还可以通过在中将(或)设置I18n.enforce_available_locales为来消除警告:truefalseconfig/application.rb

require File.expand_path('../boot', __FILE__)
.
.
.
module SampleApp
  class Application < Rails::Application
    .
    .
    .
    I18n.enforce_available_locales = true
    .
    .
    .
  end
end

9
这样做会更整洁config.i18n.enforce_available_locales = true吗?
Mischa 2013年

2
我在3.2.16上,我设置为I18n.enforce_available_locales = false,但是我仍然
收到

3
@Mischa不适用于我,但是上面的答案可以。
Mike Atlas

1
@Mischa可悲的不是,必须经过I18n.config这一过程才能产生效果
dolzenko

3
config.i18n.enforce_available_locales = true在config / application.rb中,在Rails 4.0.2中为我消除了弃用警告,但前提是我将其放在其他config.i18n行的上方。
balexand 2013年

15

I18n.config.enforce_available_locales = true 在Rails 3.2.16中为我工作(我将其放在config / application.rb中)



0

如果要关心语言环境,请写入appilcation.rb文件。

config.i18n.enforce_available_locales = true

如果进行区域设置验证,则可以编写false,而不管它。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.