小编典典

Rails I18n 验证弃用警告

all

我刚刚更新到 rails 4.0.2,我收到了这个警告:

[已弃用] I18n.enforce_available_locales 将来将默认为 true。如果您真的想跳过对您的语言环境的验证,您可以设置
I18n.enforce_available_locales = false 以避免出现此消息。

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


阅读 129

收藏
2022-03-24

共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 功能的第三方 gem,通过 Applicationconfig对象设置变量可能没有效果。在这种情况下,直接将其设置为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为真时,如果传递的语言环境不可用,我们将引发
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谩bio 巴蒂斯塔)。

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

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

在这种情况下,您需要跳过 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

这将导致该方法在调用时打印堆栈跟踪。您将能够通过检查堆栈跟踪来确定哪个 gem 正在调用它(在我的例子中是 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)>'",
2022-03-24