Rails I18n検証非推奨警告


387

rails 4.0.2にアップデートしたところ、次の警告が表示されました。

[非推奨] I18n.enforce_available_localesは将来的にデフォルトでtrueになります。本当にロケールの検証をスキップしたい場合は、I18n.enforce_available_locales = falseを設定してこのメ​​ッセージを回避できます。

falseに設定することでセキュリティ上の問題はありますか?


どうやらこれはRails 4.0.1アプリケーションにも起こります。
lucke84 14年

2
Rails 3.2.16でも同じです。以下のSimone Carlettiの回答によると、それはRails 4(> = 4.0.2)およびRails 3.2(> = 3.2.14)にあります。
Mark Berry

回答:


615

重要:アプリがI18n 0.6.8を使用していないことを確認してください。設定が正しく設定されないバグがあります


簡潔な答え

警告を止めるには、application.rbファイルを編集し、Rails::Application本文に次の行を含めます。

config.i18n.enforce_available_locales = true

可能な値は次のとおりです。

  • false:あなたが
    • ロケール検証をスキップしたい
    • ロケールを気にしない
  • true:あなたが
    • 無効なロケールが渡された場合にアプリケーションにエラーを発生させたい(または)
    • デフォルトで新しいRailsビヘイビアーにしたい(または)
    • ロケールの検証に注意

注意:

  • 以前のデフォルトの動作はでfalseはなくに対応していtrueます。
  • あなたが設定する場合config.i18n.default_localeの構成や他の国際化の設定を、設定した後にそれを行うことを確認してconfig.i18n.enforce_available_locales設定を。
  • I18n機能を含むサードパーティの宝石を使用する場合、Application configオブジェクトを介して変数を設定しても効果がない場合があります。この場合は、直接をI18n使用するように設定し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_localestrueで渡されたロケールが使用できない場合、我々は国際化:: InvalidLocale例外を発生させます。

デフォルトではnil、非推奨エラーを表示するように設定されています。

に設定した場合、false使用可能なロケールの強制はすべてスキップされます(以前の動作)。

これは次のメソッドで実装されています:

  • I18n.config.default_locale =
  • I18n.config.locale =
  • I18n.translate
  • I18n.localize
  • I18n.transliterate

この変更の前に、サポートされていないロケールを渡した場合、Railsは、ロケールが有効な場合(つまり、対応するロケールファイルが/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á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アプリを生成しようとすると、その設定config.i18napplication.rb正常に機能することがわかります。

    アプリに表示されない場合、原因を簡単にデバッグする方法があります。システムでi18n gemを見つけ、i18n.rbファイルを開き、メソッドenforce_available_locales!を編集してステートメントを含めますputs caller.inspect

    これにより、メソッドが呼び出されるたびにスタックトレースが出力されます。スタックトレース(私の場合は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)>'",

20
config.i18n.default_locale構成を設定する場合は、新しい設定を行った後で必ず構成してくださいconfig.i18n.enforce_available_locales。それ以外の場合、非推奨の警告が表示され続けます。
ファビオ・バティスタ

3
私にとっては、を設定しI18n.enforce_available_locales = trueた場合にのみ機能します。config.i18n.enforce_available_locales = true動作しません。
Pioz

1
@Piozこれは、アプリケーションが依存する宝石によって引き起こされる可能性があります。理由を説明するために投稿を更新しました。
Simone Carletti、2013

@SimoneCarlettiダイレクトコールはにすべきではありI18n.config.enforce_available_localesませんI18n.config.i18n.enforce_available_locales。あなたの回答を編集しました。修正してくれてありがとう。
Fabio、

1
I18n.config.available_locales = [:your_locale, :en]たとえば、設定する必要があることに注意してください。そうしないと、Railsサーバーを起動できなくなります。
Tamer Shlash、2013

45

完全を期すために、次のI18n.enforce_available_localesようにtrue(またはfalse)を設定することで警告を取り除くこともできますconfig/application.rb

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

9
それはすっきりしませconfig.i18n.enforce_available_locales = trueんか?
Mischa

2
私は3.2.16を使用していますが、I18n.enforce_available_locales = falseに設定しましたが、まだメッセージがあります...
2013

3
@Mischaは私にはうまくいきませんでしたが、上の答えはうまくいきます。
Mike Atlas、

1
@Mischaは残念なことにI18n.config、これを有効にするために通過する必要がありました
dolzenko

3
config.i18n.enforce_available_locales = trueconfig / application.rbで、Rails 4.0.2で非推奨の警告が取り除かれましたが、他のconfig.i18n行の上に置いた場合のみです。
Balexand 2013

15

I18n.config.enforce_available_locales = true Rails 3.2.16で私のために働いた(私はそれをconfig / application.rbに入れました)



0

ロケールを気にする場合は、appilcation.rbファイルに書き込みます。

config.i18n.enforce_available_locales = true

ロケール検証の場合はfalseと記述して、それを気にする必要はありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.