From dfd081d09915ed95333683c456aca8c5c7843cc6 Mon Sep 17 00:00:00 2001 From: Lawrence Pit Date: Thu, 10 Jun 2010 22:07:23 +1000 Subject: [PATCH] config.i18n.reload_on_each_request --- activesupport/lib/active_support/railtie.rb | 11 ++++-- railties/guides/source/configuring.textile | 2 + railties/guides/source/i18n.textile | 2 + railties/guides/source/initialization.textile | 2 + .../config/environments/development.rb.tt | 5 +++ railties/test/isolation/abstract_unit.rb | 1 + railties/test/railties/i18n_railtie_test.rb | 34 ++++++++++++++++++++ 7 files changed, 53 insertions(+), 4 deletions(-) diff --git a/activesupport/lib/active_support/railtie.rb b/activesupport/lib/active_support/railtie.rb index 59f9ab1..54497b0 100644 --- a/activesupport/lib/active_support/railtie.rb +++ b/activesupport/lib/active_support/railtie.rb @@ -33,14 +33,16 @@ module I18n config.i18n = ActiveSupport::OrderedOptions.new config.i18n.railties_load_path = [] config.i18n.load_path = [] + config.i18n.reload_on_each_request = false config.i18n.fallbacks = ActiveSupport::OrderedOptions.new - initializer "i18n.initialize" do + initializer "i18n.initialize" do |app| ActiveSupport.on_load(:i18n) do I18n.reload! - - ActionDispatch::Callbacks.to_prepare do - I18n.reload! + if app.config.i18n.reload_on_each_request + ActionDispatch::Callbacks.to_prepare do + I18n.reload! + end end end end @@ -51,6 +53,7 @@ module I18n fallbacks = app.config.i18n.delete(:fallbacks) app.config.i18n.each do |setting, value| + next if setting == :reload_on_each_request case setting when :railties_load_path app.config.i18n.load_path.unshift(*value) diff --git a/railties/guides/source/configuring.textile b/railties/guides/source/configuring.textile index ab72b48..f08e08e 100644 --- a/railties/guides/source/configuring.textile +++ b/railties/guides/source/configuring.textile @@ -89,6 +89,8 @@ h4. Configuring i18n * +config.i18n.load_path+ sets the path Rails uses to look for locale files. Defaults to +config/locales/*.{yml,rb}+ +* +config.i18n.reload_on_each_request+ controls whether or not i18n resources should be reloaded on each request. Defaults to +false+ + h4. Configuring Active Record config.active_record includes a variety of configuration options: diff --git a/railties/guides/source/i18n.textile b/railties/guides/source/i18n.textile index b09bb47..10aeafc 100644 --- a/railties/guides/source/i18n.textile +++ b/railties/guides/source/i18n.textile @@ -101,8 +101,10 @@ The default +application.rb+ files has instructions on how to add locales from a # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded. +# By default the i18n resources are not reloaded on each request. # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s] # config.i18n.default_locale = :de +# config.i18n.reload_on_each_request = true h4. Optional: Custom I18n Configuration Setup diff --git a/railties/guides/source/initialization.textile b/railties/guides/source/initialization.textile index 58ae115..7bfac76 100644 --- a/railties/guides/source/initialization.textile +++ b/railties/guides/source/initialization.textile @@ -2120,8 +2120,10 @@ As you can see, there's a require in here for _config/application.rb_, and this # config.time_zone = 'Central Time (US & Canada)' # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded. + # By default the i18n resources are not reloaded on each request. # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}')] # config.i18n.default_locale = :de + # config.i18n.reload_on_each_request = true # Configure generators values. Many other options are available, be sure to check the documentation. # config.generators do |g| diff --git a/railties/lib/rails/generators/rails/app/templates/config/environments/development.rb.tt b/railties/lib/rails/generators/rails/app/templates/config/environments/development.rb.tt index f0e917d..d5e141b 100644 --- a/railties/lib/rails/generators/rails/app/templates/config/environments/development.rb.tt +++ b/railties/lib/rails/generators/rails/app/templates/config/environments/development.rb.tt @@ -16,4 +16,9 @@ # Don't care if the mailer can't send config.action_mailer.raise_delivery_errors = false + + # Reloads all i18n resources on each request. This may slow down your + # response time, which is fine for development since you don't have to + # restart the webserver when you make changes to your translation resources. + config.i18n.reload_on_each_request = true end diff --git a/railties/test/isolation/abstract_unit.rb b/railties/test/isolation/abstract_unit.rb index b46ac0e..0945bea 100644 --- a/railties/test/isolation/abstract_unit.rb +++ b/railties/test/isolation/abstract_unit.rb @@ -10,6 +10,7 @@ require 'fileutils' # TODO: Remove rubygems when possible require 'rubygems' +require 'mocha' require 'test/unit' # TODO: Remove setting this magic constant diff --git a/railties/test/railties/i18n_railtie_test.rb b/railties/test/railties/i18n_railtie_test.rb index 2b1950b..f058234 100644 --- a/railties/test/railties/i18n_railtie_test.rb +++ b/railties/test/railties/i18n_railtie_test.rb @@ -15,6 +15,10 @@ module RailtiesTest require "#{app_path}/config/environment" end + def app + @app ||= Rails.application + end + def assert_fallbacks(fallbacks) fallbacks.each do |locale, expected| actual = I18n.fallbacks[locale] @@ -35,6 +39,36 @@ module RailtiesTest assert I18n.load_path.include?('new/path/to/locales') end + test "config.i18.reload_on_each_request = false (=default) calls I18n.reload! only on initialization" do + make_basic_app + + class ::OmgController < ActionController::Base + def index + render :text => "foo" + end + end + + I18n.expects(:reload!).never + get "/" + get "/" + end + + test "config.i18.reload_on_each_request = true calls I18n.reload! on each request" do + make_basic_app do |app| + app.config.i18n.reload_on_each_request = true + end + + class ::OmgController < ActionController::Base + def index + render :text => "foo" + end + end + + I18n.expects(:reload!).twice + get "/" + get "/" + end + test "not using config.i18n.fallbacks does not initialize I18n.fallbacks" do I18n.backend = Class.new { include I18n::Backend::Base }.new load_app -- 1.7.0