diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 5938613..16f1a45 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -42,9 +42,9 @@ class ApplicationController < ActionController::Base before_filter :set_locale def set_locale - FastGettext.available_locales = Noosfero.available_locales - FastGettext.default_locale = Noosfero.default_locale - FastGettext.locale = (params[:lang] || session[:lang] || Noosfero.default_locale || request.env['HTTP_ACCEPT_LANGUAGE'] || 'en') + FastGettext.available_locales = environment.available_locales + FastGettext.default_locale = environment.default_locale + FastGettext.locale = (params[:lang] || session[:lang] || environment.default_locale || request.env['HTTP_ACCEPT_LANGUAGE'] || 'en') I18n.locale = FastGettext.locale if params[:lang] session[:lang] = params[:lang] diff --git a/app/controllers/my_profile/cms_controller.rb b/app/controllers/my_profile/cms_controller.rb index 29c001d..fab598f 100644 --- a/app/controllers/my_profile/cms_controller.rb +++ b/app/controllers/my_profile/cms_controller.rb @@ -345,7 +345,7 @@ class CmsController < MyProfileController end def translations - @locales = Noosfero.locales.invert.reject { |name, lang| !@article.possible_translations.include?(lang) } + @locales = environment.locales.invert.reject { |name, lang| !@article.possible_translations.include?(lang) } @selected_locale = @article.language || FastGettext.locale end diff --git a/app/helpers/content_viewer_helper.rb b/app/helpers/content_viewer_helper.rb index 524aa53..3feab24 100644 --- a/app/helpers/content_viewer_helper.rb +++ b/app/helpers/content_viewer_helper.rb @@ -42,7 +42,7 @@ module ContentViewerHelper def article_translations(article) unless article.native_translation.translations.empty? links = (article.native_translation.translations + [article.native_translation]).map do |translation| - { Noosfero.locales[translation.language] => { :href => url_for(translation.url) } } + { article.environment.locales[translation.language] => { :href => url_for(translation.url) } } end content_tag(:div, link_to(_('Translations'), '#', :onclick => "toggleSubmenu(this, '#{_('Translations')}', #{links.to_json}); return false", diff --git a/app/helpers/language_helper.rb b/app/helpers/language_helper.rb index e7640de..24f3394 100644 --- a/app/helpers/language_helper.rb +++ b/app/helpers/language_helper.rb @@ -13,18 +13,18 @@ module LanguageHelper alias :calendar_date_select_language :tinymce_language - def language_chooser(options = {}) + def language_chooser(environment, options = {}) current = language separator = options[:separator] || ' — ' if options[:element] == 'dropdown' select_tag('lang', - options_for_select(Noosfero.locales.map{|code,name| [name, code]}, current), + options_for_select(environment.locales.map{|code,name| [name, code]}, current), :onchange => "document.location.href= #{url_for(params.merge(:lang => 'LANGUAGE')).inspect}.replace(/LANGUAGE/, this.value) ;", :help => _('The language you choose here is the language used for options, buttons, etc. It does not affect the language of the content created by other users.') ) else - languages = Noosfero.locales.map do |code,name| + languages = environment.locales.map do |code,name| if code == current content_tag('strong', name) else diff --git a/app/models/article.rb b/app/models/article.rb index a99defd..b0c74e2 100644 --- a/app/models/article.rb +++ b/app/models/article.rb @@ -325,14 +325,14 @@ class Article < ActiveRecord::Base end def possible_translations - possibilities = Noosfero.locales.keys - self.native_translation.translations(:select => :language).map(&:language) - [self.native_translation.language] + possibilities = environment.locales.keys - self.native_translation.translations(:select => :language).map(&:language) - [self.native_translation.language] possibilities << self.language unless self.language_changed? possibilities end def known_language unless self.language.blank? - errors.add(:language, N_('Language not supported by Noosfero')) unless Noosfero.locales.key?(self.language) + errors.add(:language, N_('Language not supported by the environment.')) unless environment.locales.key?(self.language) end end diff --git a/app/models/block.rb b/app/models/block.rb index 80da92a..3a960f9 100644 --- a/app/models/block.rb +++ b/app/models/block.rb @@ -7,6 +7,8 @@ class Block < ActiveRecord::Base # Block-specific stuff include BlockHelper + delegate :environment, :to => :box + acts_as_list :scope => :box belongs_to :box diff --git a/app/models/box.rb b/app/models/box.rb index d293529..4b6b625 100644 --- a/app/models/box.rb +++ b/app/models/box.rb @@ -2,4 +2,8 @@ class Box < ActiveRecord::Base belongs_to :owner, :polymorphic => true acts_as_list :scope => 'owner_id = #{owner_id} and owner_type = \'#{owner_type}\'' has_many :blocks, :dependent => :destroy, :order => 'position' + + def environment + owner.kind_of?(Environment) ? owner : owner.environment + end end diff --git a/app/models/environment.rb b/app/models/environment.rb index 205fe00..8d7b43c 100644 --- a/app/models/environment.rb +++ b/app/models/environment.rb @@ -766,4 +766,21 @@ class Environment < ActiveRecord::Base def image_galleries portal_community ? portal_community.image_galleries : [] end + + def locales + languages || Noosfero.locales + end + + def default_locale + default_language || Noosfero.default_locale + end + + def available_locales + locales_list = locales.keys + # move English to the beginning + if locales_list.include?('en') + locales_list = ['en'] + (locales_list - ['en']).sort + end + locales_list + end end diff --git a/app/sweepers/article_sweeper.rb b/app/sweepers/article_sweeper.rb index a984b7d..ae8cb17 100644 --- a/app/sweepers/article_sweeper.rb +++ b/app/sweepers/article_sweeper.rb @@ -20,7 +20,7 @@ protected BlockSweeper.expire_blocks(blocks) env = article.profile.environment if env && (env.portal_community == article.profile) - Noosfero.locales.keys.each do |locale| + article.environment.locales.keys.each do |locale| expire_fragment(env.portal_news_cache_key(locale)) end end diff --git a/app/sweepers/block_sweeper.rb b/app/sweepers/block_sweeper.rb index 41ae8a4..0a64337 100644 --- a/app/sweepers/block_sweeper.rb +++ b/app/sweepers/block_sweeper.rb @@ -10,7 +10,7 @@ class BlockSweeper < ActiveRecord::Observer regex = '-[a-z]*$' clean_ck = block.cache_key.gsub(/#{regex}/,'') - Noosfero.locales.keys.each do |locale| + block.environment.locales.keys.each do |locale| expire_timeout_fragment("#{clean_ck}-#{locale}") end end diff --git a/app/views/box_organizer/edit.rhtml b/app/views/box_organizer/edit.rhtml index 6aa54f5..3e1be31 100644 --- a/app/views/box_organizer/edit.rhtml +++ b/app/views/box_organizer/edit.rhtml @@ -21,7 +21,7 @@ <%= label_tag('block_display_never', _("Don't display")) %> - <%= labelled_form_field(_('Show for:'), select(:block, :language, [ [ _('all languages'), 'all']] + Noosfero.locales.map {|key, value| [value, key]} )) %> + <%= labelled_form_field(_('Show for:'), select(:block, :language, [ [ _('all languages'), 'all']] + environment.locales.map {|key, value| [value, key]} )) %> <% button_bar do %> <%= submit_button(:save, _('Save')) %> diff --git a/app/views/cms/_blog.rhtml b/app/views/cms/_blog.rhtml index 3ee3f8a..62a4b3b 100644 --- a/app/views/cms/_blog.rhtml +++ b/app/views/cms/_blog.rhtml @@ -62,7 +62,7 @@ <% f.fields_for 'feed', @article.feed do |feed| %> <%= labelled_form_field(_('Limit of posts in RSS Feed'), feed.select(:limit, [5, 10, 20, 50])) %> - <%= labelled_form_field(_('Include in RSS Feed only posts from language:'), feed.select(:language, [[_('All'), nil ]] + Noosfero.locales.map { |k,v| [v, k]})) %> + <%= labelled_form_field(_('Include in RSS Feed only posts from language:'), feed.select(:language, [[_('All'), nil ]] + environment.locales.map { |k,v| [v, k]})) %> <% end %> <% f.fields_for 'external_feed_builder', @article.external_feed do |efeed| %> diff --git a/app/views/cms/_rss_feed.rhtml b/app/views/cms/_rss_feed.rhtml index 8b60ba6..112c6c1 100644 --- a/app/views/cms/_rss_feed.rhtml +++ b/app/views/cms/_rss_feed.rhtml @@ -6,7 +6,7 @@ <%= required labelled_form_field(_('Limit of articles'), text_field(:article, :limit)) %> -<%= labelled_form_field(_('Include in RSS Feed only posts from language:'), f.select(:language, [[_('All'), nil ]] + Noosfero.locales.map { |k,v| [v, k]})) %> +<%= labelled_form_field(_('Include in RSS Feed only posts from language:'), f.select(:language, [[_('All'), nil ]] + environment.locales.map { |k,v| [v, k]})) %> <%= labelled_form_field(_('Use as item description:'), select(:article, :feed_item_description, [ [ _('Article abstract'), 'abstract'], [ _('Article body'), 'body']])) %> diff --git a/app/views/layouts/application.rhtml b/app/views/layouts/application.rhtml index 7b56e96..29f69d6 100644 --- a/app/views/layouts/application.rhtml +++ b/app/views/layouts/application.rhtml @@ -80,7 +80,7 @@
- <%= language_chooser(:element => 'dropdown') %> + <%= language_chooser(environment, :element => 'dropdown') %>
diff --git a/db/migrate/20120823215007_add_languages_and_default_language_to_environment.rb b/db/migrate/20120823215007_add_languages_and_default_language_to_environment.rb new file mode 100644 index 0000000..150b07c --- /dev/null +++ b/db/migrate/20120823215007_add_languages_and_default_language_to_environment.rb @@ -0,0 +1,11 @@ +class AddLanguagesAndDefaultLanguageToEnvironment < ActiveRecord::Migration + def self.up + add_column :environments, :languages, :string + add_column :environments, :default_language, :string + end + + def self.down + remove_column :environments, :languages + remove_column :environments, :default_language + end +end diff --git a/db/schema.rb b/db/schema.rb index 37680ca..ac7cc14 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -9,7 +9,7 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 20120818030329) do +ActiveRecord::Schema.define(:version => 20120823215007) do create_table "abuse_reports", :force => true do |t| t.integer "reporter_id" @@ -259,6 +259,8 @@ ActiveRecord::Schema.define(:version => 20120818030329) do t.datetime "created_at" t.datetime "updated_at" t.integer "reports_lower_bound", :default => 0, :null => false + t.string "languages" + t.string "default_language" end create_table "external_feeds", :force => true do |t| diff --git a/public/designs/themes/base/footer.rhtml b/public/designs/themes/base/footer.rhtml index 2384da9..4e1a0bc 100644 --- a/public/designs/themes/base/footer.rhtml +++ b/public/designs/themes/base/footer.rhtml @@ -4,4 +4,4 @@ -<%= language_chooser %> +<%= language_chooser(environment) %> diff --git a/test/unit/article_test.rb b/test/unit/article_test.rb index 60eb4a9..31aed0a 100644 --- a/test/unit/article_test.rb +++ b/test/unit/article_test.rb @@ -1211,7 +1211,7 @@ class ArticleTest < ActiveSupport::TestCase end should 'validade inclusion of language' do - a = build(Article) + a = build(Article, :profile_id => fast_create(Profile).id) a.language = '12' a.valid? assert a.errors.invalid?(:language) @@ -1243,7 +1243,7 @@ class ArticleTest < ActiveSupport::TestCase end should 'list possible translations' do - native_article = fast_create(Article, :language => 'pt') + native_article = fast_create(Article, :language => 'pt', :profile_id => fast_create(Profile).id ) article_translation = fast_create(Article, :language => 'en', :translation_of_id => native_article.id) possible_translations = native_article.possible_translations assert !possible_translations.include?('en') @@ -1253,7 +1253,7 @@ class ArticleTest < ActiveSupport::TestCase should 'verify if translation is already in use' do native_article = fast_create(Article, :language => 'pt') article_translation = fast_create(Article, :language => 'en', :translation_of_id => native_article.id) - a = build(Article) + a = build(Article, :profile => fast_create(Profile)) a.language = 'en' a.translation_of = native_article a.valid? @@ -1265,7 +1265,7 @@ class ArticleTest < ActiveSupport::TestCase should 'verify if native translation is already in use' do native_article = fast_create(Article, :language => 'pt') - a = build(Article) + a = build(Article, :profile => fast_create(Profile)) a.language = 'pt' a.translation_of = native_article a.valid? @@ -1277,7 +1277,7 @@ class ArticleTest < ActiveSupport::TestCase should 'translation have a language' do native_article = fast_create(Article, :language => 'pt') - a = build(Article) + a = build(Article, :profile_id => fast_create(Profile).id) a.translation_of = native_article a.valid? assert a.errors.invalid?(:language) @@ -1287,8 +1287,8 @@ class ArticleTest < ActiveSupport::TestCase end should 'native translation have a language' do - native_article = fast_create(Article) - a = build(Article) + native_article = fast_create(Article, :profile_id => fast_create(Profile).id ) + a = build(Article, :profile_id => fast_create(Profile).id) a.language = 'en' a.translation_of = native_article a.valid? @@ -1356,15 +1356,15 @@ class ArticleTest < ActiveSupport::TestCase end should 'not list own language as a possible translation if language has changed' do - a = build(Article, :language => 'pt') + a = build(Article, :language => 'pt', :profile_id => fast_create(Profile).id) assert !a.possible_translations.include?('pt') - a = fast_create(Article, :language => 'pt') + a = fast_create(Article, :language => 'pt', :profile_id => fast_create(Profile).id ) a.language = 'en' assert !a.possible_translations.include?('en') end should 'list own language as a possible translation if language has not changed' do - a = fast_create(Article, :language => 'pt') + a = fast_create(Article, :language => 'pt', :profile_id => fast_create(Profile).id) assert a.possible_translations.include?('pt') end diff --git a/test/unit/block_test.rb b/test/unit/block_test.rb index df9ba3a..5406049 100644 --- a/test/unit/block_test.rb +++ b/test/unit/block_test.rb @@ -107,7 +107,7 @@ class BlockTest < ActiveSupport::TestCase should 'be able to save display setting' do user = create_user('testinguser').person - box = fast_create(Box, :owner_id => user.id) + box = fast_create(Box, :owner_id => user.id, :owner_type => 'Profile') block = create(Block, :display => 'never', :box_id => box.id) block.reload assert_equal 'never', block.display @@ -115,7 +115,7 @@ class BlockTest < ActiveSupport::TestCase should 'be able to update display setting' do user = create_user('testinguser').person - box = fast_create(Box, :owner_id => user.id) + box = fast_create(Box, :owner_id => user.id, :owner_type => 'Profile') block = create(Block, :display => 'never', :box_id => box.id) assert block.update_attributes!(:display => 'always') block.reload @@ -148,4 +148,12 @@ class BlockTest < ActiveSupport::TestCase assert_equal false, block.visible?(:locale => 'en') end + should 'delegate environment to box' do + box = fast_create(Box, :owner_id => fast_create(Profile).id) + block = Block.new(:box => box) + box.stubs(:environment).returns(Environment.default) + + assert_equal box.environment, block.environment + end + end diff --git a/test/unit/box_test.rb b/test/unit/box_test.rb new file mode 100644 index 0000000..590a620 --- /dev/null +++ b/test/unit/box_test.rb @@ -0,0 +1,12 @@ +require File.dirname(__FILE__) + '/../test_helper' + +class BoxTest < ActiveSupport::TestCase + should 'retrieve environment based on owner' do + profile = fast_create(Profile) + box = fast_create(Box, :owner_id => profile.id, :owner_type => 'Profile') + assert_equal profile.environment, box.environment + + box = fast_create(Box, :owner_id => Environment.default.id, :owner_type => 'Environment') + assert_equal Environment.default, box.environment + end +end diff --git a/test/unit/environment_test.rb b/test/unit/environment_test.rb index caa3bfb..8a67fbf 100644 --- a/test/unit/environment_test.rb +++ b/test/unit/environment_test.rb @@ -1220,4 +1220,37 @@ class EnvironmentTest < ActiveSupport::TestCase assert_includes environment.licenses, l2 assert_not_includes environment.licenses, l3 end + + should 'define default locale or use the config default locale' do + environment = Environment.default + environment.default_language = nil + environment.save! + assert_equal Noosfero.default_locale, environment.default_locale + + environment.default_language = 'en' + environment.save! + assert_equal environment.default_language, environment.default_locale + end + + should 'define locales or use the config locales' do + environment = Environment.default + environment.languages = nil + environment.save! + assert_equal Noosfero.locales, environment.locales + + environment.languages = {'en' => 'English'} + environment.save! + assert_equal environment.languages, environment.locales + end + + should 'define available_locales or use the config available_locales' do + environment = Environment.default + environment.languages = nil + environment.save! + assert_equal Noosfero.available_locales, environment.available_locales + + environment.languages = {'pt' => 'Português', 'en' => 'English'} + environment.save! + assert_equal ['en', 'pt'], environment.available_locales + end end diff --git a/test/unit/language_helper_test.rb b/test/unit/language_helper_test.rb index 68c57c4..7f6e004 100644 --- a/test/unit/language_helper_test.rb +++ b/test/unit/language_helper_test.rb @@ -23,14 +23,14 @@ class LanguageHelperTest < ActiveSupport::TestCase Noosfero.expects(:locales).returns({ 'en' => 'English', 'pt_BR' => 'Português Brasileiro', 'fr' => 'Français', 'it' => 'Italiano' }).at_least_once self.expects(:language).returns('pt_BR') - result = self.language_chooser + result = self.language_chooser(Environment.default) assert_match /Português Brasileiro<\/strong>/, result assert_no_match /English<\/strong>/, result assert_no_match /Français<\/strong>/, result assert_no_match /Italiano<\/strong>/, result self.expects(:language).returns('fr') - result = self.language_chooser + result = self.language_chooser(Environment.default) assert_no_match /Português Brasileiro<\/strong>/, result assert_no_match /English<\/strong>/, result assert_match /Français<\/strong>/, result @@ -42,7 +42,7 @@ class LanguageHelperTest < ActiveSupport::TestCase Noosfero.expects(:locales).returns({ 'en' => 'English', 'pt_BR' => 'Português Brasileiro', 'fr' => 'Français', 'it' => 'Italiano' }).at_least_once self.expects(:language).returns('en') - result = self.language_chooser(:element => 'dropdown') + result = self.language_chooser(Environment.default, :element => 'dropdown') assert_match /