Commit b44f870cb472eae5120ba958c030d7edfc81a4a3

Authored by AntonioTerceiro
1 parent 500d554f

ActionItem172: rewriting locale handling code, now we are going to trust a littl…

…e bit more in Ruby-GetText.


git-svn-id: https://svn.colivre.coop.br/svn/noosfero/trunk@1565 3f533792-8f58-4932-b0fe-aaf55b0a4547
app/controllers/application.rb
@@ -25,9 +25,9 @@ class ApplicationController < ActionController::Base @@ -25,9 +25,9 @@ class ApplicationController < ActionController::Base
25 include AuthenticatedSystem 25 include AuthenticatedSystem
26 include PermissionCheck 26 include PermissionCheck
27 27
  28 + before_init_gettext :maybe_save_locale
  29 + after_init_gettext :check_locale
28 init_gettext 'noosfero' 30 init_gettext 'noosfero'
29 - before_init_gettext :force_language  
30 - after_init_gettext :set_system_locale  
31 31
32 include NeedsProfile 32 include NeedsProfile
33 33
@@ -40,7 +40,7 @@ class ApplicationController < ActionController::Base @@ -40,7 +40,7 @@ class ApplicationController < ActionController::Base
40 verify :method => :post, :only => actions, :redirect_to => redirect 40 verify :method => :post, :only => actions, :redirect_to => redirect
41 end 41 end
42 42
43 - protected 43 + protected
44 44
45 # TODO: move this logic somewhere else (Domain class?) 45 # TODO: move this logic somewhere else (Domain class?)
46 def detect_stuff_by_domain 46 def detect_stuff_by_domain
@@ -63,43 +63,43 @@ class ApplicationController < ActionController::Base @@ -63,43 +63,43 @@ class ApplicationController < ActionController::Base
63 current_user.person if logged_in? 63 current_user.person if logged_in?
64 end 64 end
65 65
66 - def force_language  
67 - lang = params[:lang]  
68 - if lang.blank?  
69 - # no language forced, get language from cookie  
70 - lang = cookies[:lang] || Noosfero.default_locale  
71 - else  
72 - # save forced language in the cookie  
73 - cookies[:lang] = lang  
74 - end  
75 -  
76 - unless lang.blank?  
77 - set_locale lang 66 + def maybe_save_locale
  67 + # save locale if forced
  68 + if params[:lang]
  69 + cookies[:lang] = params[:lang]
78 end 70 end
  71 + # force GetText to load a matching locale
  72 + GetText.locale = nil
79 end 73 end
80 74
81 - def set_system_locale  
82 - # don't allow unsupported locales  
83 - available_locales = Noosfero.locales.keys  
84 - if !available_locales.include?(GetText.locale.to_s)  
85 - # guess similar locales by using same language  
86 - similar = available_locales.find { |loc| GetText.locale.to_s.split('_').first == loc.split('_').first } 75 + def check_locale
  76 + available_locales = Noosfero.available_locales
  77 +
  78 + # do not accept unsupported locales
  79 + if !available_locales.include?(locale.to_s)
  80 + old_locale = locale.to_s
  81 + # find a similar locale
  82 + similar = available_locales.find { |loc| locale.to_s.split('_').first == loc.split('_').first }
87 if similar 83 if similar
88 set_locale similar 84 set_locale similar
  85 + cookies[:lang] = similar
89 else 86 else
90 - set_locale(Noosfero.default_locale || 'en') 87 + # no similar locale, fallback to default
  88 + set_locale(Noosfero.default_locale)
  89 + cookies[:lang] = Noosfero.default_locale
91 end 90 end
  91 + RAILS_DEFAULT_LOGGER.info('Locale reverted from %s to %s' % [old_locale, locale])
92 end 92 end
93 93
94 - # actually set the system locale  
95 - lang = GetText.locale.to_s  
96 - system_locale =  
97 - if (lang == 'en') || lang.blank?  
98 - 'C'  
99 - else  
100 - ('%s.utf8' % lang)  
101 - end  
102 - Locale.setlocale(Locale::LC_ALL, system_locale) 94 + # now set the system locale
  95 + system_locale = '%s.utf8' % locale
  96 + begin
  97 + Locale.setlocale(Locale::LC_ALL, system_locale)
  98 + rescue Exception => e
  99 + # fallback to C
  100 + RAILS_DEFAULT_LOGGER.info("Locale #{system_locale} not available, falling back to the portable \"C\" locale (consider installing the #{system_locale} locale in your system)")
  101 + Locale.setlocale(Locale::LC_ALL, 'C')
  102 + end
103 end 103 end
104 104
105 end 105 end
config/environment.rb
@@ -82,6 +82,8 @@ Noosfero.locales = { @@ -82,6 +82,8 @@ Noosfero.locales = {
82 'en' => 'English', 82 'en' => 'English',
83 'pt_BR' => 'Português Brasileiro', 83 'pt_BR' => 'Português Brasileiro',
84 } 84 }
  85 +# if you want to override this, do it in config/local.rb !
  86 +Noosfero.default_locale = 'en'
85 require 'locale' 87 require 'locale'
86 88
87 Tag.hierarchical = true 89 Tag.hierarchical = true
test/integration/locale_setting_test.rb
@@ -5,6 +5,8 @@ class LocaleSettingTest < ActionController::IntegrationTest @@ -5,6 +5,8 @@ class LocaleSettingTest < ActionController::IntegrationTest
5 def setup 5 def setup
6 # reset GetText before every test 6 # reset GetText before every test
7 GetText.locale = nil 7 GetText.locale = nil
  8 + Noosfero.stubs(:default_locale).returns('en')
  9 + Noosfero.stubs(:available_locales).returns(['pt_BR'])
8 end 10 end
9 11
10 should 'be able to set a default language' do 12 should 'be able to set a default language' do