From bb1b0bca222f110d3725fec91995df53da16739e Mon Sep 17 00:00:00 2001 From: =?utf-8?q?Jos=C3=A9=20Valim?= Date: Sun, 1 Feb 2009 09:43:39 +0100 Subject: [PATCH] Added localized rescue (404.da.html). --- actionpack/lib/action_controller/rescue.rb | 16 +++++++++++----- actionpack/test/controller/rescue_test.rb | 25 +++++++++++++++++++++++++ actionpack/test/fixtures/public/500.da.html | 1 + 3 files changed, 37 insertions(+), 5 deletions(-) create mode 100644 actionpack/test/fixtures/public/500.da.html diff --git a/actionpack/lib/action_controller/rescue.rb b/actionpack/lib/action_controller/rescue.rb index 4b7d1e3..ec61715 100644 --- a/actionpack/lib/action_controller/rescue.rb +++ b/actionpack/lib/action_controller/rescue.rb @@ -99,13 +99,19 @@ module ActionController #:nodoc: # Attempts to render a static error page based on the # status_code thrown, or just return headers if no such file - # exists. For example, if a 500 error is being handled Rails will first - # attempt to render the file at public/500.html. If the file - # doesn't exist, the body of the response will be left empty. + # exists. At first, it will try to render a localized static page. + # For example, if a 500 error is being handled Rails and locale is :da, + # it will first attempt to render the file at public/500.da.html + # then attempt to render public/500.html. If none of them exist, + # the body of the response will be left empty. def render_optional_error_file(status_code) status = interpret_status(status_code) - path = "#{Rails.public_path}/#{status.to_s[0,3]}.html" - if File.exist?(path) + locale_path = "#{Rails.public_path}/#{status[0,3]}.#{I18n.locale}.html" if I18n.locale + path = "#{Rails.public_path}/#{status[0,3]}.html" + + if locale_path && File.exist?(locale_path) + render :file => locale_path, :status => status, :content_type => Mime::HTML + elsif File.exist?(path) render :file => path, :status => status, :content_type => Mime::HTML else head status diff --git a/actionpack/test/controller/rescue_test.rb b/actionpack/test/controller/rescue_test.rb index 9f6b45f..85c2a4c 100644 --- a/actionpack/test/controller/rescue_test.rb +++ b/actionpack/test/controller/rescue_test.rb @@ -199,6 +199,31 @@ class RescueControllerTest < ActionController::TestCase end end + def test_rescue_action_in_public_with_localized_error_file + # Reload and register danish language for testing + I18n.reload! + I18n.backend.store_translations 'da', {} + + # Ensure original are still the same since we are reindexing view paths + assert_equal ORIGINAL_LOCALES, I18n.available_locales.map(&:to_s).sort + + # Change locale + old_locale = I18n.locale + I18n.locale = :da + + with_rails_root FIXTURE_PUBLIC do + with_all_requests_local false do + get :raises + end + end + + assert_response :internal_server_error + body = File.read("#{FIXTURE_PUBLIC}/public/500.da.html") + assert_equal body, @response.body + ensure + I18n.locale = old_locale + end + def test_rescue_action_in_public_with_error_file with_rails_root FIXTURE_PUBLIC do with_all_requests_local false do diff --git a/actionpack/test/fixtures/public/500.da.html b/actionpack/test/fixtures/public/500.da.html new file mode 100644 index 0000000..a497c13 --- /dev/null +++ b/actionpack/test/fixtures/public/500.da.html @@ -0,0 +1 @@ +500 localized error fixture -- 1.5.4.3