decidim-proposals 0.29.1 → 0.29.2

Sign up to get free protection for your applications and to get access to all the features.
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