public
Description: Radiant Extension for multiple language support
Clone URL: git://github.com/DefV/site_language.git
Search Repo:
site_language / site_language_extension.rb
100644 115 lines (97 sloc) 3.339 kb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
# Uncomment this if you reference any of your controllers in activate
require_dependency 'application'
 
class SiteLanguageExtension < Radiant::Extension
  version "0.2"
  description "Habla Nederlands, sir? Si oder non?"
  url "http://openminds.be/"
  
  define_routes do |map|
    map.connect 'admin/site_language/:action', :controller => 'admin/site_languages'
    begin
      SiteLanguage.codes.each do |code|
        langname = Locale.new(code).language.to_s.downcase
        map.connect "#{langname}/*url", :controller => 'site', :action => 'show_page', :language => code
      end
    rescue
      # raise SiteLanguageError, "Migrations not ran yet.."
    end
  end
 
  def activate
    admin.tabs.add "Site Language", "/admin/site_language", :after => "Layouts", :visibility => [:admin, :developer]
    # We need globalize
    unless ActiveRecord::Base.respond_to? :translates
      raise SiteLanguageError
    end
    enhance_classes
    Page.send :include, SiteLanguageTags
  end
  
  def deactivate
    admin.tabs.remove "Site Language"
  end
  
  def enhance_classes
    # Mixin'in the Mojo
    # It seems impossible to add a before_filter to Admin::AbstractModelController from here :/
    Admin::PageController.class_eval do
      before_filter :set_locale
      def set_locale
        Locale.set params[:language] || SiteLanguage.default
      end
    end
    Admin::SnippetController.class_eval do
      before_filter :set_locale
      def set_locale
        Locale.set params[:language] || SiteLanguage.default
      end
    end
 
    # pass language again when save_and_continue_editing is used
    Admin::AbstractModelController.class_eval do
      def continue_url(options)
        options[:redirect_to] || (params[:continue] ? model_edit_url(:id => model.id, :language => params[:language]) : model_index_url)
      end
    end
    
    SiteController.class_eval do
      before_filter :set_language
      
      def set_language
        redirect_to :language => SiteLanguage.default, :url => params[:url] unless Locale.set params[:language]
      end
      
      def show_page
        response.headers.delete('Cache-Control')
        url = params[:url].to_s
        lang = params[:language].to_s
        if (request.get? || request.head?) and live? and (@cache.response_cached?(lang + '-' + url))
          @cache.update_response(lang + '-' + url, response, request)
          @performed_render = true
        else
          show_uncached_page(url, lang)
        end
      end
      
      private
 
      def show_uncached_page(url, lang)
        @page = find_page(url)
        unless @page.nil?
          process_page(@page)
          @cache.cache_response(lang + '-' + url, response) if request.get? and live? and @page.cache?
          @performed_render = true
        else
          render :template => 'site/not_found', :status => 404
        end
      rescue Page::MissingRootPageError
        redirect_to welcome_url
      end
      
    end
 
    Object.class_eval do
      include Globalize
      Locale.set_base_language(SiteLanguage.default)
    end
 
    Page.class_eval do
      translates :title, :breadcrumb, :slug
    end
 
    PagePart.class_eval do
      translates :content
    end
    
    Snippet.class_eval do
      translates :content
    end
  end
end
 
 
class SiteLanguageError < StandardError
end