da6cf3e1d17919d12aa23a38849469e9dbb1374a
[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   # same as render page, but returns the string
69   #
70   def page_body(page)
71     begin
72       render_to_string :template => page.template_path
73     rescue ActionView::MissingTemplate => exc
74       begin
75         render_to_string :template => page.template_path(DEFAULT_LOCALE)
76       rescue
77         raise exc
78       end
79     end
80   end
81   helper_method :page_body
82
83   ##
84   ## INITIALIZATION
85   ##
86
87   #
88   # run every time in development mode, run once in production mode
89   #
90   def initialize_pages
91     run_once(:initialize_pages, :unless => Rails.env.development?) do
92       StaticPage.load(PAGE_DIRECTORY)
93       Menu.load(PAGE_DIRECTORY + '/menu.txt')
94     end
95   end
96
97   def run_once(name, options={})
98     key_name = "run_once_#{name}"
99     if !Thread.current[key_name] || options[:unless]
100       yield
101     end
102     Thread.current[key_name] = true
103   end
104
105 end