decidim-proposals 0.6.8 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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: