Commit 21aea18e9f0c5c6c959ce03244930a84fd455ea5

Authored by Daniela Feitosa
2 parents b812a387 50401a16

Merge branch 'stable' of gitorious.org:noosfero/noosfero into stable

Conflicts:
	debian/changelog
	lib/noosfero.rb
Showing 529 changed files with 29947 additions and 8230 deletions   Show diff stats

Too many changes.

To preserve performance only 100 of 529 files displayed.

AUTHORS
... ... @@ -6,17 +6,27 @@ noosfero, that's not a problem).
6 6 Developers
7 7 ==========
8 8  
  9 +Antonio Terceiro + Carlos Morais <terceiro@colivre.coop.br>
  10 +Antonio Terceiro + Paulo Meirelles <terceiro@colivre.coop.br>
9 11 Antonio Terceiro <terceiro@colivre.coop.br>
10 12 Aurelio A. Heckert <aurelio@colivre.coop.br>
11 13 Braulio Bhavamitra <brauliobo@gmail.com>
12 14 Bráulio Bhavamitra <brauliobo@gmail.com>
13 15 Caio SBA <caio@colivre.coop.br>
  16 +Carlos Morais <carlos88morais@gmail.com>
  17 +Carlos Morais + Diego Araújo <diegoamc90@gmail.com>
  18 +Carlos Morais + Paulo Meirelles <carlos88morais@gmail.com>
14 19 Daniela Soares Feitosa <danielafeitosa@colivre.coop.br>
15 20 Daniel Cunha <daniel@colivre.coop.br>
  21 +Diego Araújo <diegoamc90@gmail.com>
  22 +Diego Araújo + João M. M. da Silva <diegoamc90@gmail.com>
16 23 Fernanda Lopes <nanda.listas+psl@gmail.com>
17 24 Grazieno Pellegrino <grazieno@gmail.com>
18 25 Italo Valcy <italo@dcc.ufba.br>
19 26 João da Silva <jaodsilv@linux.ime.usp.br>
  27 +João M. M. da Silva + Carlos Morais <jaodsilv@linux.ime.usp.br>
  28 +João M. M. da Silva + Diego Araújo <diegoamc90@gmail.com>
  29 +João M. M. da Silva + Diego Araújo <jaodsilv@linux.ime.usp.br>
20 30 João M. M. da Silva + Paulo Meirelles <jaodsilv@linux.ime.usp.br>
21 31 Joenio Costa <joenio@colivre.coop.br>
22 32 Josef Spillner <josef.spillner@tu-dresden.de>
... ... @@ -28,6 +38,7 @@ LinguÁgil 2010 &lt;linguagil.bahia@gmail.com&gt;
28 38 Martín Olivera <molivera@solar.org.ar>
29 39 Moises Machado <moises@colivre.coop.br>
30 40 Nanda Lopes <nanda.listas+psl@gmail.com>
  41 +Paulo Meirelles + Carlos Morais <paulo@softwarelivre.org>
31 42 Paulo Meirelles <paulo@softwarelivre.org>
32 43 Rafael Gomes <rafaelgomes@techfree.com.br>
33 44 Rafael Martins <rmmartins@gmail.com>
... ...
Gemfile 0 → 100644
... ... @@ -0,0 +1,19 @@
  1 +source :rubygems
  2 +gem 'cucumber', '0.4.0'
  3 +gem 'webrat', '0.5.1'
  4 +gem 'rspec', '1.2.9'
  5 +gem 'rspec-rails', '1.2.9'
  6 +gem 'Selenium', '>= 1.1.14'
  7 +gem 'selenium-client', '>= 1.2.17'
  8 +gem 'database_cleaner'
  9 +gem 'exception_notification', '1.0.20090728'
  10 +gem 'system_timer'
  11 +
  12 +def program(name)
  13 + unless system("which #{name} > /dev/null")
  14 + puts "W: Program #{name} is needed, but was not found in your PATH"
  15 + end
  16 +end
  17 +
  18 +program 'java'
  19 +program 'firefox'
... ...
Gemfile.lock 0 → 100644
... ... @@ -0,0 +1,44 @@
  1 +GEM
  2 + remote: http://rubygems.org/
  3 + specs:
  4 + Selenium (1.1.14)
  5 + builder (3.0.0)
  6 + cucumber (0.4.0)
  7 + builder (>= 2.1.2)
  8 + diff-lcs (>= 1.1.2)
  9 + polyglot (>= 0.2.9)
  10 + term-ansicolor (>= 1.0.3)
  11 + treetop (>= 1.4.2)
  12 + database_cleaner (0.7.0)
  13 + diff-lcs (1.1.3)
  14 + exception_notification (1.0.20090728)
  15 + nokogiri (1.5.0)
  16 + polyglot (0.3.3)
  17 + rack (1.3.5)
  18 + rspec (1.2.9)
  19 + rspec-rails (1.2.9)
  20 + rack (>= 1.0.0)
  21 + rspec (>= 1.2.9)
  22 + selenium-client (1.2.18)
  23 + system_timer (1.2.4)
  24 + term-ansicolor (1.0.7)
  25 + treetop (1.4.10)
  26 + polyglot
  27 + polyglot (>= 0.3.1)
  28 + webrat (0.5.1)
  29 + nokogiri (>= 1.2.0)
  30 + rack (>= 1.0)
  31 +
  32 +PLATFORMS
  33 + ruby
  34 +
  35 +DEPENDENCIES
  36 + Selenium (>= 1.1.14)
  37 + cucumber (= 0.4.0)
  38 + database_cleaner
  39 + exception_notification (= 1.0.20090728)
  40 + rspec (= 1.2.9)
  41 + rspec-rails (= 1.2.9)
  42 + selenium-client (>= 1.2.17)
  43 + system_timer
  44 + webrat (= 0.5.1)
... ...
HACKING.rails235 0 → 100644
... ... @@ -0,0 +1,14 @@
  1 +This is a draft of how to create a environment to Rails 2.3.5 to Noosfero
  2 +development.
  3 +
  4 +Install dependencies:
  5 +
  6 +gem install rails -v 2.3.5
  7 +gem install ferret
  8 +gem install i18n
  9 +gem install will_paginate -v 2.3.12
  10 +gem install cucumber
  11 +
  12 +Creating initial environment:
  13 +
  14 +rake db:schema:load
... ...
INSTALL
... ... @@ -13,7 +13,7 @@ You need to install some packages Noosfero depends on. On Debian GNU/Linux or
13 13 Debian-based systems, all of these packages are available through the Debian
14 14 archive. You can install them with the following command:
15 15  
16   - # apt-get install ruby rake po4a libgettext-ruby-util libgettext-ruby-data libgettext-ruby1.8 libsqlite3-ruby rcov librmagick-ruby libredcloth-ruby libwill-paginate-ruby iso-codes libfeedparser-ruby libferret-ruby libdaemons-ruby mongrel mongrel-cluster tango-icon-theme libhpricot-ruby
  16 + # apt-get install ruby rake po4a libgettext-ruby-util libgettext-ruby-data libgettext-ruby1.8 libsqlite3-ruby rcov librmagick-ruby libredcloth-ruby libwill-paginate-ruby iso-codes libfeedparser-ruby libferret-ruby libdaemons-ruby thin tango-icon-theme libhpricot-ruby
17 17  
18 18 On other systems, they may or may not be available through your regular package
19 19 management system. Below are the links to their homepages.
... ... @@ -31,7 +31,7 @@ management system. Below are the links to their homepages.
31 31 * iso-codes: http://pkg-isocodes.alioth.debian.org/
32 32 * feedparser: http://packages.debian.org/sid/libfeedparser-ruby
33 33 * Daemons - http://daemons.rubyforge.org/
34   -* Mongrel: http://mongrel.rubyforge.org/
  34 +* Thin: http://code.macournoyer.com/thin/
35 35 * tango-icon-theme: http://tango.freedesktop.org/Tango_Icon_Library
36 36 * Hpricot: http://hpricot.com/
37 37  
... ... @@ -118,13 +118,13 @@ $ cd current
118 118 Copy config/ferret_server.yml.dist to config/ferret_server.yml. You will
119 119 probably not need to customize this configuration, but have a look at it.
120 120  
121   -Create the mongrel configuration file:
  121 +Create the thin configuration file:
122 122  
123   -$ mongrel_rails cluster::configure
  123 +$ thin -C config/thin.yml config
124 124  
125   -Edit config/mongrel_cluster.yml to suit your needs. Make sure your apache
126   -configuration matches the mongrel cluster configuration, specially in respect
127   -to the ports and numbers of mongrel instances.
  125 +Edit config/thin.yml to suit your needs. Make sure your apache
  126 +configuration matches the thin cluster configuration, specially in respect
  127 +to the ports and numbers of thin instances.
128 128  
129 129 Note: currently Noosfero only supports Rails 2.1.0, which is the version in
130 130 Debian Lenny. If you have a Rails version newer than that, Noosfero will
... ... @@ -316,7 +316,7 @@ In other systems the way by which you enable apache modules may be different.
316 316 Now with the Apache configuration. You can use the template below, replacing
317 317 /var/lib/noosfero/current with the directory in which your noosfero
318 318 installation is, your.domain.com with the domain name of your noosfero site.
319   -We are assuming that you are running two mongrel instances on ports 3000 and
  319 +We are assuming that you are running two thin instances on ports 3000 and
320 320 3001. If your setup is different you'll need to adjust <Proxy> section. If you
321 321 don't understand something in the configuration, please refer to the apache
322 322 documentation.
... ...
INSTALL.awstats
... ... @@ -5,11 +5,11 @@ streaming, ftp or mail server statistics, graphically.
5 5  
6 6 See http://awstats.sourceforge.net/
7 7  
8   -This guide supposes that the Noosfero server is running GNU/Linux Debian Lenny.
  8 +This guide supposes that the Noosfero server is running GNU/Linux Debian Squeeze.
9 9  
10 10 1. Install AWStats
11 11  
12   -# apt-get install awstats libgeo-ip-perl
  12 +# apt-get install awstats libgeo-ip-perl geoip-database
13 13  
14 14 2. Basic setup
15 15  
... ...
app/controllers/admin_controller.rb
1 1 class AdminController < ApplicationController
2   - require_ssl
3 2 before_filter :login_required
4 3 end
... ...
app/controllers/application.rb
1   -# his is the application's main controller. Features defined here are
2   -# available in all controllers.
3   -class ApplicationController < ActionController::Base
4   -
5   - before_filter :change_pg_schema
6   -
7   - include ApplicationHelper
8   - layout :get_layout
9   - def get_layout
10   - prepend_view_path('public/' + theme_path)
11   - theme_option(:layout) || 'application'
12   - end
13   -
14   - filter_parameter_logging :password
15   -
16   - def log_processing
17   - super
18   - return unless ENV['RAILS_ENV'] == 'production'
19   - if logger && logger.info?
20   - logger.info(" HTTP Referer: #{request.referer}")
21   - logger.info(" User Agent: #{request.user_agent}")
22   - logger.info(" Accept-Language: #{request.headers['HTTP_ACCEPT_LANGUAGE']}")
23   - end
24   - end
25   -
26   - helper :document
27   - helper :language
28   -
29   - def self.no_design_blocks
30   - @no_design_blocks = true
31   - end
32   - def self.uses_design_blocks?
33   - !@no_design_blocks
34   - end
35   - def uses_design_blocks?
36   - !@no_design_blocks && self.class.uses_design_blocks?
37   - end
38   -
39   - # Be sure to include AuthenticationSystem in Application Controller instead
40   - include AuthenticatedSystem
41   - include PermissionCheck
42   -
43   - def self.require_ssl(*options)
44   - before_filter :check_ssl, *options
45   - end
46   - def check_ssl
47   - return true if (request.ssl? || ENV['RAILS_ENV'] == 'development')
48   - redirect_to_ssl
49   - end
50   - def redirect_to_ssl
51   - if environment.enable_ssl
52   - redirect_to(params.merge(:protocol => 'https://', :host => ssl_hostname))
53   - true
54   - else
55   - false
56   - end
57   - end
58   -
59   - def self.refuse_ssl(*options)
60   - before_filter :avoid_ssl, *options
61   - end
62   - def avoid_ssl
63   - if (!request.ssl? || ENV['RAILS_ENV'] == 'development')
64   - true
65   - else
66   - redirect_to(params.merge(:protocol => 'http://'))
67   - false
68   - end
69   - end
70   -
71   - before_filter :set_locale
72   - def set_locale
73   - FastGettext.available_locales = Noosfero.available_locales
74   - FastGettext.default_locale = Noosfero.default_locale
75   - FastGettext.set_locale(params[:lang] || session[:lang] || Noosfero.default_locale || request.env['HTTP_ACCEPT_LANGUAGE'] || 'en')
76   - if params[:lang]
77   - session[:lang] = params[:lang]
78   - end
79   - end
80   -
81   - include NeedsProfile
82   -
83   - before_filter :detect_stuff_by_domain
84   - before_filter :init_noosfero_plugins
85   - attr_reader :environment
86   -
87   - before_filter :load_terminology
88   -
89   - # declares that the given <tt>actions</tt> cannot be accessed by other HTTP
90   - # method besides POST.
91   - def self.post_only(actions, redirect = { :action => 'index'})
92   - verify :method => :post, :only => actions, :redirect_to => redirect
93   - end
94   -
95   - helper_method :current_person, :current_person
96   -
97   - def change_pg_schema
98   - if Noosfero::MultiTenancy.on? and ActiveRecord::Base.postgresql?
99   - Noosfero::MultiTenancy.db_by_host = request.host
100   - end
101   - end
102   -
103   - protected
104   -
105   - def boxes_editor?
106   - false
107   - end
108   -
109   - def content_editor?
110   - false
111   - end
112   -
113   - def user
114   - current_user.person if logged_in?
115   - end
116   -
117   - alias :current_person :user
118   -
119   - # TODO: move this logic somewhere else (Domain class?)
120   - def detect_stuff_by_domain
121   - @domain = Domain.find_by_name(request.host)
122   - if @domain.nil?
123   - @environment = Environment.default
124   - else
125   - @environment = @domain.environment
126   - @profile = @domain.profile
127   - end
128   - end
129   -
130   - def init_noosfero_plugins
131   - @plugins = Noosfero::Plugin::Manager.new(self)
132   - @plugins.enabled_plugins.map(&:class).each do |plugin|
133   - prepend_view_path(plugin.view_path)
134   - end
135   - init_noosfero_plugins_controller_filters
136   - end
137   -
138   - # This is a generic method that initialize any possible filter defined by a
139   - # plugin to the current controller being initialized.
140   - def init_noosfero_plugins_controller_filters
141   - @plugins.enabled_plugins.each do |plugin|
142   - plugin.send(self.class.name.underscore + '_filters').each do |plugin_filter|
143   - self.class.send(plugin_filter[:type], plugin.class.name.underscore + '_' + plugin_filter[:method_name], (plugin_filter[:options] || {}))
144   - self.class.send(:define_method, plugin.class.name.underscore + '_' + plugin_filter[:method_name], plugin_filter[:block])
145   - end
146   - end
147   - end
148   -
149   - def load_terminology
150   - # cache terminology for performance
151   - @@terminology_cache ||= {}
152   - @@terminology_cache[environment.id] ||= environment.terminology
153   - Noosfero.terminology = @@terminology_cache[environment.id]
154   - end
155   -
156   - def render_not_found(path = nil)
157   - @no_design_blocks = true
158   - @path ||= request.path
159   - render :template => 'shared/not_found.rhtml', :status => 404, :layout => get_layout
160   - end
161   - alias :render_404 :render_not_found
162   -
163   - def render_access_denied(message = nil, title = nil)
164   - @no_design_blocks = true
165   - @message = message
166   - @title = title
167   - render :template => 'shared/access_denied.rhtml', :status => 403
168   - end
169   -
170   - def load_category
171   - unless params[:category_path].blank?
172   - path = params[:category_path].join('/')
173   - @category = environment.categories.find_by_path(path)
174   - if @category.nil?
175   - render_not_found(path)
176   - end
177   - end
178   - end
179   -
180   -end
  1 +require 'application_controller'
... ...
app/controllers/application_controller.rb 0 → 100644
... ... @@ -0,0 +1,155 @@
  1 +class ApplicationController < ActionController::Base
  2 +
  3 + before_filter :change_pg_schema
  4 +
  5 + include ApplicationHelper
  6 + layout :get_layout
  7 + def get_layout
  8 + prepend_view_path('public/' + theme_path)
  9 + theme_option(:layout) || 'application'
  10 + end
  11 +
  12 + filter_parameter_logging :password
  13 +
  14 + def log_processing
  15 + super
  16 + return unless ENV['RAILS_ENV'] == 'production'
  17 + if logger && logger.info?
  18 + logger.info(" HTTP Referer: #{request.referer}")
  19 + logger.info(" User Agent: #{request.user_agent}")
  20 + logger.info(" Accept-Language: #{request.headers['HTTP_ACCEPT_LANGUAGE']}")
  21 + end
  22 + end
  23 +
  24 + helper :document
  25 + helper :language
  26 +
  27 + def self.no_design_blocks
  28 + @no_design_blocks = true
  29 + end
  30 + def self.uses_design_blocks?
  31 + !@no_design_blocks
  32 + end
  33 + def uses_design_blocks?
  34 + !@no_design_blocks && self.class.uses_design_blocks?
  35 + end
  36 +
  37 + # Be sure to include AuthenticationSystem in Application Controller instead
  38 + include AuthenticatedSystem
  39 + include PermissionCheck
  40 +
  41 + before_filter :set_locale
  42 + def set_locale
  43 + FastGettext.available_locales = Noosfero.available_locales
  44 + FastGettext.default_locale = Noosfero.default_locale
  45 + I18n.locale = FastGettext.locale = (params[:lang] || session[:lang] || Noosfero.default_locale || request.env['HTTP_ACCEPT_LANGUAGE'] || 'en')
  46 + if params[:lang]
  47 + session[:lang] = params[:lang]
  48 + end
  49 + end
  50 +
  51 + include NeedsProfile
  52 +
  53 + before_filter :detect_stuff_by_domain
  54 + before_filter :init_noosfero_plugins
  55 + attr_reader :environment
  56 +
  57 + before_filter :load_terminology
  58 +
  59 + # declares that the given <tt>actions</tt> cannot be accessed by other HTTP
  60 + # method besides POST.
  61 + def self.post_only(actions, redirect = { :action => 'index'})
  62 + verify :method => :post, :only => actions, :redirect_to => redirect
  63 + end
  64 +
  65 + helper_method :current_person, :current_person
  66 +
  67 + protected
  68 +
  69 + def change_pg_schema
  70 + if Noosfero::MultiTenancy.on? and ActiveRecord::Base.postgresql?
  71 + Noosfero::MultiTenancy.db_by_host = request.host
  72 + end
  73 + end
  74 +
  75 + def boxes_editor?
  76 + false
  77 + end
  78 +
  79 + def content_editor?
  80 + false
  81 + end
  82 +
  83 +
  84 + def user
  85 + current_user.person if logged_in?
  86 + end
  87 +
  88 + alias :current_person :user
  89 +
  90 + # TODO: move this logic somewhere else (Domain class?)
  91 + def detect_stuff_by_domain
  92 + @domain = Domain.find_by_name(request.host)
  93 + if @domain.nil?
  94 + @environment = Environment.default
  95 + if @environment.nil? && Rails.env.development?
  96 + # This should only happen in development ...
  97 + @environment = Environment.create!(:name => "Noosfero", :is_default => true)
  98 + end
  99 + else
  100 + @environment = @domain.environment
  101 + @profile = @domain.profile
  102 + end
  103 + end
  104 +
  105 + def init_noosfero_plugins
  106 + @plugins = Noosfero::Plugin::Manager.new(self)
  107 + @plugins.each do |plugin|
  108 + prepend_view_path(plugin.class.view_path)
  109 + end
  110 + init_noosfero_plugins_controller_filters
  111 + end
  112 +
  113 + # This is a generic method that initialize any possible filter defined by a
  114 + # plugin to the current controller being initialized.
  115 + def init_noosfero_plugins_controller_filters
  116 + @plugins.each do |plugin|
  117 + plugin.send(self.class.name.underscore + '_filters').each do |plugin_filter|
  118 + self.class.send(plugin_filter[:type], plugin.class.name.underscore + '_' + plugin_filter[:method_name], (plugin_filter[:options] || {}))
  119 + self.class.send(:define_method, plugin.class.name.underscore + '_' + plugin_filter[:method_name], plugin_filter[:block])
  120 + end
  121 + end
  122 + end
  123 +
  124 + def load_terminology
  125 + # cache terminology for performance
  126 + @@terminology_cache ||= {}
  127 + @@terminology_cache[environment.id] ||= environment.terminology
  128 + Noosfero.terminology = @@terminology_cache[environment.id]
  129 + end
  130 +
  131 + def render_not_found(path = nil)
  132 + @no_design_blocks = true
  133 + @path ||= request.path
  134 + render :template => 'shared/not_found.rhtml', :status => 404, :layout => get_layout
  135 + end
  136 + alias :render_404 :render_not_found
  137 +
  138 + def render_access_denied(message = nil, title = nil)
  139 + @no_design_blocks = true
  140 + @message = message
  141 + @title = title
  142 + render :template => 'shared/access_denied.rhtml', :status => 403
  143 + end
  144 +
  145 + def load_category
  146 + unless params[:category_path].blank?
  147 + path = params[:category_path].join('/')
  148 + @category = environment.categories.find_by_path(path)
  149 + if @category.nil?
  150 + render_not_found(path)
  151 + end
  152 + end
  153 + end
  154 +
  155 +end
... ...
app/controllers/box_organizer_controller.rb
... ... @@ -82,7 +82,6 @@ class BoxOrganizerController &lt; ApplicationController
82 82 def save
83 83 @block = boxes_holder.blocks.find(params[:id])
84 84 @block.update_attributes(params[:block])
85   - expire_timeout_fragment(@block.cache_key)
86 85 redirect_to :action => 'index'
87 86 end
88 87  
... ... @@ -93,7 +92,6 @@ class BoxOrganizerController &lt; ApplicationController
93 92 def remove
94 93 @block = Block.find(params[:id])
95 94 if @block.destroy
96   - expire_timeout_fragment(@block.cache_key)
97 95 redirect_to :action => 'index'
98 96 else
99 97 session[:notice] = _('Failed to remove block')
... ...
app/controllers/my_profile/cms_controller.rb
... ... @@ -23,15 +23,6 @@ class CmsController &lt; MyProfileController
23 23 profile.articles.find(c.params[:id]).allow_post_content?(user)
24 24 end
25 25  
26   - alias :check_ssl_orig :check_ssl
27   - # Redefines the SSL checking to avoid requiring SSL when creating the "New
28   - # publication" button on article's public view.
29   - def check_ssl
30   - if ((params[:action] == 'new') && (!request.xhr?)) || (params[:action] != 'new')
31   - check_ssl_orig
32   - end
33   - end
34   -
35 26 def boxes_holder
36 27 profile
37 28 end
... ... @@ -59,7 +50,7 @@ class CmsController &lt; MyProfileController
59 50 end
60 51  
61 52 def special_article_types
62   - [Folder, Blog, UploadedFile, Forum, Gallery, RssFeed]
  53 + [Folder, Blog, UploadedFile, Forum, Gallery, RssFeed] + @plugins.dispatch(:content_types)
63 54 end
64 55  
65 56 def view
... ... @@ -320,10 +311,6 @@ class CmsController &lt; MyProfileController
320 311 end
321 312 end
322 313  
323   - def maybe_ssl(url)
324   - [url, url.sub('https:', 'http:')]
325   - end
326   -
327 314 def valid_article_type?(type)
328 315 (available_article_types + special_article_types).map {|item| item.name}.include?(type)
329 316 end
... ... @@ -366,7 +353,7 @@ class CmsController &lt; MyProfileController
366 353 }
367 354 end.to_json
368 355 end
369   -
  356 +
370 357 def content_editor?
371 358 true
372 359 end
... ...
app/controllers/my_profile/tasks_controller.rb
... ... @@ -33,12 +33,14 @@ class TasksController &lt; MyProfileController
33 33 end
34 34 end
35 35  
  36 + url = { :action => 'index' }
36 37 if failed.blank?
37 38 session[:notice] = _("All decisions were applied successfully.")
38 39 else
39 40 session[:notice] = _("Some decisions couldn't be applied.")
  41 + url[:failed] = failed
40 42 end
41   - redirect_to params.merge!(:action => 'index', :failed => failed)
  43 + redirect_to url
42 44 end
43 45  
44 46 def new
... ...
app/controllers/my_profile_controller.rb
... ... @@ -2,7 +2,6 @@ class MyProfileController &lt; ApplicationController
2 2  
3 3 needs_profile
4 4  
5   - require_ssl
6 5  
7 6 before_filter :login_required
8 7  
... ...
app/controllers/public/account_controller.rb
... ... @@ -2,8 +2,6 @@ class AccountController &lt; ApplicationController
2 2  
3 3 no_design_blocks
4 4  
5   - require_ssl :except => [ :login_popup, :logout_popup, :profile_details ]
6   -
7 5 before_filter :login_required, :only => [:activation_question, :accept_terms, :activate_enterprise]
8 6 before_filter :redirect_if_logged_in, :only => [:login, :signup]
9 7  
... ... @@ -95,7 +93,6 @@ class AccountController &lt; ApplicationController
95 93 if logged_in?
96 94 self.current_user.forget_me
97 95 end
98   - cookies.delete :auth_token
99 96 reset_session
100 97 session[:notice] = _("You have been logged out.")
101 98 redirect_to :controller => 'home', :action => 'index'
... ... @@ -245,7 +242,7 @@ class AccountController &lt; ApplicationController
245 242 session[:notice] = nil # consume the notice
246 243 end
247 244  
248   - @plugins.enabled_plugins.each { |plugin| user_data.merge!(plugin.user_data_extras) }
  245 + @plugins.each { |plugin| user_data.merge!(plugin.user_data_extras) }
249 246  
250 247 render :text => user_data.to_json, :layout => false, :content_type => "application/javascript"
251 248 end
... ...
app/controllers/public/content_viewer_controller.rb
... ... @@ -31,14 +31,6 @@ class ContentViewerController &lt; ApplicationController
31 31 end
32 32 end
33 33  
34   - if !@page.public? && !request.ssl?
35   - return if redirect_to_ssl
36   - end
37   -
38   - if @page.public?
39   - return unless avoid_ssl
40   - end
41   -
42 34 if !@page.display_to?(user)
43 35 if profile.display_info_to?(user) || !profile.visible?
44 36 message = _('You are not allowed to view this content. You can contact the owner of this profile to request access then.')
... ... @@ -119,7 +111,11 @@ class ContentViewerController &lt; ApplicationController
119 111 def add_comment
120 112 @comment.author = user if logged_in?
121 113 @comment.article = @page
  114 + @comment.ip_address = request.remote_ip
  115 + plugins_filter_comment(@comment)
  116 + return if @comment.rejected?
122 117 if (pass_without_comment_captcha? || verify_recaptcha(:model => @comment, :message => _('Please type the words correctly'))) && @comment.save
  118 + plugins_comment_saved(@comment)
123 119 @page.touch
124 120 @comment = nil # clear the comment form
125 121 redirect_to :action => 'view_page', :profile => params[:profile], :page => @page.explode_path, :view => params[:view]
... ... @@ -128,6 +124,18 @@ class ContentViewerController &lt; ApplicationController
128 124 end
129 125 end
130 126  
  127 + def plugins_filter_comment(comment)
  128 + @plugins.each do |plugin|
  129 + plugin.filter_comment(comment)
  130 + end
  131 + end
  132 +
  133 + def plugins_comment_saved(comment)
  134 + @plugins.each do |plugin|
  135 + plugin.comment_saved(comment)
  136 + end
  137 + end
  138 +
131 139 def pass_without_comment_captcha?
132 140 logged_in? && !environment.enabled?('captcha_for_logged_users')
133 141 end
... ...
app/controllers/public/enterprise_registration_controller.rb
1 1 class EnterpriseRegistrationController < ApplicationController
2 2  
3   - require_ssl
4 3  
5 4 before_filter :login_required
6 5  
... ...
app/controllers/public/profile_controller.rb
... ... @@ -23,7 +23,7 @@ class ProfileController &lt; PublicController
23 23  
24 24 def tags
25 25 @tags_cache_key = "tags_profile_#{profile.id.to_s}"
26   - if is_cache_expired?(@tags_cache_key, true)
  26 + if is_cache_expired?(@tags_cache_key)
27 27 @tags = profile.article_tags
28 28 end
29 29 end
... ... @@ -31,7 +31,7 @@ class ProfileController &lt; PublicController
31 31 def content_tagged
32 32 @tag = params[:id]
33 33 @tag_cache_key = "tag_#{CGI.escape(@tag.to_s)}_#{profile.id.to_s}_page_#{params[:npage]}"
34   - if is_cache_expired?(@tag_cache_key, true)
  34 + if is_cache_expired?(@tag_cache_key)
35 35 @tagged = profile.find_tagged_with(@tag).paginate(:per_page => 20, :page => params[:npage])
36 36 end
37 37 end
... ...
app/controllers/public/search_controller.rb
... ... @@ -207,7 +207,7 @@ class SearchController &lt; PublicController
207 207  
208 208 def tags
209 209 @tags_cache_key = "tags_env_#{environment.id.to_s}"
210   - if is_cache_expired?(@tags_cache_key, true)
  210 + if is_cache_expired?(@tags_cache_key)
211 211 @tags = environment.tag_counts
212 212 end
213 213 end
... ... @@ -215,7 +215,7 @@ class SearchController &lt; PublicController
215 215 def tag
216 216 @tag = params[:tag]
217 217 @tag_cache_key = "tag_#{CGI.escape(@tag.to_s)}_env_#{environment.id.to_s}_page_#{params[:npage]}"
218   - if is_cache_expired?(@tag_cache_key, true)
  218 + if is_cache_expired?(@tag_cache_key)
219 219 @tagged = environment.articles.find_tagged_with(@tag).paginate(:per_page => 10, :page => params[:npage])
220 220 end
221 221 end
... ...
app/controllers/public_controller.rb
1 1 class PublicController < ApplicationController
2   - refuse_ssl
3 2 end
... ...
app/helpers/application_helper.rb
  1 +require 'redcloth'
  2 +
1 3 # Methods added to this helper will be available to all templates in the
2 4 # application.
3 5 module ApplicationHelper
... ... @@ -95,7 +97,7 @@ module ApplicationHelper
95 97 text = content_tag('div', button + content_tag('div', content_tag('div', content) + close_button, :class => 'help_message', :id => help_id, :style => 'display: none;'), :class => 'help_box')
96 98  
97 99 unless block.nil?
98   - concat(text, block.binding)
  100 + concat(text)
99 101 end
100 102  
101 103 text
... ... @@ -256,7 +258,7 @@ module ApplicationHelper
256 258 end
257 259  
258 260 def button_bar(options = {}, &block)
259   - concat(content_tag('div', capture(&block) + tag('br', :style => 'clear: left;'), { :class => 'button-bar' }.merge(options)), block.binding)
  261 + concat(content_tag('div', capture(&block) + tag('br', :style => 'clear: left;'), { :class => 'button-bar' }.merge(options)))
260 262 end
261 263  
262 264 VIEW_EXTENSIONS = %w[.rhtml .html.erb]
... ... @@ -758,7 +760,7 @@ module ApplicationHelper
758 760  
759 761 # Should be on the forms_helper file but when its there the translation of labels doesn't work
760 762 class NoosferoFormBuilder < ActionView::Helpers::FormBuilder
761   - extend ActionView::Helpers::TagHelper
  763 + extend ActionView::Helpers::TagHelper
762 764  
763 765 def self.output_field(text, field_html, field_id = nil)
764 766 # try to guess an id if none given
... ... @@ -780,7 +782,7 @@ module ApplicationHelper
780 782 (field_helpers - %w(hidden_field)).each do |selector|
781 783 src = <<-END_SRC
782 784 def #{selector}(field, *args, &proc)
783   - text = object.class.human_attribute_name(field.to_s)
  785 + text = object.class.respond_to?(:human_attribute_name) && object.class.human_attribute_name(field.to_s) || field.to_s.humanize
784 786 NoosferoFormBuilder::output_field(text, super)
785 787 end
786 788 END_SRC
... ... @@ -882,7 +884,7 @@ module ApplicationHelper
882 884 end
883 885  
884 886 if block
885   - concat(result, block.binding)
  887 + concat(result)
886 888 end
887 889  
888 890 result
... ... @@ -914,18 +916,11 @@ module ApplicationHelper
914 916  
915 917 def login_url
916 918 options = Noosfero.url_options.merge({ :controller => 'account', :action => 'login' })
917   - if environment.enable_ssl && (ENV['RAILS_ENV'] != 'development')
918   - options.merge!(:protocol => 'https://', :host => ssl_hostname)
919   - end
920 919 url_for(options)
921 920 end
922 921  
923   - def ssl_hostname
924   - environment.default_hostname
925   - end
926   -
927 922 def base_url
928   - environment.top_url(request.ssl?)
  923 + environment.top_url
929 924 end
930 925  
931 926 def helper_for_article(article)
... ... @@ -1025,7 +1020,7 @@ module ApplicationHelper
1025 1020 options.merge!(:page => params[:npage])
1026 1021 content = article.to_html(options)
1027 1022 content = content.kind_of?(Proc) ? self.instance_eval(&content) : content
1028   - @plugins && @plugins.enabled_plugins.each do |plugin|
  1023 + @plugins && @plugins.each do |plugin|
1029 1024 content = plugin.parse_content(content)
1030 1025 end
1031 1026 content
... ... @@ -1147,7 +1142,7 @@ module ApplicationHelper
1147 1142 end
1148 1143  
1149 1144 def pagination_links(collection, options={})
1150   - options = {:prev_label => '&laquo; ' + _('Previous'), :next_label => _('Next') + ' &raquo;'}.merge(options)
  1145 + options = {:previous_label => '&laquo; ' + _('Previous'), :next_label => _('Next') + ' &raquo;'}.merge(options)
1151 1146 will_paginate(collection, options)
1152 1147 end
1153 1148  
... ... @@ -1238,7 +1233,7 @@ module ApplicationHelper
1238 1233 wrapper = content_tag(:div, capture(&block), :class => 'comment-balloon-content')
1239 1234 (1..8).to_a.reverse.each { |i| wrapper = content_tag(:div, wrapper, :class => "comment-wrapper-#{i}") }
1240 1235 classes = options.delete(:class) || options.delete("class") || ''
1241   - concat(content_tag('div', wrapper + tag('br', :style => 'clear: both;'), { :class => 'comment-balloon ' + classes.to_s }.merge(options)), block.binding)
  1236 + concat(content_tag('div', wrapper + tag('br', :style => 'clear: both;'), { :class => 'comment-balloon ' + classes.to_s }.merge(options)))
1242 1237 end
1243 1238  
1244 1239 def display_source_info(page)
... ... @@ -1318,6 +1313,14 @@ module ApplicationHelper
1318 1313 end
1319 1314 end
1320 1315  
  1316 + def cache_timeout(key, timeout, &block)
  1317 + cache(key, { :expires_in => timeout }, &block)
  1318 + end
  1319 +
  1320 + def is_cache_expired?(key)
  1321 + !cache_store.fetch(ActiveSupport::Cache.expand_cache_key(key, :controller))
  1322 + end
  1323 +
1321 1324 def render_tabs(tabs)
1322 1325 titles = tabs.inject(''){ |result, tab| result << content_tag(:li, link_to(tab[:title], '#'+tab[:id]), :class => 'tab') }
1323 1326 contents = tabs.inject(''){ |result, tab| result << content_tag(:div, tab[:content], :id => tab[:id]) }
... ...
app/helpers/blog_helper.rb
... ... @@ -17,7 +17,7 @@ module BlogHelper
17 17 def list_posts(articles, format = 'full')
18 18 pagination = will_paginate(articles, {
19 19 :param_name => 'npage',
20   - :prev_label => _('&laquo; Newer posts'),
  20 + :previous_label => _('&laquo; Newer posts'),
21 21 :next_label => _('Older posts &raquo;')
22 22 })
23 23 content = []
... ...
app/helpers/boxes_helper.rb
... ... @@ -99,7 +99,7 @@ module BoxesHelper
99 99 unless block.visible?
100 100 options[:title] = _("This block is invisible. Your visitors will not see it.")
101 101 end
102   - @controller.send(:content_editor?) || @plugins.enabled_plugins.each do |plugin|
  102 + @controller.send(:content_editor?) || @plugins.each do |plugin|
103 103 result = plugin.parse_content(result)
104 104 end
105 105 box_decorator.block_target(block.box, block) +
... ...
app/helpers/cms_helper.rb
... ... @@ -16,7 +16,7 @@ module CmsHelper
16 16 end
17 17  
18 18 def pagination_links(collection, options={})
19   - options = {:prev_label => '&laquo; ', :next_label => ' &raquo;', :page_links => false}.merge(options)
  19 + options = {:previous_label => '&laquo; ', :next_label => ' &raquo;', :page_links => false}.merge(options)
20 20 will_paginate(collection, options)
21 21 end
22 22  
... ...
app/helpers/content_viewer_helper.rb
... ... @@ -55,7 +55,7 @@ module ContentViewerHelper
55 55 "http://www.facebook.com/sharer.php?s=100&p[title]=%{title}&p[summary]=%{summary}&p[url]=%{url}&p[images][0]=%{image}" % {
56 56 :title => CGI.escape(article.title),
57 57 :url => CGI.escape(url_for(article.url)),
58   - :summary => CGI.escape(truncate(strip_tags(article.body.to_s), 300)),
  58 + :summary => CGI.escape(truncate(strip_tags(article.body.to_s), :length => 300)),
59 59 :image => CGI.escape(article.body_images_paths.first.to_s)
60 60 }
61 61 end
... ...
app/helpers/forms_helper.rb
... ... @@ -14,9 +14,9 @@ module FormsHelper
14 14  
15 15 def labelled_check_box( human_name, name, value = "1", checked = false, options = {} )
16 16 options[:id] ||= 'checkbox-' + FormsHelper.next_id_number
17   - check_box_tag( name, value, checked, options ) +
18   - content_tag( 'label', human_name, :for => options[:id] ) +
19   - hidden_field_tag(name, '0')
  17 + hidden_field_tag(name, '0') +
  18 + check_box_tag( name, value, checked, options ) +
  19 + content_tag( 'label', human_name, :for => options[:id] )
20 20 end
21 21  
22 22 def labelled_text_field( human_name, name, value=nil, options={} )
... ...
app/helpers/forum_helper.rb
... ... @@ -11,7 +11,7 @@ module ForumHelper
11 11 def list_forum_posts(articles)
12 12 pagination = will_paginate(articles, {
13 13 :param_name => 'npage',
14   - :prev_label => _('&laquo; Newer posts'),
  14 + :previous_label => _('&laquo; Newer posts'),
15 15 :next_label => _('Older posts &raquo;')
16 16 })
17 17 content = [content_tag('tr',
... ...
app/helpers/manage_products_helper.rb
... ... @@ -55,7 +55,7 @@ module ManageProductsHelper
55 55 def options_for_select_categories(categories, selected = nil)
56 56 categories.sort_by{|cat| cat.name.transliterate}.map do |category|
57 57 selected_attribute = selected.nil? ? '' : (category == selected ? "selected='selected'" : '')
58   - "<option value='#{category.id}' title='#{category.name}' #{selected_attribute}>#{truncate(category.name, 33) + (category.leaf? ? '': ' &raquo;')}</option>"
  58 + "<option value='#{category.id}' title='#{category.name}' #{selected_attribute}>#{truncate(category.name, :length => 33) + (category.leaf? ? '': ' &raquo;')}</option>"
59 59 end.join("\n")
60 60 end
61 61  
... ...
app/helpers/profile_editor_helper.rb
... ... @@ -137,8 +137,8 @@ module ProfileEditorHelper
137 137 content_tag(
138 138 'div',
139 139 capture(&block) + '<br style="clear:left;"/>&nbsp;',
140   - :class => 'control-panel'),
141   - block.binding)
  140 + :class => 'control-panel')
  141 + )
142 142 end
143 143  
144 144 def control_panel_button(title, icon, url)
... ...
app/helpers/sweeper_helper.rb
... ... @@ -4,9 +4,7 @@ module SweeperHelper
4 4 ActionController::Base.new().expire_fragment(*args)
5 5 end
6 6  
7   - def expire_timeout_fragment(*args)
8   - ActionController::Base.new().expire_timeout_fragment(*args)
9   - end
  7 + alias :expire_timeout_fragment :expire_fragment
10 8  
11 9 def expire_friends(profile)
12 10 # public friends page
... ...
app/helpers/tags_helper.rb
... ... @@ -50,7 +50,7 @@ module TagsHelper
50 50 style = ""+
51 51 "font-size: #{ (v * delta).round + min_size }px;"+
52 52 "top: #{ -(delta/2) - (v * (delta/2)).round }px;"
53   - destination = url.kind_of?(Hash) ? url_for(url.merge(tagname_option => tag)) : (url.to_s + tag)
  53 + destination = url.merge(tagname_option => tag)
54 54  
55 55 if options[:show_count]
56 56 display_count = options[:show_count] ? "<small><sup>(#{count})</sup></small>" : ""
... ...
app/models/article.rb
... ... @@ -13,7 +13,7 @@ class Article &lt; ActiveRecord::Base
13 13 validates_presence_of :profile_id, :name
14 14 validates_presence_of :slug, :path, :if => lambda { |article| !article.name.blank? }
15 15  
16   - validates_uniqueness_of :slug, :scope => ['profile_id', 'parent_id'], :message => N_('<!-- %{fn} -->The title (article name) is already being used by another article, please use another title.'), :if => lambda { |article| !article.slug.blank? }
  16 + validates_uniqueness_of :slug, :scope => ['profile_id', 'parent_id'], :message => N_('The title (article name) is already being used by another article, please use another title.'), :if => lambda { |article| !article.slug.blank? }
17 17  
18 18 belongs_to :last_changed_by, :class_name => 'Person', :foreign_key => 'last_changed_by_id'
19 19  
... ... @@ -34,7 +34,7 @@ class Article &lt; ActiveRecord::Base
34 34 before_destroy :rotate_translations
35 35  
36 36 before_create do |article|
37   - article.published_at = article.created_at if article.published_at.nil?
  37 + article.published_at ||= Time.now
38 38 if article.reference_article && !article.parent
39 39 parent = article.reference_article.parent
40 40 if parent && parent.blog? && article.profile.has_blog?
... ... @@ -233,7 +233,7 @@ class Article &lt; ActiveRecord::Base
233 233  
234 234 include ActionView::Helpers::TextHelper
235 235 def short_title
236   - truncate self.title, 15, '...'
  236 + truncate self.title, :length => 15, :omission => '...'
237 237 end
238 238  
239 239 def belongs_to_blog?
... ... @@ -514,7 +514,7 @@ class Article &lt; ActiveRecord::Base
514 514 end
515 515  
516 516 def short_lead
517   - truncate sanitize_html(self.lead), 170, '...'
  517 + truncate sanitize_html(self.lead), :length => 170, :omission => '...'
518 518 end
519 519  
520 520 def creator
... ...
app/models/blog.rb
... ... @@ -68,7 +68,7 @@ class Blog &lt; Folder
68 68 settings_items :visualization_format, :type => :string, :default => 'full'
69 69 validates_inclusion_of :visualization_format, :in => [ 'full', 'short' ], :if => :visualization_format
70 70  
71   - settings_items :display_posts_in_current_language, :type => :boolean, :default => true
  71 + settings_items :display_posts_in_current_language, :type => :boolean, :default => false
72 72  
73 73 alias :display_posts_in_current_language? :display_posts_in_current_language
74 74  
... ...
app/models/category.rb
1 1 class Category < ActiveRecord::Base
2 2  
3   - validates_exclusion_of :slug, :in => [ 'index' ], :message => N_('%{fn} cannot be like that.')
  3 + validates_exclusion_of :slug, :in => [ 'index' ], :message => N_('%{fn} cannot be like that.').fix_i18n
4 4 validates_presence_of :name, :environment_id
5   - validates_uniqueness_of :slug,:scope => [ :environment_id, :parent_id ], :message => N_('%{fn} is already being used by another category.')
  5 + validates_uniqueness_of :slug,:scope => [ :environment_id, :parent_id ], :message => N_('%{fn} is already being used by another category.').fix_i18n
6 6 belongs_to :environment
7 7  
8 8 validates_inclusion_of :display_color, :in => [ 1, 2, 3, 4, nil ]
9   - validates_uniqueness_of :display_color, :scope => :environment_id, :if => (lambda { |cat| ! cat.display_color.nil? }), :message => N_('%{fn} was already assigned to another category.')
  9 + validates_uniqueness_of :display_color, :scope => :environment_id, :if => (lambda { |cat| ! cat.display_color.nil? }), :message => N_('%{fn} was already assigned to another category.').fix_i18n
10 10  
11 11 # Finds all top level categories for a given environment.
12 12 named_scope :top_level_for, lambda { |environment|
... ...
app/models/change_password.rb
... ... @@ -30,10 +30,10 @@ class ChangePassword &lt; Task
30 30 unless data.login.blank? || data.email.blank?
31 31 user = User.find_by_login_and_environment_id(data.login, data.environment_id)
32 32 if user.nil?
33   - data.errors.add(:login, _('%{fn} is not a valid username.'))
  33 + data.errors.add(:login, _('%{fn} is not a valid username.').fix_i18n)
34 34 else
35 35 if user.email != data.email
36   - data.errors.add(:email, _('%{fn} is invalid.'))
  36 + data.errors.add(:email)
37 37 end
38 38 end
39 39 end
... ...
app/models/comment.rb
... ... @@ -17,7 +17,7 @@ class Comment &lt; ActiveRecord::Base
17 17 validates_presence_of :author_id, :if => (lambda { |rec| rec.name.blank? && rec.email.blank? })
18 18 validates_each :name do |rec,attribute,value|
19 19 if rec.author_id && (!rec.name.blank? || !rec.email.blank?)
20   - rec.errors.add(:name, _('%{fn} can only be informed for unauthenticated authors'))
  20 + rec.errors.add(:name, _('%{fn} can only be informed for unauthenticated authors').fix_i18n)
21 21 end
22 22 end
23 23  
... ... @@ -126,4 +126,12 @@ class Comment &lt; ActiveRecord::Base
126 126 end
127 127 end
128 128  
  129 + def rejected?
  130 + @rejected
  131 + end
  132 +
  133 + def reject!
  134 + @rejected = true
  135 + end
  136 +
129 137 end
... ...
app/models/community.rb
... ... @@ -34,7 +34,7 @@ class Community &lt; Organization
34 34 super
35 35 self.required_fields.each do |field|
36 36 if self.send(field).blank?
37   - self.errors.add(field, _('%{fn} can\'t be blank'))
  37 + self.errors.add_on_blank(field)
38 38 end
39 39 end
40 40 end
... ...
app/models/create_community.rb
... ... @@ -16,7 +16,7 @@ class CreateCommunity &lt; Task
16 16 def validate
17 17 self.environment.required_community_fields.each do |field|
18 18 if self.send(field).blank?
19   - self.errors.add(field, _('%{fn} can\'t be blank'))
  19 + self.errors.add_on_blank(field)
20 20 end
21 21 end
22 22 end
... ...
app/models/create_enterprise.rb
... ... @@ -40,12 +40,12 @@ class CreateEnterprise &lt; Task
40 40  
41 41 if self.region && self.target
42 42 unless self.region.validators.include?(self.target) || self.target_type == "Environment"
43   - self.errors.add(:target, '%{fn} is not a validator for the chosen region')
  43 + self.errors.add(:target, _('%{fn} is not a validator for the chosen region').fix_i18n)
44 44 end
45 45 end
46 46  
47 47 if self.status != Task::Status::CANCELLED && self.identifier && Profile.exists?(:identifier => self.identifier)
48   - self.errors.add(:identifier, '%{fn} is already being as identifier by another enterprise, organization or person.')
  48 + self.errors.add(:identifier, _('%{fn} is already being as identifier by another enterprise, organization or person.').fix_i18n)
49 49 end
50 50 end
51 51  
... ...
app/models/domain.rb
... ... @@ -10,14 +10,14 @@ class Domain &lt; ActiveRecord::Base
10 10  
11 11 # <tt>name</tt> must be a sequence of word characters (a to z, plus 0 to 9,
12 12 # plus '_'). Letters must be lowercase
13   - validates_format_of :name, :with => /^([a-z0-9_-]+\.)+[a-z0-9_-]+$/, :message => N_('%{fn} must be composed only of lowercase latters (a to z), numbers (0 to 9), "_" and "-"')
  13 + validates_format_of :name, :with => /^([a-z0-9_-]+\.)+[a-z0-9_-]+$/, :message => N_('%{fn} must be composed only of lowercase latters (a to z), numbers (0 to 9), "_" and "-"').fix_i18n
14 14  
15 15 # checks validations that could not be expressed using Rails' predefined
16 16 # validations. In particular:
17 17 # * <tt>name</tt> must not start with 'www.'
18 18 def validate
19 19 if self.name =~ /^www\./
20   - self.errors.add(:name, _('%{fn} must not start with www.'))
  20 + self.errors.add(:name, _('%{fn} must not start with www.').fix_i18n)
21 21 end
22 22 end
23 23  
... ...
app/models/enterprise.rb
... ... @@ -46,7 +46,7 @@ class Enterprise &lt; Organization
46 46 super
47 47 self.required_fields.each do |field|
48 48 if self.send(field).blank?
49   - self.errors.add(field, _("%{fn} can't be blank"))
  49 + self.errors.add_on_blank(field)
50 50 end
51 51 end
52 52 end
... ... @@ -76,7 +76,11 @@ class Enterprise &lt; Organization
76 76 end
77 77  
78 78 after_save do |e|
79   - e.products.each{ |p| p.enterprise_updated(e) }
  79 + e.delay.update_products_position
  80 + end
  81 +
  82 + def update_products_position
  83 + products.each{ |p| p.enterprise_updated(self) }
80 84 end
81 85  
82 86 def closed?
... ...
app/models/environment.rb
... ... @@ -223,7 +223,6 @@ class Environment &lt; ActiveRecord::Base
223 223 settings_items :layout_template, :type => String, :default => 'default'
224 224 settings_items :homepage, :type => String
225 225 settings_items :description, :type => String, :default => '<div style="text-align: center"><a href="http://noosfero.org/"><img src="/images/noosfero-network.png" alt="Noosfero"/></a></div>'
226   - settings_items :enable_ssl
227 226 settings_items :local_docs, :type => Array, :default => []
228 227 settings_items :news_amount_by_folder, :type => Integer, :default => 4
229 228 settings_items :help_message_to_add_enterprise, :type => String, :default => ''
... ... @@ -564,8 +563,8 @@ class Environment &lt; ActiveRecord::Base
564 563 domain
565 564 end
566 565  
567   - def top_url(ssl = false)
568   - protocol = (ssl ? 'https' : 'http')
  566 + def top_url
  567 + protocol = 'http'
569 568 result = "#{protocol}://#{default_hostname}"
570 569 if Noosfero.url_options.has_key?(:port)
571 570 result << ':' << Noosfero.url_options[:port].to_s
... ...
app/models/environment_finder.rb
... ... @@ -53,7 +53,7 @@ class EnvironmentFinder
53 53 # SECURITY no risk of SQL injection, since product_category_ids comes from trusted source
54 54 @environment.send(asset).find_by_contents(query, ferret_options, options.merge({:include => 'product_categorizations', :conditions => 'product_categorizations.category_id = (%s)' % product_category.id }))
55 55 elsif product_category && asset == :enterprises
56   - @environment.send(asset).find_by_contents(query, ferret_options, options.merge(:joins => 'inner join product_categorizations on (product_categorizations.product_id = products.id)', :include => 'products', :conditions => "product_categorizations.category_id = (#{product_category.id})"))
  56 + @environment.send(asset).find_by_contents(query, ferret_options, options.merge(:joins => 'inner join products on products.enterprise_id = profiles.id inner join product_categorizations on (product_categorizations.product_id = products.id)', :conditions => "product_categorizations.category_id = (#{product_category.id})"))
57 57 else
58 58 @environment.send(asset).find_by_contents(query, ferret_options, options)
59 59 end
... ...
app/models/event.rb
... ... @@ -22,7 +22,7 @@ class Event &lt; Article
22 22  
23 23 validates_each :start_date do |event,field,value|
24 24 if event.end_date && event.start_date && event.start_date > event.end_date
25   - event.errors.add(:start_date, _('%{fn} cannot come before end date.'))
  25 + event.errors.add(:start_date, _('%{fn} cannot come before end date.').fix_i18n)
26 26 end
27 27 end
28 28  
... ...
app/models/image.rb
... ... @@ -17,7 +17,7 @@ class Image &lt; ActiveRecord::Base
17 17 :icon => '20x20!' },
18 18 :max_size => 5.megabytes # remember to update validate message below
19 19  
20   - validates_attachment :size => N_("%{fn} of uploaded file was larger than the maximum size of 5.0 MB")
  20 + validates_attachment :size => N_("%{fn} of uploaded file was larger than the maximum size of 5.0 MB").fix_i18n
21 21  
22 22 delay_attachment_fu_thumbnails
23 23  
... ...
app/models/person.rb
... ... @@ -121,6 +121,12 @@ class Person &lt; Profile
121 121  
122 122 validates_multiparameter_assignments
123 123  
  124 + validates_each :birth_date do |record,attr,value|
  125 + if value && value.year == 1
  126 + record.errors.add(attr)
  127 + end
  128 + end
  129 +
124 130 def self.fields
125 131 FIELDS
126 132 end
... ... @@ -130,7 +136,7 @@ class Person &lt; Profile
130 136 self.required_fields.each do |field|
131 137 if self.send(field).blank?
132 138 unless (field == 'custom_area_of_study' && self.area_of_study != 'Others') || (field == 'custom_formation' && self.formation != 'Others')
133   - self.errors.add(field, _('%{fn} is mandatory'))
  139 + self.errors.add_on_blank(field)
134 140 end
135 141 end
136 142 end
... ... @@ -192,7 +198,7 @@ class Person &lt; Profile
192 198  
193 199 validates_each :email, :on => :update do |record,attr,value|
194 200 if User.find(:first, :conditions => ['email = ? and id != ? and environment_id = ?', value, record.user.id, record.environment.id])
195   - record.errors.add(attr, _('%{fn} is already used by other user'))
  201 + record.errors.add(attr, _('%{fn} is already used by other user').fix_i18n)
196 202 end
197 203 end
198 204  
... ...
app/models/profile.rb
... ... @@ -611,7 +611,7 @@ private :generate_url, :url_options
611 611 include ActionView::Helpers::TextHelper
612 612 def short_name(chars = 40)
613 613 if self[:nickname].blank?
614   - truncate self.name, chars, '...'
  614 + truncate self.name, :length => chars, :omission => '...'
615 615 else
616 616 self[:nickname]
617 617 end
... ...
app/models/uploaded_file.rb
... ... @@ -50,7 +50,7 @@ class UploadedFile &lt; Article
50 50 :thumbnail_class => Thumbnail,
51 51 :max_size => 5.megabytes # remember to update validate message below
52 52  
53   - validates_attachment :size => N_("%{fn} of uploaded file was larger than the maximum size of 5.0 MB")
  53 + validates_attachment :size => N_("%{fn} of uploaded file was larger than the maximum size of 5.0 MB").fix_i18n
54 54  
55 55 delay_attachment_fu_thumbnails
56 56  
... ...
app/models/user.rb
... ... @@ -100,7 +100,7 @@ class User &lt; ActiveRecord::Base
100 100 before_save :encrypt_password
101 101 validates_format_of :email, :with => Noosfero::Constants::EMAIL_FORMAT, :if => (lambda {|user| !user.email.blank?})
102 102  
103   - validates_inclusion_of :terms_accepted, :in => [ '1' ], :if => lambda { |u| ! u.terms_of_use.blank? }, :message => N_('%{fn} must be checked in order to signup.')
  103 + validates_inclusion_of :terms_accepted, :in => [ '1' ], :if => lambda { |u| ! u.terms_of_use.blank? }, :message => N_('%{fn} must be checked in order to signup.').fix_i18n
104 104  
105 105 # Authenticates a user by their login name and unencrypted password. Returns the user or nil.
106 106 def self.authenticate(login, password, environment = nil)
... ...
app/sweepers/article_sweeper.rb
... ... @@ -15,7 +15,7 @@ protected
15 15 def expire_caches(article)
16 16 article.hierarchy.each do |a|
17 17 if a != article
18   - a.touch
  18 + a.update_attribute(:updated_at, Time.now)
19 19 end
20 20 end
21 21 blocks = article.profile.blocks
... ...
app/sweepers/block_sweeper.rb 0 → 100644
... ... @@ -0,0 +1,10 @@
  1 +class BlockSweeper < ActiveRecord::Observer
  2 +
  3 + include SweeperHelper
  4 + observe :block
  5 +
  6 + def after_save(block)
  7 + expire_fragment(block.cache_key)
  8 + end
  9 +
  10 +end
... ...
app/views/account/signup.rhtml
1 1 <% if @register_pending %>
2 2 <div id='thanks-for-signing'>
3   - <%= _("<h1>Welcome to %s!</h1>
4   - <h3>Thanks for signing up, we're thrilled to have you on our social network!</h3>
5   - <p>Firstly, some tips for getting started:</p>
6   - <h4>Confirm your account!</h4>
7   - <p>You should receive a welcome email from us shortly. Please take a second to follow the link within to confirm your account.</p>
8   - <p>You won't appear as a <a href=\"%s\" target=\"_blank\">user</a> until your account is confirmed.</p>
9   - <h4>What to do next?</h4>
10   - <p><a href=\"/doc/user/editing-person-info\" target=\"_blank\">Customize your profile</a>. Upload an avatar and let your friends find you easily :)</p>
11   - <p>Learn the guidelines. Read the <a href=\"/doc\" target=\"_blank\">Documentation</a> for more details on how to use new social network!</p>
12   - <p><a href=\"/doc/user/invite-contacts\" target=\"_blank\">Invite and find</a> your Gmail, Yahoo and Hotmail contacts!</p>
13   - <p>Start exploring and Have fun!</p>" % [environment.name, url_for(:controller => :browse, :action => :people, :filter => 'more_recent')]) %>
  3 + <h1><%= _("Welcome to %s!") % environment.name %></h1>
  4 + <h3><%= _("Thanks for signing up, we're thrilled to have you on our social network!") %></h3>
  5 + <p><%= _("Firstly, some tips for getting started:") %></p>
  6 + <h4><%= _("Confirm your account!") %></h4>
  7 + <p><%= _("You should receive a welcome email from us shortly. Please take a second to follow the link within to confirm your account.") %></p>
  8 + <p><%= _("You won't appear as %s until your account is confirmed.") % link_to(_('user'), {:controller => :browse, :action => :people, :filter => 'more_recent'}, :target => '_blank') %></p>
  9 + <h4><%= _("What to do next?") %></h4>
  10 + <p><%= _("%s. Upload an avatar and let your friends find you easily :)") % link_to(_('Customize your profile'), {:controller => 'doc', :section => 'user', :topic => 'editing-person-info'}, :target => '_blank') %></p>
  11 + <p><%= _("Learn the guidelines. Read the %s for more details on how to use this social network!") % link_to(_('Documentation'), {:controller => 'doc'}, :target => '_blank') %></p>
  12 + <p><%= _("%s your Gmail, Yahoo and Hotmail contacts!") % link_to(_('Invite and find'), {:controller => 'doc', :section => 'user', :topic => 'invite-contacts'}, :target => '_blank') %></p>
  13 + <p><%= _("Start exploring and have fun!") %></p>
14 14 </div>
15 15 <% else %>
16 16 <h1><%= _('Sign up for %s!') % environment.name %></h1>
... ...
app/views/admin_panel/index.rhtml
... ... @@ -15,7 +15,7 @@
15 15 <tr><td><%= link_to _('Edit Templates'), :action => 'edit_templates' %></td></tr>
16 16 <tr><td><%= link_to _('Manage Fields'), :controller => 'features', :action => 'manage_fields' %></td></tr>
17 17 <tr><td><%= link_to _('Set Portal'), :action => 'set_portal_community' %></td></tr>
18   - <% @plugins.map(:admin_panel_links).each do |link| %>
  18 + <% @plugins.dispatch(:admin_panel_links).each do |link| %>
19 19 <tr><td><%= link_to link[:title], link[:url] %></td></tr>
20 20 <% end %>
21 21 </table>
... ...
app/views/catalog/index.rhtml
... ... @@ -5,8 +5,8 @@
5 5 <li><h1><%= _('Products/Services') %></h1></li>
6 6  
7 7 <% @products.each do |product| %>
8   - <% extra_content = @plugins.map(:catalog_item_extras, product).collect { |content| instance_eval(&content) } %>
9   - <% extra_content_list = @plugins.map(:catalog_list_item_extras, product).collect { |content| instance_eval(&content) } %>
  8 + <% extra_content = @plugins.dispatch(:catalog_item_extras, product).collect { |content| instance_eval(&content) } %>
  9 + <% extra_content_list = @plugins.dispatch(:catalog_list_item_extras, product).collect { |content| instance_eval(&content) } %>
10 10  
11 11 <li class="product <%= "not-available" unless product.available %>">
12 12 <ul>
... ...
app/views/cms/_blog.rhtml
... ... @@ -68,7 +68,6 @@
68 68 <% enabled = @article.external_feed && @article.external_feed.enabled %>
69 69 <% only_once = @article.external_feed ? @article.external_feed.only_once : true %>
70 70 <%= labelled_check_box(_('Fetch posts from an external feed'), 'article[external_feed_builder][enabled]', 'true', enabled, {:onchange => "$('external-feed-options').toggle()"}) %>
71   - <%= hidden_field_tag 'article[external_feed_builder][enabled]', 'false' %>
72 71 <div id='external-feed-options' style="display: <%= enabled ? 'block' : 'none' %>">
73 72 <%= efeed.hidden_field(:id) %>
74 73 <%= labelled_form_field( _('Feed address'), efeed.text_field(:address) ) %>
... ...
app/views/cms/view.rhtml
... ... @@ -62,4 +62,4 @@
62 62  
63 63 </table>
64 64  
65   -<%= pagination_links @articles, {:param_name => 'npage', :prev_label => '&laquo; ' + _('Previous'), :next_label => _('Next') + ' &raquo;', :page_links => true} %>
  65 +<%= pagination_links @articles, {:param_name => 'npage', :page_links => true} %>
... ...
app/views/content_viewer/view_page.rhtml
... ... @@ -70,23 +70,29 @@
70 70 <%= display_source_info(@page) %>
71 71  
72 72 <div class="comments" id="comments_list">
73   - <% if @page.accept_comments? %>
74   - <h3 <%= 'class="no-comments-yet"' if @comments.size == 0 %>>
75   - <%= number_of_comments(@page) %>
76   - </h3>
77   - <% if @comments_count > 1 %>
78   - <p class="post-comment-button"><a href="#comment_form" onclick="jQuery('#page-comment-form h4').first().trigger('click')"><%= _('Post a comment') %></a></p>
  73 +
  74 + <% if @page.accept_comments? || @comments_count > 0 %>
  75 + <h3 <%= 'class="no-comments-yet"' if @comments_count == 0 %>>
  76 + <%= number_of_comments(@page) %>
  77 + </h3>
  78 + <% end %>
  79 +
  80 + <% if @page.accept_comments? && @comments_count > 1 %>
  81 + <p class="post-comment-button"><a href="#comment_form" onclick="jQuery('#page-comment-form h4').first().trigger('click')"><%= _('Post a comment') %></a></p>
79 82 <% end %>
  83 +
80 84 <ul class="article-comments-list">
81 85 <%= render :partial => 'comment', :collection => @comments %>
82 86 </ul>
83   - <div id="page-comment-form"><%= render :partial => 'comment_form' %></div>
84   - <script type="text/javascript">
85   - jQuery( function() {
86   - jQuery('.article-comment').live('mouseover', function() { jQuery(this).find('.icon-delete:first').show(); });
87   - jQuery('.article-comment').live('mouseout', function() { jQuery(this).find('.icon-delete').hide(); });
88   - });
89   - </script>
  87 +
  88 + <% if @page.accept_comments? %>
  89 + <div id="page-comment-form"><%= render :partial => 'comment_form' %></div>
  90 + <script type="text/javascript">
  91 + jQuery( function() {
  92 + jQuery('.article-comment').live('mouseover', function() { jQuery(this).find('.icon-delete:first').show(); });
  93 + jQuery('.article-comment').live('mouseout', function() { jQuery(this).find('.icon-delete').hide(); });
  94 + });
  95 + </script>
90 96 <% end %>
91 97 </div><!-- end class="comments" -->
92 98  
... ...
app/views/features/_manage_community_fields.rhtml
... ... @@ -14,16 +14,16 @@
14 14 <td><label for="community_fields[<%= field %>][active]"><%= _(field.humanize) %></label></td>
15 15  
16 16 <td>
17   - <%= check_box_tag "community_fields[#{field}][active]", true, environment.custom_community_field(field, 'active'), :onclick => "$('community_fields[#{field}][required]').disabled=$('community_fields[#{field}][signup]').disabled=!this.checked;" %>
18 17 <%= hidden_field_tag "community_fields[#{field}][active]", false %>
  18 + <%= check_box_tag "community_fields[#{field}][active]", true, environment.custom_community_field(field, 'active'), :onclick => "$('community_fields[#{field}][required]').disabled=$('community_fields[#{field}][signup]').disabled=!this.checked;" %>
19 19 </td>
20 20 <td>
21   - <%= check_box_tag "community_fields[#{field}][required]", true, environment.custom_community_field(field, 'required'), :onclick => "if(this.checked) $('community_fields[#{field}][signup]').checked = true;" %>
22 21 <%= hidden_field_tag "community_fields[#{field}][required]", false %>
  22 + <%= check_box_tag "community_fields[#{field}][required]", true, environment.custom_community_field(field, 'required'), :onclick => "if(this.checked) $('community_fields[#{field}][signup]').checked = true;" %>
23 23 </td>
24 24 <td>
25   - <%= check_box_tag "community_fields[#{field}][signup]", true, environment.custom_community_field(field, 'signup'), :onclick => "if(!this.checked) $('community_fields[#{field}][required]').checked = false;" %>
26 25 <%= hidden_field_tag "community_fields[#{field}][signup]", false %>
  26 + <%= check_box_tag "community_fields[#{field}][signup]", true, environment.custom_community_field(field, 'signup'), :onclick => "if(!this.checked) $('community_fields[#{field}][required]').checked = false;" %>
27 27 </td>
28 28  
29 29 </tr>
... ...
app/views/features/_manage_enterprise_fields.rhtml
... ... @@ -14,16 +14,16 @@
14 14  
15 15 <td><label for="enterprise_fields[<%= field %>][active]"><%= _(field.humanize) %></label></td>
16 16 <td>
17   - <%= check_box_tag "enterprise_fields[#{field}][active]", true, environment.custom_enterprise_field(field, 'active'), :onclick => "$('enterprise_fields[#{field}][required]').disabled=$('enterprise_fields[#{field}][signup]').disabled=!this.checked;" %>
18 17 <%= hidden_field_tag "enterprise_fields[#{field}][active]", false %>
  18 + <%= check_box_tag "enterprise_fields[#{field}][active]", true, environment.custom_enterprise_field(field, 'active'), :onclick => "$('enterprise_fields[#{field}][required]').disabled=$('enterprise_fields[#{field}][signup]').disabled=!this.checked;" %>
19 19 </td>
20 20 <td>
21   - <%= check_box_tag "enterprise_fields[#{field}][required]", true, environment.custom_enterprise_field(field, 'required'), :onclick => "if(this.checked) $('enterprise_fields[#{field}][signup]').checked = true;" %>
22 21 <%= hidden_field_tag "enterprise_fields[#{field}][required]", false %>
  22 + <%= check_box_tag "enterprise_fields[#{field}][required]", true, environment.custom_enterprise_field(field, 'required'), :onclick => "if(this.checked) $('enterprise_fields[#{field}][signup]').checked = true;" %>
23 23 </td>
24 24 <td>
25   - <%= check_box_tag "enterprise_fields[#{field}][signup]", true, environment.custom_enterprise_field(field, 'signup'), :onclick => "if(!this.checked) $('enterprise_fields[#{field}][required]').checked = false;" %>
26 25 <%= hidden_field_tag "enterprise_fields[#{field}][signup]", false %>
  26 + <%= check_box_tag "enterprise_fields[#{field}][signup]", true, environment.custom_enterprise_field(field, 'signup'), :onclick => "if(!this.checked) $('enterprise_fields[#{field}][required]').checked = false;" %>
27 27 </td>
28 28  
29 29 </tr>
... ...
app/views/features/_manage_person_fields.rhtml
... ... @@ -13,16 +13,16 @@
13 13 <tr>
14 14 <td><label for="person_fields[<%= field %>][active]"><%= _(field.humanize) %></label></td>
15 15 <td>
16   - <%= check_box_tag "person_fields[#{field}][active]", true, environment.custom_person_field(field, 'active'), :onclick => "$('person_fields[#{field}][required]').disabled=$('person_fields[#{field}][signup]').disabled=!this.checked;" %>
17 16 <%= hidden_field_tag "person_fields[#{field}][active]", false %>
  17 + <%= check_box_tag "person_fields[#{field}][active]", true, environment.custom_person_field(field, 'active'), :onclick => "$('person_fields[#{field}][required]').disabled=$('person_fields[#{field}][signup]').disabled=!this.checked;" %>
18 18 </td>
19 19 <td>
20   - <%= check_box_tag "person_fields[#{field}][required]", true, environment.custom_person_field(field, 'required'), :onclick => "if(this.checked) $('person_fields[#{field}][signup]').checked = true;" %>
21 20 <%= hidden_field_tag "person_fields[#{field}][required]", false %>
  21 + <%= check_box_tag "person_fields[#{field}][required]", true, environment.custom_person_field(field, 'required'), :onclick => "if(this.checked) $('person_fields[#{field}][signup]').checked = true;" %>
22 22 </td>
23 23 <td>
24   - <%= check_box_tag "person_fields[#{field}][signup]", true, environment.custom_person_field(field, 'signup'), :onclick => "if(!this.checked) $('person_fields[#{field}][required]').checked = false;" %>
25 24 <%= hidden_field_tag "person_fields[#{field}][signup]", false %>
  25 + <%= check_box_tag "person_fields[#{field}][signup]", true, environment.custom_person_field(field, 'signup'), :onclick => "if(!this.checked) $('person_fields[#{field}][required]').checked = false;" %>
26 26 </td>
27 27 </tr>
28 28 <% end %>
... ...
app/views/friends/index.rhtml
... ... @@ -2,7 +2,7 @@
2 2  
3 3 <h1><%= __("%s's friends") % profile.name %></h1>
4 4  
5   -<% cache_timeout(profile.manage_friends_cache_key(params), 4.hours.from_now) do %>
  5 +<% cache_timeout(profile.manage_friends_cache_key(params), 4.hours) do %>
6 6 <% if @friends.empty? %>
7 7 <p>
8 8 <em>
... ...
app/views/layouts/application-ng.rhtml
... ... @@ -12,23 +12,21 @@
12 12 <%= stylesheet_link_tag template_stylesheet_path %>
13 13 <%= stylesheet_link_tag icon_theme_stylesheet_path %>
14 14 <%= stylesheet_link_tag jquery_ui_theme_stylesheet_path %>
15   - <% @plugins.enabled_plugins.each do |plugin| %>
16   - <% if plugin.stylesheet? %>
17   - <%= stylesheet_tag plugin.class.public_path('style.css'), {} %>
18   - <% end %>
19   - <% end %>
  15 + <%
  16 + plugins_stylesheets = @plugins.select(&:stylesheet?).map { |plugin| plugin.class.public_path('style.css') }
  17 + %>
  18 + <%= stylesheet_link_tag(plugins_stylesheets, :cache => 'cache/plugins-' + Digest::MD5.hexdigest(plugins_stylesheets.to_s)) unless plugins_stylesheets.empty? %>
20 19 <%= stylesheet_link_tag theme_stylesheet_path %>
21 20  
22 21 <%# Add custom tags/styles/etc via content_for %>
23 22 <%= yield :head %>
24 23 <%= javascript_tag('render_all_jquery_ui_widgets()') %>
25   - <% @plugins.enabled_plugins.each do |plugin| %>
26   - <% plugin.js_files.each do |js_file| %>
27   - <%= javascript_src_tag plugin.class.public_path(js_file), {} %>
28   - <% end %>
29   - <% end %>
  24 + <%
  25 + plugins_javascripts = @plugins.map { |plugin| plugin.js_files.map { |js| plugin.class.public_path(js) } }.flatten
  26 + %>
  27 + <%= javascript_include_tag(plugins_javascripts, :cache => 'cache/plugins-' + Digest::MD5.hexdigest(plugins_javascripts.to_s)) unless plugins_javascripts.empty? %>
30 28 <%=
31   - @plugins.map(:head_ending).collect do |content|
  29 + @plugins.dispatch(:head_ending).collect do |content|
32 30 content.respond_to?(:call) ? content.call : content
33 31 end.join("\n")
34 32 %>
... ... @@ -43,7 +41,7 @@
43 41  
44 42 <a href="#content" id="link-go-content"><span><%= _("Go to the content") %></span></a>
45 43 <%=
46   - @plugins.map(:body_beginning).collect do |content|
  44 + @plugins.dispatch(:body_beginning).collect do |content|
47 45 content.respond_to?(:call) ? content.call : content
48 46 end.join("\n")
49 47 %>
... ...
app/views/layouts/application.rhtml
... ... @@ -38,6 +38,7 @@
38 38 %>' onload='noosfero_init();'
39 39 onresize="registerDocumentSize()">
40 40 <script type="text/javascript">
  41 + // <!--
41 42 function registerDocumentSize() {
42 43 document.body.className = document.body.className.replace(/docSize-(G|L)T-\d+/g, "");
43 44 for ( var x=100; x<=1500; x+=100 ) {
... ... @@ -49,6 +50,7 @@
49 50 }
50 51 }
51 52 registerDocumentSize();
  53 + // -->
52 54 </script>
53 55  
54 56 <div id="accessibility_menu">
... ...
app/views/manage_products/show.rhtml
... ... @@ -13,7 +13,7 @@
13 13 <%= render :partial => 'manage_products/display_image' %>
14 14 </div>
15 15 <div id='product-extra-content'>
16   - <% extra_content = @plugins.map(:product_info_extras, @product).collect { |content| instance_eval(&content) } %>
  16 + <% extra_content = @plugins.dispatch(:product_info_extras, @product).collect { |content| instance_eval(&content) } %>
17 17 <%= extra_content.join("\n") %>
18 18 </div>
19 19 <div id='product-info'>
... ...
app/views/memberships/index.rhtml
... ... @@ -19,7 +19,7 @@
19 19 <%= _('Role: %s') % rolename_for(profile, membership) %> <br/>
20 20 <%= _('Type: %s') % getterm(membership.class.identification) %> <br/>
21 21 <%= _('Description: %s') % membership.description + '<br/>' if membership.community? %>
22   - <%= _('Members: %s') % membership.members.size.to_s %> <br/>
  22 + <%= _('Members: %s') % membership.members_count.to_s %> <br/>
23 23 <%= _('Created at: %s') % show_date(membership.created_at) unless membership.enterprise? %> <br/>
24 24 <% button_bar do %>
25 25 <%= button 'menu-ctrl-panel', _('Control panel of this group'), membership.admin_url %>
... ...
app/views/profile/_common.rhtml
... ... @@ -9,7 +9,7 @@
9 9 </script>
10 10  
11 11 <% unless @action %>
12   - <% cache_timeout(profile.cache_key + '-profile-general-info', 4.hours.from_now) do %>
  12 + <% cache_timeout(profile.cache_key + '-profile-general-info', 4.hours) do %>
13 13 <tr>
14 14 <th colspan='2'>
15 15 <%= _('Content') %>
... ...
app/views/profile/_person_profile.rhtml
... ... @@ -23,7 +23,7 @@
23 23 <%= display_field(_('e-Mail:'), profile, :email, true) { |email| link_to_email(email) } %>
24 24 <% end %>
25 25  
26   - <% cache_timeout(profile.relationships_cache_key, 4.hours.from_now) do %>
  26 + <% cache_timeout(profile.relationships_cache_key, 4.hours) do %>
27 27 <% if !(profile.organization.blank? && profile.organization_website.blank?) && (profile.active_fields.include?('organization') || profile.active_fields.include?('organization_website')) %>
28 28 <tr>
29 29 <th colspan='2'><%= _('Work')%></th>
... ...
app/views/profile/_profile.rhtml
1 1 <tr>
2 2 <td colspan='2'>
3 3  
4   - <% plugins_tabs = @plugins.map(:profile_tabs).
  4 + <% plugins_tabs = @plugins.dispatch(:profile_tabs).
5 5 map { |tab| {:title => tab[:title], :id => tab[:id], :content => instance_eval(&tab[:content]), :start => tab[:title]} }%>
6 6  
7 7 <% tabs = plugins_tabs.select { |tab| tab[:start] } %>
... ...
app/views/profile/communities.rhtml
... ... @@ -2,7 +2,7 @@
2 2  
3 3 <h1><%= _("%s's communities") % profile.name %></h1>
4 4  
5   -<% cache_timeout(profile.communities_cache_key(params), 4.hour.from_now) do %>
  5 +<% cache_timeout(profile.communities_cache_key(params), 4.hour) do %>
6 6 <ul class='profile-list'>
7 7 <% @communities.each do |community| %>
8 8 <li><%= profile_image_link(community)%></li>
... ...
app/views/profile/content_tagged.rhtml
... ... @@ -6,7 +6,7 @@
6 6 <%= link_to image_tag('icons-mime/rss-feed.png', :alt => _('Feed for this tag'), :title => _('Feed for this tag')), tag_feed_path, :class => 'blog-feed-link'%>
7 7 </p>
8 8  
9   -<% cache_timeout(@tag_cache_key, 4.hour.from_now) do %>
  9 +<% cache_timeout(@tag_cache_key, 4.hour) do %>
10 10 <div class='search-tagged-items'>
11 11 <ul>
12 12 <% for doc in @tagged %>
... ...
app/views/profile/friends.rhtml
... ... @@ -2,7 +2,7 @@
2 2  
3 3 <h1><%= __("%s's friends") % profile.name %></h1>
4 4  
5   -<% cache_timeout(profile.friends_cache_key(params), 4.hours.from_now) do %>
  5 +<% cache_timeout(profile.friends_cache_key(params), 4.hours) do %>
6 6 <ul class='profile-list'>
7 7 <% @friends.each do |friend| %>
8 8 <%= profile_image_link(friend) %>
... ...
app/views/profile/members.rhtml
... ... @@ -2,7 +2,7 @@
2 2  
3 3 <h1><%= _("%s's members") % profile.name %></h1>
4 4  
5   -<% cache_timeout(profile.members_cache_key(params), 4.hours.from_now) do %>
  5 +<% cache_timeout(profile.members_cache_key(params), 4.hours) do %>
6 6 <ul class='profile-list'>
7 7 <% @members.each do |member| %>
8 8 <%= profile_image_link(member) %>
... ...
app/views/profile/tags.rhtml
1 1 <h1><%= _("%s's tags") % @profile.name %></h1>
2 2  
3 3 <div class='tag_cloud'>
4   -<% cache_timeout(@tags_cache_key, 4.hour.from_now) do %>
  4 +<% cache_timeout(@tags_cache_key, 4.hour) do %>
5 5 <%= tag_cloud @tags, :id, { :action => :tags }, {:show_count => true} %>
6 6 <% end %>
7 7 </div>
... ...
app/views/profile_editor/edit.rhtml
... ... @@ -82,7 +82,7 @@
82 82 )%>
83 83  
84 84 <%=
85   - @plugins.map(:profile_editor_extras).each do |content|
  85 + @plugins.dispatch(:profile_editor_extras).each do |content|
86 86 content.respond_to?(:call) ? content.call : content
87 87 end.join("\n")
88 88 %>
... ...
app/views/profile_editor/index.rhtml
... ... @@ -66,7 +66,7 @@
66 66  
67 67 <%= control_panel_button(_('Manage my groups'), 'groups', :controller => 'memberships') if profile.person? %>
68 68  
69   - <% @plugins.map(:control_panel_buttons).each do |button| %>
  69 + <% @plugins.dispatch(:control_panel_buttons).each do |button| %>
70 70 <%= control_panel_button(button[:title], button[:icon], button[:url]) %>
71 71 <% end %>
72 72  
... ...
app/views/profile_members/_index_buttons.rhtml
... ... @@ -5,7 +5,7 @@
5 5 <%= button :search, _('Invite your friends to join %s') % profile.short_name, :controller => 'invite', :action => 'select_address_book' %>
6 6 <% end %>
7 7 <%= button :send, _('Send e-mail to members'), :action => 'send_mail' %>
8   - <% @plugins.map(:manage_members_extra_buttons).each do |plugin_button| %>
  8 + <% @plugins.dispatch(:manage_members_extra_buttons).each do |plugin_button| %>
9 9 <%= button plugin_button[:icon], plugin_button[:title], plugin_button[:url] %>
10 10 <% end %>
11 11 <% end %>
... ...
app/views/profile_members/_members_list.rhtml
1 1 <% collection = @collection == :profile_admins ? profile.admins : profile.members %>
2   -<% title = @title ? @title : "Current members" %>
  2 +<% title = @title ? @title : _('Current members') %>
3 3 <% remove_action = @remove_action ? @remove_action : {:action => 'unassociate'} %>
4 4  
5   -<h3><%= _(title) %></h3>
  5 +<h3><%= title %></h3>
6 6  
7 7 <table>
8 8 <tr>
... ...
app/views/search/_product.rhtml
... ... @@ -5,8 +5,8 @@ product_item_pos = 0 if ! product_item_pos
5 5 product_item_pos += 1
6 6 %>
7 7  
8   -<% extra_content = @plugins.map(:asset_product_extras, product, product.enterprise).collect { |content| instance_eval(&content) } %>
9   -<% extra_properties = @plugins.map(:asset_product_properties, product)%>
  8 +<% extra_content = @plugins.dispatch(:asset_product_extras, product, product.enterprise).collect { |content| instance_eval(&content) } %>
  9 +<% extra_properties = @plugins.dispatch(:asset_product_properties, product)%>
10 10  
11 11 <li class="product-item <%= ( pos % 2 == 0 ) ? 'odd' : 'even' %>">
12 12 <%= link_to_product product, :class => 'product-pic', :style => 'background-image:url(%s)' % product.default_image(:minor) %>
... ...
app/views/search/tag.rhtml
... ... @@ -6,7 +6,7 @@
6 6 <%= button('back', _('Back to tag cloud'), :action => 'tags') %>
7 7 <% end %>
8 8  
9   -<% cache_timeout(@tag_cache_key, 4.hour.from_now) do %>
  9 +<% cache_timeout(@tag_cache_key, 4.hour) do %>
10 10 <div class='search-tagged-items'>
11 11 <% @tagged.each do |hit| %>
12 12 <ul class="clean-list">
... ...
app/views/search/tags.rhtml
1 1 <h1><%= _('Tag cloud') %></h1>
2 2  
3 3 <div class='tag_cloud'>
4   -<% cache_timeout(@tags_cache_key, 4.hour.from_now) do %>
  4 +<% cache_timeout(@tags_cache_key, 4.hour) do %>
5 5 <%= tag_cloud @tags, :tag, {:action => 'tag'}, {:show_count => true} %>
6 6 <% end %>
7 7 </div>
... ...
app/views/shared/articles_list.rhtml
... ... @@ -11,4 +11,4 @@
11 11 <% end %>
12 12 </table>
13 13  
14   -<p><%= pagination_links(articles, {:param_name => 'npage', :prev_label => '&laquo; ' + _('Previous'), :next_label => _('Next') + ' &raquo;', :page_links => true}) %></p>
  14 +<p><%= pagination_links(articles, {:param_name => 'npage', :page_links => true}) %></p>
... ...
app/views/shared/block.rhtml
1 1 <% if block.cacheable? && use_cache %>
2   - <% cache_timeout(block.cache_key, block.timeout.from_now) do %>
  2 + <% cache_timeout(block.cache_key, block.timeout) do %>
3 3 <%= display_block_content(block, user, main_content) %>
4 4 <% end %>
5 5 <% else %>
... ...
config/boot.rb
... ... @@ -108,8 +108,9 @@ end
108 108 # yeah, I know, I shouldn't change this file. But ...
109 109 def install_debian_rails
110 110 local_rails = File.dirname(__FILE__) + '/../vendor/rails'
111   - debian_rails = '/usr/share/rails'
  111 + debian_rails = ['/usr/share/rails-ruby1.8', '/usr/lib/ruby/vendor_ruby/rails'].find { |d| File.exists?(d) }
112 112 if !File.exist?(local_rails) && File.exists?(debian_rails)
  113 + File.delete(local_rails) if File.symlink?(local_rails) # remove dangling symlink
113 114 puts "I: Installing Debian-installed Rails from /usr/share/rails into vendor/rails."
114 115 recommended_rails_version = Rails::GemBoot.gem_version
115 116 puts "I: Please note that the recommended Rails version is #{recommended_rails_version}, and that other versions might not work"
... ...
config/environment.rb
... ... @@ -5,7 +5,7 @@
5 5 #ENV['RAILS_ENV'] ||= 'production'
6 6  
7 7 # Specifies gem version of Rails to use when vendor/rails is not present
8   -RAILS_GEM_VERSION = '2.1.0' unless defined? RAILS_GEM_VERSION
  8 +RAILS_GEM_VERSION = '2.3.5' unless defined? RAILS_GEM_VERSION
9 9  
10 10 # Bootstrap the Rails environment, frameworks, and default configuration
11 11 require File.join(File.dirname(__FILE__), 'boot')
... ... @@ -19,7 +19,10 @@ extra_controller_dirs = %w[
19 19 ].map {|item| File.join(RAILS_ROOT, item) }
20 20  
21 21 def noosfero_session_secret
22   - file = File.join(File.dirname(__FILE__), '/../tmp/session.secret')
  22 + require 'fileutils'
  23 + target_dir = File.join(File.dirname(__FILE__), '/../tmp')
  24 + FileUtils.mkdir_p(target_dir)
  25 + file = File.join(target_dir, 'session.secret')
23 26 if !File.exists?(file)
24 27 secret = (1..128).map { %w[0 1 2 3 4 5 6 7 8 9 a b c d e f][rand(16)] }.join('')
25 28 File.open(file, 'w') do |f|
... ... @@ -63,8 +66,11 @@ Rails::Initializer.run do |config|
63 66 noosfero:translations:compile
64 67 makemo
65 68 ]
66   - unless $PROGRAM_NAME =~ /rake$/ && (ignore_rake_commands.include?(ARGV.first))
67   - config.active_record.observers = :article_sweeper, :role_assignment_sweeper, :friendship_sweeper, :category_sweeper
  69 + if $PROGRAM_NAME =~ /rake$/ && (ignore_rake_commands.include?(ARGV.first))
  70 + $NOOSFERO_LOAD_PLUGINS = false
  71 + else
  72 + $NOOSFERO_LOAD_PLUGINS = true
  73 + config.active_record.observers = :article_sweeper, :role_assignment_sweeper, :friendship_sweeper, :category_sweeper, :block_sweeper
68 74 end
69 75 # Make Active Record use UTC-base instead of local time
70 76 # config.active_record.default_timezone = :utc
... ... @@ -92,7 +98,7 @@ Rails::Initializer.run do |config|
92 98 end
93 99 end
94 100 extra_controller_dirs.each do |item|
95   - Dependencies.load_paths << item
  101 + (ActiveSupport.const_defined?('Dependencies') ? ActiveSupport::Dependencies : ::Dependencies).load_paths << item
96 102 end
97 103  
98 104 # Add new inflection rules using the following format
... ... @@ -108,16 +114,6 @@ end
108 114  
109 115 ActiveRecord::Base.store_full_sti_class = true
110 116  
111   -Noosfero.locales = {
112   - 'en' => 'English',
113   - 'pt' => 'Português',
114   - 'fr' => 'Français',
115   - 'hy' => 'հայերեն լեզու',
116   - 'de' => 'Deutsch',
117   - 'ru' => 'русский язык',
118   - 'es' => 'Español',
119   - 'eo' => 'Esperanto'
120   -}
121 117 # if you want to override this, do it in config/local.rb !
122 118 Noosfero.default_locale = nil
123 119  
... ...
config/environments/cucumber.rb
... ... @@ -18,12 +18,3 @@ config.action_controller.allow_forgery_protection = false
18 18 # The :test delivery method accumulates sent emails in the
19 19 # ActionMailer::Base.deliveries array.
20 20 config.action_mailer.delivery_method = :test
21   -
22   -config.gem 'cucumber', :lib => false, :version => '0.4.0' unless File.directory?(File.join(Rails.root, 'vendor/plugins/cucumber'))
23   -config.gem 'webrat', :lib => false, :version => '0.5.1' unless File.directory?(File.join(Rails.root, 'vendor/plugins/webrat'))
24   -config.gem 'rspec', :lib => 'spec', :version => '1.2.9' unless File.directory?(File.join(Rails.root, 'vendor/plugins/rspec'))
25   -config.gem 'rspec-rails', :lib => 'spec/rails', :version => '1.2.9' unless File.directory?(File.join(Rails.root, 'vendor/plugins/rspec-rails'))
26   -config.gem 'Selenium', :lib => 'selenium', :version => '>= 1.1.14' unless File.directory?(File.join(Rails.root, 'vendor/plugins/selenium'))
27   -config.gem 'selenium-client', :lib => 'selenium/client', :version => '>= 1.2.17' unless File.directory?(File.join(Rails.root, 'vendor/plugins/selenium-client'))
28   -config.gem 'database_cleaner', :lib => 'database_cleaner'
29   -
... ...
config/environments/test.rb
... ... @@ -20,5 +20,3 @@ config.action_controller.allow_forgery_protection = false
20 20 # The :test delivery method accumulates sent emails in the
21 21 # ActionMailer::Base.deliveries array.
22 22 config.action_mailer.delivery_method = :test
23   -
24   -config.gem 'exception_notification', :lib => 'exception_notification', :version => '1.0.20090728'
... ...
config/initializers/action_mailer.rb 0 → 100644
... ... @@ -0,0 +1,2 @@
  1 +# Turn off auto TLS for e-mail
  2 +ActionMailer::Base.smtp_settings[:enable_starttls_auto] = false
... ...
config/initializers/delayed_job_config.rb
  1 +Delayed::Worker.backend = :active_record
1 2 Delayed::Worker.max_attempts = 2
2 3 Delayed::Worker.max_run_time = 10.minutes
... ...
config/initializers/image_uploads.rb
1 1 if File.writable?(Rails.root)
2   - misplaced_directories = Dir.glob(Rails.root + '/public/images/[0-9]*')
  2 + misplaced_directories = Dir.glob(Rails.root.join('public/images/[0-9]*'))
3 3 unless misplaced_directories.empty?
4   - new_location = Rails.root + '/public/image_uploads'
  4 + new_location = Rails.root.join('public/image_uploads')
5 5 if !File.exists?(new_location)
6 6 FileUtils.mkdir(new_location)
7 7 end
... ...
config/initializers/plugins.rb
... ... @@ -3,4 +3,4 @@ require &#39;noosfero/plugin/manager&#39;
3 3 require 'noosfero/plugin/context'
4 4 require 'noosfero/plugin/active_record'
5 5 require 'noosfero/plugin/mailer_base'
6   -Noosfero::Plugin.init_system
  6 +Noosfero::Plugin.init_system if $NOOSFERO_LOAD_PLUGINS
... ...
config/locales/ar.yml 0 → 100644
... ... @@ -0,0 +1,224 @@
  1 +# Arabic translations for Ruby on Rails
  2 +# by Rida Al Barazi (me@rida.me)
  3 +# updated by Ahmed Hazem (nardgo@gmail.com)
  4 +# Rails 3 edit by rbjarnason
  5 +
  6 +"ar":
  7 + date:
  8 + formats:
  9 + default: "%Y-%m-%d"
  10 + short: "%e %b"
  11 + long: "%B %e, %Y"
  12 +
  13 + day_names:
  14 + - الأحد
  15 + - الإثنين
  16 + - الثلاثاء
  17 + - الأربعاء
  18 + - الخميس
  19 + - الجمعة
  20 + - السبت
  21 + abbr_day_names:
  22 + - الأحد
  23 + - الإثنين
  24 + - الثلاثاء
  25 + - الأربعاء
  26 + - الخميس
  27 + - الجمعة
  28 + - السبت
  29 +
  30 + month_names:
  31 + - ~
  32 + - يناير
  33 + - فبراير
  34 + - مارس
  35 + - ابريل
  36 + - مايو
  37 + - يونيو
  38 + - يوليو
  39 + - اغسطس
  40 + - سبتمبر
  41 + - اكتوبر
  42 + - نوفمبر
  43 + - ديسمبر
  44 + abbr_month_names:
  45 + - ~
  46 + - يناير
  47 + - فبراير
  48 + - مارس
  49 + - ابريل
  50 + - مايو
  51 + - يونيو
  52 + - يوليو
  53 + - اغسطس
  54 + - سبتمبر
  55 + - اكتوبر
  56 + - نوفمبر
  57 + - ديسمبر
  58 + order:
  59 + - :day
  60 + - :month
  61 + - :year
  62 +
  63 + time:
  64 + formats:
  65 + default: "%a %b %d %H:%M:%S %Z %Y"
  66 + short: "%d %b %H:%M"
  67 + long: "%B %d, %Y %H:%M"
  68 + am: 'صباحا'
  69 + pm: 'مساءا'
  70 +
  71 + support:
  72 + array:
  73 + words_connector: ", "
  74 + two_words_connector: " و "
  75 + last_word_connector: ", و "
  76 +
  77 + select:
  78 + prompt: "الرجاء اختيار"
  79 +
  80 + number:
  81 + format:
  82 + separator: "."
  83 + delimiter: ","
  84 + precision: 3
  85 + significant: false
  86 + strip_insignificant_zeros: false
  87 +
  88 + currency:
  89 + format:
  90 + format: "%u%n"
  91 + unit: "$"
  92 + separator: "."
  93 + delimiter: ","
  94 + precision: 2
  95 + significant: false
  96 + strip_insignificant_zeros: false
  97 +
  98 + percentage:
  99 + format:
  100 + delimiter: ""
  101 +
  102 + precision:
  103 + format:
  104 + delimiter: ""
  105 +
  106 + human:
  107 + format:
  108 + delimiter: ""
  109 + precision: 3
  110 + significant: true
  111 + strip_insignificant_zeros: true
  112 + storage_units:
  113 + format: "%n %u"
  114 + units:
  115 + byte:
  116 + one: "Byte"
  117 + other: "Bytes"
  118 + kb: "KB"
  119 + mb: "MB"
  120 + gb: "GB"
  121 + tb: "TB"
  122 + decimal_units:
  123 + format: "%n %u"
  124 + units:
  125 + unit: ""
  126 + thousand: ألف
  127 + million: مليون
  128 + billion: مليار
  129 + trillion: تريليون
  130 + quadrillion: الكدريليون رقم
  131 +
  132 + datetime:
  133 + distance_in_words:
  134 + half_a_minute: 'نصف دقيقة'
  135 + less_than_x_seconds:
  136 + one: 'أقل من ثانية'
  137 + other: '%{count} ثوان'
  138 + x_seconds:
  139 + one: 'ثانية واحدة'
  140 + other: '%{count} ثوان'
  141 + less_than_x_minutes:
  142 + one: 'أقل من دقيقة'
  143 + other: '%{count} دقائق'
  144 + x_minutes:
  145 + one: 'دقيقة واحدة'
  146 + other: '%{count} دقائق'
  147 + about_x_hours:
  148 + one: 'حوالي ساعة واحدة'
  149 + other: '%{count} ساعات'
  150 + x_days:
  151 + one: 'يوم واحد'
  152 + other: '%{count} أيام'
  153 + about_x_months:
  154 + one: 'حوالي شهر واحد'
  155 + other: '%{count} أشهر'
  156 + x_months:
  157 + one: 'شهر واحد'
  158 + other: '%{count} أشهر'
  159 + about_x_years:
  160 + one: 'حوالي سنة'
  161 + other: '%{count} سنوات'
  162 + over_x_years:
  163 + one: 'أكثر من سنة'
  164 + other: '%{count} سنوات'
  165 + almost_x_years:
  166 + one: "تقريبا سنة واحدة"
  167 + other: "ما يقرب من %{count} سنة"
  168 + prompts:
  169 + year: "السنة"
  170 + month: "الشهر"
  171 + day: "اليوم"
  172 + hour: "ساعة"
  173 + minute: "دقيقة"
  174 + second: "ثانية"
  175 +
  176 + helpers:
  177 + select:
  178 + prompt: "الرجاء اختيار"
  179 +
  180 + submit:
  181 + create: "%{model} إنشاء"
  182 + update: "%{model} نموذج"
  183 + submit: "%{model} حفظ"
  184 +
  185 + errors:
  186 + format: "%{attribute} %{message}"
  187 +
  188 + messages: &errors_messages
  189 + inclusion: "ليس خيارا مقبولا"
  190 + exclusion: "محجوز"
  191 + invalid: "غير معرف أو محدد"
  192 + confirmation: "لا تتوافق مع التأكيد"
  193 + accepted: "يجب أن تقبل"
  194 + empty: "فارغ، يرجى ملء الحقل"
  195 + blank: "فارغ، يرجى ملء الحقل"
  196 + too_long: "أطول من اللازم (الحد الأقصى هو %{count})"
  197 + too_short: "أقصر من اللازم (الحد الأدنى هو %{count})"
  198 + wrong_length: "بطول غير مناسب (يجب أن يكون %{count})"
  199 + not_an_integer: "يجب أن يكون صحيحا"
  200 + not_a_number: "ليس رقما"
  201 + greater_than: "يجب أن يكون أكبر من %{count}"
  202 + greater_than_or_equal_to: "يجب أن يكون أكبر من أو يساوي %{count}"
  203 + equal_to: "يجب أن يساوي %{count}"
  204 + less_than: "يجب أن يكون أصغر من %{count}"
  205 + less_than_or_equal_to: "يجب أن يكون أصغر من أو يساوي %{count}"
  206 + odd: "يجب أن يكون فردي"
  207 + even: "يجب أن يكون زوجي"
  208 + taken: "غير متوفر (مستخدم)"
  209 + record_invalid: "%{errors} فشل التحقق من صحة"
  210 + template: &errors_template
  211 + header:
  212 + one: "ليس بالامكان حفظ %{model}: خطأ واحد."
  213 + other: "ليس بالامكان حفظ %{model}: %{count} أخطاء."
  214 + body: "يرجى التحقق من الحقول التالية:"
  215 +
  216 + activerecord:
  217 + errors:
  218 + messages:
  219 + <<: *errors_messages
  220 + template:
  221 + <<: *errors_template
  222 +
  223 + full_messages:
  224 + format: "%{attribute} %{message}"
... ...
config/locales/az.yml 0 → 100644
... ... @@ -0,0 +1,222 @@
  1 +# Azerbaijani translations for Ruby on Rails
  2 +# by Nihad Abbasov (mail@narkoz.me)
  3 +
  4 +az:
  5 + date:
  6 + formats:
  7 + default: "%d.%m.%Y"
  8 + short: "%d %b"
  9 + long: "%d %B %Y"
  10 +
  11 + day_names:
  12 + - Bazar
  13 + - Bazar ertəsi
  14 + - Çərşənbə axşamı
  15 + - Çərşənbə
  16 + - Cümə axşamı
  17 + - Cümə
  18 + - Şənbə
  19 + abbr_day_names:
  20 + - B.
  21 + - B.E.
  22 + - Ç.A.
  23 + - Ç.
  24 + - C.A.
  25 + - C.
  26 + - Ş.
  27 +
  28 + month_names:
  29 + - ~
  30 + - Yanvar
  31 + - Fevral
  32 + - Mart
  33 + - Aprel
  34 + - May
  35 + - İyun
  36 + - İyul
  37 + - Avqust
  38 + - Sentyabr
  39 + - Oktyabr
  40 + - Noyabr
  41 + - Dekabr
  42 + abbr_month_names:
  43 + - ~
  44 + - Yan
  45 + - Fev
  46 + - Mar
  47 + - Apr
  48 + - May
  49 + - İyn
  50 + - İyl
  51 + - Avq
  52 + - Sen
  53 + - Okt
  54 + - Noy
  55 + - Dek
  56 + order:
  57 + - :day
  58 + - :month
  59 + - :year
  60 +
  61 + time:
  62 + formats:
  63 + default: "%a, %d %b %Y, %H:%M:%S %z"
  64 + short: "%d %b, %H:%M"
  65 + long: "%d %B %Y, %H:%M"
  66 + am: "günortaya qədər"
  67 + pm: "günortadan sonra"
  68 +
  69 + support:
  70 + array:
  71 + words_connector: ", "
  72 + two_words_connector: " və "
  73 + last_word_connector: " və "
  74 +
  75 + select:
  76 + prompt: "Seçin"
  77 +
  78 + number:
  79 + format:
  80 + separator: "."
  81 + delimiter: " "
  82 + precision: 3
  83 + significant: false
  84 + strip_insignificant_zeros: false
  85 +
  86 + currency:
  87 + format:
  88 + format: "%n %u"
  89 + unit: "AZN"
  90 + separator: "."
  91 + delimiter: " "
  92 + precision: 2
  93 + significant: false
  94 + strip_insignificant_zeros: false
  95 +
  96 + percentage:
  97 + format:
  98 + delimiter: ""
  99 +
  100 + precision:
  101 + format:
  102 + delimiter: ""
  103 +
  104 + human:
  105 + format:
  106 + delimiter: ""
  107 + precision: 1
  108 + significant: false
  109 + strip_insignificant_zeros: false
  110 + storage_units:
  111 + format: "%n %u"
  112 + units:
  113 + byte:
  114 + one: "Bayt"
  115 + other: "Bayt"
  116 + kb: "KB"
  117 + mb: "MB"
  118 + gb: "GB"
  119 + tb: "TB"
  120 + decimal_units:
  121 + format: "%n %u"
  122 + units:
  123 + unit: ""
  124 + thousand: Min
  125 + million: Milyon
  126 + billion: Milyard
  127 + trillion: Trilyon
  128 + quadrillion: Katrilyon
  129 +
  130 + datetime:
  131 + distance_in_words:
  132 + half_a_minute: "yarım dəqiqə"
  133 + less_than_x_seconds:
  134 + one: "1 saniyədən az"
  135 + other: "%{count} saniyədən az"
  136 + x_seconds:
  137 + one: "1 saniyə"
  138 + other: "%{count} saniyə"
  139 + less_than_x_minutes:
  140 + one: "1 dəqiqədən az"
  141 + other: "%{count} dəqiqədən az"
  142 + x_minutes:
  143 + one: "1 dəqiqə"
  144 + other: "%{count} dəqiqə"
  145 + about_x_hours:
  146 + one: "təxminən 1 saat"
  147 + other: "təxminən %{count} saat"
  148 + x_days:
  149 + one: "1 gün"
  150 + other: "%{count} gün"
  151 + about_x_months:
  152 + one: "təxminən 1 ay"
  153 + other: "təxminən %{count} ay"
  154 + x_months:
  155 + one: "1 ay"
  156 + other: "%{count} ay"
  157 + about_x_years:
  158 + one: "təxminən 1 il"
  159 + other: "təxminən %{count} il"
  160 + over_x_years:
  161 + one: "1 ildən çox"
  162 + other: "%{count} ildən çox"
  163 + almost_x_years:
  164 + one: "təqribən 1 il"
  165 + other: "təqribən %{count} il"
  166 + prompts:
  167 + year: "İl"
  168 + month: "Ay"
  169 + day: "Gün"
  170 + hour: "Saat"
  171 + minute: "Dəqiqə"
  172 + second: "Saniyə"
  173 +
  174 + helpers:
  175 + select:
  176 + prompt: "Seçin"
  177 +
  178 + submit:
  179 + create: '%{model} yarat'
  180 + update: '%{model} yenilə'
  181 + submit: '%{model} saxla'
  182 +
  183 + errors:
  184 + format: "%{attribute} %{message}"
  185 +
  186 + messages: &errors_messages
  187 + inclusion: "siyahiyə daxil deyil"
  188 + exclusion: "qorunur"
  189 + invalid: "yalnışdır"
  190 + confirmation: "təsdiqə uygun deyil"
  191 + accepted: "qəbul olunmalıdır"
  192 + empty: "boş ola bilməz"
  193 + blank: "boş ola bilməz"
  194 + too_long: "çox uzundur (%{count} simvoldan çox olmalı deyil)"
  195 + too_short: "çox qısadır (%{count} simvoldan az olmalı deyil)"
  196 + wrong_length: "uzunluqu səhvdir (%{count} simvol olmalıdır)"
  197 + not_a_number: "rəqəm deyil"
  198 + not_an_integer: "tam rəqəm olmalıdır"
  199 + greater_than: "%{count}-dən böyük olmalıdır"
  200 + greater_than_or_equal_to: "böyük və ya %{count}-ə bərabər olmalıdır"
  201 + equal_to: "%{count}-ə bərabər olmalıdır"
  202 + less_than: "%{count}-dən kiçik olmalıdır"
  203 + less_than_or_equal_to: "kiçik və ya %{count}-ə bərabər olmalıdır"
  204 + odd: "tək olmalıdır"
  205 + even: "cüt olmalıdır"
  206 + taken: "artıq mövcuddur"
  207 + record_invalid: "Yoxlama uğursuz oldu: %{errors}"
  208 + template: &errors_template
  209 + header:
  210 + one: "%{model} saxlanmadı: 1 səhv"
  211 + other: "%{model} saxlanmadı: %{count} səhv"
  212 + body: "Aşağıdaki səhvlər üzə çıxdı:"
  213 +
  214 + activerecord:
  215 + errors:
  216 + messages:
  217 + <<: *errors_messages
  218 + template:
  219 + <<: *errors_template
  220 +
  221 + full_messages:
  222 + format: "%{attribute} %{message}"
... ...
config/locales/bg.yml 0 → 100644
... ... @@ -0,0 +1,232 @@
  1 +# Full Bulgarian localization for Ruby on Rails 3+
  2 +#
  3 +# extracted from www.termo.bg
  4 +# supported by Samson Behar <master.webmaster.master@gmail.com>
  5 +# supported by Yavor Ivanov, http://github.com/YavorIvanov
  6 +# supported by Andrew Radev, http://github.com/AndrewRadev
  7 +# See http://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points.
  8 +
  9 +bg:
  10 +
  11 + # ===== Rails Specific ===========================================================================
  12 +
  13 + date:
  14 + formats:
  15 + default: "%d.%m.%Y"
  16 + short: "%d %b"
  17 + long: "%d %B %Y"
  18 +
  19 + day_names:
  20 + - неделя
  21 + - понеделник
  22 + - вторник
  23 + - сряда
  24 + - четвъртък
  25 + - петък
  26 + - събота
  27 + abbr_day_names:
  28 + - нед
  29 + - пон
  30 + - вт
  31 + - ср
  32 + - чет
  33 + - пет
  34 + - съб
  35 +
  36 + # should start with nil cause there is no 0-th month
  37 + month_names:
  38 + - ~
  39 + - януари
  40 + - февруари
  41 + - март
  42 + - април
  43 + - май
  44 + - юни
  45 + - юли
  46 + - август
  47 + - септември
  48 + - октомври
  49 + - ноември
  50 + - декември
  51 + abbr_month_names:
  52 + - ~
  53 + - яну.
  54 + - фев.
  55 + - март
  56 + - апр.
  57 + - май
  58 + - юни
  59 + - юли
  60 + - авг.
  61 + - сеп.
  62 + - окт.
  63 + - ноем.
  64 + - дек.
  65 + order:
  66 + - :day
  67 + - :month
  68 + - :year
  69 +
  70 + time:
  71 + formats:
  72 + default: "%a, %d %b %Y, %H:%M:%S %z"
  73 + short: "%d %b, %H:%M"
  74 + long: "%d %B %Y, %H:%M"
  75 + am: "преди обяд"
  76 + pm: "следобед"
  77 +
  78 + support:
  79 + array:
  80 + words_connector: ", "
  81 + two_words_connector: " и "
  82 + last_word_connector: " и "
  83 +
  84 + select:
  85 + prompt: "Моля отбележете"
  86 +
  87 + number:
  88 + format:
  89 + separator: ","
  90 + delimiter: " "
  91 + precision: 3
  92 + significant: false
  93 + strip_insignificant_zeros: false
  94 +
  95 + currency:
  96 + format:
  97 + format: "%n %u"
  98 + unit: "лв."
  99 + separator: ","
  100 + delimiter: " "
  101 + precision: 2
  102 + significant: false
  103 + strip_insignificant_zeros: false
  104 +
  105 + percentage:
  106 + format:
  107 + delimiter: ""
  108 +
  109 + precision:
  110 + format:
  111 + delimiter: ""
  112 +
  113 + human:
  114 + format:
  115 + delimiter: ""
  116 + precision: 1
  117 + significant: true
  118 + strip_insignificant_zeros: true
  119 + storage_units:
  120 + # Storage units output formatting.
  121 + # %u is the storage unit, %n is the number (default: 2 MB)
  122 + format: "%n %u"
  123 + units:
  124 + byte:
  125 + one: "Байт"
  126 + other: "Байта"
  127 + kb: "КБ"
  128 + mb: "МБ"
  129 + gb: "ГБ"
  130 + tb: "ТБ"
  131 + decimal_units:
  132 + format: "%n %u"
  133 + units:
  134 + unit: ""
  135 + thousand: хиляди
  136 + million: милиона
  137 + billion: милиарда
  138 + trillion: трилиона
  139 + quadrillion: квадрилиона
  140 +
  141 + datetime:
  142 + distance_in_words:
  143 + half_a_minute: "половин минута"
  144 + less_than_x_seconds:
  145 + one: "по-малко от 1 секунда"
  146 + other: "по-малко от %{count} секунди"
  147 + x_seconds:
  148 + one: "1 секунда"
  149 + other: "%{count} секунди"
  150 + less_than_x_minutes:
  151 + one: "по-малко от 1 минута"
  152 + other: "по-малко от %{count} минути"
  153 + x_minutes:
  154 + one: "1 минута"
  155 + other: "%{count} минути"
  156 + about_x_hours:
  157 + one: "около 1 час"
  158 + other: "около %{count} часа"
  159 + x_days:
  160 + one: "1 ден"
  161 + other: "%{count} дни"
  162 + about_x_months:
  163 + one: "около 1 месец"
  164 + other: "около %{count} месеца"
  165 + x_months:
  166 + one: "1 месец"
  167 + other: "%{count} месеца"
  168 + about_x_years:
  169 + one: "около 1 година"
  170 + other: "около %{count} години"
  171 + over_x_years:
  172 + one: "над 1 година"
  173 + other: "над %{count} години"
  174 + almost_x_years:
  175 + one: "почти 1 година"
  176 + other: "почти %{count} години"
  177 + prompts:
  178 + year: "Година"
  179 + month: "Месец"
  180 + day: "Ден"
  181 + hour: "Час"
  182 + minute: "Минута"
  183 + second: "Секунда"
  184 +
  185 + helpers:
  186 + select:
  187 + prompt: "Моля отбележете"
  188 +
  189 + submit:
  190 + create: 'Създай %{model}'
  191 + update: 'Обнови %{model}'
  192 + submit: 'Запази %{model}'
  193 +
  194 + errors:
  195 + format: "%{attribute} %{message}"
  196 +
  197 + messages: &errors_messages
  198 + inclusion: "съдържа непредвидена стойност"
  199 + exclusion: "съдържа предварително зададена стойност"
  200 + invalid: "съдържа невярна стойност"
  201 + confirmation: "не съответства на потвърждението"
  202 + accepted: "трябва да се потвърди"
  203 + empty: "не може да е празно"
  204 + blank: "не може да е без стойност"
  205 + too_long: "е прекаленo дълго (не може да е повече от %{count} символа)"
  206 + too_short: "е прекалено късо (не може да бъде по-малко от %{count} символа)"
  207 + wrong_length: "е с грешна дължина (трябва да е с дължина, равна на %{count} символа)"
  208 + not_a_number: "не е число"
  209 + not_an_integer: "не е цяло число"
  210 + greater_than: "трябва да има стойност, по-голяма от %{count}"
  211 + greater_than_or_equal_to: "трябва да има стойност, по-голяма или равна на %{count}"
  212 + equal_to: "трябва да има стойност, равна на %{count}"
  213 + less_than: "трябва да има стойност, по-малка от %{count}"
  214 + less_than_or_equal_to: "трябва да има стойност, по-голяма или равна на %{count}"
  215 + odd: "трябва да е четно"
  216 + even: "трябва да е нечетно"
  217 + taken: "вече съществува"
  218 + record_invalid: "имаше грешки: %{errors}"
  219 + template: &errors_template
  220 + header:
  221 + one: "%{model}: записа е неуспешен заради 1 грешка"
  222 + other: "%{model}: записа е неуспешен заради %{count} грешки"
  223 + body: "Възникнаха проблеми със следните полета:"
  224 +
  225 + activerecord:
  226 + errors:
  227 + messages:
  228 + <<: *errors_messages
  229 + template:
  230 + <<: *errors_template
  231 + full_messages:
  232 + format: "%{attribute} %{message}"
0 233 \ No newline at end of file
... ...
config/locales/bn-IN.yml 0 → 100644
... ... @@ -0,0 +1,239 @@
  1 +# Benagli (India) translations for Rails
  2 +# by Arindam Ghosh (makghosh@gmail.com)
  3 +
  4 +bn-IN:
  5 + number:
  6 + # Used in number_with_delimiter()
  7 + # These are also the defaults for 'currency', 'percentage', 'precision', and 'human'
  8 + format:
  9 + # Sets the separator between the units, for more precision (e.g. 1.0 / 2.0 == 0.5)
  10 + separator: "."
  11 + # Delimets thousands (e.g. 1,000,000 is a million) (always in groups of three)
  12 + delimiter: ","
  13 + # Number of decimals, behind the separator (1 with a precision of 2 gives: 1.00)
  14 + precision: 2
  15 + significant: false
  16 + strip_insignificant_zeros: false
  17 +
  18 + # Used in number_to_currency()
  19 + currency:
  20 + format:
  21 + # Where is the currency sign? %u is the currency unit, %n the number (default: $5.00)
  22 + format: "%u %n"
  23 + unit: "₹"
  24 + # These three are to override number.format and are optional
  25 + separator: "."
  26 + delimiter: ","
  27 + precision: 2
  28 + significant: false
  29 + strip_insignificant_zeros: false
  30 +
  31 + # Used in number_to_percentage()
  32 + percentage:
  33 + format:
  34 + # These three are to override number.format and are optional
  35 + # separator:
  36 + delimiter: ""
  37 + # precision:
  38 +
  39 + # Used in number_to_precision()
  40 + precision:
  41 + format:
  42 + # These three are to override number.format and are optional
  43 + # separator:
  44 + delimiter: ""
  45 + # precision:
  46 +
  47 + # Used in number_to_human_size()
  48 + human:
  49 + format:
  50 + # These three are to override number.format and are optional
  51 + # separator:
  52 + delimiter: ""
  53 + precision: 1
  54 + significant: true
  55 + strip_insignificant_zeros: true
  56 + # Rails <= v2.2.2
  57 + # storage_units: [Bytes, KB, MB, GB, TB]
  58 + # Rails >= v2.3
  59 + storage_units:
  60 + format: "%n %u"
  61 + units:
  62 + byte:
  63 + one: "Byte"
  64 + other: "Bytes"
  65 + kb: "KB"
  66 + mb: "MB"
  67 + gb: "GB"
  68 + tb: "TB"
  69 + decimal_units:
  70 + format: "%n %u"
  71 + units:
  72 + unit: ""
  73 +
  74 + # Used in distance_of_time_in_words(), distance_of_time_in_words_to_now(), time_ago_in_words()
  75 + datetime:
  76 + distance_in_words:
  77 + half_a_minute: "অার্ধেক মিনিট"
  78 + less_than_x_seconds:
  79 + one: "১ সেকেন্ডর কম "
  80 + other: "%{count} সেকেন্ডের কম"
  81 + x_seconds:
  82 + one: "১ সেকেন্ড"
  83 + other: "%{count} সেকেন্ড"
  84 + less_than_x_minutes:
  85 + one: "১ মিনিটের কম"
  86 + other: "%{count} মিনিটের কম"
  87 + x_minutes:
  88 + one: "১ মিনিট"
  89 + other: "%{count} মিনিট"
  90 + about_x_hours:
  91 + one: "প্রায় ১ ঘন্টা"
  92 + other: "প্রায় %{count} ঘন্টা"
  93 + x_days:
  94 + one: "১ দিন"
  95 + other: "%{count} দিন"
  96 + about_x_months:
  97 + one: "প্রায় ১ মাস"
  98 + other: "প্রায় %{count} মাস"
  99 + x_months:
  100 + one: "১ মাস"
  101 + other: "%{count} মাস"
  102 + about_x_years:
  103 + one: "প্রায় ১ বছর"
  104 + other: "প্রায় %{count} বছর"
  105 + over_x_years:
  106 + one: "১ বছরের বেশি"
  107 + other: "%{count} বছরের বেশি"
  108 + prompts:
  109 + year: "বছর"
  110 + month: "মাস"
  111 + day: "দিন"
  112 + hour: "ঘন্টা"
  113 + minute: "মিনিট"
  114 + second: "সেকেন্ড"
  115 +
  116 + errors:
  117 + format: "%{attribute} %{message}"
  118 + messages: &errors_messages
  119 + inclusion: "লিস্টে অন্তর্ভুক্ত নয়"
  120 + exclusion: "রিসার্ভ করা অাছে"
  121 + invalid: "সঠিক নয়"
  122 + confirmation: "অনুমোদনের সঙ্গে মিলছে না"
  123 + accepted: "গ্রাহ্য করতে হবে"
  124 + empty: "খালি রাখা যাবে না"
  125 + blank: "ফাঁকা রাখা যাবে না"
  126 + too_long: "খুব বড়ো (সর্বোচ্চ %{count} অক্ষর)"
  127 + too_short: "খুব ছোটো (সর্বনিম্ন %{count} অক্ষর)"
  128 + wrong_length: "দৈর্ঘ্যটি সঠিক নয় (%{count} অক্ষর হতে হবে)"
  129 + taken: "অাগেই নিয়ে নেওয়া হয়েছে"
  130 + not_a_number: "নম্বর নয়"
  131 + greater_than: "%{count} থেকে বড়ো হতে হবে"
  132 + greater_than_or_equal_to: "%{count} থেকে বড়ো অথবা তার সমান হতে হবে"
  133 + equal_to: "%{count} এর সঙ্গে সমান হতে হবে"
  134 + less_than: "%{count} থেকে ছোটো হতে হবে"
  135 + less_than_or_equal_to: "%{count} থেকে ছোটো অথবা তার সমান হতে হবে"
  136 + odd: "বেজোড় হতে হবে"
  137 + even: "জোড় হতে হবে"
  138 + template: &errors_template
  139 + header:
  140 + one: "১ টি ত্রুটির কারনে %{model} সংরক্ষন করা সম্ভব হয়নি"
  141 + other: "%{count} টি ত্রুটির কারনে %{model} সংরক্ষন করা সম্ভব হয়নি"
  142 + body: "এই ফিল্ডগুলোতে কিছু সমস্যা দেখা দিয়েছে:"
  143 +
  144 + activerecord:
  145 + errors:
  146 + messages:
  147 + <<: *errors_messages
  148 + template:
  149 + <<: *errors_template
  150 + full_messages:
  151 + format: "%{attribute} %{message}"
  152 +
  153 + # The values :model, :attribute and :value are always available for interpolation
  154 + # The value :count is available when applicable. Can be used for pluralization.
  155 +
  156 +
  157 + # Append your own errors here or at the model/attributes scope.
  158 +
  159 + # models:
  160 + # Overrides default messages
  161 +
  162 + # attributes:
  163 + # Overrides model and default messages.
  164 +
  165 + date:
  166 + formats:
  167 + # Use the strftime parameters for formats.
  168 + # When no format has been given, it uses default.
  169 + # You can provide other formats here if you like!
  170 + default: "%e/%m/%Y"
  171 + short: "%e de %b"
  172 + long: "%e de %B de %Y"
  173 +
  174 + day_names:
  175 + - রবিবার
  176 + - সোমবার
  177 + - মঙ্গলবার
  178 + - বুধবার
  179 + - বৃহস্পতিবার
  180 + - শুক্রবার
  181 + - শনিবার
  182 + abbr_day_names:
  183 + - রবিবার
  184 + - সোমবার
  185 + - মঙ্গলবার
  186 + - বুধবার
  187 + - বৃহস্পতিবার
  188 + - শুক্রবার
  189 + - শনিবার
  190 +
  191 + # Don't forget the nil at the beginning; there's no such thing as a 0th month
  192 + month_names:
  193 + - ~
  194 + - জানুয়ারি
  195 + - ফেব্রুয়ারি
  196 + - মার্চ
  197 + - এপ্রিল
  198 + - মে
  199 + - জুন
  200 + - জুলাই
  201 + - অগাস্ট
  202 + - সেপ্টেমবার
  203 + - অক্টোবার
  204 + - নভেম্বার
  205 + - ডিসেম্বার
  206 + abbr_month_names:
  207 + - ~
  208 + - জানুয়ারি
  209 + - ফেব্রুয়ারি
  210 + - মার্চ
  211 + - এপ্রিল
  212 + - মে
  213 + - জুন
  214 + - জুলাই
  215 + - অগাস্ট
  216 + - সেপ্টেমবার
  217 + - অক্টোবার
  218 + - নভেম্বার
  219 + - ডিসেম্বার
  220 + # Used in date_select and datime_select.
  221 + order:
  222 + - :year
  223 + - :month
  224 + - :day
  225 +
  226 + time:
  227 + formats:
  228 + default: "%A, %e de %B de %Y %H:%M:%S %z"
  229 + short: "%e de %b %H:%M"
  230 + long: "%e de %B de %Y %H:%M"
  231 + am: "am"
  232 + pm: "pm"
  233 +
  234 +# Used in array.to_sentence.
  235 + support:
  236 + array:
  237 + words_connector: ", "
  238 + two_words_connector: " এবং "
  239 + last_word_connector: ", এবং "
... ...
config/locales/bs.yml 0 → 100644
... ... @@ -0,0 +1,250 @@
  1 +# Bosnia and Herzegovina (Bosnian) translations for rails
  2 +# by Armin Pašalić (armin [at] pasalic [dot] com [dot] ba, http://pasalic.com.ba)
  3 +
  4 +# Please take a look at /rails/pluralization/bs.rb for pluralization instructions.
  5 +
  6 +bs:
  7 + date:
  8 + formats:
  9 + default: "%d.%m.%Y."
  10 + short: "%e. %b. %Y."
  11 + long: "%e. %B %Y."
  12 + day_names:
  13 + - nedjelja
  14 + - ponedjeljak
  15 + - utorak
  16 + - srijeda
  17 + - četvrtak
  18 + - petak
  19 + abbr_day_names:
  20 + - ned
  21 + - pon
  22 + - uto
  23 + - sri
  24 + - čet
  25 + - pet
  26 + - sub
  27 + month_names:
  28 + - januar
  29 + - februar
  30 + - mart
  31 + - april
  32 + - maj
  33 + - juni
  34 + - juli
  35 + - august
  36 + - septembar
  37 + - oktobar
  38 + - novembar
  39 + - decembar
  40 + abbr_month_names:
  41 + - jan
  42 + - feb
  43 + - mar
  44 + - apr
  45 + - maj
  46 + - jun
  47 + - jul
  48 + - aug
  49 + - sep
  50 + - okt
  51 + - nov
  52 + - dec
  53 + order:
  54 + - :day
  55 + - :month
  56 + - :year
  57 + time:
  58 + formats:
  59 + default: "%H:%M:%S"
  60 + short: "%d. %b %Y. %H:%M"
  61 + long: "%d. %B %Y. - %H:%M:%S"
  62 + am: ''
  63 + pm: ''
  64 + support:
  65 + array:
  66 + words_connector: ", "
  67 + two_words_connector: " i "
  68 + last_word_connector: " i "
  69 + select:
  70 + prompt: "Molimo odaberite"
  71 + number:
  72 + format:
  73 + separator: ","
  74 + delimiter: "."
  75 + precision: 3
  76 + significant: false
  77 + strip_insignificant_zeros: true
  78 + currency:
  79 + format:
  80 + format: "%n%u"
  81 + unit: "KM"
  82 + separator: ","
  83 + delimiter: "."
  84 + precision: 2
  85 + significant: false
  86 + strip_insignificant_zeros: true
  87 + percentage:
  88 + format:
  89 + delimiter: ","
  90 + precision:
  91 + format:
  92 + delimiter: ""
  93 + human:
  94 + format:
  95 + delimiter: ","
  96 + precision: 0
  97 + significant: true
  98 + strip_insignificant_zeros: true
  99 + storage_units:
  100 + format: "%n %u"
  101 + units:
  102 + byte:
  103 + one: "bajt"
  104 + few: "bajta"
  105 + many: "bajtova"
  106 + other: "bajtova"
  107 + kb: "KB"
  108 + mb: "MB"
  109 + gb: "GB"
  110 + tb: "TB"
  111 + decimal_units:
  112 + format: "%n %u"
  113 + units:
  114 + unit: ""
  115 + thousand:
  116 + one: "hiljada"
  117 + few: "hiljade"
  118 + many: "hiljada"
  119 + other: 'hiljada'
  120 + million:
  121 + one: "milion"
  122 + few: "miliona"
  123 + many: "miliona"
  124 + other: "miliona"
  125 + billion:
  126 + one: "milijarda"
  127 + few: "milijarde"
  128 + many: "milijardi"
  129 + other: "milijardi"
  130 + trillion:
  131 + one: "bilion"
  132 + few: "biliona"
  133 + many: "biliona"
  134 + other: "biliona"
  135 + quadrillion:
  136 + one: "bilijarda"
  137 + few: "bilijarde"
  138 + many: "bilijardi"
  139 + other: "bilijardi"
  140 + datetime:
  141 + distance_in_words:
  142 + half_a_minute: "pola minute"
  143 + less_than_x_seconds:
  144 + one: "manje od sekunde"
  145 + few: "manje od %{count} sekunde"
  146 + many: "manje od %{count} sekundi"
  147 + x_seconds:
  148 + one: "1 sekund"
  149 + few: "%{count} sekunde"
  150 + many: "%{count} sekundi"
  151 + other: "%{count} sekundi"
  152 + less_than_x_minutes:
  153 + one: "manje od minute"
  154 + few: "manje od %{count} minute"
  155 + many: "manje od %{count} minuta"
  156 + other: "manje od %{count} minuta"
  157 + x_minutes:
  158 + one: "1 minut"
  159 + few: "%{count} minute"
  160 + many: "%{count} minuta"
  161 + other: "%{count} minuta"
  162 + about_x_hours:
  163 + one: "oko sat"
  164 + few: "oko %{count} sata"
  165 + many: "oko %{count} sati"
  166 + other: "oko %{count} sati"
  167 + x_days:
  168 + one: "1 dan"
  169 + few: "%{count} dana"
  170 + many: "%{count} dana"
  171 + other: "%{count} dana"
  172 + x_months:
  173 + one: "1 mjesec"
  174 + few: "%{count} mjeseca"
  175 + many: "%{count} mjeseci"
  176 + other: "%{count} mjeseci"
  177 + about_x_months:
  178 + one: "oko mjesec"
  179 + few: "oko %{count} mjeseca"
  180 + many: "oko %{count} mjeseci"
  181 + other: "oko %{count} mjeseci"
  182 + about_x_years:
  183 + one: "oko godine"
  184 + few: "oko %{count} godine"
  185 + many: "oko %{count} godina"
  186 + other: "oko %{count} godina"
  187 + over_x_years:
  188 + one: "preko godine"
  189 + few: "preko %{count} godine"
  190 + many: "preko %{count} godina"
  191 + other: "preko %{count} godina"
  192 + almost_x_years:
  193 + one: "skoro 1 godina"
  194 + few: "skoro %{count} godine"
  195 + many: "skoro %{count} godina"
  196 + other: "skoro %{count} godina"
  197 + prompts:
  198 + year: "godina"
  199 + month: "mjesec"
  200 + day: "dan"
  201 + hour: "sat"
  202 + minute: "minut"
  203 + second: "sekundi"
  204 + helpers:
  205 + select:
  206 + prompt: "Molimo odaberite"
  207 + submit:
  208 + create: "Kreiraj %{model}"
  209 + update: "Osviježi %{model}"
  210 + submit: "Sačuvaj %{model}"
  211 + errors:
  212 + format: "%{attribute} %{message}"
  213 + messages: &errors_messages
  214 + inclusion: "nije uključeno u listu"
  215 + exclusion: "je rezervisano"
  216 + invalid: "nije validno"
  217 + confirmation: "se ne poklapa sa potvrdom"
  218 + accepted: "mora biti prihvaćeno"
  219 + empty: "ne smije biti prazno"
  220 + blank: "ne smije biti prazno"
  221 + too_long: "je predugo (maksimalno je dozvoljeno %{count} karaktera)"
  222 + too_short: "je prekratko (predviđeno je minimalno %{count} karaktera)"
  223 + wrong_length: "je pogrešne dužine (trebalo bi biti tačno %{count} karaktera)"
  224 + not_a_number: "nije broj"
  225 + not_an_integer: "mora biti cijeli broj"
  226 + greater_than: "mora biti veće od %{count}"
  227 + greater_than_or_equal_to: "mora biti veće ili jednako %{count}"
  228 + equal_to: "mora biti %{count}"
  229 + less_than: "mora biti manje od %{count}"
  230 + less_than_or_equal_to: "mora biti manje ili jednako %{count}"
  231 + odd: "mora biti neparno"
  232 + even: "mora biti parno"
  233 + taken: "je već zauzet"
  234 + record_invalid: "Validacija nije uspjela: %{errors}"
  235 + template: &errors_template
  236 + header:
  237 + one: "1 greška je spriječila da se ovaj %{model} snimi"
  238 + few: "%{count} greške su spriječile da se ovaj %{model} snimi"
  239 + many: "%{count} grešaka je spriječilo da se ovaj %{model} snimi"
  240 + other: "%{count} grešaka je spriječilo da se ovaj %{model} snimi"
  241 + body: "Desili su se problemi sa slijedećim poljima:"
  242 +
  243 + activerecord:
  244 + errors:
  245 + messages:
  246 + <<: *errors_messages
  247 + template:
  248 + <<: *errors_template
  249 + full_messages:
  250 + format: "%{attribute} %{message}"
... ...
config/locales/ca.yml 0 → 100644
... ... @@ -0,0 +1,252 @@
  1 +# Catalan translations for Rails
  2 +# by Emili Parreño (emili@eparreno.com - www.eparreno.com)
  3 +
  4 +ca:
  5 + date:
  6 + formats:
  7 + # Use the strftime parameters for formats.
  8 + # When no format has been given, it uses default.
  9 + # You can provide other formats here if you like!
  10 + default: "%d-%m-%Y"
  11 + short: "%d de %b"
  12 + long: "%d de %B de %Y"
  13 +
  14 + day_names:
  15 + - Diumenge
  16 + - Dilluns
  17 + - Dimarts
  18 + - Dimecres
  19 + - Dijous
  20 + - Divendres
  21 + - Dissabte
  22 + abbr_day_names:
  23 + - Dg
  24 + - Dl
  25 + - Dm
  26 + - Dc
  27 + - Dj
  28 + - Dv
  29 + - Ds
  30 +
  31 + # Don't forget the nil at the beginning; there's no such thing as a 0th month
  32 + month_names:
  33 + - ~
  34 + - Gener
  35 + - Febrer
  36 + - Març
  37 + - Abril
  38 + - Maig
  39 + - Juny
  40 + - Juliol
  41 + - Agost
  42 + - Setembre
  43 + - Octubre
  44 + - Novembre
  45 + - Desembre
  46 + abbr_month_names:
  47 + - ~,
  48 + - Gen
  49 + - Feb
  50 + - Mar
  51 + - Abr
  52 + - Mai
  53 + - Jun
  54 + - Jul
  55 + - Ago
  56 + - Set
  57 + - Oct
  58 + - Nov
  59 + - Des
  60 + # Used in date_select and datime_select.
  61 + order:
  62 + - :day
  63 + - :month
  64 + - :year
  65 +
  66 + time:
  67 + formats:
  68 + default: "%A, %d de %B de %Y %H:%M:%S %z"
  69 + short: "%d de %b %H:%M"
  70 + long: "%d de %B de %Y %H:%M"
  71 + am: "am"
  72 + pm: "pm"
  73 +
  74 +# Used in array.to_sentence.
  75 + support:
  76 + array:
  77 + words_connector: ", "
  78 + two_words_connector: " i "
  79 + last_word_connector: ", i "
  80 +
  81 + select:
  82 + prompt: "Si us plau tria"
  83 +
  84 + number:
  85 + # Used in number_with_delimiter()
  86 + # These are also the defaults for 'currency', 'percentage', 'precision', and 'human'
  87 + format:
  88 + # Sets the separator between the units, for more precision (e.g. 1.0 / 2.0 == 0.5)
  89 + separator: ","
  90 + # Delimets thousands (e.g. 1,000,000 is a million) (always in groups of three)
  91 + delimiter: "."
  92 + # Number of decimals, behind the separator (1 with a precision of 2 gives: 1.00)
  93 + precision: 3
  94 + significant: false
  95 + strip_insignificant_zeros: false
  96 +
  97 + # Used in number_to_currency()
  98 + currency:
  99 + format:
  100 + # Where is the currency sign? %u is the currency unit, %n the number (default: $5.00)
  101 + format: "%n %u"
  102 + unit: "€"
  103 + # These three are to override number.format and are optional
  104 + separator: ","
  105 + delimiter: "."
  106 + precision: 2
  107 + significant: false
  108 + strip_insignificant_zeros: false
  109 +
  110 + # Used in number_to_percentage()
  111 + percentage:
  112 + format:
  113 + # These three are to override number.format and are optional
  114 + # separator:
  115 + delimiter: ""
  116 + # precision:
  117 +
  118 + # Used in number_to_precision()
  119 + precision:
  120 + format:
  121 + # These three are to override number.format and are optional
  122 + # separator:
  123 + delimiter: ""
  124 + # precision:
  125 +
  126 + # Used in number_to_human_size()
  127 + human:
  128 + format:
  129 + # These three are to override number.format and are optional
  130 + # separator:
  131 + delimiter: ""
  132 + precision: 1
  133 + significant: true
  134 + strip_insignificant_zeros: true
  135 + storage_units:
  136 + # Storage units output formatting.
  137 + # %u is the storage unit, %n is the number (default: 2 MB)
  138 + format: "%n %u"
  139 + units:
  140 + byte:
  141 + one: "Byte"
  142 + other: "Bytes"
  143 + kb: "KB"
  144 + mb: "MB"
  145 + gb: "GB"
  146 + tb: "TB"
  147 + decimal_units:
  148 + format: "%n %u"
  149 + units:
  150 + unit: ""
  151 + thousand: "Mil"
  152 + million: "Milió"
  153 + billion: "Bilió"
  154 + trillion: "Trilió"
  155 + quadrillion: "Quatrilió"
  156 +
  157 + # Used in distance_of_time_in_words(), distance_of_time_in_words_to_now(), time_ago_in_words()
  158 + datetime:
  159 + distance_in_words:
  160 + half_a_minute: "mig minut"
  161 + less_than_x_seconds:
  162 + one: "menys d'1 segon"
  163 + other: "menys de %{count} segons"
  164 + x_seconds:
  165 + one: "1 segon"
  166 + other: "%{count} segons"
  167 + less_than_x_minutes:
  168 + one: "menys d'1 minut"
  169 + other: "menys de %{count} minuts"
  170 + x_minutes:
  171 + one: "1 minut"
  172 + other: "%{count} minuts"
  173 + about_x_hours:
  174 + one: "aproximadament 1 hora"
  175 + other: "aproximadament %{count} hores"
  176 + x_days:
  177 + one: "1 dia"
  178 + other: "%{count} dies"
  179 + about_x_months:
  180 + one: "aproximadament 1 mes"
  181 + other: "aproximadament %{count} mesos"
  182 + x_months:
  183 + one: "1 mes"
  184 + other: "%{count} mesos"
  185 + about_x_years:
  186 + one: "aproximadament 1 any"
  187 + other: "aproximadament %{count} anys"
  188 + over_x_years:
  189 + one: "més d'1 any"
  190 + other: "més de %{count} anys"
  191 + almost_x_years:
  192 + one: "casi 1 any"
  193 + other: "casi %{count} anys"
  194 + prompts:
  195 + year: "Any"
  196 + month: "Mes"
  197 + day: "Dia"
  198 + hour: "Hora"
  199 + minute: "Minut"
  200 + second: "Segun"
  201 +
  202 + helpers:
  203 + select:
  204 + prompt: "Si us plau tria"
  205 +
  206 + submit:
  207 + create: 'Crear %{model}'
  208 + update: 'Actualizar %{model}'
  209 + submit: 'Guardar %{model}'
  210 +
  211 +
  212 + errors:
  213 + format: "%{attribute} %{message}"
  214 +
  215 + messages: &errors_messages
  216 + inclusion: "no està inclós a la llista"
  217 + exclusion: "està reservat"
  218 + invalid: "no és vàlid"
  219 + confirmation: "no coincideix"
  220 + accepted: "ha de ser acceptat"
  221 + empty: "no pot estar buit"
  222 + blank: "no pot estar en blanc"
  223 + too_long: "és massa llarg (%{count} caràcters màxim)"
  224 + too_short: "és massa curt (%{count} caràcters mínim)"
  225 + wrong_length: "no té la longitud correcte (%{count} caràcters exactament)"
  226 + not_a_number: "no és un número"
  227 + not_an_integer: "ha de ser un enter"
  228 + taken: "no està disponible"
  229 + not_a_number: "no és un número"
  230 + greater_than: "ha de ser més gran que %{count}"
  231 + greater_than_or_equal_to: "ha de ser més gran o igual a %{count}"
  232 + equal_to: "ha de ser igual a %{count}"
  233 + less_than: "ha de ser menor que %{count}"
  234 + less_than_or_equal_to: "ha de ser menor o igual a %{count}"
  235 + odd: "ha de ser imparell"
  236 + even: "ha de ser parell"
  237 + record_invalid: "La validació ha fallat: %{errors}"
  238 + template: &errors_template
  239 + header:
  240 + one: "No s'ha pogut desar aquest/a %{model} perquè hi ha 1 error"
  241 + other: "No s'ha pogut desar aquest/a %{model} perquè hi ha hagut %{count} errors"
  242 + body: "Hi ha hagut problemes amb els següents camps:"
  243 +
  244 + activerecord:
  245 + errors:
  246 + messages:
  247 + <<: *errors_messages
  248 + template:
  249 + <<: *errors_template
  250 +
  251 + full_messages:
  252 + format: "%{attribute} %{message}"
... ...
config/locales/cs.yml 0 → 100644
... ... @@ -0,0 +1,213 @@
  1 +# Czech translations for Ruby on Rails
  2 +# by Karel Minařík (karmi@karmi.cz)
  3 +# contributors:
  4 +# - Vít Krchov - http://github.com/vita - Rails 3 update
  5 +
  6 +cs:
  7 + support:
  8 + array:
  9 + two_words_connector: ' a '
  10 + last_word_connector: ' a '
  11 + words_connector: ', '
  12 + select:
  13 + prompt: 'Prosím vyberte si'
  14 +
  15 + date:
  16 + formats:
  17 + default: "%d. %m. %Y"
  18 + short: "%d %b"
  19 + long: "%d. %B %Y"
  20 + day_names:
  21 + - Neděle
  22 + - Pondělí
  23 + - Úterý
  24 + - Středa
  25 + - Čtvrtek
  26 + - Pátek
  27 + - Sobota
  28 + abbr_day_names:
  29 + - Ne
  30 + - Po
  31 + - Út
  32 + - St
  33 + - Čt
  34 + - Pá
  35 + - So
  36 + month_names:
  37 + - ~
  38 + - Leden
  39 + - Únor
  40 + - Březen
  41 + - Duben
  42 + - Květen
  43 + - Červen
  44 + - Červenec
  45 + - Srpen
  46 + - Září
  47 + - Říjen
  48 + - Listopad
  49 + - Prosinec
  50 + abbr_month_names:
  51 + - ~
  52 + - Led
  53 + - Úno
  54 + - Bře
  55 + - Dub
  56 + - Kvě
  57 + - Čvn
  58 + - Čvc
  59 + - Srp
  60 + - Zář
  61 + - Říj
  62 + - Lis
  63 + - Pro
  64 + order:
  65 + - :day
  66 + - :month
  67 + - :year
  68 +
  69 + time:
  70 + formats:
  71 + default: "%a %d. %B %Y %H:%M %z"
  72 + short: "%d. %m. %H:%M"
  73 + long: "%A %d. %B %Y %H:%M"
  74 + am: 'am'
  75 + pm: 'pm'
  76 +
  77 + number:
  78 + format:
  79 + precision: 3
  80 + separator: '.'
  81 + delimiter: ','
  82 + significant: false
  83 + strip_insignificant_zeros: false
  84 + currency:
  85 + format:
  86 + unit: 'Kč'
  87 + precision: 2
  88 + format: '%n %u'
  89 + separator: ","
  90 + delimiter: " "
  91 + significant: false
  92 + strip_insignificant_zeros: false
  93 + human:
  94 + format:
  95 + precision: 1
  96 + delimiter: ''
  97 + significant: false
  98 + strip_insignificant_zeros: false
  99 + storage_units:
  100 + format: "%n %u"
  101 + units:
  102 + byte: "B"
  103 + kb: "KB"
  104 + mb: "MB"
  105 + gb: "GB"
  106 + tb: "TB"
  107 + decimal_units:
  108 + format: "%n %u"
  109 + units:
  110 + unit: ""
  111 + thousand: "Tisíc"
  112 + million: "Milion"
  113 + billion: "Miliarda"
  114 + trillion: "Bilion"
  115 + quadrillion: "Kvadrilion"
  116 + percentage:
  117 + format:
  118 + delimiter: ''
  119 + precision:
  120 + format:
  121 + delimiter: ''
  122 +
  123 + datetime:
  124 + prompts:
  125 + second: "Sekunda"
  126 + minute: "Minuta"
  127 + hour: "Hodina"
  128 + day: "Den"
  129 + month: "Měsíc"
  130 + year: "Rok"
  131 + distance_in_words:
  132 + half_a_minute: 'půl minutou'
  133 + less_than_x_seconds:
  134 + one: 'necelou sekundou'
  135 + other: 'ani ne %{count} sekundami'
  136 + x_seconds:
  137 + one: 'sekundou'
  138 + other: '%{count} sekundami'
  139 + less_than_x_minutes:
  140 + one: 'necelou minutou'
  141 + other: 'ani ne %{count} minutami'
  142 + x_minutes:
  143 + one: 'minutou'
  144 + other: '%{count} minutami'
  145 + about_x_hours:
  146 + one: 'asi hodinou'
  147 + other: 'asi %{count} hodinami'
  148 + x_days:
  149 + one: '24 hodinami'
  150 + other: '%{count} dny'
  151 + about_x_months:
  152 + one: 'asi měsícem'
  153 + other: 'asi %{count} měsíci'
  154 + x_months:
  155 + one: 'měsícem'
  156 + other: '%{count} měsíci'
  157 + about_x_years:
  158 + one: 'asi rokem'
  159 + other: 'asi %{count} roky'
  160 + over_x_years:
  161 + one: 'více než rokem'
  162 + other: 'více než %{count} roky'
  163 + almost_x_years:
  164 + one: 'téměř rokem'
  165 + other: 'téměř %{count} roky'
  166 +
  167 + helpers:
  168 + select:
  169 + prompt: "Prosím vyberte si"
  170 +
  171 + submit:
  172 + create: "Vytvořit %{model}"
  173 + update: "Aktualizovat %{model}"
  174 + submit: "Uložit %{model}"
  175 +
  176 + errors:
  177 + format: "%{attribute} %{message}"
  178 + messages: &errors_messages
  179 + inclusion: "není v seznamu povolených hodnot"
  180 + exclusion: "je vyhrazeno pro jiný účel"
  181 + invalid: "není platná hodnota"
  182 + confirmation: "nebylo potvrzeno"
  183 + accepted: "musí být potvrzeno"
  184 + empty: "nesmí být prázdný/á/é"
  185 + blank: "je povinná položka"
  186 + too_long: "je příliš dlouhý/á/é (max. %{count} znaků)"
  187 + too_short: "je příliš krátký/á/é (min. %{count} znaků)"
  188 + wrong_length: "nemá správnou délku (očekáváno %{count} znaků)"
  189 + not_a_number: "není číslo"
  190 + greater_than: "musí být větší než %{count}"
  191 + greater_than_or_equal_to: "musí být větší nebo rovno %{count}"
  192 + equal_to: "musí být rovno %{count}"
  193 + less_than: "musí být méně než %{count}"
  194 + less_than_or_equal_to: "musí být méně nebo rovno %{count}"
  195 + odd: "musí být liché číslo"
  196 + even: "musí být sudé číslo"
  197 + not_an_integer: "musí být celé číslo"
  198 + taken: "již databáze obsahuje"
  199 + record_invalid: "Validace je neúspešná: %{errors}"
  200 + template: &errors_template
  201 + header:
  202 + one: "Při ukládání objektu %{model} došlo k chybám a nebylo jej možné uložit"
  203 + other: "Při ukládání objektu %{model} došlo ke %{count} chybám a nebylo možné jej uložit"
  204 + body: "Následující pole obsahují chybně vyplněné údaje: "
  205 +
  206 + activerecord:
  207 + errors:
  208 + messages:
  209 + <<: *errors_messages
  210 + template:
  211 + <<: *errors_template
  212 + full_messages:
  213 + format: "%{attribute} %{message}"
0 214 \ No newline at end of file
... ...
config/locales/csb.yml 0 → 100644
... ... @@ -0,0 +1,233 @@
  1 +# Kashubian translations for Ruby on Rails
  2 +# by Michôł Òstrowsczi (ostrowski.michal@gmail.com, http://github.com/espresse)
  3 +
  4 +csb:
  5 + date:
  6 + formats:
  7 + default: "%d-%m-%Y"
  8 + short: "%d %b"
  9 + long: "%B %d, %Y"
  10 +
  11 + day_names:
  12 + - niedzela
  13 + - pòniedzôłk
  14 + - wtórk
  15 + - strzoda
  16 + - czwiôrtk
  17 + - piątk
  18 + - sobòta
  19 + abbr_day_names:
  20 + - nie
  21 + - pòn
  22 + - wtó
  23 + - str
  24 + - czw
  25 + - pią
  26 + - sob
  27 +
  28 + month_names:
  29 + - ~
  30 + - stëcznik
  31 + - gromicznik
  32 + - strëmiannik
  33 + - łżëkwiôt
  34 + - môj
  35 + - czerwińc
  36 + - lëpińc
  37 + - zélnik
  38 + - séwnik
  39 + - rujan
  40 + - lëstopadnik
  41 + - gòdnik
  42 + abbr_month_names:
  43 + - ~
  44 + - stë
  45 + - gro
  46 + - str
  47 + - łżë
  48 + - môj
  49 + - cze
  50 + - lëp
  51 + - zél
  52 + - séw
  53 + - ruj
  54 + - lës
  55 + - gòd
  56 + order:
  57 + - :day
  58 + - :month
  59 + - :year
  60 +
  61 + time:
  62 + formats:
  63 + default: "%a, %d %b %Y %H:%M:%S %z"
  64 + short: "%d %b %H:%M"
  65 + long: "%B %d, %Y %H:%M"
  66 + am: "przed pôłnim"
  67 + pm: "pò pôłnim"
  68 +
  69 + support:
  70 + array:
  71 + words_connector: ", "
  72 + two_words_connector: " ë "
  73 + last_word_connector: " a téż "
  74 +
  75 + select:
  76 + prompt: "Proszã wëbrac"
  77 +
  78 + number:
  79 + format:
  80 + separator: ","
  81 + delimiter: " "
  82 + precision: 3
  83 + significant: false
  84 + strip_insignificant_zeros: false
  85 +
  86 + currency:
  87 + format:
  88 + format: "%u %n"
  89 + unit: "PLN"
  90 + separator: ","
  91 + delimiter: " "
  92 + precision: 2
  93 + significant: false
  94 + strip_insignificant_zeros: true
  95 +
  96 + percentage:
  97 + format:
  98 + delimiter: ""
  99 +
  100 + precision:
  101 + format:
  102 + delimiter: ""
  103 +
  104 + human:
  105 + format:
  106 + delimiter: ""
  107 + precision: 3
  108 + significant: true
  109 + strip_insignificant_zeros: true
  110 + storage_units:
  111 + format: "%n %u"
  112 + units:
  113 + byte:
  114 + one: "bajt"
  115 + other: "bajtë"
  116 + kb: "KB"
  117 + mb: "MB"
  118 + gb: "GB"
  119 + tb: "TB"
  120 + decimal_units:
  121 + format: "%n %u"
  122 + units:
  123 + unit: ""
  124 + thousand: Tësąc
  125 + million: Milión
  126 + billion: Miliard
  127 + trillion: Bilión
  128 + quadrillion: Biliard
  129 +
  130 + datetime:
  131 + distance_in_words:
  132 + half_a_minute: "pół minutë"
  133 + less_than_x_seconds:
  134 + one: "mni jak sekùnda"
  135 + few: "mni jak %{count} sekùndë"
  136 + other: "mni jak %{count} sekùndów"
  137 + x_seconds:
  138 + one: "1 sekùnda"
  139 + few: "%{count} sekùndë"
  140 + other: "%{count} sekùndów"
  141 + less_than_x_minutes:
  142 + one: "mni jak minuta"
  143 + few: "mni jak %{count} minutë"
  144 + other: "mni jak %{count} minutów"
  145 + x_minutes:
  146 + one: "1 minuta"
  147 + few: "%{count} minutë"
  148 + other: "%{count} minutów"
  149 + about_x_hours:
  150 + one: "kòle gòdzënë"
  151 + few: "kòle %{count} gòdzën"
  152 + other: "kòle %{count} gòdzën"
  153 + x_days:
  154 + one: "1 dzéń"
  155 + few: "%{count} dni"
  156 + other: "%{count} dniów"
  157 + about_x_months:
  158 + one: "kòle miesąca"
  159 + few: "kòle %{count} miesąców"
  160 + other: "kòle %{count} miesąców"
  161 + x_months:
  162 + one: "1 miesąc"
  163 + few: "%{count} miesiące"
  164 + other: "%{count} miesięców"
  165 + about_x_years:
  166 + one: "kòle rokù"
  167 + few: "kòle %{count} lat"
  168 + other: "kòle %{count} lat"
  169 + over_x_years:
  170 + one: "wicy jak rok"
  171 + few: "wicy jak %{count} lata"
  172 + other: "wicy jak %{count} lat"
  173 + almost_x_years:
  174 + one: "wnet rok"
  175 + few: "wnet %{count} lata"
  176 + other: "wnet %{count} lat"
  177 + prompts:
  178 + year: "Rok"
  179 + month: "Miesiąc"
  180 + day: "Dzéń"
  181 + hour: "Gòdzëna"
  182 + minute: "Minuta"
  183 + second: "Sekunda"
  184 +
  185 + helpers:
  186 + select:
  187 + prompt: "Proszã wëbrac"
  188 +
  189 + submit:
  190 + create: 'Ùsôdzë %{model}'
  191 + update: 'Aktualizëjë %{model}'
  192 + submit: 'Zapiszë %{model}'
  193 +
  194 + errors:
  195 + format: "%{attribute} %{message}"
  196 +
  197 + messages: &errors_messages
  198 + inclusion: "ni ma na lësce dopùszczalnëch wôrtnotów"
  199 + exclusion: "je zarezerwowóné"
  200 + invalid: "je zmiłkòwé"
  201 + confirmation: "nie zgòdzô sã z pòcwierdzenim"
  202 + accepted: "mùszi bëc zaakceptowóné"
  203 + empty: "ni mòżé bëc pùsté"
  204 + blank: "ni mòże bëc pùsté"
  205 + too_long: "je za dłëdżé (maksymalno %{count} znaków)"
  206 + too_short: "je za krótczé (przënômni %{count} znaków)"
  207 + wrong_length: "mô lëchą długòtã (bë mùsza miec %{count} znaków)"
  208 + not_a_number: "nie je lëczbą"
  209 + not_an_integer: "muszi bëc całowną lëczbą"
  210 + greater_than: "mùszi bëc wikszé òd %{count}"
  211 + greater_than_or_equal_to: "mùszi bëc wikszé abò równé %{count}"
  212 + equal_to: "mùszi bëc równe %{count}"
  213 + less_than: "mùszi bëc mniszé òd %{count}"
  214 + less_than_or_equal_to: "mùszi bëc mniszé abò równé %{count}"
  215 + odd: "mùszi bëc nieparzësté"
  216 + even: "mùszé bëc parzësté"
  217 + taken: "je ju zajãté"
  218 + record_invalid: "Negatiwné sprôwdzenié pòprawnoscë: %{errors}"
  219 + template: &errors_template
  220 + header:
  221 + one: "%{model} nie òstôł zachòwóny przez jedną felã"
  222 + other: "%{model} nie òstôł zachòwóny przez %{count} felów"
  223 + body: "Fele tikają sã nëch pól:"
  224 +
  225 + activerecord:
  226 + errors:
  227 + messages:
  228 + <<: *errors_messages
  229 + template:
  230 + <<: *errors_template
  231 +
  232 + full_messages:
  233 + format: "%{attribute} %{message}"
... ...
config/locales/cy.yml 0 → 100644
... ... @@ -0,0 +1,221 @@
  1 +# Welsh translations for Ruby on Rails
  2 +# by Aran Jones (aranjones@gmail.com)
  3 +
  4 +cy:
  5 + date:
  6 + formats:
  7 + default: "%d-%m-%Y"
  8 + short: "%b %d"
  9 + long: "%B %d, %Y"
  10 +
  11 + day_names:
  12 + - Dydd Sul
  13 + - Dydd Llun
  14 + - Dydd Mawrth
  15 + - Dydd Mercher
  16 + - Dydd Iau
  17 + - Dydd Gwener
  18 + - Dydd Sadwrn
  19 + abbr_day_names:
  20 + - Sul
  21 + - Llun
  22 + - Maw
  23 + - Mer
  24 + - Iau
  25 + - Gwe
  26 + - Sad
  27 +
  28 + month_names:
  29 + - ~
  30 + - mis Ionawr
  31 + - mis Chwefror
  32 + - mis Mawrth
  33 + - mis Ebrill
  34 + - mis Mai
  35 + - mis Mehefin
  36 + - mis Gorffennaf
  37 + - mis Awst
  38 + - mis Medi
  39 + - mis Hydref
  40 + - mis Tachwedd
  41 + - mis Rhagfyr
  42 + abbr_month_names:
  43 + - ~
  44 + - Ion
  45 + - Chw
  46 + - Maw
  47 + - Ebr
  48 + - Mai
  49 + - Meh
  50 + - Gor
  51 + - Awst
  52 + - Med
  53 + - Hyd
  54 + - Tach
  55 + - Rha
  56 + order:
  57 + - :year
  58 + - :month
  59 + - :day
  60 +
  61 + time:
  62 + formats:
  63 + default: "%a, %d %b %Y %H:%M:%S %z"
  64 + short: "%d %b %H:%M"
  65 + long: "%B %d, %Y %H:%M"
  66 + am: "yb"
  67 + pm: "yh"
  68 +
  69 + support:
  70 + array:
  71 + words_connector: ", "
  72 + two_words_connector: " a "
  73 + last_word_connector: ", a "
  74 +
  75 + select:
  76 + prompt: "Dewiswch"
  77 +
  78 + number:
  79 + format:
  80 + separator: "."
  81 + delimiter: ","
  82 + precision: 3
  83 + significant: false
  84 + strip_insignificant_zeros: false
  85 +
  86 + currency:
  87 + format:
  88 + format: "%u%n"
  89 + unit: "£"
  90 + separator: "."
  91 + delimiter: ","
  92 + precision: 2
  93 + significant: false
  94 + strip_insignificant_zeros: false
  95 +
  96 + percentage:
  97 + format:
  98 + delimiter: ""
  99 +
  100 + precision:
  101 + format:
  102 + delimiter: ""
  103 +
  104 + human:
  105 + format:
  106 + delimiter: ""
  107 + precision: 3
  108 + significant: true
  109 + strip_insignificant_zeros: true
  110 + storage_units:
  111 + format: "%n %u"
  112 + units:
  113 + byte:
  114 + one: "Byte"
  115 + other: "Bytes"
  116 + kb: "KB"
  117 + mb: "MB"
  118 + gb: "GB"
  119 + tb: "TB"
  120 + decimal_units:
  121 + format: "%n %u"
  122 + units:
  123 + unit: ""
  124 + thousand: Mil
  125 + million: Miliwn
  126 + billion: Biliwn
  127 + trillion: Triliwn
  128 + quadrillion: Cwadriliwn
  129 +
  130 + datetime:
  131 + distance_in_words:
  132 + half_a_minute: "hanner munud"
  133 + less_than_x_seconds:
  134 + one: "llai nag eiliad"
  135 + other: "llai na %{count} eiliad"
  136 + x_seconds:
  137 + one: "1 eiliad"
  138 + other: "%{count} o eiliadau"
  139 + less_than_x_minutes:
  140 + one: "llai na munud"
  141 + other: "llai na %{count} munud"
  142 + x_minutes:
  143 + one: "1 munud"
  144 + other: "%{count} o funudau"
  145 + about_x_hours:
  146 + one: "tuag awr"
  147 + other: "tua %{count} awr"
  148 + x_days:
  149 + one: "1 diwrnod"
  150 + other: "%{count} diwrnod"
  151 + about_x_months:
  152 + one: "tua mis"
  153 + other: "tua %{count} mis"
  154 + x_months:
  155 + one: "1 mis"
  156 + other: "%{count} mis"
  157 + about_x_years:
  158 + one: "tua blwyddyn"
  159 + other: "tua %{count} blynedd"
  160 + over_x_years:
  161 + one: "dros flwyddyn"
  162 + other: "dros %{count} blynedd"
  163 + almost_x_years:
  164 + one: "bron yn flwyddyn"
  165 + other: "bron yn %{count} blynedd"
  166 + prompts:
  167 + year: "Blwyddyn"
  168 + month: "Mis"
  169 + day: "Diwrnod"
  170 + hour: "Awr"
  171 + minute: "Munud"
  172 + second: "Eiliad"
  173 +
  174 + helpers:
  175 + select:
  176 + prompt: "Dewiswch"
  177 +
  178 + submit:
  179 + create: 'Creu %{model}'
  180 + update: 'Diweddaru %{model}'
  181 + submit: 'Cadw %{model}'
  182 +
  183 + errors:
  184 + format: "%{attribute} %{message}"
  185 +
  186 + messages: &errors_messages
  187 + inclusion: "heb fod yn y rhestr"
  188 + exclusion: "wedi cadw"
  189 + invalid: "heb fod yn nheilwng"
  190 + confirmation: "heb fod yn gyfateb"
  191 + accepted: "angen ei dderbyn"
  192 + empty: "methu bod yn wag"
  193 + blank: "methu bod yn wag"
  194 + too_long: "yn rhy hir (cewch %{count} llythyren ar y fwyaf)"
  195 + too_short: "yn rhy fyr (rhaid am o leiaf %{count} llythyren)"
  196 + wrong_length: "gyda maint anghywir o lythrennau (dylai fod yn %{count} llythyren)"
  197 + not_a_number: "heb fod yn rhif"
  198 + not_an_integer: "heb fod yn rhif llawn"
  199 + greater_than: "angen bod yn fwy na %{count}"
  200 + greater_than_or_equal_to: "angen bod yr un maint neu fwy na %{count}"
  201 + equal_to: "angen bod yn %{count}"
  202 + less_than: "angen bod yn llai na %{count}"
  203 + less_than_or_equal_to: "angen bod yr un maint neu lai na %{count}"
  204 + odd: "rhaid bod yn odrif"
  205 + even: "rhaid bod yn eilrif"
  206 + taken: "wedi'i gymryd yn barod"
  207 + record_invalid: "Gwirio wedi methu: %{errors}"
  208 + template: &errors_template
  209 + header:
  210 + one: "Atalwyd y %{model} hwn rhag ei gadw gan 1 nam"
  211 + other: "Atalwyd y %{model} hwn rhag ei gadw gan %{count} nam"
  212 + body: "Cafwyd broblemau gyda'r meysydd canlynol:"
  213 +
  214 + activerecord:
  215 + errors:
  216 + messages:
  217 + <<: *errors_messages
  218 + template:
  219 + <<: *errors_template
  220 + full_messages:
  221 + format: "%{attribute} %{message}"
... ...
config/locales/da.yml 0 → 100644
... ... @@ -0,0 +1,236 @@
  1 +# Danish translation file for standard Ruby on Rails internationalization
  2 +# by Lars Hoeg (larshoeg@gmail.com, http://www.lenio.dk/)
  3 +# redigeret af sprogekvilibrist og grammatisk facist Rasmus Malver (rasmus@malver.dk, http://malver.dk)
  4 +
  5 +# Danish translation file for standard Ruby on Rails internationalization
  6 +# by Lars Hoeg (larshoeg@gmail.com, http://www.lenio.dk/)
  7 +
  8 +da:
  9 + # active_support
  10 + date:
  11 + # See http://sproget.dk/svarbase/SV00000046/ and http://en.wikipedia.org/wiki/Date_formats
  12 + # either use traditional (2.10.03, 2. oktober 2003): "%e.%m.%y", "%e. %B %Y"
  13 + # or international ISO 8601 format (2003-10-20): "%Y-%m-%d"
  14 + # Note: some Windows distributions do not support %e - you may have to use %d instead
  15 + formats:
  16 + default: "%d.%m.%Y"
  17 + short: "%e. %b %Y"
  18 + long: "%e. %B %Y"
  19 +
  20 + day_names:
  21 + - søndag
  22 + - mandag
  23 + - tirsdag
  24 + - onsdag
  25 + - torsdag
  26 + - fredag
  27 + - lørdag
  28 + abbr_day_names:
  29 + - søn
  30 + - man
  31 + - tir
  32 + - ons
  33 + - tor
  34 + - fre
  35 + - lør
  36 + month_names:
  37 + - ~
  38 + - januar
  39 + - februar
  40 + - marts
  41 + - april
  42 + - maj
  43 + - juni
  44 + - juli
  45 + - august
  46 + - september
  47 + - oktober
  48 + - november
  49 + - december
  50 + abbr_month_names:
  51 + - ~
  52 + - jan
  53 + - feb
  54 + - mar
  55 + - apr
  56 + - maj
  57 + - jun
  58 + - jul
  59 + - aug
  60 + - sep
  61 + - okt
  62 + - nov
  63 + - dec
  64 + order:
  65 + - :day
  66 + - :month
  67 + - :year
  68 +
  69 + time:
  70 + formats:
  71 + default: "%e. %B %Y, %H.%M"
  72 + short: "%e. %b %Y, %H.%M"
  73 + long: "%A d. %e. %B %Y, %H.%M"
  74 + am: ""
  75 + pm: ""
  76 +
  77 + support:
  78 + array:
  79 + words_connector: ", "
  80 + two_words_connector: " og "
  81 + last_word_connector: " og "
  82 + select:
  83 + # default value for :prompt => true in FormOptionsHelper
  84 + prompt: "Vælg..."
  85 +
  86 + # action_view
  87 + number:
  88 + format:
  89 + separator: ","
  90 + delimiter: "."
  91 + precision: 3
  92 + significant: false
  93 + strip_insignificant_zeros: false
  94 +
  95 + currency:
  96 + format:
  97 + format: "%u %n"
  98 + unit: "DKK"
  99 + separator: ","
  100 + delimiter: "."
  101 + precision: 2
  102 + significant: false
  103 + strip_insignificant_zeros: false
  104 +
  105 + percentage:
  106 + format:
  107 + delimiter: ""
  108 +
  109 + precision:
  110 + format:
  111 + delimiter: ""
  112 +
  113 + human:
  114 + format:
  115 + delimiter: ""
  116 + precision: 3
  117 + significant: true
  118 + strip_insignificant_zeros: true
  119 + # Rails 2.2
  120 + #storage_units: [Bytes, KB, MB, GB, TB]
  121 + # Rails 2.3
  122 + storage_units:
  123 + # Storage units output formatting.
  124 + # %u is the storage unit, %n is the number (default: 2 MB)
  125 + format: "%n %u"
  126 + units:
  127 + byte:
  128 + one: "Byte"
  129 + other: "Bytes"
  130 + kb: "KB"
  131 + mb: "MB"
  132 + gb: "GB"
  133 + tb: "TB"
  134 + decimal_units:
  135 + format: "%n %u"
  136 + units:
  137 + unit: ""
  138 + thousand: Tusind
  139 + million: Million
  140 + billion: Milliard
  141 + trillion: Billion
  142 + quadrillion: Billiard
  143 +
  144 + datetime:
  145 + distance_in_words:
  146 + half_a_minute: "et halvt minut"
  147 + less_than_x_seconds:
  148 + one: "mindre end et sekund"
  149 + other: "mindre end %{count} sekunder"
  150 + x_seconds:
  151 + one: "et sekund"
  152 + other: "%{count} sekunder"
  153 + less_than_x_minutes:
  154 + one: "mindre end et minut"
  155 + other: "mindre end %{count} minutter"
  156 + x_minutes:
  157 + one: "et minut"
  158 + other: "%{count} minutter"
  159 + about_x_hours:
  160 + one: "cirka en time"
  161 + other: "cirka %{count} timer"
  162 + x_days:
  163 + one: "en dag"
  164 + other: "%{count} dage"
  165 + about_x_months:
  166 + one: "cirka en måned"
  167 + other: "cirka %{count} måneder"
  168 + x_months:
  169 + one: "en måned"
  170 + other: "%{count} måneder"
  171 + about_x_years:
  172 + one: "cirka et år"
  173 + other: "cirka %{count} år"
  174 + over_x_years:
  175 + one: "mere end et år"
  176 + other: "mere end %{count} år"
  177 + almost_x_years:
  178 + one: "næsten et år"
  179 + other: "næsten %{count} år"
  180 + prompts:
  181 + year: "År"
  182 + month: "Måned"
  183 + day: "Dag"
  184 + hour: "Time"
  185 + minute: "Minut"
  186 + second: "Sekund"
  187 +
  188 + helpers:
  189 + select:
  190 + prompt: "Vælg..."
  191 +
  192 + submit:
  193 + create: "Opret %{model}"
  194 + update: "Opdater %{model}"
  195 + submit: "Gem %{model}"
  196 +
  197 + errors:
  198 + format: "%{attribute} %{message}"
  199 +
  200 + messages: &errors_messages
  201 + inclusion: "er ikke på listen"
  202 + exclusion: "er reserveret"
  203 + invalid: "er ikke gyldig"
  204 + confirmation: "stemmer ikke overens med bekræftelse"
  205 + accepted: "skal accepteres"
  206 + empty: "må ikke udelades"
  207 + blank: "skal udfyldes"
  208 + too_long: "er for lang (højest %{count} tegn)"
  209 + too_short: "er for kort (mindst %{count} tegn)"
  210 + wrong_length: "har forkert længde (skulle være %{count} tegn)"
  211 + not_a_number: "er ikke et tal"
  212 + not_an_integer: "er ikke et heltal"
  213 + greater_than: "skal være større end %{count}"
  214 + greater_than_or_equal_to: "skal være større end, eller lig med, %{count}"
  215 + equal_to: "skal være %{count}"
  216 + less_than: "skal være mindre end %{count}"
  217 + less_than_or_equal_to: "skal være mindre end, eller lig med, %{count}"
  218 + odd: "skal være et ulige tal"
  219 + even: "skal være et lige tal"
  220 + taken: "er allerede brugt"
  221 + record_invalid: "Godkendelse gik galt: %{errors}"
  222 + template: &errors_template
  223 + header:
  224 + one: "En fejl forhindrede %{model} i at blive gemt"
  225 + other: "%{count} fejl forhindrede %{model} i at blive gemt"
  226 + body: "Der var problemer med følgende felter:"
  227 +
  228 + activerecord:
  229 + errors:
  230 + messages:
  231 + <<: *errors_messages
  232 + template:
  233 + <<: *errors_template
  234 +
  235 + full_messages:
  236 + format: "%{attribute} %{message}"
0 237 \ No newline at end of file
... ...
config/locales/de-AT.yml 0 → 100644
... ... @@ -0,0 +1,221 @@
  1 +# German translations for Ruby on Rails
  2 +# by Clemens Kofler (clemens@railway.at)
  3 +
  4 +de-AT:
  5 + date:
  6 + formats:
  7 + default: "%d.%m.%Y"
  8 + short: "%e. %b"
  9 + long: "%e. %B %Y"
  10 + day_names:
  11 + - Sonntag
  12 + - Montag
  13 + - Dienstag
  14 + - Mittwoch
  15 + - Donnerstag
  16 + - Freitag
  17 + - Samstag
  18 + abbr_day_names:
  19 + - So
  20 + - Mo
  21 + - Di
  22 + - Mi
  23 + - Do
  24 + - Fr
  25 + - Sa
  26 + month_names:
  27 + - ~
  28 + - Jänner
  29 + - Februar
  30 + - März
  31 + - April
  32 + - Mai
  33 + - Juni
  34 + - Juli
  35 + - August
  36 + - September
  37 + - Oktober
  38 + - November
  39 + - Dezember
  40 + abbr_month_names:
  41 + - ~
  42 + - Jän
  43 + - Feb
  44 + - Mär
  45 + - Apr
  46 + - Mai
  47 + - Jun
  48 + - Jul
  49 + - Aug
  50 + - Sep
  51 + - Okt
  52 + - Nov
  53 + - Dez
  54 + order:
  55 + - :day
  56 + - :month
  57 + - :year
  58 +
  59 + time:
  60 + formats:
  61 + default: "%A, %d. %B %Y, %H:%M Uhr"
  62 + short: "%d. %B, %H:%M Uhr"
  63 + long: "%A, %d. %B %Y, %H:%M Uhr"
  64 + am: "vormittags"
  65 + pm: "nachmittags"
  66 +
  67 + datetime:
  68 + distance_in_words:
  69 + half_a_minute: 'eine halbe Minute'
  70 + less_than_x_seconds:
  71 + one: 'weniger als eine Sekunde'
  72 + other: 'weniger als %{count} Sekunden'
  73 + x_seconds:
  74 + one: 'eine Sekunde'
  75 + other: '%{count} Sekunden'
  76 + less_than_x_minutes:
  77 + one: 'weniger als eine Minute'
  78 + other: 'weniger als %{count} Minuten'
  79 + x_minutes:
  80 + one: 'eine Minute'
  81 + other: '%{count} Minuten'
  82 + about_x_hours:
  83 + one: 'etwa eine Stunde'
  84 + other: 'etwa %{count} Stunden'
  85 + x_days:
  86 + one: 'ein Tag'
  87 + other: '%{count} Tage'
  88 + about_x_months:
  89 + one: 'etwa ein Monat'
  90 + other: 'etwa %{count} Monate'
  91 + x_months:
  92 + one: 'ein Monat'
  93 + other: '%{count} Monate'
  94 + almost_x_years:
  95 + one: 'fast ein Jahr'
  96 + other: 'fast %{count} Jahre'
  97 + about_x_years:
  98 + one: 'etwa ein Jahr'
  99 + other: 'etwa %{count} Jahre'
  100 + over_x_years:
  101 + one: 'mehr als ein Jahr'
  102 + other: 'mehr als %{count} Jahre'
  103 + prompts:
  104 + second: "Sekunden"
  105 + minute: "Minuten"
  106 + hour: "Stunden"
  107 + day: "Tag"
  108 + month: "Monat"
  109 + year: "Jahr"
  110 +
  111 + number:
  112 + format:
  113 + precision: 2
  114 + separator: ','
  115 + delimiter: '.'
  116 + significant: false
  117 + strip_insignificant_zeros: false
  118 + currency:
  119 + format:
  120 + unit: '€'
  121 + format: '%u %n'
  122 + separator: ','
  123 + delimiter: '.'
  124 + precision: 2
  125 + significant: false
  126 + strip_insignificant_zeros: false
  127 + percentage:
  128 + format:
  129 + delimiter: ""
  130 + precision:
  131 + format:
  132 + delimiter: ""
  133 + human:
  134 + format:
  135 + delimiter: ""
  136 + precision: 1
  137 + significant: true
  138 + strip_insignificant_zeros: true
  139 + storage_units:
  140 + # Storage units output formatting.
  141 + # %u is the storage unit, %n is the number (default: 2 MB)
  142 + format: "%n %u"
  143 + units:
  144 + byte:
  145 + one: "Byte"
  146 + other: "Bytes"
  147 + kb: "KB"
  148 + mb: "MB"
  149 + gb: "GB"
  150 + tb: "TB"
  151 + decimal_units:
  152 + format: "%n %u"
  153 + units:
  154 + unit: ""
  155 + thousand: Tausend
  156 + million: Millionen
  157 + billion:
  158 + one: Milliarde
  159 + other: Milliarden
  160 + trillion: Billionen
  161 + quadrillion:
  162 + one: Billiarde
  163 + other: Billiarden
  164 +
  165 + support:
  166 + array:
  167 + words_connector: ", "
  168 + two_words_connector: " und "
  169 + last_word_connector: " und "
  170 + select:
  171 + prompt: "Bitte wählen:"
  172 +
  173 + helpers:
  174 + select:
  175 + prompt: "Bitte wählen"
  176 +
  177 + submit:
  178 + create: '%{model} erstellen'
  179 + update: '%{model} aktualisieren'
  180 + submit: '%{model} speichern'
  181 +
  182 + errors:
  183 + format: "%{attribute} %{message}"
  184 +
  185 + messages: &errors_messages
  186 + inclusion: "ist kein gültiger Wert"
  187 + exclusion: "ist nicht verfügbar"
  188 + invalid: "ist nicht gültig"
  189 + confirmation: "stimmt nicht mit der Bestätigung überein"
  190 + accepted: "muss akzeptiert werden"
  191 + empty: "muss ausgefüllt werden"
  192 + blank: "muss ausgefüllt werden"
  193 + too_long: "ist zu lang (nicht mehr als %{count} Zeichen)"
  194 + too_short: "ist zu kurz (nicht weniger als %{count} Zeichen)"
  195 + wrong_length: "hat die falsche Länge (muss genau %{count} Zeichen haben)"
  196 + not_a_number: "ist keine Zahl"
  197 + greater_than: "muss größer als %{count} sein"
  198 + greater_than_or_equal_to: "muss größer oder gleich %{count} sein"
  199 + equal_to: "muss genau %{count} sein"
  200 + less_than: "muss kleiner als %{count} sein"
  201 + less_than_or_equal_to: "muss kleiner oder gleich %{count} sein"
  202 + odd: "muss ungerade sein"
  203 + even: "muss gerade sein"
  204 + not_an_integer: "muss ganzzahlig sein"
  205 + taken: "ist bereits vergeben"
  206 + record_invalid: "Gültigkeitsprüfung ist fehlgeschlagen: %{errors}"
  207 + template: &errors_template
  208 + header:
  209 + one: "Konnte %{model} nicht speichern: ein Fehler."
  210 + other: "Konnte %{model} nicht speichern: %{count} Fehler."
  211 + body: "Bitte überprüfen Sie die folgenden Felder:"
  212 +
  213 + activerecord:
  214 + errors:
  215 + messages:
  216 + <<: *errors_messages
  217 + template:
  218 + <<: *errors_template
  219 +
  220 + full_messages:
  221 + format: "%{attribute} %{message}"
... ...