Rails 4.0.2にアップデートしたところ、次のような警告が表示されます。
[非推奨]将来のI18n.enforce_available_localesはデフォルトでtrueになる予定です。本当にロケールの検証をスキップしたい場合は、このメッセージを避けるためにI18n.enforce_available_locales = falseを設定することができます。
Falseに設定することでセキュリティ上の問題はありますか?
重要:アプリがI18n 0.6.8を使用していないことを確認してください 設定が正しく設定されないバグ 。
警告を黙らせるには、application.rbファイルを編集し、Rails::Application
本文内に次の行を含めます
config.i18n.enforce_available_locales = true
可能な値は次のとおりです。
注意:
false
ではなく、true
に対応しています。config.i18n.default_locale
構成または他のi18n設定を設定している場合は、config.i18n.enforce_available_locales
設定を設定した後に必ず実行してください。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)の両方に表示されるようになりました。理由は this commit で説明されています。
利用可能なロケールを強制する
I18n.config.enforce_available_locales
がtrueの場合、渡されたロケールが利用できない場合、I18n :: 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
そうでない場合は、新しいRailsデフォルトに一致するようにtrueに設定するか、ドメイン検証をより厳密にしたい場合、無効なロケールの場合にデフォルトに切り替えないようにします。
config.i18n.enforce_available_locales = true
config.i18n.default_locale
構成を設定している場合、または前述の方法(default_locale=
、locale=
、translate
など)のいずれかを使用している場合は、config.i18n.enforce_available_locales
設定。そうしないと、非推奨の警告がポップアップし続けます。 (ありがとう FábioBatista )。
I18n機能を含むサードパーティのGemを使用する場合、変数を設定しても効果がない場合があります。実際、この問題は前のポイントで説明したものと同じですが、デバッグが少し難しくなります。
この問題は優先事項です。 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
を含めます。
これにより、メソッドは呼び出されるたびにスタックトレースを出力します。スタックトレース(私の場合は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
でconfig/application.rb
を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に入れました)
そのようには思えません - それは国際化の動作方法の以前の振る舞いでしょう - 新しい振る舞い(true)は、実装されていない/利用できないロケールを要求するとエラーを発生させます。
この警告を追加したコミットを参照してください。 https://github.com/svenfuchs/i18n/commit/3b6e56e06fd70f6e4507996b017238505e66608c
ロケールを気にしたい場合はappilcation.rb
ファイルに書いてください。
config.i18n.enforce_available_locales = true
ロケールの検証であればfalseを書くことができ、それを気にする必要はありません。