decidim-proposals 0.29.2 → 0.29.4

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 (64) hide show
  1. checksums.yaml +4 -4
  2. data/app/cells/decidim/proposals/highlighted_proposals_for_component/show.erb +0 -12
  3. data/app/commands/decidim/proposals/admin/import_proposals.rb +7 -65
  4. data/app/controllers/decidim/proposals/admin/proposal_answers_controller.rb +7 -0
  5. data/app/controllers/decidim/proposals/admin/proposals_imports_controller.rb +2 -2
  6. data/app/controllers/decidim/proposals/versions_controller.rb +1 -1
  7. data/app/forms/decidim/proposals/admin/proposal_answer_form.rb +0 -15
  8. data/app/helpers/decidim/proposals/application_helper.rb +1 -0
  9. data/app/helpers/decidim/proposals/proposals_helper.rb +1 -3
  10. data/app/jobs/decidim/proposals/admin/import_proposals_job.rb +91 -0
  11. data/app/mailers/decidim/proposals/admin/import_proposals_mailer.rb +30 -0
  12. data/app/models/decidim/proposals/collaborative_draft.rb +2 -3
  13. data/app/models/decidim/proposals/proposal.rb +0 -5
  14. data/app/models/decidim/proposals/proposal_state.rb +1 -1
  15. data/app/services/decidim/proposals/proposal_builder.rb +1 -0
  16. data/app/views/decidim/proposals/admin/import_proposals_mailer/notify_failure.html.erb +1 -0
  17. data/app/views/decidim/proposals/admin/import_proposals_mailer/notify_success.html.erb +2 -0
  18. data/app/views/decidim/proposals/admin/proposals/_form.html.erb +1 -1
  19. data/app/views/decidim/proposals/admin/proposals/show.html.erb +4 -4
  20. data/app/views/decidim/proposals/proposals/_proposals.html.erb +1 -1
  21. data/app/views/decidim/proposals/proposals/index.html.erb +8 -1
  22. data/config/locales/ar.yml +7 -10
  23. data/config/locales/bg.yml +1 -9
  24. data/config/locales/bs-BA.yml +0 -6
  25. data/config/locales/ca-IT.yml +945 -0
  26. data/config/locales/ca.yml +22 -7
  27. data/config/locales/cs.yml +14 -8
  28. data/config/locales/de.yml +21 -9
  29. data/config/locales/el.yml +2 -7
  30. data/config/locales/en.yml +18 -3
  31. data/config/locales/es-MX.yml +21 -6
  32. data/config/locales/es-PY.yml +21 -6
  33. data/config/locales/es.yml +24 -9
  34. data/config/locales/eu.yml +98 -83
  35. data/config/locales/fi-plain.yml +19 -7
  36. data/config/locales/fi.yml +19 -7
  37. data/config/locales/fr-CA.yml +17 -8
  38. data/config/locales/fr.yml +16 -7
  39. data/config/locales/ga-IE.yml +2 -1
  40. data/config/locales/gl.yml +2 -3
  41. data/config/locales/hu.yml +3 -10
  42. data/config/locales/id-ID.yml +3 -1
  43. data/config/locales/is-IS.yml +5 -0
  44. data/config/locales/it.yml +24 -6
  45. data/config/locales/ja.yml +19 -5
  46. data/config/locales/lt.yml +2 -10
  47. data/config/locales/lv.yml +2 -6
  48. data/config/locales/nl.yml +6 -9
  49. data/config/locales/no.yml +2 -5
  50. data/config/locales/pl.yml +2 -12
  51. data/config/locales/pt-BR.yml +0 -6
  52. data/config/locales/pt.yml +2 -5
  53. data/config/locales/ro-RO.yml +18 -6
  54. data/config/locales/ru.yml +5 -0
  55. data/config/locales/sk.yml +5 -10
  56. data/config/locales/sr-CS.yml +0 -6
  57. data/config/locales/sv.yml +11 -7
  58. data/config/locales/tr-TR.yml +3 -6
  59. data/config/locales/uk.yml +5 -0
  60. data/config/locales/zh-CN.yml +2 -4
  61. data/config/locales/zh-TW.yml +2 -6
  62. data/lib/decidim/proposals/version.rb +1 -1
  63. data/lib/tasks/proposals/upgrade/decidim_proposals_upgrade_tasks.rake +22 -0
  64. metadata +25 -20
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8f0a793e0fdf54677810a839a8e177a8d3077aee2e25ff1618751d76f03f6401
4
- data.tar.gz: 90b7698d7c3560677628165a4ce38c5fdf78b3d1dc5cb00671967a83a9af0d72
3
+ metadata.gz: 8f083ea9482b31e176975e170eafea966d8bbac7e84a54a0208e13a3e0206678
4
+ data.tar.gz: 8586468ff6a8b6054710736fedc2c011e698272034d4207c70f2d0d55fe24278
5
5
  SHA512:
6
- metadata.gz: fd2a28b72d4d22a47f40a4ccbd000421d19c0e014f0788a6888ce36f6665660c5d2d3c862b034280cc4798da73d1137fe4815e773ac48113a89a1baeacee9d2e
7
- data.tar.gz: 499ac55e1d39ae1b19c105f69187ef399ee5bb97d110ea7ab6f15cef2aaa08c30456c12dbb45a85ff72041aaf0d38df9fca5b202e895286a7e2731e450eca263
6
+ metadata.gz: cd1334cc67b7b48abfde38396c4320496ce59f7edea987ddc67f26762585ebb043f4387f3ecbdb6ae4a76b30a85f41908624dcf92dc193c34a7faa4df30d28fa
7
+ data.tar.gz: be5c0c87019f16e7691ba3f1a8023f1b34bc7e53e7faf13650ab553ef7165a52c20f27254743af1677b2f47b9c92597ce04691d196fe334ecde2cfe3b332b6e3
@@ -10,18 +10,6 @@
10
10
  <% end %>
11
11
  <% end %>
12
12
  </div>
13
-
14
- <div class="flex items-center justify-between space-x-6">
15
- <span class="content-block__span flex-shrink-0">
16
- <%= t("decidim.participatory_spaces.highlighted_proposals.last") %>
17
- </span>
18
- <% if single_component? %>
19
- <%= link_to decidim_proposals.new_proposal_path, class: "button button__xs md:button__lg button__secondary" do %>
20
- <span class="text-center"><%= t("decidim.proposals.actions.new") %></span>
21
- <%= icon "add-line" %>
22
- <% end %>
23
- <% end %>
24
- </div>
25
13
  <div class="flex items-start justify-between">
26
14
  <div class="grow space-y-6">
27
15
  <% proposals_to_render.each do |p| %>
@@ -22,7 +22,8 @@ module Decidim
22
22
  def call
23
23
  return broadcast(:invalid) unless form.valid?
24
24
 
25
- broadcast(:ok, import_proposals)
25
+ import_proposals
26
+ broadcast(:ok)
26
27
  end
27
28
 
28
29
  private
@@ -30,70 +31,11 @@ module Decidim
30
31
  attr_reader :form
31
32
 
32
33
  def import_proposals
33
- proposals.map do |original_proposal|
34
- next if proposal_already_copied?(original_proposal, target_component)
35
-
36
- Decidim::Proposals::ProposalBuilder.copy(
37
- original_proposal,
38
- author: proposal_author,
39
- action_user: form.current_user,
40
- extra_attributes: {
41
- "component" => target_component
42
- }.merge(proposal_answer_attributes(original_proposal))
43
- )
44
- end.compact
45
- end
46
-
47
- def proposals
48
- @proposals = Decidim::Proposals::Proposal
49
- .where(component: origin_component)
50
- @proposals = @proposals.where(scope: proposal_scopes) unless proposal_scopes.empty?
51
-
52
- @proposals = if @form.states.include?("not_answered")
53
- @proposals.not_answered.or(@proposals.where(id: @proposals.only_status(@form.states).pluck(:id)))
54
- else
55
- @proposals.only_status(@form.states)
56
- end
57
-
58
- @proposals
59
- end
60
-
61
- def proposal_scopes
62
- @form.scopes
63
- end
64
-
65
- def origin_component
66
- @form.origin_component
67
- end
68
-
69
- def target_component
70
- @form.current_component
71
- end
72
-
73
- def proposal_already_copied?(original_proposal, target_component)
74
- # Note: we are including also proposals from unpublished components
75
- # because otherwise duplicates could be created until the component is
76
- # published.
77
- original_proposal.linked_resources(:proposals, "copied_from_component", component_published: false).any? do |proposal|
78
- proposal.component == target_component
79
- end
80
- end
81
-
82
- def proposal_author
83
- form.keep_authors ? nil : @form.current_organization
84
- end
85
-
86
- def proposal_answer_attributes(original_proposal)
87
- return {} unless form.keep_answers
88
-
89
- state = Decidim::Proposals::ProposalState.where(component: target_component, token: original_proposal.state).first
90
-
91
- {
92
- answer: original_proposal.answer,
93
- answered_at: original_proposal.answered_at,
94
- proposal_state: state,
95
- state_published_at: original_proposal.state_published_at
96
- }
34
+ ImportProposalsJob.perform_later(form.as_json.merge({
35
+ "current_user_id" => form.current_user.id,
36
+ "current_organization_id" => form.current_organization.id,
37
+ "current_component_id" => form.current_component.id
38
+ }))
97
39
  end
98
40
  end
99
41
  end
@@ -5,6 +5,9 @@ module Decidim
5
5
  module Admin
6
6
  # This controller allows admins to answer proposals in a participatory process.
7
7
  class ProposalAnswersController < Admin::ApplicationController
8
+ include ActionView::Helpers::SanitizeHelper
9
+ include Decidim::Proposals::Admin::Filterable
10
+
8
11
  helper_method :proposal
9
12
 
10
13
  helper Proposals::ApplicationHelper
@@ -44,6 +47,10 @@ module Decidim
44
47
  def proposal
45
48
  @proposal ||= Proposal.where(component: current_component).find(params[:id])
46
49
  end
50
+
51
+ def collection
52
+ @collection ||= Proposal.where(component: current_component).not_hidden.published
53
+ end
47
54
  end
48
55
  end
49
56
  end
@@ -16,8 +16,8 @@ module Decidim
16
16
  @form = form(Admin::ProposalsImportForm).from_params(params)
17
17
 
18
18
  Admin::ImportProposals.call(@form) do
19
- on(:ok) do |proposals|
20
- flash[:notice] = I18n.t("proposals_imports.create.success", scope: "decidim.proposals.admin", number: proposals.length)
19
+ on(:ok) do
20
+ flash[:notice] = I18n.t("proposals_imports.create.success", scope: "decidim.proposals.admin")
21
21
  redirect_to EngineRouter.admin_proxy(current_component).root_path
22
22
  end
23
23
 
@@ -11,7 +11,7 @@ module Decidim
11
11
  def versioned_resource
12
12
  @versioned_resource ||=
13
13
  if params[:proposal_id]
14
- present(Proposal.where(component: current_component).find(params[:proposal_id]))
14
+ present(Proposal.not_hidden.published.where(component: current_component).find(params[:proposal_id]))
15
15
  else
16
16
  CollaborativeDraft.where(component: current_component).find(params[:collaborative_draft_id])
17
17
  end
@@ -15,20 +15,9 @@ module Decidim
15
15
  attribute :internal_state, String
16
16
 
17
17
  validates :internal_state, presence: true, inclusion: { in: :proposal_states }
18
- validates :answer, translatable_presence: true, if: ->(form) { form.state == "rejected" }
19
-
20
- with_options if: :costs_required? do
21
- validates :cost, numericality: true, presence: true
22
- validates :cost_report, translatable_presence: true
23
- validates :execution_period, translatable_presence: true
24
- end
25
18
 
26
19
  alias state internal_state
27
20
 
28
- def costs_required?
29
- costs_enabled? && state == "accepted"
30
- end
31
-
32
21
  def publish_answer?
33
22
  current_component.current_settings.publish_answers_immediately?
34
23
  end
@@ -38,10 +27,6 @@ module Decidim
38
27
  def proposal_states
39
28
  Decidim::Proposals::ProposalState.where(component: current_component).pluck(:token).map(&:to_s) + ["not_answered"]
40
29
  end
41
-
42
- def costs_enabled?
43
- current_component.current_settings.answers_with_costs?
44
- end
45
30
  end
46
31
  end
47
32
  end
@@ -30,6 +30,7 @@ module Decidim
30
30
 
31
31
  def proposal_state_css_style(proposal)
32
32
  return "" if proposal.emendation?
33
+ return "" if proposal.withdrawn?
33
34
 
34
35
  proposal.proposal_state&.css_style
35
36
  end
@@ -12,9 +12,7 @@ module Decidim
12
12
  end
13
13
 
14
14
  def proposal_has_costs?
15
- @proposal.cost.present? &&
16
- translated_attribute(@proposal.cost_report).present? &&
17
- translated_attribute(@proposal.execution_period).present?
15
+ @proposal.cost.present?
18
16
  end
19
17
 
20
18
  def toggle_view_mode_link(current_mode, target_mode, title, params)
@@ -0,0 +1,91 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Proposals
5
+ module Admin
6
+ class ImportProposalsJob < ApplicationJob
7
+ queue_as :default
8
+
9
+ def perform(form)
10
+ @form = form
11
+ ActiveRecord::Base.transaction do
12
+ proposals.map do |original_proposal|
13
+ next if proposal_already_copied?(original_proposal, target_component)
14
+
15
+ Decidim::Proposals::ProposalBuilder.copy(
16
+ original_proposal,
17
+ author: proposal_author,
18
+ action_user: current_user,
19
+ extra_attributes: {
20
+ "component" => target_component
21
+ }.merge(proposal_answer_attributes(original_proposal))
22
+ )
23
+ end
24
+ end
25
+ ImportProposalsMailer.notify_success(current_user, origin_component, target_component, proposals.count).deliver_later
26
+ rescue ActiveRecord::RecordNotFound, NoMethodError
27
+ ImportProposalsMailer.notify_failure(current_user, origin_component, target_component).deliver_later
28
+ end
29
+
30
+ private
31
+
32
+ def proposals
33
+ proposals = Decidim::Proposals::Proposal.where(component: origin_component)
34
+ proposals = proposals.where(scope: proposal_scopes) unless proposal_scopes.empty?
35
+
36
+ if @form["states"].include?("not_answered")
37
+ proposals.not_answered.or(proposals.where(id: proposals.only_status(@form["states"]).pluck(:id)))
38
+ else
39
+ proposals.only_status(@form["states"])
40
+ end
41
+ end
42
+
43
+ def origin_component
44
+ @origin_component ||= Decidim::Component.find(@form["origin_component_id"])
45
+ end
46
+
47
+ def target_component
48
+ @target_component ||= Decidim::Component.find(@form["current_component_id"])
49
+ end
50
+
51
+ def current_user
52
+ @current_user ||= Decidim::User.find(@form["current_user_id"])
53
+ end
54
+
55
+ def current_organization
56
+ @current_organization ||= Decidim::Organization.find(@form["current_organization_id"])
57
+ end
58
+
59
+ def proposal_already_copied?(original_proposal, target_component)
60
+ # Note: we are including also proposals from unpublished components
61
+ # because otherwise duplicates could be created until the component is
62
+ # published.
63
+ original_proposal.linked_resources(:proposals, "copied_from_component", component_published: false).any? do |proposal|
64
+ proposal.component == target_component
65
+ end
66
+ end
67
+
68
+ def proposal_author
69
+ @form["keep_authors"] ? nil : current_organization
70
+ end
71
+
72
+ def proposal_scopes
73
+ @form["scopes"] || []
74
+ end
75
+
76
+ def proposal_answer_attributes(original_proposal)
77
+ return {} unless @form["keep_answers"]
78
+
79
+ state = Decidim::Proposals::ProposalState.where(component: target_component, token: original_proposal.proposal_state&.token).first
80
+
81
+ {
82
+ answer: original_proposal.answer,
83
+ answered_at: original_proposal.answered_at,
84
+ proposal_state: state,
85
+ state_published_at: original_proposal.state_published_at
86
+ }
87
+ end
88
+ end
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Proposals
5
+ module Admin
6
+ class ImportProposalsMailer < Decidim::ApplicationMailer
7
+ def notify_success(user, origin_component, target_component, count)
8
+ @organization = user.organization
9
+ @origin_component = origin_component
10
+ @target_component = target_component
11
+ @count = count
12
+
13
+ with_user(user) do
14
+ mail(to: user.email, subject: t(".subject"))
15
+ end
16
+ end
17
+
18
+ def notify_failure(user, origin_component, target_component)
19
+ @organization = user.organization
20
+ @origin_component = origin_component
21
+ @target_component = target_component
22
+
23
+ with_user(user) do
24
+ mail(to: user.email, subject: t(".subject"))
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -45,9 +45,8 @@ module Decidim
45
45
  authored_by?(user)
46
46
  end
47
47
 
48
- # Public: Overrides the `reported_content_url` Reportable concern method.
49
- def reported_content_url
50
- ResourceLocatorPresenter.new(self).url
48
+ def presenter
49
+ Decidim::Proposals::CollaborativeDraftPresenter.new(self)
51
50
  end
52
51
 
53
52
  # Public: Overrides the `reported_attributes` Reportable concern method.
@@ -301,11 +301,6 @@ module Decidim
301
301
  state == "evaluating"
302
302
  end
303
303
 
304
- # Public: Overrides the `reported_content_url` Reportable concern method.
305
- def reported_content_url
306
- ResourceLocatorPresenter.new(self).url
307
- end
308
-
309
304
  # Returns the presenter for this author, to be used in the views.
310
305
  # Required by ResourceRenderer.
311
306
  def presenter
@@ -38,7 +38,7 @@ module Decidim
38
38
  protected
39
39
 
40
40
  def generate_token
41
- self.token = ensure_unique_token(translated_attribute(title).parameterize(separator: "_"))
41
+ self.token = ensure_unique_token(token.presence || translated_attribute(title).parameterize(separator: "_"))
42
42
  end
43
43
 
44
44
  def ensure_unique_token(token)
@@ -63,6 +63,7 @@ module Decidim
63
63
  "created_at",
64
64
  "updated_at",
65
65
  "state",
66
+ "decidim_proposals_proposal_state_id",
66
67
  "state_published_at",
67
68
  "answer",
68
69
  "answered_at",
@@ -0,0 +1 @@
1
+ <p><%= t(".body", origin_component_name: translated_attribute(@origin_component.name), target_component_name: translated_attribute(@target_component.name)) %></p>
@@ -0,0 +1,2 @@
1
+ <p><%= t(".body", origin_component_name: translated_attribute(@origin_component.name), target_component_name: translated_attribute(@target_component.name)) %></p>
2
+ <p><%= t(".added_proposals", count: @count) %></p>
@@ -20,7 +20,7 @@
20
20
  </div>
21
21
  <% end %>
22
22
  <% if @form.component_suggested_hashtags.any? %>
23
- <div>
23
+ <div class="row column">
24
24
  <%= form.label :suggested_hashtags %>
25
25
  <div class="hashtags">
26
26
  <%= form.collection_check_boxes :suggested_hashtags, @form.component_suggested_hashtags.map { |hashtag| [hashtag.downcase, "##{hashtag}"] }, :first, :last do |option|
@@ -53,20 +53,20 @@
53
53
 
54
54
  <% presented_endorsers = endorsers_presenters_for(proposal) %>
55
55
  <% if presented_endorsers.any? %>
56
- <%= render partial: "endorsers", locals: { presented_endorsers:, proposal: } %>
56
+ <%= render partial: "decidim/proposals/admin/proposals/endorsers", locals: { presented_endorsers:, proposal: } %>
57
57
  <% end %>
58
58
 
59
59
  <% if proposal.documents.any? %>
60
- <%= render partial: "documents", locals: { proposal: } %>
60
+ <%= render partial: "decidim/proposals/admin/proposals/documents", locals: { proposal: } %>
61
61
  <% end %>
62
62
 
63
63
  <% if proposal.photos.any? %>
64
- <%= render partial: "photos", locals: { proposal: } %>
64
+ <%= render partial: "decidim/proposals/admin/proposals/photos", locals: { proposal: } %>
65
65
  <% end %>
66
66
 
67
67
  <% proposal_meetings = proposal.linked_resources(:meetings, "proposals_from_meeting") %>
68
68
  <% if proposal_meetings.any? %>
69
- <%= render partial: "meetings", locals: { proposal_meetings: } %>
69
+ <%= render partial: "decidim/proposals/admin/proposals/meetings", locals: { proposal_meetings: } %>
70
70
  <% end %>
71
71
 
72
72
  <% if allowed_to?(:create, :proposal_note, proposal: proposal) %>
@@ -8,7 +8,7 @@
8
8
  <%= cell("decidim/announcement", params[:filter].present? ? t(".empty_filters") : t(".empty")) %>
9
9
  <% else %>
10
10
  <div class="flex items-center justify-between">
11
- <h2 class="h5 md:h3 decorator"><%= t("count", scope: "decidim.proposals.proposals.index", count: @proposals.total_count) %></h2>
11
+ <h2 class="h5 md:h3 decorator" aria-live="polite" aria-atomic="true"><%= t("count", scope: "decidim.proposals.proposals.index", count: @proposals.total_count) %></h2>
12
12
  <div class="view-layout__links flex view_mode__links">
13
13
  <%= toggle_view_mode_link(@view_mode, "list", t("list_mode", scope: "decidim.proposals.proposals.index"), params) %>
14
14
  <%= toggle_view_mode_link(@view_mode, "grid", t("grid_mode", scope: "decidim.proposals.proposals.index"), params) %>
@@ -1,4 +1,11 @@
1
- <% add_decidim_page_title(t("name", scope: "decidim.components.proposals")) %>
1
+ <% add_decidim_meta_tags(
2
+ description: translated_attribute(current_participatory_space.short_description),
3
+ title: t("decidim.components.pagination.page_title",
4
+ component_name:,
5
+ current_page: @proposals.current_page,
6
+ total_pages: @proposals.total_pages ),
7
+ url: proposals_url,
8
+ resource: current_component) %>
2
9
 
3
10
  <% append_stylesheet_pack_tag "decidim_proposals", media: "all" %>
4
11
  <% append_javascript_pack_tag "decidim_proposals" %>
@@ -12,6 +12,8 @@ ar:
12
12
  state: حالة
13
13
  title: عنوان
14
14
  user_group_id: إنشاء مسودة تعاونية كـ
15
+ import_participatory_text:
16
+ document: مستند
15
17
  proposal:
16
18
  address: عنوان
17
19
  answer: إجابة
@@ -21,6 +23,8 @@ ar:
21
23
  category_id: الفئة
22
24
  decidim_scope_id: النطاق
23
25
  has_address: لديه عنوان
26
+ latitude: خط العرض
27
+ longitude: خط الطول
24
28
  scope_id: نطاق
25
29
  state: حالة
26
30
  suggested_hashtags: الهاشتاج المقترحة
@@ -33,6 +37,8 @@ ar:
33
37
  execution_period: فترة التنفيذ
34
38
  proposals_copy:
35
39
  origin_component_id: مكون لنسخ المقترحات من
40
+ proposals_file_import:
41
+ file: ملف
36
42
  proposals_import:
37
43
  import_proposals: مقترحات الاستيراد
38
44
  keep_answers: الاحتفاظ بالحالة والإجابات
@@ -312,6 +318,7 @@ ar:
312
318
  title: اقتراحات
313
319
  votes:
314
320
  object: أصوات
321
+ title: الأصوات
315
322
  participatory_spaces:
316
323
  highlighted_proposals:
317
324
  see_all: شاهد الكل
@@ -420,7 +427,6 @@ ar:
420
427
  index:
421
428
  actions: أفعال
422
429
  assign_to_valuator: أسنِده إلى مُقيِّم
423
- assign_to_valuator_button: تعيين
424
430
  cancel: إلغاء
425
431
  change_category: تغيير الفئة
426
432
  change_scope: تغيير النطاق
@@ -434,7 +440,6 @@ ar:
434
440
  split_button: انشق، مزق
435
441
  title: اقتراحات
436
442
  unassign_from_valuator: إلغاء الإسناد مِن المُقيِّم
437
- unassign_from_valuator_button: إلغاء الإسناد
438
443
  update: تحديث
439
444
  update_scope_button: تحديث النطاق
440
445
  new:
@@ -448,13 +453,6 @@ ar:
448
453
  documents: المستندات
449
454
  endorsements_count: عد أصوات التأييدات
450
455
  endorsers: المؤيدون
451
- n_more_endorsers:
452
- zero: و%{count} آخرين
453
- one: وواحد آخر
454
- two: و%{count} آخرين
455
- few: و%{count} آخرين
456
- many: و%{count} آخرين
457
- other: و%{count} آخرين
458
456
  photos: الصور
459
457
  ranking: "%{ranking} مِن %{total}"
460
458
  related_meetings: ملتقيات ذات صلة
@@ -685,7 +683,6 @@ ar:
685
683
  text_banner: أنت تتطلع على قائمة الاقتراحات المسحوبة من قبل مؤلفيها. %{go_back_link}.
686
684
  new:
687
685
  send: استمر
688
- title: إنشاء اقتراحك
689
686
  orders:
690
687
  label: 'ترتيب المقترحات حسب:'
691
688
  most_commented: الأكثر تعليقًا عليها
@@ -374,7 +374,6 @@ bg:
374
374
  title: Гласове
375
375
  participatory_spaces:
376
376
  highlighted_proposals:
377
- last: Позледни предложения
378
377
  see_all: Виж всички предложения
379
378
  proposals:
380
379
  actions:
@@ -512,7 +511,6 @@ bg:
512
511
  index:
513
512
  actions: Активности
514
513
  assign_to_valuator: Възлагане на оценител
515
- assign_to_valuator_button: Възлагане
516
514
  cancel: Отказ
517
515
  change_category: Промяна на категория
518
516
  change_scope: Промяна на обхвата
@@ -528,7 +526,6 @@ bg:
528
526
  statuses: Статуси
529
527
  title: Предложения
530
528
  unassign_from_valuator: Отнемане възложеното на оценителя
531
- unassign_from_valuator_button: Отнемане на възложеното
532
529
  update: Актуализация
533
530
  update_scope_button: Актуализиране на обхвата
534
531
  new:
@@ -546,9 +543,6 @@ bg:
546
543
  endorsements_count: Брой препоръки
547
544
  endorsers: Препоръчали
548
545
  link: Виж предложението
549
- n_more_endorsers:
550
- one: и още 1
551
- other: и още %{count}
552
546
  photos: Снимки
553
547
  ranking: "%{ranking} от %{total}"
554
548
  related_meetings: Свързани срещи
@@ -569,7 +563,6 @@ bg:
569
563
  proposals_imports:
570
564
  create:
571
565
  invalid: Възникна проблем при импортирането на предложенията.
572
- success: "%{number} предложения бяха импортирани успешно."
573
566
  new:
574
567
  create: Импортиране на предложения
575
568
  no_components: Няма други компоненти на предложения в това пространство за участие, от които да се импортират предложенията.
@@ -808,7 +801,6 @@ bg:
808
801
  text_banner: Разглеждате списъка с предложения, оттеглени от своите автори. %{go_back_link}.
809
802
  new:
810
803
  send: Продължи
811
- title: Създайте Ваше предложение
812
804
  orders:
813
805
  label: 'Подреждане на предложенията по:'
814
806
  most_commented: Най-коментирани
@@ -841,7 +833,7 @@ bg:
841
833
  edit_proposal: Редактиране на предложение
842
834
  estimated_cost: Предвидени разходи
843
835
  hidden_endorsers_count:
844
- one: и още %{count} човек
836
+ one: и още %{count}
845
837
  other: и още %{count} души
846
838
  link_to_collaborative_draft_help_text: Това предложение е резултат от съвместна чернова. Прегледайте хронологията
847
839
  link_to_collaborative_draft_text: Вижте съвместната чернова
@@ -51,11 +51,9 @@ bs:
51
51
  proposals:
52
52
  index:
53
53
  assign_to_valuator: Dodeli procenjivaču
54
- assign_to_valuator_button: Dodeli
55
54
  change_scope: Promeni opseg
56
55
  publish_answers: Objavi odgovore
57
56
  unassign_from_valuator: Oduzmi od procenjivača
58
- unassign_from_valuator_button: Od dodeli
59
57
  update_scope_button: Ažuriraj opseg
60
58
  show:
61
59
  amendments_count: Broj izmena
@@ -64,10 +62,6 @@ bs:
64
62
  documents: Dokumenti
65
63
  endorsements_count: Broj podržavanja
66
64
  endorsers: Podržavaoci
67
- n_more_endorsers:
68
- one: i još 1
69
- few: i još %{count}
70
- other: i još %{count}
71
65
  photos: Slike
72
66
  ranking: "%{ranking} od %{total}"
73
67
  related_meetings: Slični sastanci