decidim-proposals 0.31.1 → 0.31.3

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 (59) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/concerns/decidim/proposals/admin/filterable.rb +3 -1
  3. data/app/controllers/decidim/proposals/admin/proposals_imports_controller.rb +15 -0
  4. data/app/controllers/decidim/proposals/proposals_controller.rb +7 -1
  5. data/app/forms/decidim/proposals/admin/proposal_form.rb +51 -1
  6. data/app/forms/decidim/proposals/admin/proposals_import_form.rb +8 -14
  7. data/app/helpers/decidim/proposals/admin/proposal_bulk_actions_helper.rb +2 -1
  8. data/app/packs/entrypoints/decidim_proposals_admin.js +1 -0
  9. data/app/packs/src/decidim/proposals/admin/controllers/import_proposals/controller.js +110 -0
  10. data/app/packs/src/decidim/proposals/admin/import_proposals.js +5 -0
  11. data/app/views/decidim/proposals/admin/proposals_imports/new.html.erb +10 -12
  12. data/app/views/decidim/proposals/collaborative_drafts/_edit_form_fields.html.erb +2 -1
  13. data/app/views/decidim/proposals/proposals/_edit_form_fields.html.erb +2 -2
  14. data/app/views/decidim/proposals/proposals/_proposal_aside.html.erb +1 -1
  15. data/app/views/decidim/proposals/proposals/_proposals.html.erb +1 -1
  16. data/app/views/decidim/proposals/proposals/index.html.erb +1 -1
  17. data/config/locales/ar.yml +12 -4
  18. data/config/locales/bg.yml +6 -2
  19. data/config/locales/ca-IT.yml +12 -12
  20. data/config/locales/ca.yml +12 -12
  21. data/config/locales/cs.yml +19 -4
  22. data/config/locales/de.yml +3 -5
  23. data/config/locales/el.yml +6 -2
  24. data/config/locales/en.yml +2 -2
  25. data/config/locales/es-MX.yml +11 -11
  26. data/config/locales/es-PY.yml +7 -7
  27. data/config/locales/es.yml +10 -10
  28. data/config/locales/eu.yml +7 -7
  29. data/config/locales/fi-plain.yml +6 -6
  30. data/config/locales/fi.yml +4 -4
  31. data/config/locales/fr-CA.yml +30 -12
  32. data/config/locales/fr.yml +30 -12
  33. data/config/locales/ga-IE.yml +5 -0
  34. data/config/locales/gl.yml +9 -5
  35. data/config/locales/hu.yml +8 -3
  36. data/config/locales/id-ID.yml +6 -4
  37. data/config/locales/is-IS.yml +24 -0
  38. data/config/locales/it.yml +11 -7
  39. data/config/locales/ja.yml +6 -6
  40. data/config/locales/lt.yml +11 -5
  41. data/config/locales/lv.yml +7 -3
  42. data/config/locales/nl.yml +12 -10
  43. data/config/locales/no.yml +6 -2
  44. data/config/locales/pl.yml +13 -7
  45. data/config/locales/pt-BR.yml +7 -7
  46. data/config/locales/pt.yml +8 -4
  47. data/config/locales/ro-RO.yml +11 -4
  48. data/config/locales/ru.yml +27 -1
  49. data/config/locales/sk.yml +9 -4
  50. data/config/locales/sl.yml +6 -0
  51. data/config/locales/sv.yml +146 -36
  52. data/config/locales/tr-TR.yml +12 -6
  53. data/config/locales/uk.yml +27 -1
  54. data/config/locales/zh-CN.yml +5 -1
  55. data/config/locales/zh-TW.yml +6 -3
  56. data/db/data/20260208135005_change_users_in_action_logs_proposals.rb +29 -0
  57. data/lib/decidim/proposals/admin_engine.rb +5 -2
  58. data/lib/decidim/proposals/version.rb +1 -1
  59. metadata +23 -20
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: be7a2b8e7861c220b8ab1b1bff9145e8f985e9a912036c4cf6e01196446deab2
4
- data.tar.gz: a01f558a091e5714c506289ad89204b8dfe5f02c10304e57b97024dc717402f5
3
+ metadata.gz: c245b1ea6ef736a9799553e7f87f5f95d5c7c7b4c3b7c3e4830f3c9c4626d650
4
+ data.tar.gz: a6238f6e26575eee72a3e3f1b87c07e30a8822fef9c0cb47475af9c571e6b677
5
5
  SHA512:
6
- metadata.gz: aab0f50962aacf6f619e1271632e2d772f493d1da9a5e5339ef382d9d85846a6b2a67cfe3dcc258b5197097f14474d5befdadf8542229db3f42cd562af5dcaf0
7
- data.tar.gz: 865b61a13d3c090276e0b7c19e272d6f501665382a2f58e0770832a91fdc1227c26d7df21a7ea7d2cf57df25087da06a24810f32a6824a1f6234b4e140903f62
6
+ metadata.gz: e03002daa5cfc826e8c18fbcfc60dba89d1d5aa294e4bf909db8eab8933f97b7b73d3061b94ae1190dc59750b91764e77fc0397fee6a49201efe98ebf1fa9853
7
+ data.tar.gz: 857327cf0f33058d2830e7b34ded7e299577c9d5e1cf30dad5ba06b78541647f9e4d7c1a885ed290354b85e5309f70001439250769136fed4fcc94ec3337b05c
@@ -51,7 +51,9 @@ module Decidim
51
51
  end
52
52
 
53
53
  def evaluator_role_ids
54
- current_participatory_space.user_roles(:evaluator).order_by_name.pluck(:id)
54
+ roles = current_participatory_space.user_roles(:evaluator)
55
+ roles = roles.order_by_name if roles.respond_to?(:order_by_name)
56
+ roles.pluck(:id)
55
57
  end
56
58
 
57
59
  def translated_evaluator_role_ids_has(evaluator_role_id)
@@ -27,6 +27,21 @@ module Decidim
27
27
  end
28
28
  end
29
29
  end
30
+
31
+ def component_states
32
+ enforce_permission_to :import, :proposals
33
+ component = current_participatory_space.components.find_by(id: params[:origin_id])
34
+
35
+ if component
36
+ states = Decidim::Proposals::ProposalState
37
+ .where(component:)
38
+ .map { |s| { token: s.token, title: translated_attribute(s.title) } }
39
+ states << { token: "not_answered", title: I18n.t("decidim.proposals.answers.not_answered") }
40
+ render json: states
41
+ else
42
+ render json: []
43
+ end
44
+ end
30
45
  end
31
46
  end
32
47
  end
@@ -16,7 +16,7 @@ module Decidim
16
16
  include Paginable
17
17
  include Decidim::AttachmentsHelper
18
18
 
19
- helper_method :proposal_presenter, :form_presenter, :tab_panel_items
19
+ helper_method :proposal_presenter, :form_presenter, :tab_panel_items, :withdrawn_proposals?
20
20
 
21
21
  before_action :authenticate_user!, only: [:new, :create]
22
22
  before_action :ensure_is_draft, only: [:preview, :publish, :edit_draft, :update_draft, :destroy_draft]
@@ -233,6 +233,12 @@ module Decidim
233
233
  @proposal_presenter ||= present(@proposal)
234
234
  end
235
235
 
236
+ def withdrawn_proposals?
237
+ return @withdrawn_proposals if defined?(@withdrawn_proposals)
238
+
239
+ @withdrawn_proposals = Proposal.where(component: current_component).published.not_hidden.withdrawn.exists?
240
+ end
241
+
236
242
  def form_proposal_params
237
243
  form(ProposalForm).from_params(params)
238
244
  end
@@ -27,12 +27,62 @@ module Decidim
27
27
 
28
28
  self.title = presenter.title(all_locales: title.is_a?(Hash))
29
29
  self.body = presenter.editor_body(all_locales: body.is_a?(Hash))
30
- self.documents = model.attachments
30
+ self.documents = model.attachments.ids
31
+ self.add_documents = model.attachments.map { |att| { id: att.id, title: att.title } }
32
+ end
33
+
34
+ def documents=(value)
35
+ case value
36
+ when String
37
+ super(parse_string_documents(value))
38
+ when Integer
39
+ super([value])
40
+ else
41
+ super
42
+ end
43
+ end
44
+
45
+ def documents
46
+ result = super
47
+
48
+ if should_use_add_documents?(result)
49
+ extract_ids_from_add_documents
50
+ else
51
+ result.is_a?(Array) ? result : []
52
+ end
31
53
  end
32
54
 
33
55
  def notify_missing_attachment_if_errored
34
56
  errors.add(:add_documents, :needs_to_be_reattached) if errors.any? && add_documents.present?
35
57
  end
58
+
59
+ private
60
+
61
+ def should_use_add_documents?(result)
62
+ (result.blank? || result.is_a?(String)) && add_documents.present?
63
+ end
64
+
65
+ def extract_ids_from_add_documents
66
+ add_documents
67
+ .select { |doc| doc.is_a?(Hash) && (doc[:id].present? || doc["id"].present?) }
68
+ .map { |doc| (doc[:id] || doc["id"]).to_i }
69
+ end
70
+
71
+ def parse_string_documents(value)
72
+ return [] if value.blank?
73
+
74
+ parse_document_ids(value)
75
+ end
76
+
77
+ def parse_document_ids(value)
78
+ ids = begin
79
+ Array(JSON.parse(value))
80
+ rescue JSON::ParserError
81
+ value.split(",").map(&:strip)
82
+ end
83
+
84
+ ids.map(&:to_i).reject(&:zero?)
85
+ end
36
86
  end
37
87
  end
38
88
  end
@@ -10,22 +10,14 @@ module Decidim
10
10
  mimic :proposals_import
11
11
 
12
12
  attribute :origin_component_id, Integer
13
- attribute :import_proposals, Boolean
14
13
  attribute :keep_answers, Boolean
15
14
  attribute :keep_authors, Boolean
16
- attribute :states, Array
15
+ attribute :states, Array[String]
17
16
 
18
- validates :origin_component_id, :origin_component, :states, :current_component, presence: true
19
- validates :import_proposals, allow_nil: false, acceptance: true
17
+ validates :origin_component_id, :origin_component, :current_component, presence: true
18
+ validates :states, presence: true
20
19
  validate :valid_states
21
20
 
22
- def states_collection
23
- @states_collection ||= ProposalState.where(component: current_component) + [ProposalState.new(token: "not_answered",
24
- title: I18n.t(
25
- :not_answered, scope: "decidim.proposals.answers"
26
- ))]
27
- end
28
-
29
21
  def states
30
22
  super.compact_blank
31
23
  end
@@ -47,9 +39,11 @@ module Decidim
47
39
  private
48
40
 
49
41
  def valid_states
50
- return if states.all? do |state|
51
- states_collection.pluck(:token).include?(state)
52
- end
42
+ return unless origin_component
43
+ return if states.empty?
44
+
45
+ valid_tokens = Decidim::Proposals::ProposalState.where(component: origin_component).pluck(:token) + ["not_answered"]
46
+ return if states.all? { |state| valid_tokens.include?(state) }
53
47
 
54
48
  errors.add(:states, :invalid)
55
49
  end
@@ -35,7 +35,8 @@ module Decidim
35
35
 
36
36
  # find the evaluators for the current space.
37
37
  def find_evaluators_for_select(participatory_space, current_user)
38
- evaluator_roles = participatory_space.user_roles(:evaluator).order_by_name
38
+ evaluator_roles = participatory_space.user_roles(:evaluator)
39
+ evaluator_roles = evaluator_roles.order_by_name if evaluator_roles.respond_to?(:order_by_name)
39
40
  evaluators = Decidim::User.where(id: evaluator_roles.pluck(:decidim_user_id)).to_a
40
41
 
41
42
  filtered_evaluator_roles = evaluator_roles.filter do |role|
@@ -1,3 +1,4 @@
1
1
  import "src/decidim/proposals/admin/proposals"
2
2
  import "src/decidim/proposals/admin/proposals_form"
3
3
  import "src/decidim/proposals/admin/proposals_merge"
4
+ import "src/decidim/proposals/admin/import_proposals"
@@ -0,0 +1,110 @@
1
+ import { Controller } from "@hotwired/stimulus"
2
+
3
+ /**
4
+ * Stimulus controller for the admin import-proposals form.
5
+ *
6
+ * Watches a `<select>` element (the origin component picker) and dynamically
7
+ * fetches the available proposal states for the chosen component.
8
+ * The retrieved states are rendered as a list of checkboxes inside a
9
+ * container element, so admins can easily filter which proposal states to import.
10
+ *
11
+ * Targets:
12
+ * - `select` – The `<select>` element used to choose the origin component.
13
+ * - `container` – The wrapper element where the state checkboxes are rendered.
14
+ *
15
+ * Values:
16
+ * - `statesUrl` {String} – Base URL of the endpoint that returns available states.
17
+ * - `selectedStates` {Array} – Pre-selected state tokens (populated on page load
18
+ * when re-rendering a previously submitted form).
19
+ */
20
+ export default class ImportProposalsController extends Controller {
21
+
22
+ /**
23
+ * Lifecycle callback invoked by Stimulus when the controller is connected to
24
+ * the DOM. Triggers an initial state fetch based on the currently selected
25
+ * component so that a pre-filled form displays the correct checkboxes.
26
+ * @returns {void}
27
+ */
28
+ connect() {
29
+ this._fetchStates(this.selectTarget.value);
30
+ }
31
+
32
+ /**
33
+ * Triggered when the select value changes.
34
+ * @param {Event} event - The change event fired by the select element.
35
+ * @returns {void}
36
+ */
37
+ onSelectChange(event) {
38
+ this._fetchStates(event.target.value);
39
+ }
40
+
41
+ /**
42
+ * Escapes a string for safe insertion into HTML.
43
+ * @param {string} str - The string to escape.
44
+ * @returns {string} The escaped HTML string.
45
+ */
46
+ _escapeHtml(str) {
47
+ const div = document.createElement("div");
48
+ div.appendChild(document.createTextNode(str));
49
+ return div.innerHTML;
50
+ }
51
+
52
+ /**
53
+ * Fetches the available states for the given component ID and renders them.
54
+ * @param {string} componentId - The ID of the selected component to fetch states for.
55
+ * @returns {void}
56
+ */
57
+ _fetchStates(componentId) {
58
+ const container = this.containerTarget;
59
+ if (!componentId) {
60
+ container.innerHTML = "";
61
+ container.style.display = "none";
62
+ return;
63
+ }
64
+
65
+ const url = `${this.statesUrlValue}?origin_id=${componentId}`;
66
+ fetch(url, {
67
+ credentials: "same-origin",
68
+ headers: { Accept: "application/json" }
69
+ }).then((res) => {
70
+ return res.json();
71
+ }).then((states) => {
72
+ if (!states.length) {
73
+ container.innerHTML = "";
74
+ container.style.display = "none";
75
+ return;
76
+ }
77
+
78
+ const selectedStates = this.selectedStatesValue;
79
+ const wrapper = document.createElement("div");
80
+ wrapper.className = "row column";
81
+
82
+ states.forEach((state) => {
83
+ const div = document.createElement("div");
84
+ const label = document.createElement("label");
85
+ const input = document.createElement("input");
86
+ input.type = "checkbox";
87
+ input.name = "proposals_import[states][]";
88
+ input.value = state.token;
89
+ input.checked = selectedStates.includes(state.token);
90
+ label.appendChild(input);
91
+ label.appendChild(document.createTextNode(` ${state.title}`));
92
+ div.appendChild(label);
93
+ wrapper.appendChild(div);
94
+ });
95
+
96
+ container.innerHTML = "";
97
+ container.appendChild(wrapper);
98
+ container.style.display = "block";
99
+ }).catch(() => {
100
+ container.innerHTML = "";
101
+ container.style.display = "none";
102
+ });
103
+ }
104
+ }
105
+
106
+ ImportProposalsController.targets = ["select", "container"]
107
+ ImportProposalsController.values = {
108
+ statesUrl: String,
109
+ selectedStates: { type: Array, default: [] }
110
+ }
@@ -0,0 +1,5 @@
1
+ import { Application } from "@hotwired/stimulus"
2
+ import ImportProposalsController from "src/decidim/proposals/admin/controllers/import_proposals/controller.js"
3
+
4
+ const application = Application.start()
5
+ application.register("import-proposals", ImportProposalsController)
@@ -1,4 +1,5 @@
1
1
  <% add_decidim_page_title(t(".title")) %>
2
+ <%= append_javascript_pack_tag "decidim_proposals_admin" %>
2
3
  <div class="item_show__header">
3
4
  <h1 class="item_show__header-title">
4
5
  <%= t(".title") %>
@@ -7,21 +8,21 @@
7
8
 
8
9
  <div class="item__edit item__edit-1col">
9
10
  <div class="item__edit-form">
10
- <%= decidim_form_for(@form, url: proposals_import_path, html: { class: "form form-defaults import_proposals" }) do |f| %>
11
+ <%= decidim_form_for(@form, url: proposals_import_path, local: true, html: { class: "form form-defaults import_proposals" }) do |f| %>
11
12
  <% if @form.origin_components.any? %>
12
13
  <div class="form__wrapper">
13
14
  <div class="card pt-4">
14
- <div class="card-section">
15
+ <div class="card-section"
16
+ data-controller="import-proposals"
17
+ data-import-proposals-states-url-value="<%= component_states_proposals_import_path %>">
15
18
  <div class="row column">
16
- <%= f.select :origin_component_id, @form.origin_components_collection, prompt: t(".select_component") %>
19
+ <%= f.select :origin_component_id, @form.origin_components_collection, { prompt: t(".select_component") }, { data: { import_proposals_target: "select", action: "change->import-proposals#onSelectChange" } } %>
17
20
  </div>
18
21
  <div class="row column">
19
- <%= f.label t(".select_states") %>
20
- <%= f.collection_check_boxes :states, @form.states_collection, :token, :title do |b| %>
21
- <div>
22
- <%= b.label { b.check_box + translated_attribute(b.text) } %>
23
- </div>
24
- <% end %>
22
+ <label class="ml-4"><%= t(".select_states") %></label>
23
+ <div id="states-container"
24
+ data-import-proposals-target="container"
25
+ data-import-proposals-selected-states-value="<%= @form.states.to_json %>"></div>
25
26
  </div>
26
27
  <div class="row column">
27
28
  <%= f.check_box :keep_authors %>
@@ -29,9 +30,6 @@
29
30
  <div class="row column">
30
31
  <%= f.check_box :keep_answers %>
31
32
  </div>
32
- <div class="row column">
33
- <%= f.check_box :import_proposals %>
34
- </div>
35
33
  </div>
36
34
  </div>
37
35
  </div>
@@ -21,5 +21,6 @@
21
21
  button_edit_label: t("decidim.proposals.collaborative_drafts.new.edit_file"),
22
22
  button_class: "button button__lg button__transparent-secondary w-full",
23
23
  help_text: t("attachment_legend", scope: "decidim.proposals.collaborative_drafts.edit"),
24
- help_i18n_scope: "decidim.forms.file_help.file" %>
24
+ help_i18n_scope: "decidim.forms.file_help.file",
25
+ paragraph: true %>
25
26
  <% end %>
@@ -22,7 +22,6 @@
22
22
  <%= filter_taxonomy_items_select_field form, :taxonomies, filter %>
23
23
  <% end %>
24
24
  <% end %>
25
-
26
25
  <% if component_settings.attachments_allowed? && (new_proposal || @proposal) %>
27
26
  <%= form.attachment :documents,
28
27
  multiple: true,
@@ -31,5 +30,6 @@
31
30
  button_edit_label: t("decidim.proposals.proposals.edit.edit_attachments"),
32
31
  button_class: "button button__lg button__transparent-secondary w-full",
33
32
  help_i18n_scope: "decidim.forms.file_help.file",
34
- help_text: t("attachment_legend", scope: "decidim.proposals.proposals.edit") %>
33
+ help_text: t("attachment_legend", scope: "decidim.proposals.proposals.edit"),
34
+ paragraph: true %>
35
35
  <% end %>
@@ -1,4 +1,4 @@
1
- <% if current_settings.votes_enabled? && (show_likes_card? || current_user) %>
1
+ <% if current_settings.votes_enabled? %>
2
2
  <section class="layout-aside__section">
3
3
  <div class="proposal__aside-vote layout-aside__ctas-buttons" data-controller="sticky-buttons">
4
4
  <%= render partial: "vote_button", locals: { proposal: @proposal, from_proposals_list: false } unless @proposal.withdrawn? %>
@@ -26,6 +26,6 @@
26
26
 
27
27
  <% if params.dig("filter", "with_availability").present? && params["filter"]["with_availability"] == "withdrawn" %>
28
28
  <%= link_to t("decidim.proposals.proposals.index.see_all"), proposals_path("filter[with_availability]" => nil), class: "button button__sm button__text-secondary" %>
29
- <% else %>
29
+ <% elsif withdrawn_proposals? %>
30
30
  <%= link_to t("decidim.proposals.proposals.index.see_all_withdrawn"), proposals_path(filter: { with_availability: "withdrawn", with_any_state: [] }), class: "button button__sm button__text-secondary" %>
31
31
  <% end %>
@@ -1,5 +1,5 @@
1
1
  <% add_decidim_meta_tags(
2
- description: translated_attribute(current_participatory_space.short_description),
2
+ description: translated_attribute(current_participatory_space.try(:short_description) || current_participatory_space.description),
3
3
  title: t("decidim.components.pagination.page_title",
4
4
  component_name: component_name,
5
5
  current_page: @proposals.current_page,
@@ -35,7 +35,6 @@ ar:
35
35
  file: ملف
36
36
  proposals_import:
37
37
  import_proposals: مقترحات الاستيراد
38
- keep_answers: الاحتفاظ بالحالة والإجابات
39
38
  keep_authors: الحفاظ على المؤلفين الأصلي
40
39
  errors:
41
40
  models:
@@ -181,6 +180,9 @@ ar:
181
180
  admin:
182
181
  proposal_note_created:
183
182
  email_subject: ترك شخص ملاحظة على الاقتراح %{resource_title}.
183
+ coauthor_invited:
184
+ actions:
185
+ accept: قبول
184
186
  collaborative_draft_access_accepted:
185
187
  email_intro: 'تم قبول %{requester_name} لأن يكون مسجلاً كمساهم في المسودة التعاونية <a href="%{resource_url}">%{resource_title}</a>.'
186
188
  email_outro: لقد تلقيت هذا الإشعار لأنك مساهم مع <a href="%{resource_url}">%{resource_title}</a>.
@@ -372,7 +374,6 @@ ar:
372
374
  create: مقترحات الاستيراد
373
375
  no_components: لا توجد مكونات اقتراح أخرى في هذه المساحة التشاركية لاستيراد المقترحات منها.
374
376
  select_component: يرجى اختيار عنصر
375
- select_states: تحقق من حالة مقترحات الاستيراد
376
377
  proposals_merges:
377
378
  create:
378
379
  success: دمج المقترحات بنجاح في واحدة جديدة.
@@ -433,7 +434,7 @@ ar:
433
434
  all: الكل
434
435
  amendment: تعديلات
435
436
  open: افتح
436
- published: نشرت
437
+ published: تم نشره
437
438
  related_to: متعلق ب
438
439
  search: بحث
439
440
  state: الحالة
@@ -491,7 +492,7 @@ ar:
491
492
  withdraw: سحب المشروع
492
493
  states:
493
494
  open: افتح
494
- published: نشرت
495
+ published: تم نشره
495
496
  withdrawn: سحب
496
497
  update:
497
498
  error: حدثت مشكلة في حفظ المسودة التعاونية.
@@ -594,6 +595,13 @@ ar:
594
595
  answer: إجابة
595
596
  changes_at_title: تعديل على "%{title}"
596
597
  estimated_cost: التكلفة التقديرية
598
+ hidden_likes_count:
599
+ zero: و %{count} المزيد من الناس
600
+ one: و %{count} شخص آخر
601
+ two: و %{count} المزيد من الناس
602
+ few: و %{count} المزيد من الناس
603
+ many: و %{count} المزيد من الناس
604
+ other: و %{count} المزيد من الناس
597
605
  link_to_collaborative_draft_help_text: هذا الاقتراح هو نتيجة لمشروع تعاوني. مراجعة التاريخ
598
606
  link_to_collaborative_draft_text: انظر المسودة التعاونية
599
607
  link_to_promoted_emendation_help_text: هذا الاقتراح عبارة عن تعديل مروج له
@@ -43,7 +43,6 @@ bg:
43
43
  origin_component_id: Компонент, от който да се копират предложенията
44
44
  proposals_import:
45
45
  import_proposals: Копиране на предложения
46
- keep_answers: Запазете състоянието и отговорите
47
46
  keep_authors: Запази автора на оригинала
48
47
  errors:
49
48
  models:
@@ -203,6 +202,9 @@ bg:
203
202
  admin:
204
203
  proposal_note_created:
205
204
  email_subject: Някой е направил бележка в предложението %{resource_title}.
205
+ coauthor_invited:
206
+ actions:
207
+ accept: Приеми
206
208
  collaborative_draft_access_accepted:
207
209
  email_intro: '%{requester_name} получи достъп като сътрудник в съвместната чернова <a href="%{resource_url}">%{resource_title}</a>.'
208
210
  email_outro: Получихте известие, защото сте сътрудник в <a href="%{resource_url}">%{resource_title}</a>.
@@ -456,7 +458,6 @@ bg:
456
458
  create: Импортиране на предложения
457
459
  no_components: Няма други компоненти на предложения в това пространство за участие, от които да се импортират предложенията.
458
460
  select_component: Моля, изберете компонент
459
- select_states: Проверете състоянието на предложенията за импортиране
460
461
  title: Импортиране на предложения от друг компонент
461
462
  proposals_merges:
462
463
  create:
@@ -691,6 +692,9 @@ bg:
691
692
  answer: Отговор
692
693
  changes_at_title: Изменение на „%{title}“
693
694
  estimated_cost: Предвидени разходи
695
+ hidden_likes_count:
696
+ one: и още %{count}
697
+ other: и още %{count} души
694
698
  link_to_collaborative_draft_help_text: Това предложение е резултат от съвместна чернова. Прегледайте хронологията
695
699
  link_to_collaborative_draft_text: Вижте съвместната чернова
696
700
  link_to_promoted_emendation_help_text: Това предложение е допринасяща поправка
@@ -53,7 +53,7 @@ ca-IT:
53
53
  file: Arxiu
54
54
  proposals_import:
55
55
  import_proposals: Importar propostes
56
- keep_answers: Manté l'estat i les respostes
56
+ keep_answers: Manté els estats i les respostes
57
57
  keep_authors: Mantenir l'autoria original
58
58
  errors:
59
59
  models:
@@ -370,9 +370,9 @@ ca-IT:
370
370
  notification_title: La teva proposta <a href="%{resource_path}">%{resource_title}</a>ha canviat el seu estat a "%{state}".
371
371
  follower:
372
372
  email_intro: 'La proposta "%{resource_title}" ha canviat d''estat a "%{state}". Pots llegir la resposta en aquesta pàgina:'
373
- email_outro: Has rebut aquesta notificació perquè estàs seguint "%{resource_title}". Pots deixar de seguir-ho des de l'enllaç anterior.
373
+ email_outro: Has rebut aquesta notificació perquè estàs seguint l'espai "%{resource_title}". Pots deixar de seguir-ho des de l'enllaç anterior.
374
374
  email_subject: Una proposta que segueixes ha canviat el seu estat (%{state})
375
- notification_title: La teva proposta <a href="%{resource_path}">%{resource_title}</a>ha canviat el seu estat a "%{state}".
375
+ notification_title: La proposta <a href="%{resource_path}">%{resource_title}</a> ha canviat el seu estat a "%{state}".
376
376
  proposal_update_taxonomies:
377
377
  email_intro: 'Una administradora ha actualitzat les taxonomies de la teva proposta "%{resource_title}", fes-hi una ullada:'
378
378
  email_outro: Has rebut aquesta notificació perquè ets l'autora de la proposta.
@@ -690,9 +690,9 @@ ca-IT:
690
690
  success: El procés d'importació ha començat. T'avisarem quan hagi finalitzat.
691
691
  new:
692
692
  create: Importa propostes
693
- no_components: No hi ha cap altre component de propostes en aquest espai participatiu des d'on importar-les.
693
+ no_components: No hi ha cap altre component de propostes en aquest espai de participació des d'on importar-les.
694
694
  select_component: Escull un component
695
- select_states: Consulta els estats de les propostes a importar
695
+ select_states: Importa només les propostes amb aquests estats. Si no s'ha seleccionat cap estat, s'importaran totes les propostes.
696
696
  title: Importar projectes des d'un altre component
697
697
  proposals_merges:
698
698
  create:
@@ -771,11 +771,11 @@ ca-IT:
771
771
  all: Tots
772
772
  amendment: Esmenes
773
773
  open: Obert
774
- published: Publicat
774
+ published: Publicades
775
775
  related_to: Relacionat amb
776
776
  search: Cerca
777
777
  state: Estat
778
- withdrawn: Retirat
778
+ withdrawn: Retirada
779
779
  filters_small_view:
780
780
  close_modal: Tanca la finestra
781
781
  filter: Filtre
@@ -805,7 +805,7 @@ ca-IT:
805
805
  error: No s'ha pogut completar la teva sol·licitud, si us plau torna-ho a provar més tard.
806
806
  success: La teva sol·licitud de contribució s'ha enviat correctament.
807
807
  collaboration_requests:
808
- accept_request: Accepta
808
+ accept_request: Acceptar
809
809
  reject_request: Rebutja
810
810
  title: Sol·licituds de col·laboració
811
811
  rejected_request:
@@ -827,10 +827,10 @@ ca-IT:
827
827
  withdraw: retira l'esborrany
828
828
  states:
829
829
  open: Obert
830
- published: Publicat
831
- withdrawn: Retirat
830
+ published: Publicades
831
+ withdrawn: Retirada
832
832
  update:
833
- error: S'ha produït un error en desar l'esborrany col·laboratiu.
833
+ error: Hi ha hagut un error en desar l'esborrany col·laboratiu.
834
834
  success: L'esborrany col·laboratiu s'ha actualitzat correctament.
835
835
  wizard_aside:
836
836
  back_from_collaborative_draft: Tornar a l'esborrany col·laboratiu
@@ -982,7 +982,7 @@ ca-IT:
982
982
  edit_proposal: Editar
983
983
  estimated_cost: Cost estimat
984
984
  hidden_likes_count:
985
- one: i %{count} persones més
985
+ one: i %{count} persona més
986
986
  other: i %{count} persones més
987
987
  link_to_collaborative_draft_help_text: Aquesta proposta és el resultat d'un esborrany col·laboratiu. Revisa l'historial
988
988
  link_to_collaborative_draft_text: Veure l'esborrany col·laboratiu