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 25 include AuthenticatedSystem
26 26 include PermissionCheck
27 27  
  28 + before_init_gettext :maybe_save_locale
  29 + after_init_gettext :check_locale
28 30 init_gettext 'noosfero'
29   - before_init_gettext :force_language
30   - after_init_gettext :set_system_locale
31 31  
32 32 include NeedsProfile
33 33  
... ... @@ -40,7 +40,7 @@ class ApplicationController < ActionController::Base
40 40 verify :method => :post, :only => actions, :redirect_to => redirect
41 41 end
42 42  
43   - protected
  43 + protected
44 44  
45 45 # TODO: move this logic somewhere else (Domain class?)
46 46 def detect_stuff_by_domain
... ... @@ -63,43 +63,43 @@ class ApplicationController < ActionController::Base
63 63 current_user.person if logged_in?
64 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 70 end
  71 + # force GetText to load a matching locale
  72 + GetText.locale = nil
79 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 83 if similar
88 84 set_locale similar
  85 + cookies[:lang] = similar
89 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 90 end
  91 + RAILS_DEFAULT_LOGGER.info('Locale reverted from %s to %s' % [old_locale, locale])
92 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 103 end
104 104  
105 105 end
... ...
config/environment.rb
... ... @@ -82,6 +82,8 @@ Noosfero.locales = {
82 82 'en' => 'English',
83 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 87 require 'locale'
86 88  
87 89 Tag.hierarchical = true
... ...
test/integration/locale_setting_test.rb
... ... @@ -5,6 +5,8 @@ class LocaleSettingTest < ActionController::IntegrationTest
5 5 def setup
6 6 # reset GetText before every test
7 7 GetText.locale = nil
  8 + Noosfero.stubs(:default_locale).returns('en')
  9 + Noosfero.stubs(:available_locales).returns(['pt_BR'])
8 10 end
9 11  
10 12 should 'be able to set a default language' do
... ...