decidim-core 0.30.2 → 0.30.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 (59) hide show
  1. checksums.yaml +4 -4
  2. data/app/cells/decidim/activity_cell.rb +6 -0
  3. data/app/cells/decidim/author/badge.erb +6 -0
  4. data/app/cells/decidim/author/show.erb +5 -1
  5. data/app/cells/decidim/author_cell.rb +10 -0
  6. data/app/cells/decidim/profile/avatar.erb +0 -2
  7. data/app/cells/decidim/profile/badge.erb +3 -3
  8. data/app/cells/decidim/profile/details.erb +2 -1
  9. data/app/cells/decidim/user_activity_cell.rb +6 -1
  10. data/app/controllers/decidim/download_your_data_controller.rb +5 -2
  11. data/app/forms/decidim/user_group_form.rb +2 -0
  12. data/app/helpers/decidim/map_helper.rb +1 -1
  13. data/app/helpers/decidim/menu_helper.rb +8 -2
  14. data/app/models/decidim/private_export.rb +4 -0
  15. data/app/packs/src/decidim/form_filter.js +6 -0
  16. data/app/packs/src/decidim/map/controller/markers.js +3 -1
  17. data/app/packs/stylesheets/decidim/_author.scss +8 -0
  18. data/app/packs/stylesheets/decidim/_cards.scss +5 -1
  19. data/app/packs/stylesheets/decidim/_footer.scss +5 -0
  20. data/app/packs/stylesheets/decidim/_profile.scss +6 -6
  21. data/app/packs/stylesheets/decidim/editor.scss +3 -1
  22. data/app/services/decidim/download_your_data_exporter.rb +15 -4
  23. data/app/services/decidim/open_data_exporter.rb +2 -1
  24. data/app/validators/etiquette_validator.rb +2 -2
  25. data/app/validators/password_validator.rb +3 -1
  26. data/app/views/decidim/application/_document.html.erb +2 -2
  27. data/app/views/decidim/download_your_data/_export.html.erb +1 -1
  28. data/app/views/decidim/export_mailer/download_your_data_export.html.erb +1 -1
  29. data/app/views/decidim/export_mailer/export.html.erb +1 -1
  30. data/app/views/decidim/shared/_filters.html.erb +1 -1
  31. data/app/views/layouts/decidim/_application.html.erb +1 -1
  32. data/config/locales/ca-IT.yml +12 -10
  33. data/config/locales/ca.yml +10 -8
  34. data/config/locales/cs.yml +5 -0
  35. data/config/locales/de.yml +2 -1
  36. data/config/locales/en.yml +2 -0
  37. data/config/locales/es-MX.yml +2 -0
  38. data/config/locales/es-PY.yml +2 -0
  39. data/config/locales/es.yml +2 -0
  40. data/config/locales/eu.yml +49 -47
  41. data/config/locales/fi-plain.yml +1 -0
  42. data/config/locales/fi.yml +1 -0
  43. data/config/locales/fr-CA.yml +3 -1
  44. data/config/locales/fr.yml +3 -1
  45. data/config/locales/it.yml +2 -0
  46. data/config/locales/ja.yml +3 -0
  47. data/config/locales/ru.yml +0 -1
  48. data/config/locales/sl.yml +0 -1
  49. data/db/migrate/20250819110800_convert_private_exports_id_to_uuid.rb +55 -0
  50. data/lib/decidim/asset_router/storage.rb +8 -8
  51. data/lib/decidim/core/engine.rb +1 -0
  52. data/lib/decidim/core/test/factories.rb +7 -2
  53. data/lib/decidim/core/test/shared_examples/comments_examples.rb +24 -0
  54. data/lib/decidim/core/version.rb +1 -1
  55. data/lib/decidim/form_builder.rb +1 -1
  56. data/lib/decidim/webpacker/configuration.rb +5 -1
  57. data/lib/tasks/upgrade/clean.rake +11 -0
  58. data/lib/tasks/upgrade/decidim_fix_action_log.rake +28 -0
  59. metadata +9 -6
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 42ebd59c0047d75695c9819c2bb0482423b4f5022f31258703b0d0ee476ca793
4
- data.tar.gz: bb3a77b79383688f58f120b1ce7824282061b503e1a11553f2c883360b8b8fb4
3
+ metadata.gz: 170c5d444f05cfbcae31786562762966232e9fadad30da014a19a6ceb239a768
4
+ data.tar.gz: cb838708158da84fdea7082175501cd7d2bed5499b7a2450c10e3ab1b79858b9
5
5
  SHA512:
6
- metadata.gz: c12dc0996382e5ad172ae4b70008bcd2df5d1181e9938f0815ef004efe353b210fa78ed7ab8ab7ba8068542c08cb1e431a011e1f6e5401a1aae0c987cd4c330e
7
- data.tar.gz: 2a641e595999e29a1a68285315d35e5312842c6b997929df48d2fd53bf6cff51ef3279e92ed11dc5c43364238a6486aebc5f07715d49119b611806c103fc2ce7
6
+ metadata.gz: db97bde00dcc402180828529bb1801c527a4565d7205ce1432f6eba97348c83ce58770548fddd6c71421c6202bb70cd269bd898d7059e5cb61db3d9d84fd903c
7
+ data.tar.gz: c5cb74531f7240c2d1a9feb356c5e3b44e9da7016b127b048d081dc968796ce546d59bbd0088b4d1134aad40c4abe65db9cd358981c93c3ca84d9964365eebab
@@ -12,6 +12,12 @@ module Decidim
12
12
  return unless renderable?
13
13
 
14
14
  render
15
+ rescue NoMethodError => e
16
+ # Soft-deleted components or participatory spaces could cause errors
17
+ # when rendering activities. We log them for further inspection but
18
+ # avoid breaking the entire activity feed.
19
+ Rails.logger.error("Error rendering activity cell for #{model.id}: #{e.message}")
20
+ nil
15
21
  end
16
22
 
17
23
  # Since activity logs could be linked to resource no longer available
@@ -0,0 +1,6 @@
1
+ <% if show_badge? %>
2
+ <span class="author__badge">
3
+ <%= icon "star-s-fill" %>
4
+ <span class="sr-only"><%= officialization_text %></span>
5
+ </span>
6
+ <% end %>
@@ -6,7 +6,10 @@
6
6
  <%= render :avatar %>
7
7
 
8
8
  <span>
9
- <%= render :name %>
9
+ <span class="flex gap-2">
10
+ <%= render :name %>
11
+ <%= render :badge %>
12
+ </span>
10
13
 
11
14
  <% context_actions.each do |action| %>
12
15
  <%= render action %>
@@ -17,6 +20,7 @@
17
20
  <% else %>
18
21
  <%= render :avatar %>
19
22
  <%= render :name %>
23
+ <%= render :badge %>
20
24
  <% end %>
21
25
  <% end %>
22
26
 
@@ -186,5 +186,15 @@ module Decidim
186
186
 
187
187
  model.has_tooltip?
188
188
  end
189
+
190
+ def show_badge?
191
+ return false unless model.respond_to? :officialized?
192
+
193
+ model.officialized?
194
+ end
195
+
196
+ def officialization_text
197
+ translated_attribute(model.officialized_as).presence || t("decidim.profiles.show.officialized")
198
+ end
189
199
  end
190
200
  end
@@ -2,6 +2,4 @@
2
2
  <div class="profile__avatar">
3
3
  <%= image_tag avatar_url, alt: t("decidim.author.avatar", name: decidim_sanitize(presented_profile.name)) %>
4
4
  </div>
5
-
6
- <%= render :badge if show_badge? %>
7
5
  </div>
@@ -1,4 +1,4 @@
1
- <div class="profile__avatar-badge">
1
+ <span class="profile__details-badge">
2
2
  <%= icon "star-s-fill" %>
3
- <span class="sr-only"><%= officialization_text %></span>
4
- </div>
3
+ <%= officialization_text %>
4
+ </span>
@@ -1,7 +1,8 @@
1
1
  <div class="profile__details">
2
- <h1 class="h3">
2
+ <h1 class="h3 flex gap-2">
3
3
  <%= presented_profile.name %>
4
4
  <span class="sr-only"><%= tab_items.find { |tab_item| is_active_link?(tab_item[:path]) }&.dig(:text) %> (<%= presented_profile.name %>)</span>
5
+ <%= render :badge if show_badge? %>
5
6
  </h1>
6
7
  <div class="profile__details-data">
7
8
  <% details_items.each do |detail| %>
@@ -11,7 +11,12 @@ module Decidim
11
11
  end
12
12
 
13
13
  def activities
14
- context[:activities]
14
+ resource_ids_to_filter = context[:activities].select { |log| log[:action] == "delete" && log[:resource_type] == "Decidim::Comments::Comment" }.map(&:resource_id)
15
+ if resource_ids_to_filter.any?
16
+ context[:activities].where.not("resource_id in (?) AND resource_type = ?", resource_ids_to_filter, "Decidim::Comments::Comment")
17
+ else
18
+ context[:activities]
19
+ end
15
20
  end
16
21
 
17
22
  def resource_types
@@ -43,7 +43,10 @@ module Decidim
43
43
  def download_file
44
44
  enforce_permission_to(:download, :user, current_user:)
45
45
 
46
- if private_export.expired?
46
+ if private_export.blank?
47
+ flash[:error] = t("decidim.account.download_your_data_export.export_not_found")
48
+ redirect_to download_your_data_path
49
+ elsif private_export.expired?
47
50
  flash[:error] = t("decidim.account.download_your_data_export.export_expired")
48
51
  redirect_to download_your_data_path
49
52
  elsif private_export.file.attached?
@@ -57,7 +60,7 @@ module Decidim
57
60
  private
58
61
 
59
62
  def private_export
60
- @private_export ||= current_user.private_exports.find(params[:uuid])
63
+ @private_export ||= current_user.private_exports.where(uuid: params[:uuid]).first
61
64
  end
62
65
 
63
66
  def help_definitions
@@ -16,10 +16,12 @@ module Decidim
16
16
  attribute :phone
17
17
 
18
18
  validates :name, presence: true
19
+ validates :name, format: { with: Decidim::UserBaseEntity::REGEXP_NAME }
19
20
  validates :email, presence: true, "valid_email_2/email": { disposable: true }
20
21
  validates :nickname, presence: true
21
22
 
22
23
  validates :nickname, length: { maximum: Decidim::User.nickname_max_length, allow_blank: true }
24
+ validates :nickname, format: { with: Decidim::UserBaseEntity::REGEXP_NICKNAME }
23
25
  validates :avatar, passthru: { to: Decidim::UserGroup }
24
26
 
25
27
  validate :unique_document_number
@@ -81,7 +81,7 @@ module Decidim
81
81
 
82
82
  help = content_tag(:div, class: "map__skip-container") do
83
83
  sr_content = content_tag(:p, t("screen_reader_explanation", scope: "decidim.map.dynamic"), class: "sr-only")
84
- link = link_to(t("skip_button", scope: "decidim.map.dynamic"), "##{bottom_id}", class: "map__skip")
84
+ link = link_to(t("skip_button", scope: "decidim.map.dynamic"), "##{bottom_id}", class: "map__skip", "data-skip-to-content": true)
85
85
 
86
86
  sr_content + link
87
87
  end
@@ -68,8 +68,14 @@ module Decidim
68
68
  @menu_highlighted_participatory_process ||= (
69
69
  # The queries already include the order by weight
70
70
  Decidim::ParticipatoryProcesses::OrganizationParticipatoryProcesses.new(current_organization) |
71
- Decidim::ParticipatoryProcesses::PromotedParticipatoryProcesses.new
72
- ).first
71
+ Decidim::ParticipatoryProcesses::PromotedParticipatoryProcesses.new
72
+ ).select(&:published?).map { |process| remove_private_space_if_not_private_user(process) }&.compact&.first
73
+ end
74
+
75
+ def remove_private_space_if_not_private_user(process)
76
+ return nil if process.private_space == true && !process.can_participate?(current_user)
77
+
78
+ process
73
79
  end
74
80
 
75
81
  def home_content_block_menu
@@ -12,6 +12,10 @@ module Decidim
12
12
 
13
13
  default_scope { order(created_at: :desc) }
14
14
 
15
+ before_create do |record|
16
+ record.uuid = SecureRandom.uuid
17
+ end
18
+
15
19
  def expired?
16
20
  expires_at < Time.zone.now
17
21
  end
@@ -206,6 +206,12 @@ export default class FormFilterComponent {
206
206
  this.changeEvents = false;
207
207
  this._clearForm();
208
208
 
209
+ // Prevent filtering again on anchor link "Skip to main content", "Skip map", or "Skip to results"
210
+ const filterSkipValues = [...document.querySelectorAll("[data-skip-to-content]")].map((el) => el.hash);
211
+ if (filterSkipValues.includes(window.location.hash)) {
212
+ return;
213
+ }
214
+
209
215
  const filterParams = this._parseLocationFilterValues();
210
216
  const currentOrder = this._parseLocationOrderValue();
211
217
 
@@ -67,7 +67,9 @@ export default class MapMarkersController extends MapController {
67
67
  }
68
68
 
69
69
  clearMarkers() {
70
- this.map.removeLayer(this.markerClusters);
70
+ if (this.markerClusters !== null) {
71
+ this.map.removeLayer(this.markerClusters);
72
+ }
71
73
  this.markerClusters = new L.MarkerClusterGroup();
72
74
  this.map.addLayer(this.markerClusters);
73
75
  }
@@ -14,6 +14,10 @@
14
14
 
15
15
  &-container {
16
16
  @apply rounded-full overflow-hidden inline-block w-6 h-6 align-top;
17
+
18
+ &:focus-within {
19
+ @apply ring-2 ring-primary;
20
+ }
17
21
  }
18
22
 
19
23
  &-counter {
@@ -29,6 +33,10 @@
29
33
  @apply text-secondary font-semibold;
30
34
  }
31
35
 
36
+ &__badge svg {
37
+ @apply grid overflow-hidden place-items-center bg-primary rounded-full w-4 h-4 text-white fill-current;
38
+ }
39
+
32
40
  &__metadata {
33
41
  @apply flex items-center gap-1 text-gray-2 text-sm;
34
42
 
@@ -59,7 +59,11 @@
59
59
  }
60
60
 
61
61
  &-title {
62
- @apply h4 text-secondary;
62
+ @apply h4;
63
+ }
64
+
65
+ a &-title {
66
+ @apply text-secondary;
63
67
 
64
68
  overflow: hidden;
65
69
  display: -webkit-box;
@@ -4,6 +4,11 @@ footer {
4
4
 
5
5
  &__top {
6
6
  @apply hidden lg:flex flex-row gap-8 container py-10;
7
+
8
+ .prose a,
9
+ .prose strong {
10
+ @apply text-white;
11
+ }
7
12
  }
8
13
 
9
14
  &__down {
@@ -9,18 +9,18 @@
9
9
  &-container {
10
10
  @apply w-24 h-24 relative;
11
11
  }
12
+ }
13
+
14
+ &__details {
15
+ @apply pb-3 space-y-2;
12
16
 
13
17
  &-badge {
14
- @apply absolute top-full right-0 -translate-y-full grid place-items-center w-6 h-6 rounded-full overflow-hidden bg-primary border border-white;
18
+ @apply flex items-center gap-1 text-sm text-gray-2;
15
19
 
16
20
  svg {
17
- @apply w-4 h-4 text-white fill-current;
21
+ @apply w-4 h-4 inline-block bg-primary rounded-full text-white fill-current;
18
22
  }
19
23
  }
20
- }
21
-
22
- &__details {
23
- @apply pb-3 space-y-2;
24
24
 
25
25
  &-data {
26
26
  @apply flex flex-wrap gap-x-6 gap-y-4;
@@ -89,7 +89,9 @@
89
89
  }
90
90
 
91
91
  .ProseMirror {
92
- @apply relative p-2.5 outline-0 min-h-full prose max-w-none prose-headings:first:mt-0 prose-p:first:mt-0 prose-ul:first:mt-0 prose-ol:first:mt-0 prose-blockquote:first:mt-0 prose-pre:first:mt-0;
92
+ @apply relative p-2.5 outline-0 resize-y overflow-hidden prose max-w-none prose-headings:first:mt-0 prose-p:first:mt-0 prose-ul:first:mt-0 prose-ol:first:mt-0 prose-blockquote:first:mt-0 prose-pre:first:mt-0;
93
+
94
+ min-height: inherit;
93
95
 
94
96
  &.ProseMirror-focused,
95
97
  &.dialog-open {
@@ -22,14 +22,21 @@ module Decidim
22
22
  end
23
23
 
24
24
  # i18n-tasks-use t("decidim.download_your_data.show.download_your_data")
25
- def export
26
- user_export = user.private_exports.build
25
+ def export(retries: 0)
26
+ data.rewind
27
+ user_export = user.private_exports.build(file_size: data.length)
27
28
  user_export.export_type = name
28
- user_export.file.attach(io: data, filename: "#{name}.zip", content_type: "application/zip")
29
+ user_export.content_type = "application/zip"
29
30
  user_export.expires_at = Decidim.download_your_data_expiry_time.from_now
30
31
  user_export.metadata = {}
31
32
  user_export.save!
32
- user_export
33
+ user_export.file.attach(io: data, filename: "#{name}.zip", content_type: "application/zip")
34
+
35
+ return user_export.reload if user_export.reload.file.attached?
36
+ return user_export.reload if retries >= 3
37
+
38
+ user_export.destroy!
39
+ export(retries: retries + 1)
33
40
  end
34
41
 
35
42
  private
@@ -37,6 +44,10 @@ module Decidim
37
44
  attr_reader :user, :export_format, :name
38
45
 
39
46
  def data
47
+ @data ||= load_data!
48
+ end
49
+
50
+ def load_data!
40
51
  user_data, user_attachments = data_and_attachments_for_user
41
52
  buffer = Zip::OutputStream.write_buffer do |out|
42
53
  save_user_data(out, user_data)
@@ -116,9 +116,10 @@ module Decidim
116
116
  end
117
117
 
118
118
  def data_for_participatory_space(export_manifest)
119
- collection = participatory_spaces.flat_map do |participatory_space|
119
+ collection = participatory_spaces.filter { |space| space.manifest.name == export_manifest.manifest.name }.flat_map do |participatory_space|
120
120
  export_manifest.collection.call(participatory_space)
121
121
  end
122
+
122
123
  serializer = export_manifest.open_data_serializer.nil? ? export_manifest.serializer : export_manifest.open_data_serializer
123
124
  exporter = Decidim::Exporters::CSV.new(collection, serializer)
124
125
  get_help_definition(:spaces, exporter, export_manifest) unless collection.empty?
@@ -24,7 +24,7 @@ class EtiquetteValidator < ActiveModel::EachValidator
24
24
  end
25
25
 
26
26
  def validate_caps(record, attribute, value)
27
- number_of_caps = value.scan(/[A-Z]/).length
27
+ number_of_caps = value.scan(/[[:upper:]]/).length
28
28
  return if number_of_caps.zero? || number_of_caps < value.length / 2 # 50%
29
29
 
30
30
  record.errors.add(attribute, options[:message] || :too_much_caps)
@@ -37,7 +37,7 @@ class EtiquetteValidator < ActiveModel::EachValidator
37
37
  end
38
38
 
39
39
  def validate_caps_first(record, attribute, value)
40
- return if value.scan(/\A[a-z]{1}/).empty?
40
+ return if value.scan(/\A[[:lower:]]{1}/).empty?
41
41
 
42
42
  record.errors.add(attribute, options[:message] || :must_start_with_caps)
43
43
  end
@@ -55,7 +55,9 @@ class PasswordValidator < ActiveModel::EachValidator
55
55
  attr_reader :record, :attribute, :value
56
56
 
57
57
  def get_message(reason)
58
- I18n.t "password_validator.#{reason}"
58
+ I18n.t! "password_validator.#{reason}"
59
+ rescue I18n::MissingTranslationData
60
+ I18n.t "password_validator.fallback"
59
61
  end
60
62
 
61
63
  def organization
@@ -1,8 +1,8 @@
1
1
  <div id="<%= dom_id(document) %>">
2
2
  <div class="card__list-content">
3
- <%= link_to document.url, target: "_blank", rel: "noopener noreferrer", class: "card__list-title", title: t("decidim.application.document.download") do %>
3
+ <span class="card__list-title">
4
4
  <%= h attachment_title(document) %>
5
- <% end %>
5
+ </span>
6
6
  <% if document.description.present? %>
7
7
  <div class="card__list-text"><%= decidim_escape_translated(document.description) %></div>
8
8
  <% end %>
@@ -2,7 +2,7 @@
2
2
  <td class="text-left p-4"><%= t(export.export_type, scope:"decidim.download_your_data.show") %></td>
3
3
  <td class="text-center"><%= export.expired? ? t("expired", scope:"decidim.download_your_data.show") : l(export.expires_at, format: :decidim_short) %></td>
4
4
  <td class="py-4">
5
- <%= button_to download_download_your_data_path(export),
5
+ <%= button_to download_download_your_data_path(uuid: export.uuid),
6
6
  class: "button button__sm button__transparent-secondary m-auto block",
7
7
  disabled: export.expired?,
8
8
  aria: { label: t("download", scope:"decidim.download_your_data.show") },
@@ -3,5 +3,5 @@
3
3
  </p>
4
4
 
5
5
  <p class="email-button email-button__cta">
6
- <%= link_to t(".download"), download_download_your_data_url(@private_export, host: @organization.host), class: "button expanded hollow button--sc" %>
6
+ <%= link_to t(".download"), download_download_your_data_url(uuid: @private_export.uuid, host: @organization.host), class: "button expanded hollow button--sc" %>
7
7
  </p>
@@ -3,5 +3,5 @@
3
3
  </p>
4
4
 
5
5
  <p class="email-button email-button__cta">
6
- <%= link_to t(".download"), download_download_your_data_url(@private_export, host: @organization.host), class: "button expanded hollow button--sc" %>
6
+ <%= link_to t(".download"), download_download_your_data_url(uuid: @private_export.uuid, host: @organization.host), class: "button expanded hollow button--sc" %>
7
7
  </p>
@@ -14,7 +14,7 @@
14
14
 
15
15
  <div id="dropdown-menu-filters">
16
16
  <% if local_assigns.has_key?(:skip_to_id) %>
17
- <%= link_to t("skip", scope: "decidim.shared.filter_form_help"), "##{skip_to_id}", class: "filter-skip", role: "menuitem" %>
17
+ <%= link_to t("skip", scope: "decidim.shared.filter_form_help"), "##{skip_to_id}", class: "filter-skip", role: "menuitem", "data-skip-to-content": true %>
18
18
  <% end %>
19
19
 
20
20
  <p id="filter-help-text" class="filter-help" role="menuitem" aria-disabled="true"><%= t("help", scope: "decidim.shared.filter_form_help") %></p>
@@ -8,7 +8,7 @@
8
8
 
9
9
  <body class="text-black text-md form-defaults<%= yield (:body_class) %>">
10
10
  <!--noindex--><!--googleoff: all-->
11
- <%= link_to t("skip_button", scope: "decidim.accessibility"), "#content", class: "layout-container__skip" %>
11
+ <%= link_to t("skip_button", scope: "decidim.accessibility"), "#content", class: "layout-container__skip", "data-skip-to-content": true %>
12
12
  <%= cell("decidim/data_consent", current_organization) %>
13
13
  <!--googleon: all--><!--/noindex-->
14
14
 
@@ -66,7 +66,7 @@ ca-IT:
66
66
  decidim/attachment_created_event: Arxiu adjunt
67
67
  decidim/component_published_event: Component actiu
68
68
  decidim/demoted_membership: Ja no ets una administradora del grup
69
- decidim/gamification/badge_earned_event: Insígnia obtinguda
69
+ decidim/gamification/badge_earned_event: Ensenya obtinguda
70
70
  decidim/gamification/level_up_event: Has pujat de nivell
71
71
  decidim/invited_to_group_event: Convidada al grup
72
72
  decidim/join_request_accepted_event: Sol·licitud d'incorporació acceptada
@@ -204,6 +204,7 @@ ca-IT:
204
204
  success: El teu compte s'ha eliminat correctament.
205
205
  download_your_data_export:
206
206
  export_expired: L'exportació ha caducat. Intenta generar una nova exportació.
207
+ export_not_found: L'exportació a la qual has accedit no existeix o no tens accés o permisos per descarregar-la
207
208
  file_no_exists: L'arxiu no existeix
208
209
  notice: La descàrrega de les teves dades està en curs. Rebràs un correu electrònic quan estigui completa.
209
210
  email_change:
@@ -1147,7 +1148,7 @@ ca-IT:
1147
1148
  dropzone: Arrossega-hi els arxius o fes clic per a pujar-los
1148
1149
  explanation: Guia per a %{attribute}
1149
1150
  gamification:
1150
- all_badges_link: Veure totes les insígnies disponibles.
1151
+ all_badges_link: Veure totes les ensenyes disponibles.
1151
1152
  badges:
1152
1153
  followers:
1153
1154
  conditions:
@@ -1160,11 +1161,11 @@ ca-IT:
1160
1161
  unearned_another: Aquesta participant encara no té seguidores.
1161
1162
  unearned_own: Encara no et segueix ningú.
1162
1163
  index:
1163
- badge_title: "Insígnia %{name}"
1164
+ badge_title: "Ensenya %{name}"
1164
1165
  how: Com pots aconseguir-la
1165
- page_description: Les insígnies són reconeixements de les accions de les participants i del progrés en la plataforma. A mesura que comencis a descobrir, participar i interactuar amb la plataforma, n'obtindràs de diferents tipus. Aquí tens la llista d'insígnies i algunes formes d'aconseguir-les.
1166
- title: Insígnies
1167
- description: Les insígnies són reconeixements de les accions de les participants i del progrés en la plataforma. A mesura que comencis a descobrir, participar i interactuar amb la plataforma, n'obtindràs de diferents tipus.
1166
+ page_description: Les ensenyes són reconeixements de les accions de les participants i del progrés en la plataforma. A mesura que comencis a descobrir, participar i interactuar amb la plataforma, n'obtindràs de diferents tipus. Aquí tens la llista d'ensenyes i algunes formes d'aconseguir-les.
1167
+ title: Ensenyes
1168
+ description: Les ensenyes són reconeixements de les accions de les participants i del progrés en la plataforma. A mesura que comencis a descobrir, participar i interactuar amb la plataforma, n'obtindràs de diferents tipus.
1168
1169
  level: Nivell %{level}
1169
1170
  reached_top: Has arribat al màxim nivell d'aquesta ensenya.
1170
1171
  title: Què són les ensenyes?
@@ -1292,6 +1293,7 @@ ca-IT:
1292
1293
  create_with_space: "%{user_name} ha creat %{resource_name} a %{space_name}"
1293
1294
  delete: "%{user_name} ha eliminat %{resource_name}"
1294
1295
  delete_with_space: "%{user_name} ha eliminat %{resource_name} en %{space_name}"
1296
+ publish: "%{user_name} ha publicat %{resource_name}"
1295
1297
  publish_with_space: "%{user_name} ha publicat %{resource_name} en %{space_name}"
1296
1298
  unknown_action: "%{user_name} ha realitzat una acció a %{resource_name}"
1297
1299
  unknown_action_with_space: "%{user_name} ha realitzat una acció a %{resource_name} en %{space_name}"
@@ -1718,7 +1720,7 @@ ca-IT:
1718
1720
  default_officialization_text_for_users: Aquesta participant està verificada públicament. S'ha verificat que el seu nom o la seva funció es correspon amb el seu nom i funció reals.
1719
1721
  show:
1720
1722
  activity: Activitat
1721
- badges: Insígnies
1723
+ badges: Ensenyes
1722
1724
  conversations: Converses
1723
1725
  followers: Seguidores
1724
1726
  following: Seguint
@@ -1950,7 +1952,7 @@ ca-IT:
1950
1952
  show:
1951
1953
  version_index: Versió %{index} de %{total}
1952
1954
  welcome_notification:
1953
- default_body: <p>Hola {{name}}, gràcies per unir-te a {{organization}} et donem la benvinguda!</p><ul><li>Si vole fer-te una idea ràpida de que pots fer-hi, fes una ullada a la <a href="{{help_url}}">Secció d'ajuda</a>.</li><li>Una vegada l'hagis llegit rebràs la teva primera ensenya. Aquí trobaràs un <a href="{{badges_url}}">llistat de totes les ensenyes</a>que pots aconsegui participant a {{organization}}</li><li>. Per acabar, però no per això menys important, uneix-te a d'altres persones, comparteix amb elles d'estar compromesa i de participar a {{organization}}. Fes propostes, comentaris, debat, pensa en com contribuir a un bé comú, aporta arguments per mirar de convèncer, escolta i llegeix per convèncer-te, expressa les teves idees de manera concreta i directa, respon amb paciència i decisió, defensa les teves idees i resta oberta de ment per a col·laborar i unir-te a les idees d'altra gent.</li></ul>
1955
+ default_body: <p>Hola {{name}}, gràcies per unir-te a {{organization}} i benvinguda!</p><ul><li>Si vols fer-te una idea ràpida del que pots fer aquí, fes un cop d'ull a la secció d'<a href="{{help_url}}">Ajuda</a>.</li><li>Un cop l'hagis llegit obtindràs la teva primera ensenya. Aquí tens la <a href="{{badges_url}}">llista</a> de totes les ensenyes que pots anar aconseguint a mesura que participis a {{organization}}</li><li>Finalment, però no per això menys important, uneix-te a altres persones, comparteix amb elles l'experiència d'implicar-se i participar a {{organization}}. Fes propostes, comenta, debat, pensa en com contribuir al bé comú, aporta arguments per convèncer, escolta i llegeix per convèncer-te, expressa les teves idees de manera concreta i directa, respon amb paciència i decisió, defensa les teves idees i manté la ment oberta a col·laborar i sumar-te a les idees d'altres persones.</li></ul>
1954
1956
  default_subject: Gràcies per unir-te a {{organization}}!
1955
1957
  wizard_step_form:
1956
1958
  wizard_aside:
@@ -2339,8 +2341,8 @@ ca-IT:
2339
2341
  title: Configuració de la participant
2340
2342
  user_groups: Grups
2341
2343
  locale:
2342
- name: Català
2343
- name_with_error: Català (error!)
2344
+ name: Alguerés
2345
+ name_with_error: Alguerés (error!)
2344
2346
  password_validator:
2345
2347
  denied: no és vàlid
2346
2348
  domain_included_in_password: és massa semblant a aquest nom de domini
@@ -66,7 +66,7 @@ ca:
66
66
  decidim/attachment_created_event: Arxiu adjunt
67
67
  decidim/component_published_event: Component actiu
68
68
  decidim/demoted_membership: Ja no ets una administradora del grup
69
- decidim/gamification/badge_earned_event: Insígnia obtinguda
69
+ decidim/gamification/badge_earned_event: Ensenya obtinguda
70
70
  decidim/gamification/level_up_event: Has pujat de nivell
71
71
  decidim/invited_to_group_event: Convidada al grup
72
72
  decidim/join_request_accepted_event: Sol·licitud d'incorporació acceptada
@@ -204,6 +204,7 @@ ca:
204
204
  success: El teu compte s'ha eliminat correctament.
205
205
  download_your_data_export:
206
206
  export_expired: L'exportació ha caducat. Intenta generar una nova exportació.
207
+ export_not_found: L'exportació a la qual has accedit no existeix o no tens accés o permisos per descarregar-la
207
208
  file_no_exists: L'arxiu no existeix
208
209
  notice: La descàrrega de les teves dades està en curs. Rebràs un correu electrònic quan estigui completa.
209
210
  email_change:
@@ -1147,7 +1148,7 @@ ca:
1147
1148
  dropzone: Arrossega-hi els arxius o fes clic per a pujar-los
1148
1149
  explanation: Guia per a %{attribute}
1149
1150
  gamification:
1150
- all_badges_link: Veure totes les insígnies disponibles.
1151
+ all_badges_link: Veure totes les ensenyes disponibles.
1151
1152
  badges:
1152
1153
  followers:
1153
1154
  conditions:
@@ -1160,11 +1161,11 @@ ca:
1160
1161
  unearned_another: Aquesta participant encara no té seguidores.
1161
1162
  unearned_own: Encara no et segueix ningú.
1162
1163
  index:
1163
- badge_title: "Insígnia %{name}"
1164
+ badge_title: "Ensenya %{name}"
1164
1165
  how: Com pots aconseguir-la
1165
- page_description: Les insígnies són reconeixements de les accions de les participants i del progrés en la plataforma. A mesura que comencis a descobrir, participar i interactuar amb la plataforma, n'obtindràs de diferents tipus. Aquí tens la llista d'insígnies i algunes formes d'aconseguir-les.
1166
- title: Insígnies
1167
- description: Les insígnies són reconeixements de les accions de les participants i del progrés en la plataforma. A mesura que comencis a descobrir, participar i interactuar amb la plataforma, n'obtindràs de diferents tipus.
1166
+ page_description: Les ensenyes són reconeixements de les accions de les participants i del progrés en la plataforma. A mesura que comencis a descobrir, participar i interactuar amb la plataforma, n'obtindràs de diferents tipus. Aquí tens la llista d'ensenyes i algunes formes d'aconseguir-les.
1167
+ title: Ensenyes
1168
+ description: Les ensenyes són reconeixements de les accions de les participants i del progrés en la plataforma. A mesura que comencis a descobrir, participar i interactuar amb la plataforma, n'obtindràs de diferents tipus.
1168
1169
  level: Nivell %{level}
1169
1170
  reached_top: Has arribat al màxim nivell d'aquesta ensenya.
1170
1171
  title: Què són les ensenyes?
@@ -1292,6 +1293,7 @@ ca:
1292
1293
  create_with_space: "%{user_name} ha creat %{resource_name} a %{space_name}"
1293
1294
  delete: "%{user_name} ha eliminat %{resource_name}"
1294
1295
  delete_with_space: "%{user_name} ha eliminat %{resource_name} en %{space_name}"
1296
+ publish: "%{user_name} ha publicat %{resource_name}"
1295
1297
  publish_with_space: "%{user_name} ha publicat %{resource_name} en %{space_name}"
1296
1298
  unknown_action: "%{user_name} ha realitzat una acció a %{resource_name}"
1297
1299
  unknown_action_with_space: "%{user_name} ha realitzat una acció a %{resource_name} en %{space_name}"
@@ -1718,7 +1720,7 @@ ca:
1718
1720
  default_officialization_text_for_users: Aquesta participant està verificada públicament. S'ha verificat que el seu nom o la seva funció es correspon amb el seu nom i funció reals.
1719
1721
  show:
1720
1722
  activity: Activitat
1721
- badges: Insígnies
1723
+ badges: Ensenyes
1722
1724
  conversations: Converses
1723
1725
  followers: Seguidores
1724
1726
  following: Seguint
@@ -1950,7 +1952,7 @@ ca:
1950
1952
  show:
1951
1953
  version_index: Versió %{index} de %{total}
1952
1954
  welcome_notification:
1953
- default_body: <p>Hola {{name}}, gràcies per unir-te a {{organization}} et donem la benvinguda!</p><ul><li>Si vole fer-te una idea ràpida de que pots fer-hi, fes una ullada a la <a href="{{help_url}}">Secció d'ajuda</a>.</li><li>Una vegada l'hagis llegit rebràs la teva primera ensenya. Aquí trobaràs un <a href="{{badges_url}}">llistat de totes les ensenyes</a>que pots aconsegui participant a {{organization}}</li><li>. Per acabar, però no per això menys important, uneix-te a d'altres persones, comparteix amb elles d'estar compromesa i de participar a {{organization}}. Fes propostes, comentaris, debat, pensa en com contribuir a un bé comú, aporta arguments per mirar de convèncer, escolta i llegeix per convèncer-te, expressa les teves idees de manera concreta i directa, respon amb paciència i decisió, defensa les teves idees i resta oberta de ment per a col·laborar i unir-te a les idees d'altra gent.</li></ul>
1955
+ default_body: <p>Hola {{name}}, gràcies per unir-te a {{organization}} i benvinguda!</p><ul><li>Si vols fer-te una idea ràpida del que pots fer aquí, fes un cop d'ull a la secció d'<a href="{{help_url}}">Ajuda</a>.</li><li>Un cop l'hagis llegit obtindràs la teva primera ensenya. Aquí tens la <a href="{{badges_url}}">llista</a> de totes les ensenyes que pots anar aconseguint a mesura que participis a {{organization}}</li><li>Finalment, però no per això menys important, uneix-te a altres persones, comparteix amb elles l'experiència d'implicar-se i participar a {{organization}}. Fes propostes, comenta, debat, pensa en com contribuir al bé comú, aporta arguments per convèncer, escolta i llegeix per convèncer-te, expressa les teves idees de manera concreta i directa, respon amb paciència i decisió, defensa les teves idees i manté la ment oberta a col·laborar i sumar-te a les idees d'altres persones.</li></ul>
1954
1956
  default_subject: Gràcies per unir-te a {{organization}}!
1955
1957
  wizard_step_form:
1956
1958
  wizard_aside:
@@ -1208,6 +1208,8 @@ cs:
1208
1208
  title: Jaké jsou odznaky?
1209
1209
  group_admins:
1210
1210
  actions:
1211
+ confirm_modal:
1212
+ ok_add: Přidat administrátora
1211
1213
  demote_admin: Odstranit admin
1212
1214
  demote:
1213
1215
  error: Při odebrání tohoto účastníka ze seznamu administrátorů došlo k chybě.
@@ -1237,6 +1239,9 @@ cs:
1237
1239
  error: Při přijímání této žádosti o připojení došlo k chybě.
1238
1240
  success: Žádost o připojení byla úspěšně přijata.
1239
1241
  actions:
1242
+ confirm_modal:
1243
+ ok_remove: Odebrat člena
1244
+ title_remove: Odebrat člena
1240
1245
  promote_to_admin: Udělat adminem
1241
1246
  remove_from_group: Odstranit uživatele
1242
1247
  index: