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.
- 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:
|