decidim-proposals 0.6.8 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (31) hide show
  1. checksums.yaml +4 -4
  2. data/app/commands/decidim/proposals/create_proposal.rb +12 -0
  3. data/app/commands/decidim/proposals/vote_proposal.rb +2 -0
  4. data/app/controllers/decidim/proposals/application_controller.rb +18 -0
  5. data/app/controllers/decidim/proposals/proposals_controller.rb +7 -1
  6. data/app/helpers/decidim/proposals/application_helper.rb +14 -0
  7. data/app/helpers/decidim/proposals/proposal_votes_helper.rb +45 -1
  8. data/app/models/decidim/proposals/proposal.rb +19 -0
  9. data/app/services/decidim/proposals/proposal_search.rb +1 -1
  10. data/app/views/decidim/proposals/admin/proposals/index.html.erb +11 -0
  11. data/app/views/decidim/proposals/proposals/_filters.html.erb +1 -1
  12. data/app/views/decidim/proposals/proposals/_vote_button.html.erb +9 -7
  13. data/app/views/decidim/proposals/proposals/_voting_rules.html.erb +35 -0
  14. data/app/views/decidim/proposals/proposals/index.html.erb +8 -4
  15. data/app/views/decidim/proposals/proposals/show.html.erb +11 -4
  16. data/config/locales/ca.yml +18 -6
  17. data/config/locales/en.yml +17 -5
  18. data/config/locales/es.yml +17 -5
  19. data/config/locales/eu.yml +28 -16
  20. data/config/locales/fi.yml +23 -11
  21. data/config/locales/fr.yml +21 -9
  22. data/config/locales/it.yml +17 -5
  23. data/config/locales/nl.yml +19 -7
  24. data/config/locales/pl.yml +17 -5
  25. data/config/locales/ru.yml +183 -0
  26. data/config/locales/uk.yml +36 -24
  27. data/lib/decidim/proposals/feature.rb +10 -8
  28. data/lib/decidim/proposals/test/factories.rb +29 -1
  29. data/lib/decidim/proposals/version.rb +10 -0
  30. metadata +25 -51
  31. data/app/views/decidim/proposals/proposals/_votes_limit.html.erb +0 -21
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 07ce9b11095349492cb56ff878df03491fadfbac
4
- data.tar.gz: 715fbd1fb215ae4cc88c246976ff448fc9c9d294
3
+ metadata.gz: 87d3499da69c46a6b748f61303bf26957d97b788
4
+ data.tar.gz: f2229325a4b0654b03d37972944712d0a6db353e
5
5
  SHA512:
6
- metadata.gz: af27be2490906cf7152301e1290f5dc8e76d527d20943602d0ef286ab8b3993f2ba07b7b217046516ca6452c251189e46f4e493d62cec54123303e902afe125a
7
- data.tar.gz: 62d8e3020cfc76435472b20356342f0f0e4c1aa32262e92f505fb773488d0f79e65d258884eec9aca52220b3eb4e0dce19889f14a97b302793d6f244ef323170
6
+ metadata.gz: c8609c5edfe6bc7b87cf7f86b811e94c6c4168b9d9f66a8e473eaf3e6642b182c9f0ce35fe63f42f6a4d99f6b97f6b53b82a0a5278e23149923d94b394863324
7
+ data.tar.gz: 208b22a99297808ba62e4a3b556948f5c373eb8f87b6b0411b036b27b6eff4daea0dcd7384f19db2bf46b3a190de6b9bf3c592b9437037b64530ad83884beebc
@@ -20,6 +20,7 @@ module Decidim
20
20
  #
21
21
  # Returns nothing.
22
22
  def call
23
+ return broadcast(:invalid) if proposal_limit_reached?
23
24
  return broadcast(:invalid) if form.invalid?
24
25
 
25
26
  if process_attachments?
@@ -85,6 +86,17 @@ module Decidim
85
86
  def process_attachments?
86
87
  attachments_allowed? && attachment_present?
87
88
  end
89
+
90
+ def proposal_limit_reached?
91
+ proposal_limit = form.current_feature.settings.proposal_limit
92
+
93
+ return false if proposal_limit.zero?
94
+ current_user_proposals.count >= proposal_limit
95
+ end
96
+
97
+ def current_user_proposals
98
+ Proposal.where(author: @current_user, feature: form.current_feature)
99
+ end
88
100
  end
89
101
  end
90
102
  end
@@ -20,6 +20,8 @@ module Decidim
20
20
  #
21
21
  # Returns nothing.
22
22
  def call
23
+ return broadcast(:invalid) if @proposal.maximum_votes_reached?
24
+
23
25
  build_proposal_vote
24
26
  return broadcast(:invalid) unless vote.valid?
25
27
 
@@ -8,6 +8,24 @@ module Decidim
8
8
  # Note that it inherits from `Decidim::Features::BaseController`, which
9
9
  # override its layout and provide all kinds of useful methods.
10
10
  class ApplicationController < Decidim::Features::BaseController
11
+ helper_method :proposal_limit_reached?
12
+
13
+ private
14
+
15
+ def proposal_limit
16
+ return nil if feature_settings.proposal_limit.zero?
17
+ feature_settings.proposal_limit
18
+ end
19
+
20
+ def proposal_limit_reached?
21
+ return false unless proposal_limit
22
+
23
+ proposals.where(author: current_user).count >= proposal_limit
24
+ end
25
+
26
+ def proposals
27
+ Proposal.where(feature: current_feature)
28
+ end
11
29
  end
12
30
  end
13
31
  end
@@ -11,8 +11,8 @@ module Decidim
11
11
  include Paginable
12
12
 
13
13
  helper_method :geocoded_proposals
14
-
15
14
  before_action :authenticate_user!, only: [:new, :create]
15
+ before_action :check_proposal_limit!, only: [:new, :create]
16
16
 
17
17
  def index
18
18
  @proposals = search
@@ -87,6 +87,12 @@ module Decidim
87
87
  related_to: ""
88
88
  }
89
89
  end
90
+
91
+ def check_proposal_limit!
92
+ return unless proposal_limit_reached?
93
+ flash[:error] = I18n.t("proposals.new.limit_reached", scope: "decidim")
94
+ redirect_to action: :index
95
+ end
90
96
  end
91
97
  end
92
98
  end
@@ -54,6 +54,20 @@ module Decidim
54
54
  "secondary"
55
55
  end
56
56
  end
57
+
58
+ def proposal_limit_enabled?
59
+ proposal_limit.present?
60
+ end
61
+
62
+ def proposal_limit
63
+ return if feature_settings.proposal_limit.zero?
64
+
65
+ feature_settings.proposal_limit
66
+ end
67
+
68
+ def current_user_proposals
69
+ Proposal.where(feature: current_feature, author: current_user)
70
+ end
57
71
  end
58
72
  end
59
73
  end
@@ -24,11 +24,55 @@ module Decidim
24
24
  "expanded button--sc"
25
25
  end
26
26
 
27
+ # Public: Gets the vote limit for each user, if set.
28
+ #
29
+ # Returns an Integer if set, nil otherwise.
30
+ def vote_limit
31
+ return nil if feature_settings.vote_limit.zero?
32
+ feature_settings.vote_limit
33
+ end
34
+
27
35
  # Check if the vote limit is enabled for the current feature
28
36
  #
29
37
  # Returns true if the vote limit is enabled
30
38
  def vote_limit_enabled?
31
- current_user && current_settings.votes_enabled? && feature_settings.vote_limit.present? && feature_settings.vote_limit.positive?
39
+ vote_limit.present?
40
+ end
41
+
42
+ # Public: Checks if maximum votes per proposal are set.
43
+ #
44
+ # Returns true if set, false otherwise.
45
+ def maximum_votes_per_proposal_enabled?
46
+ maximum_votes_per_proposal.present?
47
+ end
48
+
49
+ # Public: Fetches the maximum amount of votes per proposal.
50
+ #
51
+ # Returns an Integer with the maximum amount of votes, nil otherwise.
52
+ def maximum_votes_per_proposal
53
+ return nil unless feature_settings.maximum_votes_per_proposal.positive?
54
+ feature_settings.maximum_votes_per_proposal
55
+ end
56
+
57
+ # Public: Checks if voting is enabled in this step.
58
+ #
59
+ # Returns true if enabled, false otherwise.
60
+ def votes_enabled?
61
+ current_settings.votes_enabled
62
+ end
63
+
64
+ # Public: Checks if voting is blocked in this step.
65
+ #
66
+ # Returns true if blocked, false otherwise.
67
+ def votes_blocked?
68
+ current_settings.votes_blocked
69
+ end
70
+
71
+ # Public: Checks if the current user is allowed to vote in this step.
72
+ #
73
+ # Returns true if the current user can vote, false otherwise.
74
+ def current_user_can_vote?
75
+ current_user && votes_enabled? && vote_limit_enabled? && !votes_blocked?
32
76
  end
33
77
 
34
78
  # Return the remaining votes for a user if the current feature has a vote limit
@@ -113,6 +113,25 @@ module Decidim
113
113
  def official?
114
114
  author.nil?
115
115
  end
116
+
117
+ # Public: The maximum amount of votes allowed for this proposal.
118
+ #
119
+ # Returns an Integer with the maximum amount of votes, nil otherwise.
120
+ def maximum_votes
121
+ maximum_votes = feature.settings.maximum_votes_per_proposal
122
+ return nil if maximum_votes.zero?
123
+
124
+ maximum_votes
125
+ end
126
+
127
+ # Public: The maximum amount of votes allowed for this proposal. 0 means infinite.
128
+ #
129
+ # Returns true if reached, false otherwise.
130
+ def maximum_votes_reached?
131
+ return false unless maximum_votes
132
+
133
+ votes.count >= maximum_votes
134
+ end
116
135
  end
117
136
  end
118
137
  end
@@ -25,7 +25,7 @@ module Decidim
25
25
  def search_origin
26
26
  if origin == "official"
27
27
  query.where(decidim_author_id: nil)
28
- elsif origin == "citizenship"
28
+ elsif origin == "citizens"
29
29
  query.where.not(decidim_author_id: nil)
30
30
  else # Assume 'all'
31
31
  query
@@ -25,7 +25,13 @@
25
25
  <% if scopes_enabled?(current_participatory_space) %>
26
26
  <th><%= t("models.proposal.fields.scope", scope: "decidim.proposals") %></th>
27
27
  <% end %>
28
+
28
29
  <th><%= t("models.proposal.fields.state", scope: "decidim.proposals") %></th>
30
+
31
+ <% if current_settings.votes_enabled? %>
32
+ <th><%= t("models.proposal.fields.votes", scope: "decidim.proposals") %></th>
33
+ <% end %>
34
+
29
35
  <th class="actions"><%= t("actions.title", scope: "decidim.proposals") %></th>
30
36
  </tr>
31
37
  </thead>
@@ -57,6 +63,11 @@
57
63
  <%= humanize_proposal_state proposal.state %>
58
64
  </strong>
59
65
  </td>
66
+ <% if current_settings.votes_enabled? %>
67
+ <td>
68
+ <%= proposal.votes.count %>
69
+ </td>
70
+ <% end %>
60
71
  <td class="table-list__actions">
61
72
  <% if can? :update, proposal %>
62
73
  <%= icon_link_to "chat", edit_proposal_proposal_answer_path(proposal_id: proposal.id, id: proposal.id), t("actions.answer", scope: "decidim.proposals"), class: "action-icon--edit-answer" %>
@@ -13,7 +13,7 @@
13
13
  </div>
14
14
 
15
15
  <% if feature_settings.official_proposals_enabled %>
16
- <%= form.collection_radio_buttons :origin, [["all", t('.all')], ["official", t('.official')], ["citizenship", t('.citizenship')]], :first, :last, legend_title: t('.origin') %>
16
+ <%= form.collection_radio_buttons :origin, [["all", t('.all')], ["official", t('.official')], ["citizens", t('.citizens')]], :first, :last, legend_title: t('.origin') %>
17
17
  <% end %>
18
18
 
19
19
  <% if feature_settings.proposal_answering_enabled && current_settings.proposal_answering_enabled %>
@@ -10,14 +10,16 @@
10
10
  <% if @voted_proposals ? @voted_proposals.include?(proposal.id) : proposal.voted_by?(current_user) %>
11
11
  <%= action_authorized_button_to :vote, t('.already_voted'), proposal_proposal_vote_path(proposal_id: proposal, from_proposals_list: from_proposals_list), method: :delete, remote: true, data: { disable: true }, class: "card__button button #{vote_button_classes(from_proposals_list)} success" %>
12
12
  <% else %>
13
- <% if vote_limit_enabled? && remaining_votes_count_for(current_user) == 0 %>
14
- <%= action_authorized_button_to :vote, t('.no_votes_remaining'), proposal_proposal_vote_path(proposal_id: proposal, from_proposals_list: from_proposals_list), remote: true, data: { disable: true }, class: "card__button button #{vote_button_classes(from_proposals_list)}", disabled: true %>
15
- <% elsif current_settings.votes_blocked? %>
16
- <button class="card__button button <%= vote_button_classes(from_proposals_list) %> disabled" disabled>
17
- <%= t('.votes_blocked') %>
18
- </button>
13
+ <% if proposal.maximum_votes_reached? %>
14
+ <%= content_tag :span, t('.maximum_votes_reached'), class: "card__button button #{vote_button_classes(from_proposals_list)} disabled", disabled: true %>
19
15
  <% else %>
20
- <%= action_authorized_button_to :vote, t('.vote'), proposal_proposal_vote_path(proposal_id: proposal, from_proposals_list: from_proposals_list), remote: true, data: { disable: true }, class: "card__button button #{vote_button_classes(from_proposals_list)}" %>
16
+ <% if vote_limit_enabled? && remaining_votes_count_for(current_user) == 0 %>
17
+ <%= content_tag :span, t('.no_votes_remaining'), class: "card__button button #{vote_button_classes(from_proposals_list)}", disabled: true %>
18
+ <% elsif current_settings.votes_blocked? %>
19
+ <%= content_tag :span, t('.votes_blocked'), class: "card__button button #{vote_button_classes(from_proposals_list)} disabled", disabled: true %>
20
+ <% else %>
21
+ <%= action_authorized_button_to :vote, t('.vote'), proposal_proposal_vote_path(proposal_id: proposal, from_proposals_list: from_proposals_list), remote: true, data: { disable: true }, class: "card__button button #{vote_button_classes(from_proposals_list)}" %>
22
+ <% end %>
21
23
  <% end %>
22
24
  <% end %>
23
25
  <% end %>
@@ -0,0 +1,35 @@
1
+ <% if votes_enabled? && (vote_limit_enabled? || maximum_votes_per_proposal_enabled? || proposal_limit_enabled?) %>
2
+ <div class="row column">
3
+ <div class="callout secondary voting-rules">
4
+ <div class="row">
5
+ <div class="columns medium-8 large-9">
6
+ <h3 class="heading3"><%= t('.title') %></h3>
7
+ <ul>
8
+ <% if vote_limit_enabled? %>
9
+ <li><%= t('.vote_limit.description', limit: feature_settings.vote_limit) %></li>
10
+ <% end %>
11
+
12
+ <% if proposal_limit_enabled? %>
13
+ <li><%= t('.proposal_limit.description', limit: proposal_limit) %></li>
14
+ <% end %>
15
+
16
+ <% if maximum_votes_per_proposal_enabled? %>
17
+ <li><%= t('.maximum_votes_per_proposal.description', limit: maximum_votes_per_proposal) %></li>
18
+ <% end %>
19
+ </ul>
20
+ </div>
21
+ <% if current_user_can_vote? %>
22
+ <div class="columns medium-4 large-3">
23
+ <div class="card card--nomargin text-center remaining-votes-counter">
24
+ <div class="card__content">
25
+ <span class="definition-data__title"><%= t('.vote_limit.left', limit: feature_settings.vote_limit) %></span>
26
+ <%= render partial: "remaining_votes_count" %>
27
+ <span class="extra__suport-text"><%= t('.vote_limit.votes') %></span>
28
+ </div>
29
+ </div>
30
+ </div>
31
+ <% end %>
32
+ </div>
33
+ </div>
34
+ </div>
35
+ <% end %>
@@ -27,16 +27,20 @@
27
27
  <%= javascript_include_tag "decidim/map" %>
28
28
  <% end %>
29
29
  <% end %>
30
- <%= render partial: "votes_limit" %>
30
+ <%= render partial: "voting_rules" %>
31
31
  <div class="row columns">
32
32
  <div class="title-action">
33
33
  <h2 id="proposals-count" class="title-action__title section-heading">
34
34
  <%= render partial: "count" %>
35
35
  </h2>
36
36
  <% if current_settings.creation_enabled %>
37
- <%= action_authorized_link_to :create, new_proposal_path, class: "title-action__action button small hollow" do %>
38
- <%= t(".new_proposal") %>
39
- <%= icon "plus" %>
37
+ <% if !proposal_limit_reached? %>
38
+ <%= action_authorized_link_to :create, new_proposal_path, class: "title-action__action button small hollow" do %>
39
+ <%= t(".new_proposal") %>
40
+ <%= icon "plus" %>
41
+ <% end %>
42
+ <% else %>
43
+ <%= content_tag :a, t(".new_proposal"), class: "title-action__action button small hollow disabled", title: t(".proposal_limit_reached") %>
40
44
  <% end %>
41
45
  <% else %>
42
46
  <span class="title-action__action button small hollow disabled">
@@ -4,7 +4,7 @@
4
4
  url: proposal_url(@proposal.id)
5
5
  }) %>
6
6
 
7
- <%= render partial: "votes_limit" %>
7
+ <%= render partial: "voting_rules" %>
8
8
  <div class="row column view-header">
9
9
  <h2 class="heading2"><%= @proposal.title %></h2>
10
10
  <div class="author-data">
@@ -49,14 +49,21 @@
49
49
  <div class="section">
50
50
  <div class="callout success">
51
51
  <h5><%= t(".proposal_accepted_reason") %></h5>
52
- <p><%== translated_attribute @proposal.answer %></p>
52
+ <p><%= sanitize translated_attribute @proposal.answer %></p>
53
53
  </div>
54
54
  </div>
55
- <% else %>
55
+ <% elsif @proposal.rejected? %>
56
56
  <div class="section">
57
57
  <div class="callout warning">
58
58
  <h5><%= t(".proposal_rejected_reason") %></h5>
59
- <p><%== translated_attribute @proposal.answer %></p>
59
+ <p><%= sanitize translated_attribute @proposal.answer %></p>
60
+ </div>
61
+ </div>
62
+ <% else %>
63
+ <div class="section">
64
+ <div class="callout secondary">
65
+ <h5><%= t(".proposal_in_evaluation_reason") %></h5>
66
+ <p><%= sanitize translated_attribute @proposal.answer %></p>
60
67
  </div>
61
68
  </div>
62
69
  <% end %>
@@ -23,10 +23,12 @@ ca:
23
23
  attachments_allowed: Permetre arxius adjunts
24
24
  comments_enabled: Comentaris habilitats
25
25
  geocoding_enabled: Geocodificació habilitada
26
+ maximum_votes_per_proposal: Vots màxims per proposta
26
27
  new_proposal_help_text: Text d'ajuda al crear una nova proposta
27
28
  official_proposals_enabled: Propostes oficials habilitades
28
29
  proposal_answering_enabled: Resposta oficial a propostes activades
29
- vote_limit: Límit de vot
30
+ proposal_limit: Límit de propostes per usuari
31
+ vote_limit: Límit de vots per usuari
30
32
  step:
31
33
  announcement: Avís
32
34
  comments_blocked: Comentaris bloquejats
@@ -88,6 +90,9 @@ ca:
88
90
  scope: Àmbit
89
91
  state: Estat
90
92
  title: Títol
93
+ votes: Vots
94
+ new:
95
+ limit_reached: No pots crear noves propostes ja que has superat el límit.
91
96
  proposal_votes:
92
97
  create:
93
98
  error: Hi ha hagut errors en votar la proposta.
@@ -105,7 +110,7 @@ ca:
105
110
  all: Tots
106
111
  category: Categoria
107
112
  category_prompt: Selecciona una categoria
108
- citizenship: Ciutadania
113
+ citizens: Ciutadania
109
114
  evaluating: En avaluació
110
115
  official: Oficial
111
116
  origin: Origen
@@ -123,6 +128,7 @@ ca:
123
128
  unfold: Desplegar
124
129
  index:
125
130
  new_proposal: Nova proposta
131
+ proposal_limit_reached: Has arribat al límit de la proposta
126
132
  view_proposal: Veure proposta
127
133
  linked_proposals:
128
134
  proposal_votes:
@@ -143,10 +149,12 @@ ca:
143
149
  view_proposal: Veure proposta
144
150
  show:
145
151
  proposal_accepted_reason: 'Aquesta proposta ha estat acceptada perquè:'
152
+ proposal_in_evaluation_reason: S'està avaluant aquesta proposta
146
153
  proposal_rejected_reason: 'Aquesta proposta ha estat rebutjada perquè:'
147
154
  report: Informe
148
155
  vote_button:
149
156
  already_voted: Ja has votat
157
+ maximum_votes_reached: S'ha arribat al límit de vots
150
158
  no_votes_remaining: No hi ha suports restants
151
159
  vote: Donar suport
152
160
  votes_blocked: Recollida de suports desactivada
@@ -154,12 +162,16 @@ ca:
154
162
  count:
155
163
  one: SUPORT
156
164
  other: SUPORTS
157
- votes_limit:
165
+ voting_rules:
166
+ maximum_votes_per_proposal:
167
+ description: Cada proposta pot rebre un màxim de %{limit} vots.
168
+ proposal_limit:
169
+ description: Pots crear fins a %{limit} propostes.
170
+ title: 'La votació es regeix per les següents normes:'
158
171
  vote_limit:
159
- description: En lloc de donar suport a tantes propostes com es vulgui, només es pot donar suport fins a un màxim de %{limit} propostes.
172
+ description: Pots votar fins a %{limit} propostes.
160
173
  left: Restant
161
- title: Té %{limit} suports a distribuir
162
- votes: Suports
174
+ votes: Vots
163
175
  resource_links:
164
176
  included_proposals:
165
177
  proposal_projects: 'Proposta formulada en aquests projectes:'
@@ -23,10 +23,12 @@ en:
23
23
  attachments_allowed: Allow attachments
24
24
  comments_enabled: Comments enabled
25
25
  geocoding_enabled: Geocoding enabled
26
+ maximum_votes_per_proposal: Maximum votes per proposal
26
27
  new_proposal_help_text: New proposal help text
27
28
  official_proposals_enabled: Official proposals enabled
28
29
  proposal_answering_enabled: Proposal answering enabled
29
- vote_limit: Vote limit
30
+ proposal_limit: Proposal limit per user
31
+ vote_limit: Vote limit per user
30
32
  step:
31
33
  announcement: Announcement
32
34
  comments_blocked: Comments blocked
@@ -88,6 +90,9 @@ en:
88
90
  scope: Scope
89
91
  state: State
90
92
  title: Title
93
+ votes: Votes
94
+ new:
95
+ limit_reached: You can't create new proposals since you've exceeded the limit.
91
96
  proposal_votes:
92
97
  create:
93
98
  error: There's been errors when voting the proposal.
@@ -105,7 +110,7 @@ en:
105
110
  all: All
106
111
  category: Category
107
112
  category_prompt: Select a category
108
- citizenship: Citizenship
113
+ citizens: Citizens
109
114
  evaluating: Evaluating
110
115
  official: Official
111
116
  origin: Origin
@@ -123,6 +128,7 @@ en:
123
128
  unfold: Unfold
124
129
  index:
125
130
  new_proposal: New proposal
131
+ proposal_limit_reached: Proposal limit reached
126
132
  view_proposal: View proposal
127
133
  linked_proposals:
128
134
  proposal_votes:
@@ -143,10 +149,12 @@ en:
143
149
  view_proposal: View proposal
144
150
  show:
145
151
  proposal_accepted_reason: 'This proposal has been accepted because:'
152
+ proposal_in_evaluation_reason: This proposal is being evaluated
146
153
  proposal_rejected_reason: 'This proposal has been rejected because:'
147
154
  report: Report
148
155
  vote_button:
149
156
  already_voted: Already voted
157
+ maximum_votes_reached: Vote limit reached
150
158
  no_votes_remaining: No votes remaining
151
159
  vote: Vote
152
160
  votes_blocked: Voting disabled
@@ -154,11 +162,15 @@ en:
154
162
  count:
155
163
  one: VOTE
156
164
  other: VOTES
157
- votes_limit:
165
+ voting_rules:
166
+ maximum_votes_per_proposal:
167
+ description: Each proposal can receive a maximum of %{limit} votes.
168
+ proposal_limit:
169
+ description: You can create up to %{limit} proposals.
170
+ title: 'Voting is subject to the following rules:'
158
171
  vote_limit:
159
- description: Instead of voting as many proposals as you want you can only vote up to %{limit} proposals.
172
+ description: You can vote up to %{limit} proposals.
160
173
  left: Remaining
161
- title: You have %{limit} votes to distribute
162
174
  votes: Votes
163
175
  resource_links:
164
176
  included_proposals:
@@ -23,10 +23,12 @@ es:
23
23
  attachments_allowed: Permitir archivos adjuntos
24
24
  comments_enabled: Comentarios habilitados
25
25
  geocoding_enabled: Geocodificación habilitada
26
+ maximum_votes_per_proposal: Máximo de votos por propuesta
26
27
  new_proposal_help_text: Texto de ayuda al crear una propuesta
27
28
  official_proposals_enabled: Propuestas oficiales habilitadas
28
29
  proposal_answering_enabled: Respuesta oficial a propuestas habilitadas
29
- vote_limit: Límite de votos
30
+ proposal_limit: Límite de propuestas por usuario
31
+ vote_limit: Límite de votos por usuario
30
32
  step:
31
33
  announcement: Aviso
32
34
  comments_blocked: Comentarios bloqueados
@@ -88,6 +90,9 @@ es:
88
90
  scope: Ámbito
89
91
  state: Estado
90
92
  title: Título
93
+ votes: Votos
94
+ new:
95
+ limit_reached: No puedes crear nuevas propuestas ya que has superado el límite.
91
96
  proposal_votes:
92
97
  create:
93
98
  error: Ha habido errores al votar la propuesta.
@@ -105,7 +110,7 @@ es:
105
110
  all: Todas
106
111
  category: Categoría
107
112
  category_prompt: Selecciona una categoría
108
- citizenship: Ciudadanía
113
+ citizens: Ciudadanía
109
114
  evaluating: En evaluación
110
115
  official: Oficial
111
116
  origin: Origen
@@ -123,6 +128,7 @@ es:
123
128
  unfold: Desplegar
124
129
  index:
125
130
  new_proposal: Nueva propuesta
131
+ proposal_limit_reached: Límite de propuestas alcanzado
126
132
  view_proposal: Ver propuesta
127
133
  linked_proposals:
128
134
  proposal_votes:
@@ -143,10 +149,12 @@ es:
143
149
  view_proposal: Ver propuesta
144
150
  show:
145
151
  proposal_accepted_reason: 'Esta propuesta ha sido aceptada porque:'
152
+ proposal_in_evaluation_reason: Esta propuesta está siendo evaluada
146
153
  proposal_rejected_reason: 'Esta propuesta ha sido rechazada porque:'
147
154
  report: Denunciar
148
155
  vote_button:
149
156
  already_voted: Ya votado
157
+ maximum_votes_reached: Límite de votos alcanzado
150
158
  no_votes_remaining: No hay votos restantes
151
159
  vote: Dar apoyo
152
160
  votes_blocked: Votación desactivada
@@ -154,11 +162,15 @@ es:
154
162
  count:
155
163
  one: APOYO
156
164
  other: APOYOS
157
- votes_limit:
165
+ voting_rules:
166
+ maximum_votes_per_proposal:
167
+ description: Cada propuesta puede recibir un máximo de %{limit} votos.
168
+ proposal_limit:
169
+ description: Puedes crear hasta %{limit} propuestas.
170
+ title: 'La votación se rige por las siguientes normas:'
158
171
  vote_limit:
159
- description: En lugar de dar apoyo tantas propuestas como se desee, sólo se puede dar apoyo hasta %{limit} propuestas.
172
+ description: Puedes votar hasta %{limit} propuestas.
160
173
  left: Restante
161
- title: Tiene %{limit} votos a distribuir
162
174
  votes: Votos
163
175
  resource_links:
164
176
  included_proposals: