decidim-core 0.26.1 → 0.26.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.

Potentially problematic release.


This version of decidim-core might be problematic. Click here for more details.

Files changed (53) hide show
  1. checksums.yaml +4 -4
  2. data/app/cells/decidim/card_m/show.erb +1 -1
  3. data/app/cells/decidim/followers_cell.rb +1 -1
  4. data/app/cells/decidim/notification/show.erb +1 -1
  5. data/app/cells/decidim/notification_cell.rb +6 -0
  6. data/app/commands/decidim/update_user_interests.rb +5 -1
  7. data/app/controllers/concerns/decidim/skip_timeoutable.rb +17 -0
  8. data/app/controllers/decidim/timeouts_controller.rb +2 -6
  9. data/app/forms/decidim/user_interest_scope_form.rb +1 -1
  10. data/app/helpers/decidim/application_helper.rb +4 -0
  11. data/app/helpers/decidim/meta_tags_helper.rb +24 -1
  12. data/app/helpers/decidim/sanitize_helper.rb +8 -2
  13. data/app/models/decidim/action_log.rb +1 -0
  14. data/app/models/decidim/user_base_entity.rb +1 -0
  15. data/app/packs/src/decidim/external_link.js +6 -0
  16. data/app/packs/src/decidim/map/controller/static.js +6 -5
  17. data/app/packs/src/decidim/session_timeouter.js +10 -5
  18. data/app/validators/password_validator.rb +12 -3
  19. data/app/views/decidim/devise/invitations/edit.html.erb +2 -2
  20. data/app/views/layouts/decidim/_timeout_modal.html.erb +2 -0
  21. data/config/initializers/devise.rb +2 -1
  22. data/config/locales/ar.yml +17 -0
  23. data/config/locales/ca.yml +17 -2
  24. data/config/locales/cs.yml +7 -0
  25. data/config/locales/de.yml +8 -2
  26. data/config/locales/en.yml +7 -0
  27. data/config/locales/es-MX.yml +19 -4
  28. data/config/locales/es-PY.yml +15 -0
  29. data/config/locales/es.yml +15 -0
  30. data/config/locales/fi-plain.yml +8 -0
  31. data/config/locales/fi.yml +8 -1
  32. data/config/locales/fr-CA.yml +8 -1
  33. data/config/locales/fr.yml +35 -28
  34. data/config/locales/hu.yml +1 -0
  35. data/config/locales/it.yml +8 -0
  36. data/config/locales/ja.yml +8 -1
  37. data/config/locales/pt.yml +2 -2
  38. data/config/locales/sv.yml +3 -1
  39. data/lib/decidim/content_parsers/hashtag_parser.rb +1 -1
  40. data/lib/decidim/content_parsers/resource_parser.rb +97 -0
  41. data/lib/decidim/content_parsers.rb +1 -0
  42. data/lib/decidim/content_processor.rb +2 -1
  43. data/lib/decidim/content_renderers/resource_renderer.rb +30 -0
  44. data/lib/decidim/content_renderers.rb +1 -0
  45. data/lib/decidim/core/test/factories.rb +2 -1
  46. data/lib/decidim/core/version.rb +1 -1
  47. data/lib/devise/models/decidim_validatable.rb +3 -3
  48. metadata +11 -13
  49. data/app/cells/decidim/endorsement_buttons_cell.rb.2 +0 -211
  50. data/app/helpers/decidim/social_share_button_helper.rb +0 -26
  51. data/lib/decidim/social_share/service.rb +0 -33
  52. data/lib/decidim/social_share/service_registry.rb +0 -63
  53. data/lib/decidim/social_share.rb +0 -45
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 53feb2cc6c5c494c20cf8e6ae1d35cc933ddf3a91ee2704b9b2fb6436b267c87
4
- data.tar.gz: 431d81f9df34a6c1f0a88a3786f138e748e4cc9b5a706707493e7735a7cf782a
3
+ metadata.gz: 18193603bd469c0ea5937875b577f4cc5439727b2ad1759e60ea725d029e18f1
4
+ data.tar.gz: 91c95bec2cdc7af5ad17a5d5ccd165817516fbaf0ed46051c198d3b8b5b1321b
5
5
  SHA512:
6
- metadata.gz: 69ec72cc2adbd4c88933c2c21aade155b7b98dc9708c85d9f0677b32621ce205c8b247109d96c0b13d3b7e6b96214eea3ac1c03e3aedfdaae2ca0afba7de96cd
7
- data.tar.gz: 92caf28a3f0ea16de36d307a4ff484478d071a5b442a6848a09741c657b1bdf86f1c53c9ccf799920901fabb8aea5284f32e661c07d3d6830e77e8299c482557
6
+ metadata.gz: 71b39ec5cae4751ab21048ef686cd6b3704e8d5469d9ba608fcf163944ebf83fc100d1a47c59d4eae4b4c01af4d5074918113a8cf533151e954eb97defa14bf9
7
+ data.tar.gz: 72011b7df988f022988d64892177f9f4b28338019152d0a2ce46f489696256acdcd095d0da83346e41d70cdeb72c72ef7e21c0e701b50a1d4b35a6de8c51840d
@@ -9,7 +9,7 @@
9
9
  <div class="card__text">
10
10
  <div class="card__text--paragraph">
11
11
  <%= render :badge if has_badge? %>
12
- <%= description %>
12
+ <%= Decidim::ContentProcessor.render(description, "div") %>
13
13
  </div>
14
14
  </div>
15
15
 
@@ -12,7 +12,7 @@ module Decidim
12
12
  end
13
13
 
14
14
  def followers
15
- @followers ||= model.followers.page(params[:page]).per(20)
15
+ @followers ||= model.followers.not_blocked.page(params[:page]).per(20)
16
16
  end
17
17
  end
18
18
  end
@@ -13,7 +13,7 @@
13
13
  <span class="text-small"><%= notification.event_class.constantize.model_name.human %></span>
14
14
  <br>
15
15
  <span>
16
- <%= notification.event_class_instance.notification_title %>
16
+ <%= notification_title %>
17
17
  </span>
18
18
  <% if notification.display_resource_text? %>
19
19
  <p>
@@ -11,6 +11,12 @@ module Decidim
11
11
  render :show
12
12
  end
13
13
 
14
+ def notification_title
15
+ notification.event_class_instance.notification_title
16
+ rescue StandardError
17
+ I18n.t("decidim.notifications.show.missing_event")
18
+ end
19
+
14
20
  private
15
21
 
16
22
  def notification
@@ -29,7 +29,11 @@ module Decidim
29
29
  end
30
30
 
31
31
  def selected_scopes_ids
32
- @form.scopes.select(&:checked).map(&:id)
32
+ @form.scopes.map do |scope|
33
+ next unless scope.checked?
34
+
35
+ scope.id.to_i
36
+ end.compact
33
37
  end
34
38
  end
35
39
  end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/concern"
4
+
5
+ module Decidim
6
+ # We don't want to reset timeout timer on routes where we make requests automatically
7
+ # (e.g. asking time before timeout or fetching comments).
8
+ module SkipTimeoutable
9
+ extend ActiveSupport::Concern
10
+
11
+ private
12
+
13
+ def skip_timeout
14
+ request.env["devise.skip_timeoutable"] = true
15
+ end
16
+ end
17
+ end
@@ -5,6 +5,8 @@ require "active_support/concern"
5
5
  module Decidim
6
6
  # Tells/Extends time before inactivity warning or automatic logout.
7
7
  class TimeoutsController < Decidim::ApplicationController
8
+ include Decidim::SkipTimeoutable
9
+
8
10
  # Skip these methods because they can call Devise's store_location_for, which can save timeouts path to session.
9
11
  skip_before_action :store_current_location
10
12
 
@@ -23,11 +25,5 @@ module Decidim
23
25
  format.js
24
26
  end
25
27
  end
26
-
27
- private
28
-
29
- def skip_timeout
30
- request.env["devise.skip_timeoutable"] = true
31
- end
32
28
  end
33
29
  end
@@ -6,7 +6,7 @@ module Decidim
6
6
  class UserInterestScopeForm < Form
7
7
  mimic :scope
8
8
 
9
- attribute :name, String
9
+ attribute :name, JsonbAttributes
10
10
  attribute :checked, Boolean
11
11
  attribute :children, Array[UserInterestScopeForm]
12
12
 
@@ -119,5 +119,9 @@ module Decidim
119
119
  [base_url, "/", process.active_step.cta_path].join("")
120
120
  end
121
121
  end
122
+
123
+ def prevent_timeout_seconds
124
+ 0
125
+ end
122
126
  end
123
127
  end
@@ -16,7 +16,30 @@ module Decidim
16
16
  add_decidim_meta_description(tags[:description])
17
17
  add_decidim_meta_url(tags[:url])
18
18
  add_decidim_meta_twitter_handler(tags[:twitter_handler])
19
- add_decidim_meta_image_url(tags[:image_url])
19
+ add_decidim_meta_image_url(add_base_url_to(tags[:image_url]))
20
+ end
21
+
22
+ # Public: Add base url to path if path doesn't include host.
23
+ # path - A String containing path (e.g. "/proposals/1" )
24
+ # Returns a String of URL including base URL and path, or path if it's blank.
25
+ def add_base_url_to(path)
26
+ return path if path.blank?
27
+ return path if URI.parse(path).host.present?
28
+
29
+ "#{resolve_base_url}#{path}"
30
+ end
31
+
32
+ # Public: Resolve base url (example: https://www.decidim.org) without url params
33
+ # Returns a String of base URL
34
+ def resolve_base_url
35
+ return request.base_url if respond_to?(:request) && request&.base_url.present?
36
+
37
+ uri = URI.parse(decidim.root_url(host: current_organization.host))
38
+ if uri.port.blank? || [80, 443].include?(uri.port)
39
+ "#{uri.scheme}://#{uri.host}"
40
+ else
41
+ "#{uri.scheme}://#{uri.host}:#{uri.port}"
42
+ end
20
43
  end
21
44
 
22
45
  # Public: Accumulates the given `title` so that they can be chained. Since Rails views
@@ -94,11 +94,17 @@ module Decidim
94
94
  end
95
95
  end
96
96
 
97
+ # This method is currently being used only for Proposal and Meeting,
98
+ # It aims to load the presenter class, and perform some basic sanitization on the content
99
+ # This method should be used along side simple_format.
100
+ # @param resource [Object] Resource object
101
+ # @param method [Symbol] Method name
102
+ #
103
+ # @return ActiveSupport::SafeBuffer
97
104
  def render_sanitized_content(resource, method)
98
105
  content = present(resource).send(method, links: true, strip_tags: !safe_content?)
99
- content = simple_format(content, {}, sanitize: false)
100
106
 
101
- return content unless safe_content?
107
+ return decidim_sanitize(content, {}) unless safe_content?
102
108
 
103
109
  decidim_sanitize_editor(content)
104
110
  end
@@ -135,6 +135,7 @@ module Decidim
135
135
  def visible_for?(user)
136
136
  return false if resource_lazy.blank?
137
137
  return false if participatory_space_lazy.blank?
138
+ return false if resource_lazy.respond_to?(:deleted?) && resource_lazy.deleted?
138
139
  return false if resource_lazy.respond_to?(:hidden?) && resource_lazy.hidden?
139
140
  return false if resource_lazy.respond_to?(:can_participate?) && !resource_lazy.can_participate?(user)
140
141
 
@@ -55,6 +55,7 @@ module Decidim
55
55
  scope = scope.public_spaces if klass.try(:participatory_space?)
56
56
  scope = scope.includes(:component) if klass.try(:has_component?)
57
57
  scope = scope.filter(&:visible?) if klass.method_defined?(:visible?)
58
+ scope = scope.reject(&:blocked) if klass == Decidim::UserBaseEntity
58
59
  scope
59
60
  end
60
61
  end
@@ -5,6 +5,9 @@ const EXCLUDE_CLASSES = [
5
5
  "footer-social__icon",
6
6
  "logo-cityhall"
7
7
  ];
8
+ const EXCLUDE_ANCESTOR_CLASSES = [
9
+ "editor-container"
10
+ ]
8
11
  const EXCLUDE_REL = ["license", "decidim"];
9
12
 
10
13
  const DEFAULT_MESSAGES = {
@@ -27,6 +30,9 @@ export default class ExternalLink {
27
30
  if (EXCLUDE_CLASSES.some((cls) => this.$link.hasClass(cls))) {
28
31
  return;
29
32
  }
33
+ if (EXCLUDE_ANCESTOR_CLASSES.some((cls) => this.$link.parents().hasClass(cls))) {
34
+ return;
35
+ }
30
36
  if (
31
37
  EXCLUDE_REL.some((rel) => {
32
38
  const linkRels = `${this.$link.attr("rel")}`.split(" ");
@@ -16,6 +16,12 @@ export default class MapStaticController extends MapController {
16
16
  this.map.tap.disable();
17
17
  }
18
18
 
19
+ if (this.config.zoom) {
20
+ this.map.setZoom(this.config.zoom);
21
+ } else {
22
+ this.map.setZoom(15);
23
+ }
24
+
19
25
  if (this.config.latitude && this.config.longitude) {
20
26
  const coordinates = [this.config.latitude, this.config.longitude];
21
27
 
@@ -27,11 +33,6 @@ export default class MapStaticController extends MapController {
27
33
  }).addTo(this.map);
28
34
  marker._icon.removeAttribute("tabindex");
29
35
  }
30
- if (this.config.zoom) {
31
- this.map.setZoom(this.config.zoom);
32
- } else {
33
- this.map.setZoom(15);
34
- }
35
36
 
36
37
  if (this.config.link) {
37
38
  this.map._container.addEventListener("click", (ev) => {
@@ -1,5 +1,4 @@
1
1
  import moment from "moment"
2
- import Foundation from "foundation-sites"
3
2
 
4
3
  $(() => {
5
4
  let sessionTimeOutEnabled = true;
@@ -8,17 +7,18 @@ $(() => {
8
7
  const secondsUntilTimeoutPath = $timeoutModal.data("seconds-until-timeout-path");
9
8
  const heartbeatPath = $timeoutModal.data("heartbeat-path");
10
9
  const interval = parseInt($timeoutModal.data("session-timeout-interval"), 10);
10
+ const preventTimeOutSeconds = $timeoutModal.data("prevent-timeout-seconds");
11
11
  let endsAt = moment().add(timeoutInSeconds, "seconds");
12
12
  let lastAction = moment();
13
- const popup = new Foundation.Reveal($timeoutModal);
14
13
  const $continueSessionButton = $("#continueSession");
15
14
  let lastActivityCheck = moment();
16
15
  // 5 * 60 seconds = 5 Minutes
17
16
  const activityCheckInterval = 5 * 60;
17
+ const preventTimeOutUntil = moment().add(preventTimeOutSeconds, "seconds");
18
18
 
19
19
  // Ajax request is made at timeout_modal.html.erb
20
20
  $continueSessionButton.on("click", () => {
21
- $("#timeoutModal").foundation("close");
21
+ $timeoutModal.foundation("close");
22
22
  // In admin panel we have to hide all overlays
23
23
  $(".reveal-overlay").css("display", "none");
24
24
  lastActivityCheck = moment();
@@ -82,7 +82,12 @@ $(() => {
82
82
  }
83
83
 
84
84
  const timeRemaining = Math.round((endsAt - moment()) / 1000);
85
- if (timeRemaining > 150) {
85
+ if (timeRemaining > 170) {
86
+ return;
87
+ }
88
+
89
+ if (moment() < preventTimeOutUntil) {
90
+ heartbeat();
86
91
  return;
87
92
  }
88
93
 
@@ -95,7 +100,7 @@ $(() => {
95
100
  } else if (secondsUntilSessionExpires <= 90) {
96
101
  $timeoutModal.find("#reveal-hidden-sign-out")[0].click();
97
102
  } else if (secondsUntilSessionExpires <= 150) {
98
- popup.open();
103
+ $timeoutModal.foundation("open");
99
104
  }
100
105
  });
101
106
  }, interval);
@@ -49,6 +49,15 @@ class PasswordValidator < ActiveModel::EachValidator
49
49
  I18n.t "password_validator.#{reason}"
50
50
  end
51
51
 
52
+ def organization
53
+ @organization ||= organization_from_record
54
+ end
55
+
56
+ def organization_from_record
57
+ return record.current_organization if record.respond_to?(:current_organization)
58
+ return record.organization if record.respond_to?(:organization)
59
+ end
60
+
52
61
  def strong?
53
62
  VALIDATION_METHODS.each do |method|
54
63
  @weak_password_reasons << method.to_s.sub(/\?$/, "").to_sym if send(method.to_s)
@@ -96,10 +105,10 @@ class PasswordValidator < ActiveModel::EachValidator
96
105
  end
97
106
 
98
107
  def domain_included_in_password?
99
- return false unless record&.current_organization&.host
100
- return true if value.include?(record.current_organization.host)
108
+ return false unless organization && organization.host
109
+ return true if value.include?(organization.host)
101
110
 
102
- record.current_organization.host.split(".").each do |part|
111
+ organization.host.split(".").each do |part|
103
112
  next if part.length < IGNORE_SIMILARITY_SHORTER_THAN
104
113
 
105
114
  return true if value.include?(part)
@@ -27,11 +27,11 @@
27
27
 
28
28
  <% if f.object.class.require_password_on_accepting %>
29
29
  <div class="field">
30
- <p><%= f.password_field :password, required: "required", minlength: ::Devise.password_length.min, maxlength: ::Devise.password_length.max %></p>
30
+ <p><%= f.password_field :password, required: "required", minlength: ::PasswordValidator::MINIMUM_LENGTH, maxlength: ::PasswordValidator::MAX_LENGTH %></p>
31
31
  </div>
32
32
 
33
33
  <div class="field">
34
- <p><%= f.password_field :password_confirmation, required: "required", minlength: ::Devise.password_length.min, maxlength: ::Devise.password_length.max %></p>
34
+ <p><%= f.password_field :password_confirmation, required: "required", minlength: ::PasswordValidator::MINIMUM_LENGTH, maxlength: ::PasswordValidator::MAX_LENGTH %></p>
35
35
  </div>
36
36
  <% end %>
37
37
  </div>
@@ -1,9 +1,11 @@
1
1
  <% if current_user && !current_user.remember_created_at %>
2
2
  <% timeout_time_seconds = Decidim.config.expire_session_after.to_i %>
3
+ <% prevent_timeout_for = try(:prevent_timeout_seconds) || 0 %>
3
4
  <div class="reveal" id="timeoutModal" data-close-on-click="false" data-close-on-esc="false"
4
5
  data-seconds-until-timeout-path="<%= decidim.seconds_until_timeout_path %>"
5
6
  data-heartbeat-path="<%= decidim.heartbeat_path %>"
6
7
  data-session-timeout="<%= timeout_time_seconds %>"
8
+ data-prevent-timeout-seconds="<%= prevent_timeout_for %>"
7
9
  data-session-timeout-interval="<%= Decidim.config.session_timeout_interval.to_i * 1000 %>" data-reveal>
8
10
  <h2><%= t(".title") %></h2>
9
11
  <p><%= t(".body", minutes: (timeout_time_seconds / 60) - 2) %></p>
@@ -208,7 +208,8 @@ Devise.setup do |config|
208
208
 
209
209
  # ==> Configuration for :validatable
210
210
  # Range for password length.
211
- config.password_length = 6..128
211
+ # NOTE: this will not be used as we're using our own PasswordValidator
212
+ # config.password_length = 6..128
212
213
 
213
214
  # Email regex used to validate email formats. It simply asserts that
214
215
  # one (and only one) @ exists in the given string. This is mainly
@@ -3,6 +3,10 @@ ar:
3
3
  attributes:
4
4
  account:
5
5
  delete_reason: سبب حذف حسابك
6
+ common:
7
+ created_at: تم إنشاؤها في
8
+ conversation:
9
+ body: المحتوى
6
10
  group:
7
11
  about: عن
8
12
  avatar: الصورة الرمزية
@@ -11,11 +15,14 @@ ar:
11
15
  name: الإسم
12
16
  nickname: الاسم المستعار
13
17
  phone: الهاتف
18
+ message:
19
+ body: المحتوى
14
20
  report:
15
21
  details: تعليقات إضافية
16
22
  user:
17
23
  about: عن
18
24
  email: بريدك الإلكتروني
25
+ locale: اللغة
19
26
  name: اسمك
20
27
  nickname: الاسم المستعار
21
28
  password: الكلمة السرية
@@ -33,6 +40,7 @@ ar:
33
40
  decidim/profile_updated_event: تحديث الملف الشخصي
34
41
  decidim/promote_to_admin: تمت ترقيته إلى مسؤول المجموعة
35
42
  decidim/removed_from_group: تمت إزالته من المجموعة
43
+ decidim/resource_endorsed_event: المورد المدعُوم
36
44
  activerecord:
37
45
  attributes:
38
46
  decidim/user:
@@ -788,6 +796,10 @@ ar:
788
796
  error: لم تبدأ المحادثة. حاول مرة أخرى في وقت لاحق
789
797
  index:
790
798
  close: إغلاق مشروط
799
+ groups: فِرَقي
800
+ last_message: آخر رسالة
801
+ new_conversation: محادثة جديدة
802
+ next: التالي
791
803
  no_conversations: ليس لديك محادثات حتى الآن
792
804
  title: المحادثات
793
805
  reply:
@@ -816,6 +828,10 @@ ar:
816
828
  note: لقد تلقيت هذه الرسالة الإلكترونية لأنك مشترك في الرسائل الإخبارية على %{organization_name}. يمكنك تغيير الإعدادات الخاصة بك على هاتفك <a href="%{link}">الصفحة إخطارات</a>.
817
829
  see_on_website: لا يمكن عرض هذا البريد الإلكتروني بشكل صحيح؟ اطلع عليه على <a href="%{link}" target="_blank">الموقع</a>.
818
830
  unsubscribe: لإلغاء الاشتراك في تلقي هذا النوع من البريد الإلكتروني ، <a href="%{link}" target="_blank" class="unsubscribe">إلغاء الاشتراك</a>.
831
+ newsletter_templates:
832
+ image_text_cta_settings_form:
833
+ introduction: مقدمة
834
+ main_image: الصورة الرئيسية
819
835
  newsletters:
820
836
  unsubscribe:
821
837
  check_subscription: إذا كنت ترغب في تغيير تفضيلاتك ، يمكنك القيام بذلك في صفحة التكوين <a href="%{link}" target="_blank"></a>
@@ -1037,6 +1053,7 @@ ar:
1037
1053
  label: 'نتائج لكل صفحة:'
1038
1054
  share_modal:
1039
1055
  close_window: أغلق النافذة
1056
+ copy_share_link: انسخ
1040
1057
  share: شارك
1041
1058
  share_link: مشاركة الرابط
1042
1059
  statistics:
@@ -22,6 +22,7 @@ ca:
22
22
  user:
23
23
  about: Quant a
24
24
  email: El teu correu electrònic
25
+ locale: Configuració regional
25
26
  name: El teu nom
26
27
  nickname: Àlies
27
28
  password: Contrasenya
@@ -34,12 +35,17 @@ ca:
34
35
  decidim/demoted_membership: Ja no ets una administradora del grup
35
36
  decidim/gamification/badge_earned_event: Insígnia obtinguda
36
37
  decidim/gamification/level_up_event: Has pujat de nivell
38
+ decidim/invited_to_group_event: Convidada al grup
37
39
  decidim/join_request_accepted_event: Sol·licitud d'incorporació acceptada
38
40
  decidim/join_request_rejected_event: Sol·licitud d'incorporació rebutjada
39
41
  decidim/profile_updated_event: Perfil actualitzat
40
42
  decidim/promote_to_admin: Promocionada a administradora del grup
43
+ decidim/promoted_to_admin_event: Promocionada a administradora del grup
41
44
  decidim/removed_from_group: Eliminada del grup
42
45
  decidim/resource_endorsed_event: Adhesió a recurs feta
46
+ decidim/resource_hidden_event: Recurs amagat
47
+ decidim/user_group_created_event: S'ha creat el grup de l'usuari
48
+ decidim/welcome_notification_event: Missatge de benvinguda
43
49
  activerecord:
44
50
  attributes:
45
51
  decidim/user:
@@ -107,6 +113,7 @@ ca:
107
113
  decidim:
108
114
  accessibility:
109
115
  external_link: Enllaç extern
116
+ front_page_link: Anar a la pàgina principal
110
117
  logo: "Logo oficial de %{organization}"
111
118
  skip_button: Vés al contingut principal
112
119
  account:
@@ -696,6 +703,11 @@ ca:
696
703
  email_outro: Has rebut aquesta notificació perquè estàs seguint a %{nickname}. Pots deixar de rebre notificacions seguint l'enllaç anterior.
697
704
  email_subject: "%{nickname} ha actualitzat el seu perfil"
698
705
  notification_title: El <a href="%{resource_path}"> perfi l</a> de %{name} (%{nickname}), a qui estàs seguint, s'ha actualitzat.
706
+ user_officialized:
707
+ email_intro: La participant %{name} (%{nickname}) ha estat oficialitzada.
708
+ email_outro: Has rebut aquesta notificació perquè ets una de les administradores de la plataforma.
709
+ email_subject: "S'ha oficialitzat a %{name}"
710
+ notification_title: La participant %{name} (%{nickname}) ha estat oficialitzada.
699
711
  export_mailer:
700
712
  data_portability_export:
701
713
  click_button: 'Fes clic en el següent enllaç per descarregar les teves dades.<br/>L''arxiu estarà disponible fins %{date}.<br/>Necessitaràs <a href="https://www.7-zip.org/">7-Zip</a> (per a Windows), <a href="https://www.keka.io/en/">Keka</a> (per a MacOS) o <a href="https://peazip.github.io">PeaZip</a> (per a Linux) per obrir-lo. Contrasenya: %{password}'
@@ -1077,6 +1089,8 @@ ca:
1077
1089
  translated_text: 'Text de la traducció automàtica:'
1078
1090
  notifications:
1079
1091
  no_notifications: Encara no hi ha notificacions.
1092
+ show:
1093
+ missing_event: Vaja, aquesta notificació pertany a un element que ja no està disponible. Pots descartar-la.
1080
1094
  notifications_settings:
1081
1095
  show:
1082
1096
  administrators: Administradores
@@ -1718,8 +1732,8 @@ ca:
1718
1732
  mailer:
1719
1733
  invitation_instructions:
1720
1734
  accept_until_format: "%B %d, %Y %I:%M %p"
1721
- long: "%B %d, %Y %H:%M"
1722
- long_dashed: "%A-%m-%d %H:%M:%S"
1735
+ long: "%d de %B, %Y %H:%M"
1736
+ long_dashed: "%d-%m-%Y %H:%M:%S"
1723
1737
  short: "%d/%m/%Y %H:%M"
1724
1738
  time_of_day: "%H:%M"
1725
1739
  versions:
@@ -1729,6 +1743,7 @@ ca:
1729
1743
  dropdown:
1730
1744
  choose_diff_view_html: 'Vista HTML:'
1731
1745
  choose_diff_view_mode: 'Mode de vista de comparació:'
1746
+ choose_diff_view_mode_menu: Triar el mode de comparació
1732
1747
  option_escaped: Escapada
1733
1748
  option_split: Costat per costat
1734
1749
  option_unescaped: No escapada
@@ -35,12 +35,17 @@ cs:
35
35
  decidim/demoted_membership: Již není správcem skupiny
36
36
  decidim/gamification/badge_earned_event: Získaný odznak
37
37
  decidim/gamification/level_up_event: Vy jste vyrovnali
38
+ decidim/invited_to_group_event: Pozván do skupiny
38
39
  decidim/join_request_accepted_event: Připojit žádost přijatou
39
40
  decidim/join_request_rejected_event: Připojit žádost zamítnuta
40
41
  decidim/profile_updated_event: Profil aktualizován
41
42
  decidim/promote_to_admin: Propagováno na správu skupiny
43
+ decidim/promoted_to_admin_event: Povýšen na administrátora skupiny
42
44
  decidim/removed_from_group: Odstraněna ze skupiny
43
45
  decidim/resource_endorsed_event: Zdroj byl schválen
46
+ decidim/resource_hidden_event: Zdroj skryt
47
+ decidim/user_group_created_event: Uživatelská skupina vytvořena
48
+ decidim/welcome_notification_event: Uvítací zpráva
44
49
  activerecord:
45
50
  attributes:
46
51
  decidim/user:
@@ -1123,6 +1128,8 @@ cs:
1123
1128
  translated_text: 'Automaticky přeložený text:'
1124
1129
  notifications:
1125
1130
  no_notifications: Zatím žádné oznámení.
1131
+ show:
1132
+ missing_event: Jejda, toto oznámení patří k položce, která již není k dispozici. Můžete ho zahodit.
1126
1133
  notifications_settings:
1127
1134
  show:
1128
1135
  administrators: Správci
@@ -22,6 +22,7 @@ de:
22
22
  user:
23
23
  about: Über
24
24
  email: Ihre E-Mail
25
+ locale: Spracheinstellung
25
26
  name: Ihr Name
26
27
  nickname: Spitzname
27
28
  password: Passwort
@@ -34,6 +35,7 @@ de:
34
35
  decidim/demoted_membership: Kein Gruppenadministrator mehr
35
36
  decidim/gamification/badge_earned_event: Abzeichen verdient
36
37
  decidim/gamification/level_up_event: Sie sind um ein Level aufgestiegen
38
+ decidim/invited_to_group_event: Zur Gruppe eingeladen
37
39
  decidim/join_request_accepted_event: Beitrittsanfrage akzeptiert
38
40
  decidim/join_request_rejected_event: Beitrittsanfrage abgelehnt
39
41
  decidim/profile_updated_event: Profil aktualisiert
@@ -79,6 +81,10 @@ de:
79
81
  datetime:
80
82
  distance_in_words:
81
83
  half_a_minute: eine halbe Minute
84
+ x_seconds:
85
+ one: vor 1 Sekunde
86
+ other: "Vor %{count} Sekunden"
87
+ zero: sofort
82
88
  decidim:
83
89
  accessibility:
84
90
  external_link: Externer Link
@@ -478,7 +484,7 @@ de:
478
484
  shared:
479
485
  newsletter_modal:
480
486
  buttons:
481
- check: Überprüfen und fortfahren
487
+ check: Kontakterlaubnis erteilen und fortfahren
482
488
  close_modal: Modal schließen
483
489
  uncheck: Ohne Kontakterlaubnis fortfahren
484
490
  notice: |-
@@ -956,7 +962,7 @@ de:
956
962
  new_conversation: Neue Unterhaltung
957
963
  next: Weiter
958
964
  no_conversations: Du hast noch keine Unterhaltungen
959
- title: Gespräche
965
+ title: Nachrichten
960
966
  reply:
961
967
  placeholder: Ihre Antwort...
962
968
  send: Senden
@@ -36,12 +36,17 @@ en:
36
36
  decidim/demoted_membership: No longer a group admin
37
37
  decidim/gamification/badge_earned_event: Badge earned
38
38
  decidim/gamification/level_up_event: You've leveled up
39
+ decidim/invited_to_group_event: Invited to group
39
40
  decidim/join_request_accepted_event: Join request accepted
40
41
  decidim/join_request_rejected_event: Join request rejected
41
42
  decidim/profile_updated_event: Profile updated
42
43
  decidim/promote_to_admin: Promoted to group admin
44
+ decidim/promoted_to_admin_event: Promoted to group admin
43
45
  decidim/removed_from_group: Removed from group
44
46
  decidim/resource_endorsed_event: Resource endorsed
47
+ decidim/resource_hidden_event: Resource hidden
48
+ decidim/user_group_created_event: User group created
49
+ decidim/welcome_notification_event: Welcome message
45
50
  activerecord:
46
51
  attributes:
47
52
  decidim/user:
@@ -1092,6 +1097,8 @@ en:
1092
1097
  translated_text: 'Automatically translated text:'
1093
1098
  notifications:
1094
1099
  no_notifications: No notifications yet.
1100
+ show:
1101
+ missing_event: Oops, this notification belongs to an item that is no longer available. You can discard it.
1095
1102
  notifications_settings:
1096
1103
  show:
1097
1104
  administrators: Administrators