decidim-proposals 0.27.4 → 0.27.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. checksums.yaml +4 -4
  2. data/app/cells/decidim/proposals/highlighted_proposals_for_component/show.erb +1 -1
  3. data/app/cells/decidim/proposals/participatory_text_proposal/buttons.erb +2 -2
  4. data/app/cells/decidim/proposals/proposal_tags/show.erb +2 -2
  5. data/app/controllers/concerns/decidim/proposals/orderable.rb +2 -2
  6. data/app/controllers/decidim/proposals/widgets_controller.rb +11 -1
  7. data/app/models/decidim/proposals/proposal.rb +2 -14
  8. data/app/models/decidim/proposals/valuation_assignment.rb +2 -1
  9. data/app/packs/src/decidim/proposals/admin/proposals.js +7 -0
  10. data/app/permissions/decidim/proposals/permissions.rb +9 -0
  11. data/app/views/decidim/proposals/admin/proposals/_form.html.erb +1 -1
  12. data/app/views/decidim/proposals/admin/proposals/_proposal-tr.html.erb +1 -1
  13. data/app/views/decidim/proposals/admin/proposals/show.html.erb +40 -35
  14. data/app/views/decidim/proposals/admin/proposals/update_attribute.js.erb +2 -1
  15. data/app/views/decidim/proposals/proposals/show.html.erb +3 -1
  16. data/config/locales/ar.yml +3 -6
  17. data/config/locales/bg.yml +166 -2
  18. data/config/locales/ca.yml +28 -26
  19. data/config/locales/cs.yml +7 -5
  20. data/config/locales/de.yml +12 -10
  21. data/config/locales/el.yml +0 -3
  22. data/config/locales/en.yml +2 -0
  23. data/config/locales/es-MX.yml +9 -7
  24. data/config/locales/es-PY.yml +10 -8
  25. data/config/locales/es.yml +18 -16
  26. data/config/locales/eu.yml +162 -158
  27. data/config/locales/fi-plain.yml +7 -5
  28. data/config/locales/fi.yml +6 -4
  29. data/config/locales/fr-CA.yml +10 -6
  30. data/config/locales/fr.yml +24 -20
  31. data/config/locales/ga-IE.yml +7 -0
  32. data/config/locales/gl.yml +3 -5
  33. data/config/locales/he-IL.yml +1 -0
  34. data/config/locales/hu.yml +19 -9
  35. data/config/locales/id-ID.yml +5 -3
  36. data/config/locales/is-IS.yml +4 -3
  37. data/config/locales/it.yml +7 -6
  38. data/config/locales/ja.yml +19 -17
  39. data/config/locales/lt.yml +25 -3
  40. data/config/locales/lv.yml +5 -3
  41. data/config/locales/nl.yml +6 -7
  42. data/config/locales/no.yml +2 -3
  43. data/config/locales/pl.yml +33 -4
  44. data/config/locales/pt-BR.yml +64 -5
  45. data/config/locales/pt.yml +4 -3
  46. data/config/locales/ro-RO.yml +1 -3
  47. data/config/locales/ru.yml +6 -3
  48. data/config/locales/sk.yml +9 -7
  49. data/config/locales/sq-AL.yml +1 -0
  50. data/config/locales/sv.yml +8 -6
  51. data/config/locales/th-TH.yml +1 -0
  52. data/config/locales/tr-TR.yml +10 -6
  53. data/config/locales/uk.yml +6 -3
  54. data/config/locales/zh-CN.yml +5 -3
  55. data/config/locales/zh-TW.yml +1 -4
  56. data/db/migrate/20240404202756_add_valuation_assignments_count_to_decidim_proposals_proposals.rb +16 -0
  57. data/decidim-proposals.gemspec +40 -0
  58. data/lib/decidim/proposals/proposal_serializer.rb +1 -0
  59. data/lib/decidim/proposals/test/factories.rb +63 -56
  60. data/lib/decidim/proposals/valuatable.rb +2 -1
  61. data/lib/decidim/proposals/version.rb +1 -1
  62. metadata +30 -26
  63. data/config/environment.rb +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c1365c0d325e5a7f66b393bfbc6147bd1502ac8e2125d845315ca84a654c69d6
4
- data.tar.gz: c7c9b07fda158bf3a999e2bb91312cd3ba49e9250d7de706010b0401617eaede
3
+ metadata.gz: 85856f36076b1726e3bfe1f049f46968909f1acd6ded28784a020abe858dddbd
4
+ data.tar.gz: 9329f0d81040190473850146061ebcf3778c669cec4b22a3d1778cc01b568b03
5
5
  SHA512:
6
- metadata.gz: cc8ea5518ea1e7b7707a606fee3249aa2390a8b88fcbc055d6e9d8dd5b5c9b5b7cfc131abd74c6ca15b0a70bd555fb345092fadcc283d31c2da2d55add16f22f
7
- data.tar.gz: d95d858d704a8487807953fe06b94fb32d5c8341f34739ac3225c8292b24753c6a66b3c7d02b0549c1110f96d2958de3f562d4976c4394f04bc7461ab80c616f
6
+ metadata.gz: 2aff02ae9dfbf6e0f0d87014e79344a4ec1e995af11a4d51196702506de9cdc2c356276a096a0b25fbe96060945d56cc56a6e1dc3e06803f490d7267b5b331cf
7
+ data.tar.gz: 1dd27d121005ba63c91f56db70f540f265ef3a4579e0de837a5307f2acda20a54281d0c67621deb0e0465e9c87c20a2daf901f85a4fd7e2b92ef3ebcb56f674e
@@ -1,6 +1,6 @@
1
1
  <section class="section row collapse highlighted_proposals">
2
2
  <h3 class="section-heading">
3
- <%= translated_attribute(model.name) %> <a href="<%= main_component_path(model) %>" class="text-small"><%= t("decidim.participatory_spaces.highlighted_proposals.see_all", count: proposals_count) %></a>
3
+ <%= decidim_escape_translated(model.name) %> <a href="<%= main_component_path(model) %>" class="text-small"><%= t("decidim.participatory_spaces.highlighted_proposals.see_all", count: proposals_count) %></a>
4
4
  </h3>
5
5
 
6
6
  <%= cell(
@@ -6,7 +6,7 @@
6
6
  <%= link_to resource_amendments_path, class: "column medium-4 button light secondary" do %>
7
7
  <%= visible_emendations.count %>
8
8
  <% end %>
9
- <%= link_to amend_resource_path, class: "column button hollow secondary button--sc", disabled: amend_button_disabled? do %>
9
+ <%= action_authorized_link_to :amend, amend_resource_path, resource: model, data: { "redirect_url" => amend_resource_path }, class: "column button hollow secondary button--sc", disabled: amend_button_disabled? do %>
10
10
  <%= t("amend", scope: "decidim.proposals.participatory_text_proposal.buttons") %>
11
11
  <% end %>
12
12
  </div>
@@ -23,7 +23,7 @@
23
23
  <%= link_to resource_comments_path, class: "column medium-4 button light secondary" do %>
24
24
  <%= icon "comment-square", class: "icon--small", aria_label: t("comments", scope: "decidim.proposals.participatory_text_proposal.buttons"), role: "img" %> <%= model.comments_count %>
25
25
  <% end %>
26
- <%= link_to resource_comments_path, class: "column button hollow secondary button--sc" do %>
26
+ <%= action_authorized_link_to :comment, resource_comments_path, resource: model, class: "column button hollow secondary button--sc" do %>
27
27
  <%= t("comment", scope: "decidim.proposals.participatory_text_proposal.buttons") %>
28
28
  <% end %>
29
29
  <% end %>
@@ -3,8 +3,8 @@
3
3
  <% if category.present? %>
4
4
  <li>
5
5
  <%= link_to resource_locator(model).index(filter: { with_any_category: [category.id.to_s] }), title: t("decidim.tags.filter_results_for_category", resource: translated_attribute(category.name)) do %>
6
- <span class="show-for-sr"><%= t "decidim.tags.filter_results_for_category", resource: translated_attribute(category.name) %></span>
7
- <span aria-hidden="true"><%= translated_attribute(category.name) %></span>
6
+ <span class="show-for-sr"><%= t "decidim.tags.filter_results_for_category", resource: decidim_html_escape(translated_attribute(category.name)) %></span>
7
+ <span aria-hidden="true"><%= decidim_html_escape(translated_attribute(category.name)) %></span>
8
8
  <% end %>
9
9
  <% if previous_category.present? && show_previous_category? %>
10
10
  &nbsp;
@@ -59,11 +59,11 @@ module Decidim
59
59
  def reorder(proposals)
60
60
  case order
61
61
  when "most_commented"
62
- proposals.left_joins(:comments).group(:id).order(Arel.sql("COUNT(decidim_comments_comments.id) DESC"))
62
+ proposals.order(comments_count: :desc)
63
63
  when "most_endorsed"
64
64
  proposals.order(endorsements_count: :desc)
65
65
  when "most_followed"
66
- proposals.left_joins(:follows).group(:id).order(Arel.sql("COUNT(decidim_follows.id) DESC"))
66
+ proposals.order(follows_count: :desc)
67
67
  when "most_voted"
68
68
  proposals.order(proposal_votes_count: :desc)
69
69
  when "random"
@@ -5,15 +5,25 @@ module Decidim
5
5
  class WidgetsController < Decidim::WidgetsController
6
6
  helper Proposals::ApplicationHelper
7
7
 
8
+ def show
9
+ enforce_permission_to :embed, :proposal, proposal: model if model
10
+
11
+ super
12
+ end
13
+
8
14
  private
9
15
 
10
16
  def model
11
- @model ||= Proposal.where(component: params[:component_id]).find(params[:proposal_id])
17
+ @model ||= Proposal.not_hidden.except_withdrawn.where(component: current_component).find(params[:proposal_id])
12
18
  end
13
19
 
14
20
  def iframe_url
15
21
  @iframe_url ||= proposal_widget_url(model)
16
22
  end
23
+
24
+ def permission_class_chain
25
+ [Decidim::Proposals::Permissions]
26
+ end
17
27
  end
18
28
  end
19
29
  end
@@ -96,11 +96,11 @@ module Decidim
96
96
  }
97
97
 
98
98
  scope :sort_by_valuation_assignments_count_asc, lambda {
99
- order(Arel.sql("#{sort_by_valuation_assignments_count_nulls_last_query} ASC NULLS FIRST").to_s)
99
+ order(valuation_assignments_count: :asc)
100
100
  }
101
101
 
102
102
  scope :sort_by_valuation_assignments_count_desc, lambda {
103
- order(Arel.sql("#{sort_by_valuation_assignments_count_nulls_last_query} DESC NULLS LAST").to_s)
103
+ order(valuation_assignments_count: :desc)
104
104
  }
105
105
 
106
106
  scope_search_multi :with_any_state, [:accepted, :rejected, :evaluating, :state_not_published]
@@ -333,18 +333,6 @@ module Decidim
333
333
  ProposalSearch.new(self, params, options)
334
334
  end
335
335
 
336
- # Defines the base query so that ransack can actually sort by this value
337
- def self.sort_by_valuation_assignments_count_nulls_last_query
338
- <<-SQL.squish
339
- (
340
- SELECT COUNT(decidim_proposals_valuation_assignments.id)
341
- FROM decidim_proposals_valuation_assignments
342
- WHERE decidim_proposals_valuation_assignments.decidim_proposal_id = decidim_proposals_proposals.id
343
- GROUP BY decidim_proposals_valuation_assignments.decidim_proposal_id
344
- )
345
- SQL
346
- end
347
-
348
336
  # method to filter by assigned valuator role ID
349
337
  def self.valuator_role_ids_has(value)
350
338
  query = <<-SQL.squish
@@ -9,7 +9,8 @@ module Decidim
9
9
  include Decidim::Traceable
10
10
  include Decidim::Loggable
11
11
 
12
- belongs_to :proposal, foreign_key: "decidim_proposal_id", class_name: "Decidim::Proposals::Proposal"
12
+ belongs_to :proposal, foreign_key: "decidim_proposal_id", class_name: "Decidim::Proposals::Proposal",
13
+ counter_cache: true
13
14
  belongs_to :valuator_role, polymorphic: true
14
15
 
15
16
  def self.log_presenter_class_for(_log)
@@ -47,6 +47,12 @@ $(() => {
47
47
  }
48
48
  }
49
49
 
50
+ const resetForms = function() {
51
+ $("#js-bulk-actions-dropdown button").each(function() {
52
+ $(`#js-form-${$(this).data("action")}`)[0].reset();
53
+ })
54
+ }
55
+
50
56
  const showOtherActionsButtons = function() {
51
57
  $("#js-other-actions-wrapper").removeClass("hide");
52
58
  }
@@ -68,6 +74,7 @@ $(() => {
68
74
  window.showOtherActionsButtons = showOtherActionsButtons;
69
75
  window.hideOtherActionsButtons = hideOtherActionsButtons;
70
76
  window.hideBulkActionForms = hideBulkActionForms;
77
+ window.resetForms = resetForms;
71
78
 
72
79
  if ($(".js-bulk-action-form").length) {
73
80
  hideBulkActionForms();
@@ -4,6 +4,7 @@ module Decidim
4
4
  module Proposals
5
5
  class Permissions < Decidim::DefaultPermissions
6
6
  def permissions
7
+ allow_embed_proposal?
7
8
  return permission_action unless user
8
9
 
9
10
  # Delegate the admin permission checks to the admin permissions class
@@ -47,6 +48,14 @@ module Decidim
47
48
  @proposal ||= context.fetch(:proposal, nil) || context.fetch(:resource, nil)
48
49
  end
49
50
 
51
+ # As this is a public action, we need to run this before other checks
52
+ def allow_embed_proposal?
53
+ return unless permission_action.action == :embed && permission_action.subject == :proposal && proposal
54
+ return disallow! if proposal.withdrawn?
55
+
56
+ allow!
57
+ end
58
+
50
59
  def voting_enabled?
51
60
  return unless current_settings
52
61
 
@@ -44,7 +44,7 @@
44
44
 
45
45
  <div class="row column" id="proposal_meeting">
46
46
  <%= form.select :meeting_id,
47
- options_for_select(@form.meetings&.map { |meeting| [present(meeting).title, meeting.id] }, selected: meetings_as_authors_selected ),
47
+ options_for_select(@form.meetings&.map { |meeting| [present(meeting).title(html_escape: true), meeting.id] }, selected: meetings_as_authors_selected ),
48
48
  { include_blank: true, label: t(".select_a_meeting") },
49
49
  { multiple: false, class: "chosen-select" } %>
50
50
  </div>
@@ -53,7 +53,7 @@
53
53
  </td>
54
54
 
55
55
  <td class="valuators-count">
56
- <%= proposal.valuation_assignments.count %>
56
+ <%= proposal.valuation_assignments.size %>
57
57
  </td>
58
58
 
59
59
  <td>
@@ -72,42 +72,47 @@
72
72
  </ul>
73
73
  </div>
74
74
 
75
- <div class="row column">
76
- <strong><%= t ".endorsers" %>:</strong>
77
- <ul id="proposal-endorsers-list">
78
- <% presented_endorsers = endorsers_presenters_for(proposal).to_a %>
79
- <% presented_endorsers.first(5).each do |presented_endorser| %>
80
- <li>
81
- <%= link_to_if(
82
- presented_endorser.profile_path.present?,
83
- presented_endorser.name,
84
- presented_endorser.profile_path,
85
- target: :blank
86
- ) %>
87
- </li>
88
- <% end %>
89
- <% if presented_endorsers.count > 5 %>
90
- <li>
91
- <%= link_to(
92
- t(".n_more_endorsers", count: presented_endorsers.count - 5),
93
- resource_locator(proposal).path
94
- ) %>
95
- </li>
96
- <% end %>
97
- </ul>
98
- </div>
75
+ <% presented_endorsers = endorsers_presenters_for(proposal).to_a %>
76
+ <% if presented_endorsers.any? %>
77
+ <div class="row column">
78
+ <strong><%= t ".endorsers" %>:</strong>
79
+ <ul id="proposal-endorsers-list">
80
+ <% presented_endorsers.first(5).each do |presented_endorser| %>
81
+ <li>
82
+ <%= link_to_if(
83
+ presented_endorser.profile_path.present?,
84
+ presented_endorser.name,
85
+ presented_endorser.profile_path,
86
+ target: :blank
87
+ ) %>
88
+ </li>
89
+ <% end %>
90
+ <% if presented_endorsers.count > 5 %>
91
+ <li>
92
+ <%= link_to(
93
+ t(".n_more_endorsers", count: presented_endorsers.count - 5),
94
+ resource_locator(proposal).path
95
+ ) %>
96
+ </li>
97
+ <% end %>
98
+ </ul>
99
+ </div>
100
+ <% end %>
99
101
 
100
- <div class="row column">
101
- <strong><%= t ".related_meetings" %>:</strong>
102
- <ul id="related-meetings">
103
- <% proposal.linked_resources(:meetings, "proposals_from_meeting").each do |meeting| %>
104
- <% presented_meeting = present(meeting) %>
105
- <li>
106
- <%= link_to presented_meeting.title, presented_meeting.profile_path %>
107
- </li>
108
- <% end %>
109
- </ul>
110
- </div>
102
+ <% proposal_meetings = proposal.linked_resources(:meetings, "proposals_from_meeting") %>
103
+ <% if proposal_meetings.any? %>
104
+ <div class="row column">
105
+ <strong><%= t ".related_meetings" %>:</strong>
106
+ <ul id="related-meetings">
107
+ <% proposal_meetings.each do |meeting| %>
108
+ <% presented_meeting = present(meeting) %>
109
+ <li>
110
+ <%= link_to decidim_escape_translated(meeting.title).html_safe, presented_meeting.profile_path %>
111
+ </li>
112
+ <% end %>
113
+ </ul>
114
+ </div>
115
+ <% end %>
111
116
 
112
117
  <% if proposal.documents.any? %>
113
118
  <div class="row column">
@@ -22,5 +22,6 @@
22
22
  window.hideBulkActionsButton();
23
23
  window.hideBulkActionForms();
24
24
  window.showOtherActionsButtons();
25
- window.selectedResourcesCountUpdate();
25
+ window.selectedProposalsCountUpdate();
26
+ window.resetForms();
26
27
  <% end %>
@@ -129,7 +129,9 @@ extra_admin_link(
129
129
  <%= resource_version(proposal_presenter, versions_path: proposal_versions_path(@proposal)) %>
130
130
  <%= cell("decidim/fingerprint", @proposal) %>
131
131
  <%= render partial: "decidim/shared/share_modal", locals: { resource: @proposal } %>
132
- <%= embed_modal_for proposal_widget_url(@proposal, format: :js) %>
132
+ <% if allowed_to? :embed, :proposal, proposal: @proposal %>
133
+ <%= embed_modal_for proposal_widget_url(@proposal, format: :js) %>
134
+ <% end %>
133
135
  <%= cell "decidim/proposals/proposal_link_to_collaborative_draft", @proposal %>
134
136
  <%= cell "decidim/proposals/proposal_link_to_rejected_emendation", @proposal %>
135
137
  </div>
@@ -291,7 +291,6 @@ ar:
291
291
  notification_title: تم قبول اقتراحك <a href="%{resource_path}">%{resource_title}</a>.
292
292
  follower:
293
293
  email_intro: 'تم قبول الاقتراح "%{resource_title}". يمكنك قراءة الإجابة على هذه الصفحة:'
294
- email_outro: لقد تلقيت هذا الإشعار لأنك تتابع %{resource_title}. يمكنك إلغاء المتابعة على الرابط السابق.
295
294
  email_subject: تم قبول اقتراح تتابعه
296
295
  notification_title: لقد تم قبول المُقتَرح <a href="%{resource_path}">%{resource_title}</a>.
297
296
  proposal_evaluating:
@@ -302,7 +301,6 @@ ar:
302
301
  notification_title: يتم تقييم الاقتراح الخاص بك <a href="%{resource_path}">%{resource_title}</a>.
303
302
  follower:
304
303
  email_intro: 'الاقتراح "%{resource_title}" قيد التقييم حاليا. يمكنك التحقق من وجود إجابة على هذه الصفحة:'
305
- email_outro: لقد تلقيت هذا الإشعار لأنك تتابع %{resource_title}. يمكنك إلغاء المتابعة على الرابط السابق.
306
304
  email_subject: واحد من الاقتراحات التي تتبعها قيد التقييم الآن
307
305
  notification_title: الاقتراح <a href="%{resource_path}">%{resource_title}</a> قيد التقييم الآن.
308
306
  proposal_mentioned:
@@ -329,7 +327,6 @@ ar:
329
327
  notification_title: تم رفض اقتراحك <a href="%{resource_path}">%{resource_title}</a>.
330
328
  follower:
331
329
  email_intro: 'تم رفض الاقتراح %{resource_title}. يمكنك قراءة الإجابة على ذلك على هذه الصفحة:'
332
- email_outro: لقد تلقيت هذا الإشعار لأنك تتابع %{resource_title}. يمكنك إلغاء المتابعة على الرابط السابق.
333
330
  email_subject: واحد من الاقتراحات التي تتبعها تم رفضها
334
331
  notification_title: تم رفض الاقتراح <a href="%{resource_path}">%{resource_title}</a>.
335
332
  proposal_update_category:
@@ -454,7 +451,7 @@ ar:
454
451
  other: اقتراحات
455
452
  title:
456
453
  answers: استيراد إجابات الاقتراح
457
- proposals: استيراد الاقتراحات
454
+ proposals: مقترحات الاستيراد
458
455
  models:
459
456
  proposal:
460
457
  name: اقتراح
@@ -496,7 +493,7 @@ ar:
496
493
  accepted: وافقت
497
494
  answer_proposal: إجابة
498
495
  evaluating: تقييم
499
- not_answered: لم تتم الإجابة عليه
496
+ not_answered: بلا جواب
500
497
  rejected: مرفوض
501
498
  title: الإجابة على الاقتراح %{title}
502
499
  proposal_notes:
@@ -600,7 +597,7 @@ ar:
600
597
  no_components: لا توجد مكونات اقتراح أخرى في هذه المساحة التشاركية لاستيراد المقترحات منها.
601
598
  select_component: يرجى اختيار عنصر
602
599
  select_states: تحقق من حالة مقترحات الاستيراد
603
- title: استيراد الاقتراحات
600
+ title: مقترحات الاستيراد
604
601
  proposals_merges:
605
602
  create:
606
603
  invalid: 'طرأت مشكلة في دمج الاقتراحات المحددة لأن بعضها:'
@@ -11,6 +11,8 @@ bg:
11
11
  state: Състояние
12
12
  title: Заглавие
13
13
  user_group_id: Създай съвместна чернова като
14
+ import_participatory_text:
15
+ document: Текстов документ за участие
14
16
  proposal:
15
17
  address: Адрес
16
18
  answer: Отговор
@@ -141,6 +143,7 @@ bg:
141
143
  endorsements_enabled: Одобряване разрешено
142
144
  proposal_answering_enabled: Отговора на предложение е разрешен
143
145
  publish_answers_immediately: Публикувай отговорите на предложения незабавно
146
+ publish_answers_immediately_help_html: 'Имайте предвид, че ако отговаряте на някои предложения, без това активиране, ще трябва да ги публикувате ръчно, като ги изберете и използвате действието за публикуване. За повече информация как работи това вижте <a href="https://docs.decidim.org/en/admin/components/proposals/answers#_publication" target="_blank">страницата с документация за отговорите на предложенията</a>.'
144
147
  suggested_hashtags: Предлагай хаштаг на участниците когато създават предложения
145
148
  votes_blocked: Поддържането блокирано
146
149
  votes_enabled: Поддържането разрешено
@@ -189,7 +192,6 @@ bg:
189
192
  notification_title: Вашето предложение <a href="%{resource_path}">%{resource_title}</a> е одобрено.
190
193
  follower:
191
194
  email_intro: 'Предложението "%{resource_title}" е одобрено. Прочетете отговора на страницата:'
192
- email_outro: Получавате това известие, защото следвате "%{resource_title}". Може да премахнете следването чрез предната връзка.
193
195
  email_subject: Предложение, което следвате е одобрено
194
196
  notification_title: Предложението <a href="%{resource_path}">%{resource_title}</a> беше одобрено.
195
197
  proposal_evaluating:
@@ -200,7 +202,6 @@ bg:
200
202
  notification_title: Вашето предложение <a href="%{resource_path}">%{resource_title}</a> се разглежда.
201
203
  follower:
202
204
  email_intro: 'Предложението "%{resource_title}" се разглежда в момента. Прочетете отговора на страницата:'
203
- email_outro: Получавате това известие, защото следвате "%{resource_title}". Може да премахнете следването чрез предната връзка.
204
205
  email_subject: Предложение, което следвате се разглежда
205
206
  notification_title: Предложението <a href="%{resource_path}">%{resource_title}</a> се разглежда.
206
207
  proposal_mentioned:
@@ -216,10 +217,173 @@ bg:
216
217
  proposal_published_for_space:
217
218
  email_intro: Предложението "%{resource_title}" беше добавено в "%{participatory_space_title}", което следвате.
218
219
  email_outro: Получавате това известие, защото следвате "%{participatory_space_title}". Може да прекратите известията чрез предната връзка.
220
+ notification_title: Предложениетоl <a href="%{resource_path}">%{resource_title}</a> е добавено към %{participatory_space_title} от %{author}
221
+ notification_title_official: Официалното предложение <a href="%{resource_path}">%{resource_title}</a> е добавено към %{participatory_space_title}
222
+ proposal_rejected:
223
+ affected_user:
224
+ email_intro: 'Вашето предложение "%{resource_title}" беше отхвърлено. Можете да прочетете отговора на тази страница:'
225
+ email_outro: Получавате това известие, защото сте автор на %{resource_title}".
226
+ email_subject: Вашето предложение беше отхвърлено
227
+ notification_title: Вашето предложение <a href="%{resource_path}">%{resource_title}</a> беше отхвърлено.
228
+ follower:
229
+ email_intro: 'Предложението „%{resource_title}“ беше отхвърлено. Можете да прочетете отговора на тази страница:'
230
+ email_subject: Предложение, което следвате, беше отхвърлено
231
+ notification_title: Предложението <a href="%{resource_path}">%{resource_title}</a> беше отхвърлено.
232
+ gamification:
233
+ badges:
234
+ proposal_votes:
235
+ unearned_another: Този участник все още не е подкрепил нито едно предложение.
236
+ proposals:
237
+ unearned_another: Този участник все още не е създал нито едно предложение.
238
+ participatory_spaces:
239
+ highlighted_proposals:
240
+ see_all: Виж всички предложения (%{count})
219
241
  proposals:
242
+ admin:
243
+ imports:
244
+ title:
245
+ answers: Импортиране на отговори на предложения
246
+ proposals: Копиране на предложения
247
+ participatory_texts:
248
+ new_import:
249
+ document_legend: 'Добавете документ с големина до 2 Mb, като всеки раздел до 3 нива надолу в структурата ще бъде анализиран в „Предложения“. Поддържаните формати са: %{valid_mime_types}'
250
+ publish:
251
+ invalid: Неуспешно публикуване на предложения
252
+ success: Всички предложения бяха публикувани
253
+ proposal_notes:
254
+ create:
255
+ error: Възникна проблем при създаването на тази бележка за предложението
256
+ success: Бележката за предложението беше създадена успешно
257
+ proposals:
258
+ answer:
259
+ invalid: Възникна проблем при отговарянето на това предложение
260
+ success: Отговорихте успешно на предложението
261
+ create:
262
+ invalid: Възникна проблем при създаването на това предложение
263
+ success: Предложението беше създадено успешно
264
+ publish_answers:
265
+ number_of_proposals: Отговорите на %{number} предложения ще бъдат публикувани.
266
+ select_a_proposal: Моля, изберете предложение
267
+ show:
268
+ authors: Автори
269
+ comments_negative_count: Против
270
+ comments_neutral_count: Неутрален
271
+ comments_positive_count: Подкрепям
272
+ created_at: Дата на създаване
273
+ endorsements_ranking: Класиране по препоръки
274
+ link: Връзка
275
+ proposals: Предложения
276
+ votes_ranking: Класиране по подкрепяния
277
+ update_category:
278
+ select_a_proposal: Моля, изберете предложение
279
+ update_scope:
280
+ select_a_proposal: Моля, изберете предложение
281
+ select_a_scope: Моля, изберете обхват
282
+ proposals_imports:
283
+ create:
284
+ invalid: Възникна проблем при импортирането на предложенията
285
+ success: "%{number} предложения бяха импортирани успешно"
286
+ new:
287
+ title: Копиране на предложения
288
+ valuation_assignments:
289
+ create:
290
+ invalid: Възникна грешка при възлагането на предложенията на оценител
291
+ success: Предложенията бяха възложени успешно на оценител
292
+ delete:
293
+ invalid: Възникна грешка при отмяна на възлагането на предложения към оценител
294
+ success: Оценителят бе успешно премахнат от предложенията
295
+ collaborative_drafts:
296
+ collaborative_draft:
297
+ publish:
298
+ irreversible_action_modal:
299
+ body: След като черновата бъде публикувана като предложение, тя повече няма да може да се редактира. За предложението няма да могат да се приемат нови автори или добавки.
300
+ view_collaborative_draft: Преглед на съвместна чернова
301
+ withdraw:
302
+ irreversible_action_modal:
303
+ body: След като черновата бъде затворена, тя повече няма да може да се редактира. За черновата няма да могат да се приемат нови автори или добавки.
304
+ count:
305
+ drafts_count:
306
+ one: "Съвместна чернова"
307
+ other: "Съвместни чернови"
308
+ requests:
309
+ accepted_request:
310
+ success: "@%{user} беше приет(а) успешно като сътрудник"
311
+ access_requested:
312
+ success: Вашата заявка за сътрудничество беше изпратена успешно
313
+ rejected_request:
314
+ success: "@%{user} беше отхвърлен(а) успешно като сътрудник"
315
+ show:
316
+ final_proposal: окончателно предложение
317
+ info-message: Това е <strong>съвместна чернова</strong> за предложение. Това означава, че можете да помогнете на авторите да оформят предложението си, като използвате раздела за коментари по-долу, или да го подобрите директно, като поискате редакторски достъп. След като авторите Ви предоставят достъп, ще можете да извършвате промени в черновата.
318
+ published_proposal: публикувано предложение
319
+ version_history: вижте хронологията на версиите за това предложение
320
+ wizard_aside:
321
+ info: Създавате <strong>съвместна чернова</strong>.
220
322
  content_blocks:
221
323
  highlighted_proposals:
222
324
  proposals: Предложения
325
+ last_activity:
326
+ new_proposal_at_html: "<span>Ново предложение на адрес: %{link}</span>"
327
+ proposal_updated_at_html: "<span>Предложение беше актуализирано на: %{link}</span>"
328
+ models:
329
+ collaborative_draft:
330
+ fields:
331
+ authors: Автори
332
+ contributions: Добавки
333
+ new:
334
+ limit_reached: Не можете да създавате нови предложения, докато сте надхвърлили ограничението.
335
+ proposals:
336
+ count:
337
+ proposals_count:
338
+ one: "%{count} предложение"
339
+ other: "%{count} предложения"
340
+ edit:
341
+ add_image: Добавяне на изображение
342
+ edit_image: Редактиране на изображение
343
+ gallery_legend: "(Незадължително) Добавете изображение към картата с предложението"
344
+ index:
345
+ view_proposal: Преглед на предложението
346
+ linked_proposals:
347
+ proposal_votes:
348
+ one: поддръжка
349
+ other: поддръжки
350
+ participatory_texts:
351
+ view_index:
352
+ see_index: Вижте индекса
353
+ proposal:
354
+ creation_date: 'Създадено на:'
355
+ view_proposal: Преглед на предложението
356
+ proposals:
357
+ empty: Все още няма предложение
358
+ empty_filters: Няма предложение, което да отговаря на тези критерии
359
+ show:
360
+ back_to: Назад към
361
+ back_to_list: Назад към списъка
362
+ endorsements_list: Списък с одобрения
363
+ read_less: Виж по-малко
364
+ read_more: Прочетете повече
365
+ report: Отчет
366
+ tags:
367
+ changed_from: "(променено от предишното <u>%{previous_name}</u> от администратор)"
368
+ votes_count:
369
+ most_popular_proposal: Най-популярно предложение
370
+ need_more_votes: Има нужда от повече подкрепяния
371
+ voting_rules:
372
+ minimum_votes_per_user:
373
+ given_enough_votes: Предоставили сте достатъчно подкрепяния.
374
+ threshold_per_proposal:
375
+ description: За да бъдат валидирани, предложенията трябва да съберат %{limit} подкрепяния
376
+ vote_limit:
377
+ left: Оставащи
378
+ wizard_aside:
379
+ info: Вие създавате <strong>предложение</strong>.
380
+ wizard_steps:
381
+ see_steps: вижте стъпките
382
+ step_of: Стъпка %{current_step_num} от общо %{total_steps}
383
+ proposals_picker:
384
+ close: Затвори
385
+ more_proposals: Има още %{number} предложения. Прецизирайте търсенето си, за да ги намерите.
386
+ no_proposals: Няма предложения, които да съответстват на критериите Ви за търсене, или няма никакви предложения.
223
387
  versions:
224
388
  collaborative_drafts:
225
389
  back_to_resource: Обратно към съвместната чернова