Rails I18n验证弃用警告

我刚刚更新到rails 4.0.2,收到以下警告:

[已弃用]I18n.enforce\u available\u区域设置将在将来默认为true。如果确实要跳过区域设置的验证,可以将I18n.enforce\u available\u locales=false设置为避免出现此消息

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

重要信息:确保您的应用程序未使用I18n 0.6.8,因为它有一个错误,无法正确设置配置


简短回答

为了消除警告,请编辑application.rb文件,并在Rails::application正文中包含以下行

config.i18n.enforce\u available\u locales=true

可能的值为:

  • 错误:如果
    • 要跳过区域设置验证吗
    • 不关心地区
  • 正确:如果
    • 如果传递了无效的区域设置,希望应用程序引发错误(或)
    • 希望默认为新Rails行为(或)
    • 关心区域设置验证吗

注:

  • 旧的默认行为对应于false,而不是true
  • 如果您正在设置config.i18n.default\u locale配置或其他i18n设置,请确保在设置config.i18n.enforce\u available\u locales设置后执行此操作
  • 如果您使用包含I18n功能的第三方gems,则通过应用程序config对象设置变量可能没有效果。在这种情况下,使用I18n.config.enforce\u available\u locales将其直接设置为I18n

    警告

范例

需要文件。展开路径('../boot',文件)
# ...
模块You应用程序
班级申请<Rails::应用程序
# ...
config.i18n.exforce\u available\u locales=true
#或者,如果您的一个gem竞争预加载,请使用
I18n.config.exforce\u available\u locales=true
# ...
终止
终止

长话短说

弃用警告现在显示在Rails 4(>=4.0.2)和Rails 3.2(>=3.2.14)中。原因在本文件中解释

强制使用可用的区域设置

I18n.config.exforce\u available\u locales为true时,我们将提出
I18n::如果传递的区域设置不可用,则出现InvalidLocale异常

默认设置为nil,将显示弃用错误

如果设置为false,我们将完全跳过强制使用可用的区域设置(旧行为)

这已通过以下方法实现:

  • I18n.config.default\u语言环境=
  • I18n.config.locale=
  • I18n.翻译
  • I18n.本地化
  • 音译

在此更改之前,如果您传递了一个不受支持的区域设置,Rails将在该区域设置有效时(即,如果/config/locales文件夹中有相应的区域设置文件)自动切换到该区域设置,否则该区域设置将默认为config.i18n.default\u locale配置(默认为:en)

i18ngem的新版本迫使开发人员更加注意区域设置管理

将来,行为将发生变化,如果区域设置无效,Rails应用程序将引发错误

在准备这类更改时(这可能会破坏到目前为止仍依赖于静默默认值的几个应用程序),警告将迫使您明确声明在当前过渡期内要执行的验证

要恢复以前的行为,只需将以下配置设置为false

config.i18n.exforce\u available\u locales=false

否则,将其设置为true以匹配新的Rails默认值,或者如果您希望更严格地进行域验证,并避免在区域设置无效的情况下切换到默认值

config.i18n.enforce\u available\u locales=true

警告

  1. 如果您正在设置config.i18n.default\u locale配置或使用前面提到的任何方法(default\u locale=locale=translate等),请确保在设置config.i18n.exforce\u available\u locales设置后执行此操作。否则,弃用警告将继续弹出。(谢谢法比奥·巴蒂斯塔)

  2. 如果使用包含I18n功能的第三方gem,则通过设置变量可能无效。事实上,问题与前一点中描述的相同,只是调试有点困难

    这是一个优先事项。在Rails应用程序中设置配置时,该值不会立即分配给I18n gem。Rails将每个配置存储在一个内部对象中,加载依赖项(Railties和第三方gem),然后将配置传递给目标类。如果您使用gem(或Rails插件)在将配置分配给I18n之前调用任何I18n方法,那么您将得到警告

    在这种情况下,您需要跳过Rails堆栈,并通过调用

    I18n.config.exforce\u available\u locales=true
    

    而不是

    config.i18n.enforce\u available\u locales=true
    

    这个问题很容易证明。尝试生成一个新的空Rails应用程序,您将看到application.rb中的设置config.i18n

    如果在你的应用程序中没有,有一个简单的方法来调试罪犯。在系统中找到i18n gem,打开i18n.rb文件并编辑方法exforce\u available\u locales以包含语句放置调用方。检查

    这将导致该方法在调用时打印stacktrace。您可以通过检查stacktrace(在我的例子中是Authlogic)来确定哪个gem正在调用它

    [“/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:在`验证`格式`电子邮件`字段`选项'中,
    “/Users/weppos/.rvm/gems/[email protected]/gems/authlogic-3.1.0/lib/authlogic/acts_as_authentic/email.rb:102:在“包含的块”中,
    “/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:在'each'中,
    “/Users/weppos/.rvm/gems/[email protected]/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)>”,
    

发表评论