decidim-proposals 0.29.1 → 0.29.2

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 (70) hide show
  1. checksums.yaml +4 -4
  2. data/app/cells/decidim/proposals/highlighted_proposals_for_component/show.erb +11 -11
  3. data/app/cells/decidim/proposals/proposal_g_cell.rb +21 -0
  4. data/app/cells/decidim/proposals/proposal_l_cell.rb +17 -18
  5. data/app/controllers/concerns/decidim/proposals/admin/filterable.rb +1 -1
  6. data/app/controllers/decidim/proposals/proposals_controller.rb +4 -8
  7. data/app/forms/decidim/proposals/admin/proposal_answer_form.rb +3 -3
  8. data/app/forms/decidim/proposals/admin/proposal_form.rb +1 -1
  9. data/app/forms/decidim/proposals/admin/proposals_import_form.rb +6 -9
  10. data/app/forms/decidim/proposals/admin/valuation_assignment_form.rb +4 -1
  11. data/app/helpers/decidim/proposals/admin/proposal_bulk_actions_helper.rb +1 -1
  12. data/app/helpers/decidim/proposals/map_helper.rb +1 -1
  13. data/app/models/decidim/proposals/proposal.rb +2 -6
  14. data/app/packs/stylesheets/decidim/proposals/proposals.scss +1 -5
  15. data/app/permissions/decidim/proposals/permissions.rb +4 -3
  16. data/app/services/decidim/proposals/collaborative_draft_diff_renderer.rb +22 -0
  17. data/app/services/decidim/proposals/diff_renderer.rb +2 -0
  18. data/app/services/decidim/proposals/proposal_builder.rb +1 -1
  19. data/app/views/decidim/proposals/admin/proposals/index.html.erb +2 -2
  20. data/app/views/decidim/proposals/admin/proposals_imports/new.html.erb +2 -2
  21. data/app/views/decidim/proposals/proposals/index.html.erb +1 -1
  22. data/app/views/decidim/proposals/proposals/index.js.erb +12 -0
  23. data/app/views/decidim/proposals/proposals/show.html.erb +1 -1
  24. data/config/locales/ar.yml +1 -3
  25. data/config/locales/bg.yml +5 -7
  26. data/config/locales/bn-BD.yml +1 -0
  27. data/config/locales/bs-BA.yml +100 -0
  28. data/config/locales/ca.yml +5 -5
  29. data/config/locales/cs.yml +19 -5
  30. data/config/locales/de.yml +7 -7
  31. data/config/locales/el.yml +3 -5
  32. data/config/locales/es-MX.yml +8 -8
  33. data/config/locales/es-PY.yml +3 -3
  34. data/config/locales/es.yml +8 -8
  35. data/config/locales/eu.yml +93 -86
  36. data/config/locales/fi-plain.yml +7 -7
  37. data/config/locales/fi.yml +24 -24
  38. data/config/locales/fr-CA.yml +4 -6
  39. data/config/locales/fr.yml +3 -5
  40. data/config/locales/gl.yml +3 -6
  41. data/config/locales/he-IL.yml +7 -0
  42. data/config/locales/hu.yml +2 -3
  43. data/config/locales/id-ID.yml +9 -4
  44. data/config/locales/is-IS.yml +0 -7
  45. data/config/locales/it.yml +7 -8
  46. data/config/locales/ja.yml +3 -5
  47. data/config/locales/lt.yml +1 -3
  48. data/config/locales/lv.yml +5 -2
  49. data/config/locales/nl.yml +7 -5
  50. data/config/locales/no.yml +1 -4
  51. data/config/locales/pl.yml +2 -4
  52. data/config/locales/pt-BR.yml +3 -5
  53. data/config/locales/pt.yml +2 -4
  54. data/config/locales/ro-RO.yml +7 -9
  55. data/config/locales/ru.yml +0 -7
  56. data/config/locales/sk.yml +6 -3
  57. data/config/locales/sl.yml +0 -4
  58. data/config/locales/sv.yml +5 -4
  59. data/config/locales/tr-TR.yml +5 -7
  60. data/config/locales/uk.yml +1 -8
  61. data/config/locales/zh-CN.yml +1 -3
  62. data/config/locales/zh-TW.yml +3 -5
  63. data/db/migrate/20240110203504_create_default_proposal_states.rb +3 -2
  64. data/decidim-proposals.gemspec +1 -1
  65. data/lib/decidim/api/proposal_type.rb +13 -0
  66. data/lib/decidim/api/proposals_type.rb +1 -3
  67. data/lib/decidim/proposals/proposal_serializer.rb +7 -4
  68. data/lib/decidim/proposals/test/factories.rb +6 -5
  69. data/lib/decidim/proposals/version.rb +1 -1
  70. metadata +24 -21
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2109029e1165afe1fe039f4f5e1d2f0b8af26d8e80bb2e0db0c11053da033e61
4
- data.tar.gz: 9e72ff8d19ba6f4442eed68fa4c5625e2d22367b3c00a8faf2b36fa58c888dbe
3
+ metadata.gz: 8f0a793e0fdf54677810a839a8e177a8d3077aee2e25ff1618751d76f03f6401
4
+ data.tar.gz: 90b7698d7c3560677628165a4ce38c5fdf78b3d1dc5cb00671967a83a9af0d72
5
5
  SHA512:
6
- metadata.gz: 3d2b4e79ae0fb506248ca119acca6ce128649457f53b6047a9def36168110a63a36bccb6abde7fd8300194cd8bf785546d9d21d066e4f628da6742c2601fb8d6
7
- data.tar.gz: 3ad98b72afdc5b9b2601cffa7f5c872b5bf5202ed35f9bff830014af78d7b1de2c5aaae4b5ffc4e721f2d21594a8229bb96ef549f653a0caf36ae8f2a36b0cf9
6
+ metadata.gz: fd2a28b72d4d22a47f40a4ccbd000421d19c0e014f0788a6888ce36f6665660c5d2d3c862b034280cc4798da73d1137fe4815e773ac48113a89a1baeacee9d2e
7
+ data.tar.gz: 499ac55e1d39ae1b19c105f69187ef399ee5bb97d110ea7ab6f15cef2aaa08c30456c12dbb45a85ff72041aaf0d38df9fca5b202e895286a7e2731e450eca263
@@ -11,21 +11,21 @@
11
11
  <% end %>
12
12
  </div>
13
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>
14
25
  <div class="flex items-start justify-between">
15
26
  <div class="grow space-y-6">
16
- <span class="content-block__span">
17
- <%= t("decidim.participatory_spaces.highlighted_proposals.last") %>
18
- </span>
19
-
20
27
  <% proposals_to_render.each do |p| %>
21
28
  <%= card_for p, link_whole_card: true, title_tag: :h3, **options.slice(:show_space) %>
22
29
  <% end %>
23
30
  </div>
24
-
25
- <% if single_component? %>
26
- <%= link_to decidim_proposals.new_proposal_path, class: "button button__sm md:button__lg button__secondary" do %>
27
- <span><%= t("decidim.proposals.actions.new") %></span>
28
- <%= icon "add-line" %>
29
- <% end %>
30
- <% end %>
31
31
  </div>
@@ -34,6 +34,27 @@ module Decidim
34
34
 
35
35
  private
36
36
 
37
+ def cache_hash
38
+ @cache_hash ||= begin
39
+ hash = []
40
+ hash << I18n.locale.to_s
41
+ hash << self.class.name.demodulize.underscore
42
+ hash << model.cache_key_with_version
43
+ hash << model.proposal_votes_count
44
+ hash << model.endorsements_count
45
+ hash << model.comments_count
46
+ hash << Digest::MD5.hexdigest(model.component.cache_key_with_version)
47
+ hash << Digest::MD5.hexdigest(resource_image_url) if resource_image_url
48
+ hash << 0 # render space
49
+ hash << model.follows_count
50
+ hash << Digest::MD5.hexdigest(model.authors.map(&:cache_key_with_version).to_s)
51
+ hash << (model.must_render_translation?(model.organization) ? 1 : 0) if model.respond_to?(:must_render_translation?)
52
+ hash << model.component.participatory_space.active_step.id if model.component.participatory_space.try(:active_step)
53
+
54
+ hash.join(Decidim.cache_key_separator)
55
+ end
56
+ end
57
+
37
58
  def classes
38
59
  super.merge(metadata: "card__list-metadata")
39
60
  end
@@ -20,25 +20,24 @@ module Decidim
20
20
  end
21
21
 
22
22
  def cache_hash
23
- hash = []
24
- hash << I18n.locale.to_s
25
- hash << model.cache_key_with_version
26
- hash << model.proposal_votes_count
27
- hash << model.endorsements_count
28
- hash << model.comments_count
29
- hash << Digest::MD5.hexdigest(model.component.cache_key_with_version)
30
- hash << Digest::MD5.hexdigest(resource_image_url) if resource_image_url
31
- hash << render_space? ? 1 : 0
32
- if current_user
33
- hash << current_user.cache_key_with_version
34
- hash << current_user.follows?(model) ? 1 : 0
35
- end
36
- hash << model.follows_count
37
- hash << Digest::MD5.hexdigest(model.authors.map(&:cache_key_with_version).to_s)
38
- hash << (model.must_render_translation?(model.organization) ? 1 : 0) if model.respond_to?(:must_render_translation?)
39
- hash << model.component.participatory_space.active_step.id if model.component.participatory_space.try(:active_step)
23
+ @cache_hash ||= begin
24
+ hash = []
25
+ hash << I18n.locale.to_s
26
+ hash << self.class.name.demodulize.underscore
27
+ hash << model.cache_key_with_version
28
+ hash << model.proposal_votes_count
29
+ hash << model.endorsements_count
30
+ hash << model.comments_count
31
+ hash << Digest::MD5.hexdigest(model.component.cache_key_with_version)
32
+ hash << Digest::MD5.hexdigest(resource_image_url) if resource_image_url
33
+ hash << render_space? ? 1 : 0
34
+ hash << model.follows_count
35
+ hash << Digest::MD5.hexdigest(model.authors.map(&:cache_key_with_version).to_s)
36
+ hash << (model.must_render_translation?(model.organization) ? 1 : 0) if model.respond_to?(:must_render_translation?)
37
+ hash << model.component.participatory_space.active_step.id if model.component.participatory_space.try(:active_step)
40
38
 
41
- hash.join(Decidim.cache_key_separator)
39
+ hash.join(Decidim.cache_key_separator)
40
+ end
42
41
  end
43
42
  end
44
43
  end
@@ -47,7 +47,7 @@ module Decidim
47
47
  end
48
48
 
49
49
  def valuator_role_ids
50
- current_participatory_space.user_roles(:valuator).pluck(:id)
50
+ current_participatory_space.user_roles(:valuator).order_by_name.pluck(:id)
51
51
  end
52
52
 
53
53
  def translated_valuator_role_ids_has(valuator_role_id)
@@ -43,13 +43,11 @@ module Decidim
43
43
  .order(position: :asc)
44
44
  render "decidim/proposals/proposals/participatory_texts/participatory_text"
45
45
  else
46
- @base_query = search
47
- .result
48
- .published
49
- .not_hidden
46
+ @proposals = search.result
50
47
 
51
- @proposals = @base_query.includes(:component, :coauthorships, :attachments)
52
- @all_geocoded_proposals = @base_query.geocoded
48
+ @proposals = reorder(@proposals)
49
+ @proposals = paginate(@proposals)
50
+ @proposals = @proposals.includes(:component, :coauthorships, :attachments)
53
51
 
54
52
  @voted_proposals = if current_user
55
53
  ProposalVote.where(
@@ -59,8 +57,6 @@ module Decidim
59
57
  else
60
58
  []
61
59
  end
62
- @proposals = reorder(@proposals)
63
- @proposals = paginate(@proposals)
64
60
  end
65
61
  end
66
62
 
@@ -8,9 +8,9 @@ module Decidim
8
8
  include TranslatableAttributes
9
9
  mimic :proposal_answer
10
10
 
11
- translatable_attribute :answer, String
12
- translatable_attribute :cost_report, String
13
- translatable_attribute :execution_period, String
11
+ translatable_attribute :answer, Decidim::Attributes::RichText
12
+ translatable_attribute :cost_report, Decidim::Attributes::RichText
13
+ translatable_attribute :execution_period, Decidim::Attributes::RichText
14
14
  attribute :cost, Float
15
15
  attribute :internal_state, String
16
16
 
@@ -10,7 +10,7 @@ module Decidim
10
10
  translatable_attribute :title, String do |field, _locale|
11
11
  validates field, length: { in: 15..150 }, if: proc { |resource| resource.send(field).present? }
12
12
  end
13
- translatable_attribute :body, String
13
+ translatable_attribute :body, Decidim::Attributes::RichText
14
14
 
15
15
  validates :title, :body, translatable_presence: true
16
16
 
@@ -6,6 +6,7 @@ module Decidim
6
6
  # A form object to be used when admin users want to import a collection of proposals
7
7
  # from another component.
8
8
  class ProposalsImportForm < Decidim::Form
9
+ include TranslatableAttributes
9
10
  mimic :proposals_import
10
11
 
11
12
  attribute :origin_component_id, Integer
@@ -19,15 +20,11 @@ module Decidim
19
20
  validates :import_proposals, allow_nil: false, acceptance: true
20
21
  validate :valid_states
21
22
 
22
- VALID_STATES = %w(accepted not_answered evaluating rejected).freeze
23
-
24
23
  def states_collection
25
- VALID_STATES.map do |state|
26
- OpenStruct.new(
27
- name: I18n.t(state, scope: "decidim.proposals.answers"),
28
- value: state
29
- )
30
- end
24
+ @states_collection ||= ProposalState.where(component: current_component) + [ProposalState.new(token: "not_answered",
25
+ title: I18n.t(
26
+ :not_answered, scope: "decidim.proposals.answers"
27
+ ))]
31
28
  end
32
29
 
33
30
  def states
@@ -56,7 +53,7 @@ module Decidim
56
53
 
57
54
  def valid_states
58
55
  return if states.all? do |state|
59
- VALID_STATES.include?(state)
56
+ states_collection.pluck(:token).include?(state)
60
57
  end
61
58
 
62
59
  errors.add(:states, :invalid)
@@ -16,7 +16,10 @@ module Decidim
16
16
  end
17
17
 
18
18
  def valuator_roles
19
- @valuator_roles ||= current_component.participatory_space.user_roles(:valuator).where(id: valuator_role_ids)
19
+ @valuator_roles ||= current_component.participatory_space
20
+ .user_roles(:valuator)
21
+ .order_by_name
22
+ .where(id: valuator_role_ids)
20
23
  end
21
24
 
22
25
  def same_participatory_space
@@ -10,7 +10,7 @@ module Decidim
10
10
 
11
11
  # find the valuators for the current space.
12
12
  def find_valuators_for_select(participatory_space, current_user)
13
- valuator_roles = participatory_space.user_roles(:valuator)
13
+ valuator_roles = participatory_space.user_roles(:valuator).order_by_name
14
14
  valuators = Decidim::User.where(id: valuator_roles.pluck(:decidim_user_id)).to_a
15
15
 
16
16
  filtered_valuator_roles = valuator_roles.filter do |role|
@@ -9,7 +9,7 @@ module Decidim
9
9
  #
10
10
  # geocoded_proposals - A collection of geocoded proposals
11
11
  def proposals_data_for_map(geocoded_proposals)
12
- geocoded_proposals.map do |proposal|
12
+ geocoded_proposals.select(&:geocoded_and_valid?).map do |proposal|
13
13
  proposal_data_for_map(proposal)
14
14
  end
15
15
  end
@@ -402,12 +402,8 @@ module Decidim
402
402
  where(query, value:)
403
403
  end
404
404
 
405
- def self.ransackable_scopes(auth_object = nil)
406
- base = [:with_any_origin, :with_any_state, :state_eq, :voted_by, :coauthored_by, :related_to, :with_any_scope, :with_any_category]
407
- return base unless auth_object&.admin?
408
-
409
- # Add extra scopes for admins for the admin panel searches
410
- base + [:valuator_role_ids_has]
405
+ def self.ransackable_scopes(_auth_object = nil)
406
+ [:with_any_origin, :with_any_state, :state_eq, :voted_by, :coauthored_by, :related_to, :with_any_scope, :with_any_category, :valuator_role_ids_has]
411
407
  end
412
408
 
413
409
  # Create i18n ransackers for :title and :body.
@@ -103,11 +103,7 @@
103
103
  }
104
104
 
105
105
  &__grid-text-title {
106
- @apply flex justify-between flex-row md:flex-col md:items-start lg:flex-row lg:items-center;
107
-
108
- .label {
109
- @apply md:mt-2;
110
- }
106
+ @apply flex justify-between flex-row md:flex-col items-start lg:flex-row;
111
107
  }
112
108
 
113
109
  &__list-metadata {
@@ -4,15 +4,16 @@ module Decidim
4
4
  module Proposals
5
5
  class Permissions < Decidim::DefaultPermissions
6
6
  def permissions
7
- return permission_action unless user
8
-
9
7
  # Delegate the admin permission checks to the admin permissions class
10
8
  return Decidim::Proposals::Admin::Permissions.new(user, permission_action, context).permissions if permission_action.scope == :admin
11
9
  return permission_action if permission_action.scope != :public
12
10
 
11
+ toggle_allow(!proposal.hidden?) if permission_action.subject == :proposal && permission_action.action == :read
12
+ return permission_action unless user
13
+
13
14
  case permission_action.subject
14
15
  when :proposal
15
- apply_proposal_permissions(permission_action)
16
+ apply_proposal_permissions(permission_action) unless permission_action.action == :read
16
17
  when :collaborative_draft
17
18
  apply_collaborative_draft_permissions(permission_action)
18
19
  else
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Proposals
5
+ class CollaborativeDraftDiffRenderer < DiffRenderer
6
+ private
7
+
8
+ def attribute_types
9
+ {
10
+ title: :string,
11
+ body: :string,
12
+ decidim_category_id: :category,
13
+ decidim_scope_id: :scope,
14
+ address: :string,
15
+ latitude: :string,
16
+ longitude: :string,
17
+ decidim_proposals_proposal_state_id: :string
18
+ }
19
+ end
20
+ end
21
+ end
22
+ end
@@ -21,8 +21,10 @@ module Decidim
21
21
 
22
22
  # Parses the values before parsing the changeset.
23
23
  def parse_changeset(attribute, values, type, diff)
24
+ return parse_i18n_changeset(attribute, values, type, diff) if [:i18n, :i18n_html].include?(type)
24
25
  return parse_scope_changeset(attribute, values, type, diff) if type == :scope
25
26
  return parse_state_changeset(attribute, values, type, diff) if type == :state
27
+ return parse_user_group_changeset(attribute, values, type, diff) if type == :user_group
26
28
 
27
29
  values = parse_values(attribute, values)
28
30
  old_value = values[0]
@@ -117,7 +117,7 @@ module Decidim
117
117
  if attachment.file.attached?
118
118
  new_attachment.file = attachment.file.blob
119
119
  else
120
- new_attachment.attached_uploader(:file).remote_url = attachment.attached_uploader(:file).url(host: original_proposal.organization.host)
120
+ new_attachment.attached_uploader(:file).remote_url = attachment.attached_uploader(:file).url
121
121
  end
122
122
 
123
123
  new_attachment.save!
@@ -25,7 +25,7 @@
25
25
  <%= check_box_tag "proposals_bulk", "all", false, class: "js-check-all" %>
26
26
  </th>
27
27
  <th class="!text-left">
28
- <%= sort_link(query, :title, t("models.proposal.fields.title", scope: "decidim.proposals") ) %>
28
+ <%= sort_link(query, :translated_title, t("models.proposal.fields.title", scope: "decidim.proposals") ) %>
29
29
  </th>
30
30
  <th>
31
31
  <%= sort_link(query, :published_at, t("models.proposal.fields.published_at", scope: "decidim.proposals") ) %>
@@ -58,7 +58,7 @@
58
58
  </th>
59
59
 
60
60
  <th>
61
- <%= sort_link(query, :state, [:state, :is_emendation], t("models.proposal.fields.state", scope: "decidim.proposals") ) %>
61
+ <%= t("models.proposal.fields.state", scope: "decidim.proposals") %>
62
62
  </th>
63
63
 
64
64
  <th><%= t("actions.title", scope: "decidim.proposals") %></th>
@@ -17,9 +17,9 @@
17
17
  </div>
18
18
  <div class="row column">
19
19
  <%= f.label t(".select_states") %>
20
- <%= f.collection_check_boxes :states, @form.states_collection, :value, :name do |b| %>
20
+ <%= f.collection_check_boxes :states, @form.states_collection, :token, :title do |b| %>
21
21
  <div>
22
- <%= b.label { b.check_box + b.text } %>
22
+ <%= b.label { b.check_box + translated_attribute(b.text) } %>
23
23
  </div>
24
24
  <% end %>
25
25
  </div>
@@ -31,7 +31,7 @@
31
31
 
32
32
  <% if Decidim::Map.available?(:geocoding, :dynamic) && component_settings.geocoding_enabled? %>
33
33
  <div class="proposal-list__map">
34
- <%= dynamic_map_for proposals_data_for_map(@all_geocoded_proposals) do %>
34
+ <%= dynamic_map_for proposals_data_for_map(@proposals) do %>
35
35
  <template id="marker-popup">
36
36
  <div class="space-y-6">
37
37
  <a href="${link}" class="card__list">
@@ -3,3 +3,15 @@ var $orderFilterInput = $('.order_filter');
3
3
 
4
4
  $proposals.html('<%= j(render partial: "proposals").strip.html_safe %>');
5
5
  $orderFilterInput.val('<%= order %>');
6
+
7
+ <% if Decidim::Map.available?(:geocoding, :dynamic) && component_settings.geocoding_enabled? %>
8
+ var $map = $("#map");
9
+ var controller = $map.data("map-controller");
10
+ if (controller) {
11
+ var markerData = JSON.parse('<%= escape_javascript proposals_data_for_map(@proposals).to_json.html_safe %>');
12
+ controller.clearMarkers();
13
+ if (markerData.length > 0 ) {
14
+ controller.addMarkers(markerData);
15
+ }
16
+ }
17
+ <% end %>
@@ -77,7 +77,7 @@ extra_admin_link(
77
77
  <% end %>
78
78
 
79
79
  <% if component_settings.geocoding_enabled? && @proposal.geocoded? %>
80
- <div class="static-map__container">
80
+ <div class="static-map__container py-6">
81
81
  <%= render partial: "decidim/shared/static_map", locals: { icon_name: "proposals", geolocalizable: @proposal } %>
82
82
  </div>
83
83
  <% end %>
@@ -262,12 +262,10 @@ ar:
262
262
  email_subject: تمت إضافة اقتراح جديد "%{resource_title}" إلى %{participatory_space_title}
263
263
  proposal_update_category:
264
264
  email_intro: 'قام المشرف بتحديث فئة اقتراحك "%{resource_title}" ، تحقق من ذلك في هذه الصفحة:'
265
- email_outro: لقد تلقيت هذا الإشعار لأنك مؤلف الاقتراح.
266
265
  email_subject: تم تحديث فئة %{resource_title} اقتراح
267
266
  notification_title: تم تحديث فئة اقتراح <a href="%{resource_path}">%{resource_title}</a> بواسطة مسؤول.
268
267
  proposal_update_scope:
269
268
  email_intro: 'قام مدير بتحديث نطاق اقتراحك "%{resource_title}" ، يرجى التحقق منه على هذه الصفحة:'
270
- email_outro: لقد تلقيت هذا الإشعار لأنك مؤلف الاقتراح.
271
269
  email_subject: تم تحديث نطاق الاقتراح %{resource_title}
272
270
  notification_title: نطاق الاقتراح <a href="%{resource_path}">%{resource_title}</a> تم تحديثه من قبل مدير.
273
271
  voting_enabled:
@@ -316,7 +314,7 @@ ar:
316
314
  object: أصوات
317
315
  participatory_spaces:
318
316
  highlighted_proposals:
319
- see_all: شاهد الكل (%{count})
317
+ see_all: شاهد الكل
320
318
  proposals:
321
319
  actions:
322
320
  answer_proposal: الرد على المُقتَرَح
@@ -117,7 +117,7 @@ bg:
117
117
  proposal_state_id_eq:
118
118
  label: Състояние
119
119
  scope_id_eq:
120
- label: Обхват
120
+ label: Сфера
121
121
  state_eq:
122
122
  label: Състояние
123
123
  values:
@@ -142,7 +142,7 @@ bg:
142
142
  actions:
143
143
  amend: Промяна
144
144
  comment: Коментар
145
- create: Създай
145
+ create: Създаване
146
146
  endorse: Одобри
147
147
  vote: Глас
148
148
  vote_comment: Оцени коментара
@@ -190,7 +190,7 @@ bg:
190
190
  proposal_wizard_step_1_help_text: Текст на помощника за стъпка "Създай"
191
191
  proposal_wizard_step_2_help_text: Помощен текст на стъпка "Публикуване" на съветника за предложения
192
192
  resources_permissions_enabled: Позволените действия могат да се задават за всяко предложение
193
- scope_id: Обхват
193
+ scope_id: Сфера
194
194
  scopes_enabled: Обхватите са активирани
195
195
  threshold_per_proposal: Праг за предложенията
196
196
  vote_limit: Лимит за гласуване на участник
@@ -309,12 +309,10 @@ bg:
309
309
  notification_title: Вашето предложение <a href="%{resource_path}">%{resource_title}</a> промени състоянието си на „%{state}“.
310
310
  proposal_update_category:
311
311
  email_intro: 'Администратор актуализира категорията на Вашето предложение „%{resource_title}“. Вижте повече на тази страница:'
312
- email_outro: Получавате това известие, защото сте авторът на предложението.
313
312
  email_subject: Категорията на предложението %{resource_title} беше актуализирана
314
313
  notification_title: Категорията на предложението <a href="%{resource_path}">%{resource_title}</a> беше актуализирана от администратор.
315
314
  proposal_update_scope:
316
315
  email_intro: 'Администратор актуализира обхвата на Вашето предложение „%{resource_title}“. Вижте повече на тази страница:'
317
- email_outro: Получавате това известие, защото сте авторът на предложението.
318
316
  email_subject: Обхватът на предложението %{resource_title} беше актуализиран
319
317
  notification_title: Обхватът на предложението <a href="%{resource_path}">%{resource_title}</a> беше актуализиран от администратор.
320
318
  voting_enabled:
@@ -660,7 +658,7 @@ bg:
660
658
  open: Отворен
661
659
  published: Публикувано
662
660
  related_to: Свързано с
663
- scope: Обхват
661
+ scope: Сфера
664
662
  search: Търсене
665
663
  state: Статус
666
664
  withdrawn: Оттеглено
@@ -746,7 +744,7 @@ bg:
746
744
  official_proposal: Официално предложение
747
745
  published_answer: Публикуван отговор
748
746
  published_at: Публикувано на
749
- scope: Обхват
747
+ scope: Сфера
750
748
  state: Статус
751
749
  title: Заглавие
752
750
  valuator: Оценител
@@ -0,0 +1 @@
1
+ bn:
@@ -0,0 +1,100 @@
1
+ ---
2
+ bs:
3
+ activemodel:
4
+ attributes:
5
+ valuation_assignment:
6
+ admin_log:
7
+ valuator_role_id: Ime procenjivača
8
+ errors:
9
+ models:
10
+ proposal:
11
+ attributes:
12
+ body:
13
+ cant_be_equal_to_template: ne može biti jednak šablonu
14
+ models:
15
+ decidim/proposals/admin/update_proposal_scope_event: Predlog opsega izmenjen
16
+ decidim:
17
+ admin:
18
+ filters:
19
+ proposals:
20
+ valuator_role_ids_has:
21
+ label: Dodeljeno procenjivaču
22
+ search_placeholder:
23
+ id_string_or_title_cont: Pretraži %{collection} prema identifikacionom broju ili nazivu.
24
+ components:
25
+ proposals:
26
+ settings:
27
+ global:
28
+ new_proposal_body_template: Novi predlog šablona glavnog teksta
29
+ new_proposal_body_template_help: Možete da definišete tekst koji će se pojavljivati pri kreiranju novog predloga
30
+ step:
31
+ amendments_visibility: Vidljivost izmena
32
+ amendments_visibility_choices:
33
+ all: Izmene su vidljive svima
34
+ participants: Izmene su vidljive samo svojim autorima
35
+ answers_with_costs: Omogući troškove za odgovore na predloge
36
+ publish_answers_immediately: Objavi odgovore na predloge odmah
37
+ events:
38
+ proposals:
39
+ admin:
40
+ proposal_note_created:
41
+ email_outro: Dobili ste ovo obaveštenje jer možete da procenite predlog.
42
+ email_subject: Neko je ostavio poruku na predlogu %{resource_title}.
43
+ proposal_update_scope:
44
+ email_intro: 'Administrator je ažurirao opseg vašeg predloga "%{resource_title}", pogledajte na ovoj strani:'
45
+ email_subject: Opseg predloga %{resource_title} je ažuriran
46
+ proposals:
47
+ actions:
48
+ answer_proposal: Odgovor na predlog
49
+ show: Prikaži predlog
50
+ admin:
51
+ proposals:
52
+ index:
53
+ assign_to_valuator: Dodeli procenjivaču
54
+ assign_to_valuator_button: Dodeli
55
+ change_scope: Promeni opseg
56
+ publish_answers: Objavi odgovore
57
+ unassign_from_valuator: Oduzmi od procenjivača
58
+ unassign_from_valuator_button: Od dodeli
59
+ update_scope_button: Ažuriraj opseg
60
+ show:
61
+ amendments_count: Broj izmena
62
+ assigned_valuators: Dodeljeni procenjivači
63
+ comments_count: Broj komentara
64
+ documents: Dokumenti
65
+ endorsements_count: Broj podržavanja
66
+ endorsers: Podržavaoci
67
+ n_more_endorsers:
68
+ one: i još 1
69
+ few: i još %{count}
70
+ other: i još %{count}
71
+ photos: Slike
72
+ ranking: "%{ranking} od %{total}"
73
+ related_meetings: Slični sastanci
74
+ remove_assignment: Ukloni zadatak
75
+ remove_assignment_confirmation: Da li ste sigurni da želite da uklonite procenjivača sa ovog predloga?
76
+ valuators: Procenjivači
77
+ update_category:
78
+ invalid: 'Ovi predlozi već imaju %{subject_name} kategoriju: %{proposals}.'
79
+ success: 'Predlozi uspešno dodati u kategoriju %{subject_name}: %{proposals}.'
80
+ update_scope:
81
+ invalid: 'Ovi predlozi već imaju %{subject_name} opseg: %{proposals}.'
82
+ success: 'Predlozi kojima je uspešno dodat opseg %{subject_name}: %{proposals}.'
83
+ admin_log:
84
+ proposal:
85
+ publish_answer: "%{user_name} je objavio odgovor na predlog %{resource_name} u prostoru %{space_name}"
86
+ valuation_assignment:
87
+ create: "%{user_name} je dodao predlog %{resource_name} procenjivaču"
88
+ models:
89
+ proposal:
90
+ fields:
91
+ published_answer: Objavljeni odgovor
92
+ valuator: Procenjivač
93
+ valuators: Procenjivači
94
+ proposals:
95
+ show:
96
+ estimated_cost: Procenjen trošak
97
+ proposals_picker:
98
+ choose_proposals: Izaberi predloge
99
+ publish_answers:
100
+ success: Odgovori na predloge uspešno objavljeni.
@@ -143,7 +143,7 @@ ca:
143
143
  actions:
144
144
  amend: Esmena
145
145
  comment: Comentar
146
- create: Crear
146
+ create: Crea
147
147
  endorse: Adherir-se
148
148
  vote: Donar suport
149
149
  vote_comment: Votar el comentari
@@ -310,12 +310,12 @@ ca:
310
310
  notification_title: La teva proposta <a href="%{resource_path}">%{resource_title}</a>ha canviat el seu estat a "%{state}".
311
311
  proposal_update_category:
312
312
  email_intro: 'Una administradora ha actualitzat la categoria de la teva proposta "%{resource_title}", fes-hi una ullada:'
313
- email_outro: Has rebut aquesta notificació perquè vas presentar aquesta proposta.
313
+ email_outro: Has rebut aquesta notificació perquè ets l'autora de la proposta.
314
314
  email_subject: S'ha actualitzat la categoria de la proposta %{resource_title}
315
315
  notification_title: La categoria de la proposta <a href="%{resource_path}">%{resource_title}</a> ha estat actualitzada per una administradora.
316
316
  proposal_update_scope:
317
317
  email_intro: 'Una administradora ha actualitzat l''àmbit de la teva proposta "%{resource_title}", fes-hi una ullada:'
318
- email_outro: Has rebut aquesta notificació perquè vas presentar aquesta proposta.
318
+ email_outro: Has rebut aquesta notificació perquè ets l'autora de la proposta.
319
319
  email_subject: S'ha actualitzat l'àmbit de la proposta %{resource_title}
320
320
  notification_title: L'àmbit de la proposta <a href="%{resource_path}">%{resource_title}</a> ha estat actualitzat per una administradora.
321
321
  voting_enabled:
@@ -507,7 +507,7 @@ ca:
507
507
  title: Actualitza la proposta
508
508
  update: Actualizar
509
509
  form:
510
- attachment_legend: "(Opcional) Afegiu un fitxer adjunt"
510
+ attachment_legend: "(Opcional) Afegeix un fitxer adjunt"
511
511
  created_in_meeting: Aquesta proposta prové d'una trobada
512
512
  delete_attachment: Suprimeix l'adjunt
513
513
  select_a_category: Selecciona una categoria
@@ -842,7 +842,7 @@ ca:
842
842
  show:
843
843
  answer: Resposta
844
844
  changes_at_title: Esmena a "%{title}"
845
- edit_proposal: Edita proposta
845
+ edit_proposal: Edita la proposta
846
846
  estimated_cost: Cost estimat
847
847
  hidden_endorsers_count:
848
848
  one: i %{count} persona més