Commit b44f870cb472eae5120ba958c030d7edfc81a4a3
1 parent
500d554f
Exists in
master
and in
23 other branches
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
Showing
3 changed files
with
35 additions
and
31 deletions
Show diff stats
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 |