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.
- checksums.yaml +4 -4
- data/app/commands/decidim/proposals/create_proposal.rb +12 -0
- data/app/commands/decidim/proposals/vote_proposal.rb +2 -0
- data/app/controllers/decidim/proposals/application_controller.rb +18 -0
- data/app/controllers/decidim/proposals/proposals_controller.rb +7 -1
- data/app/helpers/decidim/proposals/application_helper.rb +14 -0
- data/app/helpers/decidim/proposals/proposal_votes_helper.rb +45 -1
- data/app/models/decidim/proposals/proposal.rb +19 -0
- data/app/services/decidim/proposals/proposal_search.rb +1 -1
- data/app/views/decidim/proposals/admin/proposals/index.html.erb +11 -0
- data/app/views/decidim/proposals/proposals/_filters.html.erb +1 -1
- data/app/views/decidim/proposals/proposals/_vote_button.html.erb +9 -7
- data/app/views/decidim/proposals/proposals/_voting_rules.html.erb +35 -0
- data/app/views/decidim/proposals/proposals/index.html.erb +8 -4
- data/app/views/decidim/proposals/proposals/show.html.erb +11 -4
- data/config/locales/ca.yml +18 -6
- data/config/locales/en.yml +17 -5
- data/config/locales/es.yml +17 -5
- data/config/locales/eu.yml +28 -16
- data/config/locales/fi.yml +23 -11
- data/config/locales/fr.yml +21 -9
- data/config/locales/it.yml +17 -5
- data/config/locales/nl.yml +19 -7
- data/config/locales/pl.yml +17 -5
- data/config/locales/ru.yml +183 -0
- data/config/locales/uk.yml +36 -24
- data/lib/decidim/proposals/feature.rb +10 -8
- data/lib/decidim/proposals/test/factories.rb +29 -1
- data/lib/decidim/proposals/version.rb +10 -0
- metadata +25 -51
- 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:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 87d3499da69c46a6b748f61303bf26957d97b788
|
4
|
+
data.tar.gz: f2229325a4b0654b03d37972944712d0a6db353e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
@@ -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
|
-
|
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,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')], ["
|
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
|
14
|
-
<%=
|
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
|
-
|
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: "
|
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
|
-
|
38
|
-
<%=
|
39
|
-
|
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: "
|
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
|
52
|
+
<p><%= sanitize translated_attribute @proposal.answer %></p>
|
53
53
|
</div>
|
54
54
|
</div>
|
55
|
-
<%
|
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
|
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 %>
|
data/config/locales/ca.yml
CHANGED
@@ -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
|
-
|
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
|
-
|
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
|
-
|
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:
|
172
|
+
description: Pots votar fins a %{limit} propostes.
|
160
173
|
left: Restant
|
161
|
-
|
162
|
-
votes: Suports
|
174
|
+
votes: Vots
|
163
175
|
resource_links:
|
164
176
|
included_proposals:
|
165
177
|
proposal_projects: 'Proposta formulada en aquests projectes:'
|
data/config/locales/en.yml
CHANGED
@@ -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
|
-
|
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
|
-
|
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
|
-
|
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:
|
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:
|
data/config/locales/es.yml
CHANGED
@@ -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
|
-
|
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
|
-
|
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
|
-
|
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:
|
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:
|