当前位置: 首页 > 知识库问答 >
问题:

Rails I18n验证弃用警告

鄢松
2023-03-14

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

[已弃用]我18n.enforce_available_locales将来会默认为true。如果您真的想跳过区域设置的验证,您可以设置I18n.enforce_available_locales=false以避免此消息。

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

共有3个答案

颜黎昕
2023-03-14

<代码>I18n。配置。enforce\u available\u locales=true在Rails 3.2.16中对我有效(我把它放在config/application.rb中)

罗光华
2023-03-14

为了完整起见,请注意,您还可以通过在config/application.rb中将I18n.enforce_available_locales设置为true(或false)来消除警告:

require File.expand_path('../boot', __FILE__)
.
.
.
module SampleApp
  class Application < Rails::Application
    .
    .
    .
    I18n.enforce_available_locales = true
    .
    .
    .
  end
end
湛鸿雪
2023-03-14

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

要使警告静音,请编辑应用程序。rb文件,并在Rails::应用程序体中包含以下行

config.i18n.enforce_available_locales = true

可能的值包括:

  • 错误:如果您
    • 要跳过区域设置验证
    • 不关心地区
    • 如果传递了无效的区域设置,希望应用程序引发错误(或)

    注:

    • 旧的默认行为对应于false,而不是true
    • 如果您正在设置config.i18n.default_locale配置或其他国际化设置,请确保在设置config.i18n.enforce_available_locales设置后执行此操作。
    • 如果您使用包含I18n功能的第三方宝石,通过Applicationconfig对象设置变量可能不会产生效果。在这种情况下,使用I18n.config.enforce_available_locales将其直接设置为I18n

      注意事项

    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中都显示了弃用警告(

    强制使用可用的区域设置

    当<代码>I18n时。配置。enforce\u available\u locales为true,如果传递的区域设置不可用,我们将引发I18n::InvalidLocale异常。

    默认值设置为零,这将显示弃用错误。

    如果设置为false,我们将完全跳过强制执行可用语言环境(旧行为)。

    这已通过以下方法实现:

    • 我18n.config.default_locale=
    • 我18n.config.locale=
    • 我18n.translate
    • 我18n.localize
    • 我18n.transliterate

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

    新版本的I18n gem迫使开发人员对语言环境管理更有意识。

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

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

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

    config.i18n.enforce_available_locales = false
    

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

    config.i18n.enforce_available_locales = true
    

    >

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

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

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

    I18n.config.enforce_available_locales = true
    

    而不是

    config.i18n.enforce_available_locales = true
    

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

    如果在您的应用程序中没有,有一种简单的方法可以调试罪魁祸首。在您的系统中找到国际化gem,打开i18n.rb文件并编辑方法enforce_available_locales!以包含语句放置caller.inspect

    这将导致该方法在调用时打印stacktrace。您可以通过检查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)>'",
    

 类似资料:
  • 您在配置/应用程序中放置了类似的内容。rb 此时仍会出现警告:

  • 问题内容: 我刚刚更新到Django v1.8,并在更新项目之前测试了本地设置,并且发出了弃用警告,这是我从未见过的,对我也没有任何意义。我可能只是忽略了某些内容或误解了文档。 现在,这对我提出了3个问题。 根据文档,Options.app_label除非模型不在应用程序模块之外,否则不是必需的,在我看来,不是这样。其次,无论如何,此行为在1.7中已被弃用,那么为什么它甚至成为问题? 这些应用程序

  • 问题内容: 我有一个React组件,我想在单击时切换一个CSS类。 所以我有这个: 这个问题是ESLint不断告诉我“ this.refs”已贬值。 我该怎么办?我如何解决它而不使用折旧的代码? 问题答案: 您要引用的Lint规则称为 no-string-refs, 并通过以下方式警告您: 之所以收到此警告,是因为已实现了不赞成使用的使用方式(通过使用字符串)。根据您的React版本,您可以执行以

  • 我正在使用scikit-learn 0.14的GridSearchCV,但总是得到以下警告: /Library/Frameworks/epd 64 . framework/Versions/7.2/lib/python 2.7/site-packages/sk learn/grid _ search . py:706:deprecation warning:忽略GridSearchCV的附加参数!

  • 我的项目正在迁移到视图绑定,但与此同时,在查看构建日志时,此警告会分散注意力 警告:“kotlin android extensions”Gradle插件已弃用。请使用本迁移指南(https://goo.gle/kotlin-android-extensions-deprecation)开始使用视图绑定的步骤(https://developer.android.com/topic/librarie

  • 我看到了许多在API上使用弃用注释的示例,以便将它们标记为“需要尽快更换”。 然而,在几乎所有这些情况下,代码开发人员不仅继续使用弃用的API,而且还抑制了弃用警告。 API开发人员的最佳意图似乎最终会创建更多与已实现的业务逻辑无关的代码——如果API已弃用但不断使用并抑制相关警告,则看起来充其量是代码的退化,并且在最坏的情况下替换弃用的库时是潜在的应用程序断点IMHO。 这个问题有没有切实可行的