ruby-on-rails - Rails I18n验证否决警告

  显示原文与译文双语对照的内容

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

[deprecated] I18n.enforce_available_locales 在未来将默认为真。 如果你真的想跳过对你的区域设置的验证,你可以设置 I18n.enforce_available_locales = false以避免这里消息。

将它的设置为假有任何安全问题?

时间:

重要: 确保你的应用程序没有使用 i18n 0.6.8,它有一个 Bug,它可以防止配置被正确设置。


简短回答

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


config.i18n.enforce_available_locales = true

可能的值是:

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

注:

  • 旧的默认行为对应于 false,而不是 true
  • 如果要设置 config.i18n.default_locale 配置或者其他 i18n 设置,请在设置 config.i18n.enforce_available_locales 设置。
  • 如果你的第三方 Gems 包含 i18n 特性,则通过应用程序 config 对象设置变量可能没有效果。 在本例中,直接将它设置为 I18nI18n.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.transliterate

在这个改变之前,如果你不支持的语言环境,Rails 传递,那么他们会向它的switch 如果区域设置为有效( 例如 。 如果 /config/locales 文件夹中有一个相应的区域设置文件,则区域设置将默认为 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 Batista ) 。

  2. 如果你使用第三方 Gems,它包括 i18n 功能,设置变量的通过可能没有效果。 事实上,这个问题与前面提到的相同,只是稍微难以调试。

    这里问题是优先级问题。 在 Rails 应用中设置配置时,值不会立即分配给 i18n gem 。 Rails 将每个配置存储在一个内部对象中,加载依赖项( Railties和第三方 Gems ),然后它将配置传递给目标类。 如果你使用的宝石( 或者 Rails 插件) 将调用之前设定方法是分配给 i18n i18n的任何方法,那么你将得到警告。

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

    
    I18n.config.enforce_available_locales = true
    
    

    代替

    
    config.i18n.enforce_available_locales = true
    
    

    这个问题很容易证明。 在 application.rb 作品fine,试图生成一个新的空 Rails 应用程序,你将会看到该设置

    如果在你的应用中没有,有一个简单的方法来调试罪魁祸首。 在你的系统中找到 i18n gem,打开 i18n.rb 文件并编辑 enforce_available_locales 以包含语句 puts 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)>'",
    
    

在只是出于完整性的考虑,请注意,你还可以通过设置 I18n.enforce_available_locales 摆脱了警告来 true


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

I18n.config.enforce_available_locales = true 在 Rails 3.2.16中为我工作( 我把它放在配置/应用程序中)

于未实现/available,并没有看起来那样- 那最好找有相关度近的区域设置相关的先前行为方式 i18n 作品- 新行为( 真) 将引发错误当你 ask.

请查看添加这里警告的提交: https://github.com/svenfuchs/i18n/commit/3b6e56e06fd70f6e4507996b017238505e66608c

...