decidim-core 0.26.1 → 0.26.2

Sign up to get free protection for your applications and to get access to all the features.

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