240df61f6f57c43f8658fcbc583eee3d8ba2a600
[leap_website.git] / app / controllers / application_controller.rb
1
2 class ApplicationController < ActionController::Base
3   protect_from_forgery
4   before_filter :set_locale, :initialize_pages
5
6   if Rails.env.production?
7     rescue_from Exception, :with => :render_500
8     rescue_from ActionController::RoutingError, :with => :render_404
9   end
10
11   protected
12
13   ##
14   ## LOCALIZATION
15   ##
16
17   #
18   # ensure that the locale is encoded as the url prefix and I18n.locale is set.
19   #
20   def set_locale
21     if params[:locale].nil?  || !AVAILABLE_LANGUAGES.include?(params[:locale])
22       locale = HttpAcceptLanguage::compatible_language_from(request.headers['HTTP_ACCEPT_LANGUAGE'], AVAILABLE_LANGUAGES) || DEFAULT_LOCALE
23       locale = locale.to_s.sub('-', '_').sub(/_\w\w/, '')
24       if request.path == '/'
25         url = '/' + locale
26       else
27         url = url_for(params.merge(:locale => locale))
28       end
29       redirect_to url
30     else
31       I18n.locale = params[:locale]
32       self.default_url_options[:locale] = params[:locale]
33     end
34   end
35
36   #def default_url_options
37   #  {:locale => locale }
38   #end
39
40   ##
41   ## RENDERING
42   ##
43
44   def render_500
45     render :template => 'errors/error', :status => 500
46   end
47
48   def render_404
49     render :template => 'errors/not_found', :status => 404
50   end
51
52   #
53   # renders the content of a static page
54   #
55   def render_page(page)
56     begin
57       render :template => page.template_path
58     rescue ActionView::MissingTemplate => exc
59       begin
60         render :template => page.template_path(DEFAULT_LOCALE)
61       rescue
62         raise exc
63       end
64     end
65   end
66
67   ##
68   ## INITIALIZATION
69   ##
70
71   #
72   # run every time in development mode, run once in production mode
73   #
74   def initialize_pages
75     run_once(:initialize_pages, :unless => Rails.env.development?) do
76       StaticPage.load(PAGE_DIRECTORY)
77       Menu.load(PAGE_DIRECTORY + '/menu.txt')
78     end
79   end
80
81   def run_once(name, options={})
82     key_name = "run_once_#{name}"
83     if !Thread.current[key_name] || options[:unless]
84       yield
85     end
86     Thread.current[key_name] = true
87   end
88
89 end