ruby-on-rails i18n使用 - Rails I18n验证弃用警告




rails开发 api教程 (5)

似乎并不是这样 - 这将是i18n工作方式的先前行为 - 当您询问未实施/可用的区域设置时,新行为(true)会引发错误。

看到添加此警告的提交: https//github.com/svenfuchs/i18n/commit/3b6e56e06fd70f6e4507996b017238505e66608c

我只是更新到轨道4.0.2,我得到这个警告:

[已弃用] I18n.enforce_available_locales将在未来默认为true。 如果你真的想跳过你的语言环境验证,你可以设置I18n.enforce_available_locales = false来避免这个消息。

将它设置为false有没有任何安全问题?


为了完整性,请注意,您还可以通过在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

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


重要提示 :请确保您的应用程序未使用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功能的第三方宝石,则可能无法通过应用程序config对象设置变量。 在这种情况下,请使用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(> = 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.transliterate

在这个改变之前,如果你传递了一个不支持的语言环境,如果语言环境是有效的(即/如果/config/locales文件夹中有相应的语言/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之前使用调用任何I18n方法的gem(或Rails插件),那么您将得到警告。

    在这种情况下,您需要跳过Rails堆栈并通过调用立即将配置设置为I18n gem

    I18n.config.enforce_available_locales = true
    

    代替

    config.i18n.enforce_available_locales = true
    

    这个问题很容易证明。 尝试生成一个新的空的Rails应用程序,你会发现在application.rb中设置config.i18n可以正常工作。

    如果在你的应用程序中没有,那么有一个简单的方法来调试罪魁祸首。 在您的系统中找到i18n gem,打开i18n.rb文件并编辑方法enforce_available_locales! 包括声明puts caller.inspect

    这将导致该方法在调用时打印堆栈跟踪。 您将能够通过检查堆栈跟踪来确定哪个gem正在调用它(在我的情况下,它是Authlogic)。

    ["/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:in `validates_format_of_email_field_options'",
     "/Users/weppos/.rvm/gems/[email protected]/gems/authlogic-3.1.0/lib/authlogic/acts_as_authentic/email.rb:102:in `block in included'",
     "/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:in `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)>'",
    

你也可以在你的迁移中尝试change_column_default (在Rails 3.2.8中测试):

class SetDefault < ActiveRecord::Migration
  def up
    # Set default value
    change_column_default :people, :last_name, "Smith"
  end

  def down
    # Remove default
    change_column_default :people, :last_name, nil
  end
end

change_column_default Rails API文档





ruby-on-rails ruby ruby-on-rails-4 deprecated rails-i18n