decidim-admin 0.29.1 → 0.29.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 (80) hide show
  1. checksums.yaml +4 -4
  2. data/app/commands/decidim/admin/block_user.rb +1 -0
  3. data/app/commands/decidim/admin/unhide_resource.rb +1 -0
  4. data/app/controllers/decidim/admin/block_user_controller.rb +1 -1
  5. data/app/controllers/decidim/admin/conflicts_controller.rb +1 -1
  6. data/app/controllers/decidim/admin/impersonations_controller.rb +1 -0
  7. data/app/controllers/decidim/admin/moderations_controller.rb +8 -3
  8. data/app/controllers/decidim/admin/newsletters_controller.rb +2 -1
  9. data/app/controllers/decidim/admin/organization_controller.rb +1 -1
  10. data/app/forms/decidim/admin/help_section_form.rb +1 -1
  11. data/app/forms/decidim/admin/impersonate_user_form.rb +5 -0
  12. data/app/forms/decidim/admin/organization_appearance_form.rb +2 -2
  13. data/app/forms/decidim/admin/organization_form.rb +2 -2
  14. data/app/forms/decidim/admin/static_page_form.rb +1 -1
  15. data/app/forms/decidim/admin/transfer_user_form.rb +15 -0
  16. data/app/packs/src/decidim/admin/newsletters.js +18 -9
  17. data/app/packs/stylesheets/decidim/admin/_moderations.scss +8 -0
  18. data/app/permissions/decidim/admin/permissions.rb +8 -0
  19. data/app/queries/decidim/admin/newsletter_recipients.rb +9 -5
  20. data/app/views/decidim/admin/conflicts/edit.html.erb +21 -11
  21. data/app/views/decidim/admin/moderated_users/index.html.erb +2 -2
  22. data/app/views/decidim/admin/moderations/index.html.erb +5 -1
  23. data/app/views/decidim/admin/newsletter_templates/index.html.erb +0 -1
  24. data/app/views/decidim/admin/shared/landing_page_content_blocks/edit.html.erb +1 -1
  25. data/config/locales/ar.yml +62 -6
  26. data/config/locales/bg.yml +2 -2
  27. data/config/locales/bn-BD.yml +1 -0
  28. data/config/locales/bs-BA.yml +526 -0
  29. data/config/locales/ca-IT.yml +1161 -0
  30. data/config/locales/ca.yml +16 -6
  31. data/config/locales/cs.yml +11 -1
  32. data/config/locales/de.yml +19 -9
  33. data/config/locales/el.yml +4 -2
  34. data/config/locales/en.yml +10 -0
  35. data/config/locales/eo.yml +1 -0
  36. data/config/locales/es-MX.yml +15 -5
  37. data/config/locales/es-PY.yml +15 -5
  38. data/config/locales/es.yml +13 -3
  39. data/config/locales/eu.yml +170 -148
  40. data/config/locales/fi-plain.yml +15 -7
  41. data/config/locales/fi.yml +32 -24
  42. data/config/locales/fr-CA.yml +14 -4
  43. data/config/locales/fr.yml +13 -3
  44. data/config/locales/ga-IE.yml +1 -6
  45. data/config/locales/gl.yml +6 -3
  46. data/config/locales/he-IL.yml +6 -0
  47. data/config/locales/hu.yml +6 -6
  48. data/config/locales/id-ID.yml +9 -5
  49. data/config/locales/is-IS.yml +13 -6
  50. data/config/locales/it.yml +184 -6
  51. data/config/locales/ja.yml +17 -7
  52. data/config/locales/kaa.yml +5 -3
  53. data/config/locales/ko.yml +11 -3
  54. data/config/locales/lb.yml +10 -7
  55. data/config/locales/lt.yml +2 -0
  56. data/config/locales/lv.yml +6 -4
  57. data/config/locales/nl.yml +7 -4
  58. data/config/locales/no.yml +6 -3
  59. data/config/locales/pl.yml +4 -4
  60. data/config/locales/pt-BR.yml +2 -2
  61. data/config/locales/pt.yml +11 -4
  62. data/config/locales/ro-RO.yml +10 -5
  63. data/config/locales/ru.yml +8 -8
  64. data/config/locales/sk.yml +7 -7
  65. data/config/locales/sl.yml +7 -2
  66. data/config/locales/sq-AL.yml +13 -6
  67. data/config/locales/sr-CS.yml +6 -5
  68. data/config/locales/sv.yml +14 -6
  69. data/config/locales/th-TH.yml +14 -0
  70. data/config/locales/tr-TR.yml +7 -8
  71. data/config/locales/uk.yml +5 -7
  72. data/config/locales/zh-CN.yml +3 -10
  73. data/config/locales/zh-TW.yml +2 -0
  74. data/config/routes.rb +1 -1
  75. data/decidim-admin.gemspec +1 -1
  76. data/lib/decidim/admin/engine.rb +1 -0
  77. data/lib/decidim/admin/test/manage_hide_content_examples.rb +4 -3
  78. data/lib/decidim/admin/test/manage_moderations_examples.rb +1 -1
  79. data/lib/decidim/admin/version.rb +1 -1
  80. metadata +12 -9
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d3f285a47f80f5bdf3a2d992daab51c9945cbccd2c6f714ca15b2529b8923e79
4
- data.tar.gz: 8f4965b0ee06c4d6b5fa74418e52d36f03fe239da058d67927b713955e1211d4
3
+ metadata.gz: 1c852741cd61530ba9d8b7d124853be3848447169a38affddefadc8a62983317
4
+ data.tar.gz: 266e61bd6389325aedfdef65efc9e4ad74fb52cd6aad24afdcc0f36893a1b5b6
5
5
  SHA512:
6
- metadata.gz: ef1df3729f97261f2a3164eff704c5d503e6a4731daf5e5d586476c64f5f0eb4409234e107f82ce972ce1b2f697685e940d420c6d3d3ebc43d39db579c459540
7
- data.tar.gz: 6e21939582031fc8774833fbed42bf22647dc359b1e5fffe983e593092e89ad2959ebe94042602ac3ba32e0b2f7f61ff8c1ac8c9db3862884e88d3cad8e99e8f
6
+ metadata.gz: eb17e3607080d60671cf40e5f5e20d151ba2df3ab0349914eec98cd449372171db95838779ab787e24defe37343cf7377c48906430b92fb6fa7c351cab9543cd
7
+ data.tar.gz: 370fd4143351c6b5b48cc24f768fa49cf0aeb8906b842d0fcac0400fe6535e0bb4f5e69a9905d165dec5626b0f4cb3daf00a8129e0fadb7101d25cc0daca1f7a
@@ -77,6 +77,7 @@ module Decidim
77
77
  form.user.block_id = @current_blocking.id
78
78
  form.user.extended_data["user_name"] = form.user.name
79
79
  form.user.name = "Blocked user"
80
+ form.user.notifications_sending_frequency = "none"
80
81
  form.user.save!
81
82
  end
82
83
  end
@@ -20,6 +20,7 @@ module Decidim
20
20
  #
21
21
  # Returns nothing.
22
22
  def call
23
+ return broadcast(:parent_invalid) if @reportable.respond_to?(:commentable) && @reportable.commentable.try(:hidden?)
23
24
  return broadcast(:invalid) unless unhideable?
24
25
 
25
26
  unhide!
@@ -22,7 +22,7 @@ module Decidim
22
22
  BlockUser.call(@form) do
23
23
  on(:ok) do
24
24
  flash[:notice] = I18n.t("officializations.block.success", scope: "decidim.admin")
25
- redirect_to moderated_users_path(blocked: true), notice:
25
+ redirect_to moderated_users_path, notice:
26
26
  end
27
27
 
28
28
  on(:invalid) do
@@ -47,7 +47,7 @@ module Decidim
47
47
 
48
48
  on(:invalid) do
49
49
  flash.now[:alert] = I18n.t("error", scope: "decidim.admin.conflicts.transfer")
50
- redirect_to decidim.root_path
50
+ render action: "edit"
51
51
  end
52
52
  end
53
53
  end
@@ -29,6 +29,7 @@ module Decidim
29
29
 
30
30
  @form = form(ImpersonateUserForm).from_params(
31
31
  user:,
32
+ name: params[:impersonate_user][:name],
32
33
  handler_name:,
33
34
  reason: params[:impersonate_user][:reason],
34
35
  authorization: Decidim::AuthorizationHandler.handler_for(
@@ -57,12 +57,17 @@ module Decidim
57
57
  Admin::UnhideResource.call(reportable, current_user) do
58
58
  on(:ok) do
59
59
  flash[:notice] = I18n.t("reportable.unhide.success", scope: "decidim.moderations.admin")
60
- redirect_to moderations_path
60
+ redirect_to moderations_path(hidden: true)
61
+ end
62
+
63
+ on(:parent_invalid) do
64
+ flash[:alert] = I18n.t("reportable.unhide.parent_invalid", scope: "decidim.moderations.admin")
65
+ redirect_to moderations_path(hidden: true)
61
66
  end
62
67
 
63
68
  on(:invalid) do
64
- flash.now[:alert] = I18n.t("reportable.unhide.invalid", scope: "decidim.moderations.admin")
65
- redirect_to moderations_path
69
+ flash[:alert] = I18n.t("reportable.unhide.invalid", scope: "decidim.moderations.admin")
70
+ redirect_to moderations_path(hidden: true)
66
71
  end
67
72
  end
68
73
  end
@@ -108,7 +108,8 @@ module Decidim
108
108
  end
109
109
 
110
110
  def recipients_count
111
- data = params.permit(data: {}).to_h[:data]
111
+ data = params.permit(newsletter: {}).to_h[:newsletter]
112
+
112
113
  @form = form(SelectiveNewsletterForm).from_params(data)
113
114
  render plain: recipients_count_query
114
115
  end
@@ -48,7 +48,7 @@ module Decidim
48
48
  if (term = params[:term].to_s).present?
49
49
  query = if term.start_with?("@")
50
50
  nickname = term.delete("@")
51
- relation.where("nickname ILIKE ?", "#{nickname}%")
51
+ relation.where("nickname LIKE ?", "#{nickname}%")
52
52
  .order(Arel.sql(ActiveRecord::Base.sanitize_sql_array("similarity(nickname, '#{nickname}') DESC")))
53
53
  else
54
54
  relation.where("name ILIKE ?", "%#{term}%").or(
@@ -9,7 +9,7 @@ module Decidim
9
9
  include TranslationsHelper
10
10
 
11
11
  attribute :id, String
12
- translatable_attribute :content, String
12
+ translatable_attribute :content, Decidim::Attributes::RichText
13
13
 
14
14
  def name
15
15
  multi_translation("activerecord.models.#{manifest.model_class_name.underscore}.other")
@@ -14,6 +14,7 @@ module Decidim
14
14
  attribute :handler_name, String
15
15
 
16
16
  validates :user, presence: true
17
+ validates :name, presence: true, unless: :persisted_user?
17
18
  validates :reason, presence: true, unless: :managed_user?
18
19
 
19
20
  private
@@ -21,6 +22,10 @@ module Decidim
21
22
  def managed_user?
22
23
  user && user.managed?
23
24
  end
25
+
26
+ def persisted_user?
27
+ user&.persisted?
28
+ end
24
29
  end
25
30
  end
26
31
  end
@@ -32,9 +32,9 @@ module Decidim
32
32
  attribute :tertiary_color, String
33
33
 
34
34
  translatable_attribute :cta_button_text, String
35
- translatable_attribute :description, String
35
+ translatable_attribute :description, Decidim::Attributes::RichText
36
36
  translatable_attribute :highlighted_content_banner_title, String
37
- translatable_attribute :highlighted_content_banner_short_description, String
37
+ translatable_attribute :highlighted_content_banner_short_description, Decidim::Attributes::RichText
38
38
  translatable_attribute :highlighted_content_banner_action_title, String
39
39
  translatable_attribute :highlighted_content_banner_action_subtitle, String
40
40
  translatable_attribute :omnipresent_banner_title, String
@@ -31,9 +31,9 @@ module Decidim
31
31
  attribute :customize_welcome_notification, Boolean
32
32
 
33
33
  translatable_attribute :welcome_notification_subject, String
34
- translatable_attribute :welcome_notification_body, String
34
+ translatable_attribute :welcome_notification_body, Decidim::Attributes::RichText
35
35
 
36
- translatable_attribute :admin_terms_of_service_body, String
36
+ translatable_attribute :admin_terms_of_service_body, Decidim::Attributes::RichText
37
37
 
38
38
  validates :welcome_notification_subject, :welcome_notification_body, translatable_presence: true, if: proc { |form| form.customize_welcome_notification }
39
39
 
@@ -9,7 +9,7 @@ module Decidim
9
9
  attribute :slug, String
10
10
  validates :title, translatable_presence: true
11
11
  translatable_attribute :title, String
12
- translatable_attribute :content, String
12
+ translatable_attribute :content, Decidim::Attributes::RichText
13
13
  attribute :changed_notably, Boolean
14
14
  attribute :allow_public_access, Boolean
15
15
  attribute :weight, Integer
@@ -14,6 +14,21 @@ module Decidim
14
14
 
15
15
  validates :current_user, presence: true
16
16
  validates :conflict, presence: true
17
+ validates :email, presence: true
18
+ validate :unique_email
19
+
20
+ private
21
+
22
+ def unique_email
23
+ return if conflict.blank?
24
+ return true if Decidim::UserBaseEntity.where(
25
+ organization: context.current_organization,
26
+ email:
27
+ ).where.not(id: [conflict.current_user.id, conflict.managed_user_id]).empty?
28
+
29
+ errors.add :email, :taken
30
+ false
31
+ end
17
32
  end
18
33
  end
19
34
  end
@@ -54,9 +54,9 @@ $(() => {
54
54
  $participatorySpacesForSelect.hide();
55
55
  }
56
56
 
57
- $(".form .spaces-block-tag").each(function(_i, blockTag) {
57
+ $(".form .spaces-block-tag").each(function (_i, blockTag) {
58
58
  const selectTag = $(blockTag).find(".chosen-select")
59
- selectTag.change(function() {
59
+ selectTag.change(function () {
60
60
  let optionSelected = selectTag.find("option:selected").val()
61
61
  if (optionSelected === "all") {
62
62
  selectTag.find("option").not(":first").prop("selected", true);
@@ -67,16 +67,25 @@ $(() => {
67
67
  });
68
68
  })
69
69
 
70
- $form.on("change", function() {
71
- let $data = $form.serializeJSON().newsletter;
72
- let $url = $form.data("recipients-count-newsletter-path");
70
+ $form.on("change", function(event) {
71
+ let formData = new FormData(event.target.closest("form"));
72
+ let url = $form.data("recipients-count-newsletter-path");
73
73
  const $modal = $("#recipients_count_spinner");
74
74
  $modal.removeClass("hide");
75
- $.get($url, {data: $data}, function(recipientsCount) {
76
- $("#recipients_count").text(recipientsCount);
77
- }).always(function() {
75
+
76
+ const xhr = new XMLHttpRequest();
77
+ xhr.open("POST", url, true);
78
+ xhr.onload = function() {
79
+ if (xhr.status === 200) {
80
+ $("#recipients_count").text(xhr.responseText);
81
+ }
78
82
  $modal.addClass("hide");
79
- });
83
+ };
84
+ xhr.onerror = function() {
85
+ $modal.addClass("hide");
86
+ };
87
+ // Send the form data
88
+ xhr.send(formData);
80
89
  })
81
90
  }
82
91
  });
@@ -29,6 +29,14 @@
29
29
  list-style: none;
30
30
  margin: 0;
31
31
 
32
+ li a {
33
+ @apply flex items-center;
34
+
35
+ svg {
36
+ @apply ml-1;
37
+ }
38
+ }
39
+
32
40
  .icon {
33
41
  @apply ml-2;
34
42
  }
@@ -3,6 +3,8 @@
3
3
  module Decidim
4
4
  module Admin
5
5
  class Permissions < Decidim::DefaultPermissions
6
+ include Decidim::UserRoleChecker
7
+
6
8
  def permissions
7
9
  return permission_action if managed_user_action?
8
10
 
@@ -31,6 +33,8 @@ module Decidim
31
33
 
32
34
  apply_global_moderations_permission_for_admin!
33
35
 
36
+ can_use_image_editor?
37
+
34
38
  if user.admin? && admin_terms_accepted?
35
39
  allow! if read_admin_log_action?
36
40
  allow! if read_user_statistics_action?
@@ -253,6 +257,10 @@ module Decidim
253
257
  def available_authorization_handlers?
254
258
  user.organization.available_authorization_handlers.any?
255
259
  end
260
+
261
+ def can_use_image_editor?
262
+ allow! if permission_action.subject == :editor_image && user_has_any_role?(user, nil, broad_check: true)
263
+ end
256
264
  end
257
265
  end
258
266
  end
@@ -20,11 +20,7 @@ module Decidim
20
20
  end
21
21
 
22
22
  def query
23
- recipients = Decidim::User.where(organization: @form.current_organization)
24
- .where.not(newsletter_notifications_at: nil)
25
- .where.not(email: nil)
26
- .where.not(confirmed_at: nil)
27
- .not_deleted
23
+ recipients = recipients_base_query
28
24
 
29
25
  recipients = recipients.interested_in_scopes(@form.scope_ids) if @form.scope_ids.present?
30
26
 
@@ -41,6 +37,14 @@ module Decidim
41
37
 
42
38
  private
43
39
 
40
+ def recipients_base_query
41
+ Decidim::User.available
42
+ .where(organization: @form.current_organization)
43
+ .where.not(newsletter_notifications_at: nil)
44
+ .where.not(email: nil)
45
+ .confirmed
46
+ end
47
+
44
48
  # Return the ids of the ParticipatorySpace selected
45
49
  # in form, grouped by type
46
50
  # This will be used to take followers and
@@ -27,18 +27,28 @@
27
27
  </div>
28
28
  </div>
29
29
 
30
- <%= decidim_form_for(@form, url: conflict_path, method: :put, html: { class: "form" }) do |f| %>
31
- <div class="card">
32
- <div class="card-section">
33
- <div class="row column">
34
- <%= f.text_field :reason, label: t("reason", scope: "decidim.admin.conflicts.transfer") %>
30
+ <div class="item__edit item__edit-1col">
31
+ <div class="item__edit-form">
32
+ <%= decidim_form_for(@form, url: conflict_path, method: :put, html: { class: "form form-defaults" }) do |f| %>
33
+ <div class="form__wrapper">
34
+ <div class="card pt-4">
35
+ <div class="card-section">
36
+ <div class="row column">
35
37
 
36
- <%= f.text_field :email, label: t("email", scope: "decidim.admin.conflicts.transfer") %>
38
+ <%= f.text_field :reason, label: t("reason", scope: "decidim.admin.conflicts.transfer") %>
39
+ </div>
40
+
41
+ <div class="row column">
42
+
43
+ <%= f.text_field :email, label: t("email", scope: "decidim.admin.conflicts.transfer") %>
44
+ </div>
45
+ </div>
46
+ </div>
37
47
  </div>
38
- </div>
39
- </div>
40
48
 
41
- <div class="form__wrapper-block flex-col-reverse md:flex-row justify-between">
42
- <%= f.submit t("title", scope: "decidim.admin.conflicts.transfer"), class: "button button__sm button__secondary" %>
49
+ <div class="form__wrapper-block flex-col-reverse md:flex-row justify-between">
50
+ <%= f.submit t("title", scope: "decidim.admin.conflicts.transfer"), class: "button button__sm button__secondary" %>
51
+ </div>
52
+ <% end %>
43
53
  </div>
44
- <% end %>
54
+ </div>
@@ -51,9 +51,9 @@
51
51
  <% end %>
52
52
  <% if allowed_to?(:block, :moderate_users) %>
53
53
  <% if moderation.user.blocked? %>
54
- <%= icon_link_to "forbid-2-line", user_block_path(user_id: moderation.user.id), t(".actions.unblock"), class: "action-icon action-icon--disabled", method: :delete %>
54
+ <%= icon_link_to "refresh-line", user_block_path(user_id: moderation.user.id), t(".actions.unblock"), class: "action-icon action-icon--disabled", method: :delete %>
55
55
  <% else %>
56
- <%= icon_link_to "forbid-2-line", new_user_block_path(user_id: moderation.user.id), t(".actions.block"), class: "action-icon action-icon" %>
56
+ <%= icon_link_to "lock-2-line", new_user_block_path(user_id: moderation.user.id), t(".actions.block"), class: "action-icon action-icon" %>
57
57
  <% end %>
58
58
  <% end %>
59
59
  </td>
@@ -85,7 +85,11 @@
85
85
  <%= icon_link_to "eye-line", hide_moderation_path(id: moderation), t("actions.hide", scope: "decidim.moderations"), class: "action-icon--hide", method: :put %>
86
86
  <% end %>
87
87
  <% if moderation.reportable.hidden? && allowed_to?(:unhide, authorization_scope) %>
88
- <%= icon_link_to "eye-line", unhide_moderation_path(id: moderation), t("actions.unhide", scope: "decidim.moderations"), method: :put %>
88
+ <% if moderation.reportable.respond_to?(:commentable) && moderation.reportable.commentable.try(:hidden?) %>
89
+ <%= icon_with_tooltip "eye-line", t("actions.parent_hidden", scope: "decidim.moderations"), class: "action-icon action-icon--disabled", role: "img", aria_label: t("actions.parent_hidden", scope: "decidim.moderations") %>
90
+ <% else %>
91
+ <%= icon_link_to "eye-line", unhide_moderation_path(id: moderation), t("actions.unhide", scope: "decidim.moderations"), method: :put %>
92
+ <% end %>
89
93
  <% end %>
90
94
  </td>
91
95
  </tr>
@@ -3,7 +3,6 @@
3
3
  <div class="item_show__header">
4
4
  <h1 class="item_show__header-title">
5
5
  <%= t ".title" %>
6
- <%= link_to t("actions.newsletter.new", scope: "decidim.admin"), [:newsletter_templates], class: "button button__sm button__secondary expanded small new" %>
7
6
  </h1>
8
7
  </div>
9
8
 
@@ -6,7 +6,7 @@
6
6
  </div>
7
7
  <div class="item__edit item__edit-1col">
8
8
  <div class="item__edit-form">
9
- <%= decidim_form_for(@form, html: { class: "form-defaults form edit_content_block [&_button]:button [&_button]:button__sm [&_button]:button__secondary" }, url: resource_landing_page_content_block_path) do |form| %>
9
+ <%= decidim_form_for(@form, html: { class: "form-defaults form edit_content_block" }, url: resource_landing_page_content_block_path) do |form| %>
10
10
  <div class="form__wrapper">
11
11
  <div class="card py-4">
12
12
  <div class="card-section">
@@ -38,8 +38,12 @@ ar:
38
38
  user_group_id: إنشاء الاستيرادات ك
39
39
  newsletter:
40
40
  body: النص
41
+ send_to_all_users: إرسال إلى كافة المستخدمين
42
+ send_to_followers: إرسال إلى المتابِعين
43
+ send_to_participants: إرسال إلى المشتركين
41
44
  subject: الموضوع
42
45
  organization:
46
+ admin_terms_of_service_body: نص شروط الخدمة للمشرف
43
47
  alert_color: تنبيه
44
48
  available_authorizations: التراخيص المتاحة
45
49
  badges_enabled: تمكين الشارات
@@ -53,8 +57,12 @@ ar:
53
57
  enable_participatory_space_filters: تفعيل أختيارات فرز الفضاء التشاركي
54
58
  facebook_handler: مُعرّف حساب فيسبوك
55
59
  favicon: أيقونة
60
+ force_authentication: فرض المصادقة
61
+ force_users_to_authenticate_before_access_organization: إلزام المستخدمين على المصادقة قبل الدخول إلى المنظمة
62
+ from: البريد الإلكتروني للمرسل
56
63
  github_handler: مُعرّف حساب غِت هَب
57
64
  header_snippets: قصاصات رأس
65
+ highlight_alternative_color: تحديد، البديل
58
66
  highlight_color: تظليل
59
67
  highlighted_content_banner_action_subtitle: نص زر الإجراء
60
68
  highlighted_content_banner_action_title: عنوان زر الإجراء
@@ -85,9 +93,12 @@ ar:
85
93
  secondary_hosts: المستضيفين الثانويين
86
94
  send_welcome_notification: إرسال إشعار بالترحيب
87
95
  success_color: نجاح
96
+ tertiary_color: المستوى الثالث
88
97
  time_zone: المنطقة الزمنية
89
98
  tos_version: شروط وأحكام الخدمة
99
+ twitter_handler: X handler
90
100
  user_groups_enabled: تمكين المجموعات
101
+ users_registration_mode: وضع تسجيل المستخدمين
91
102
  warning_color: تحذير
92
103
  welcome_notification_body: محتوى إشعار الترحيب
93
104
  welcome_notification_subject: موضوع إشعار الترحيب
@@ -95,6 +106,8 @@ ar:
95
106
  participatory_space_private_user:
96
107
  email: البريد الإلكتروني
97
108
  name: الإسم
109
+ participatory_space_private_user_csv_import:
110
+ file: ملف
98
111
  scope:
99
112
  code: الشفرة
100
113
  name: الاسم
@@ -109,24 +122,46 @@ ar:
109
122
  settings:
110
123
  scope_id: المجال
111
124
  static_page:
125
+ allow_public_access: السماح بالوصول دون مصادقة
112
126
  changed_notably: كانت هناك تغييرات ملحوظة.
113
127
  content: المحتوى
114
128
  organization: المنظمة
115
129
  show_in_footer: تظهر في تذييل الصفحة
116
130
  slug: سبيكة العنوان الشبكي
117
131
  title: العنوان
132
+ topic_id: الموضوع
133
+ weight: موضع الطلب
118
134
  static_page_topic:
119
135
  description: وصف
136
+ name: عنوان الموضوع
120
137
  show_in_footer: تظهر في تذييل الصفحة
121
138
  title: العنوان
139
+ weight: موضع الطلب
122
140
  user_group_csv_verification:
123
141
  file: ملف
124
142
  errors:
125
143
  models:
144
+ newsletter:
145
+ attributes:
146
+ base:
147
+ at_least_one_space: حدد مساحة تشاركية واحدة على الأقل.
126
148
  organization:
127
149
  attributes:
128
150
  official_img_footer:
129
151
  allowed_file_content_types: ملف صورة غير صالح
152
+ participatory_space_private_user_csv_import:
153
+ attributes:
154
+ file:
155
+ malformed: خطأ في ملفّ الاستيراد، يرجى قراءة التعليمات بعناية والتأكد من أن ترميز الملف هو UTF-8.
156
+ user_group_csv_verification:
157
+ attributes:
158
+ file:
159
+ malformed: خطأ في ملفّ الاستيراد، يرجى قراءة التعليمات بعناية والتأكد من أن ترميز الملف هو UTF-8.
160
+ new_import:
161
+ attributes:
162
+ file:
163
+ invalid_file: الملف غير صالح، يرجى التأكد من تنسيق الملف بشكل صحيح.
164
+ invalid_mime_type: ملف من نوع MIME غير صالح.
130
165
  activerecord:
131
166
  attributes:
132
167
  decidim/static_page:
@@ -145,10 +180,15 @@ ar:
145
180
  admin:
146
181
  actions:
147
182
  add: إضافة
183
+ attachment:
184
+ new: إضافة مرفق
185
+ attachment_collection:
186
+ new: مجلد مرفقات جديد
148
187
  browse: تصفح
149
188
  category:
150
189
  new: فئة جديدة
151
190
  export: تصدير الكل
191
+ export-selection: تصدير الإختيار
152
192
  import: استيراد
153
193
  manage: تدبير
154
194
  newsletter:
@@ -295,6 +335,9 @@ ar:
295
335
  title: نقل
296
336
  'true': 'نعم'
297
337
  user_name: المستخدم
338
+ content_blocks:
339
+ edit:
340
+ title: محتويات الصفحة
298
341
  dashboard:
299
342
  show:
300
343
  view_more_logs: عرض المزيد من السجلات
@@ -430,6 +473,9 @@ ar:
430
473
  download_example_format: مثال كـ %{name}
431
474
  file_legend: إضافة ملف استيراد سيتم تحليله.
432
475
  import: استيراد
476
+ logs:
477
+ filters:
478
+ user: المستخدم
433
479
  managed_users:
434
480
  promotion:
435
481
  error: كانت هناك مشكلة في تعزيز المشارك المُدار.
@@ -507,6 +553,7 @@ ar:
507
553
  plural: جمع
508
554
  share_token:
509
555
  fields:
556
+ created_at: أنشئت في
510
557
  expires_at: تنتهي صلاحيته في
511
558
  token: رمز التشفير - Token
512
559
  user: تم الإنشاء بواسطة
@@ -529,8 +576,8 @@ ar:
529
576
  actions: أفعال
530
577
  created_at: أنشئت في
531
578
  document_number: رقم المستند
532
- name: اسم
533
- nickname: الاسم المستعار
579
+ name: الاسم
580
+ nickname: كنية
534
581
  phone: هاتف
535
582
  state: حالة
536
583
  users_count: عدد المشاركين
@@ -564,6 +611,11 @@ ar:
564
611
  reported_content: محتوى تم الإبلاغ عنه
565
612
  show:
566
613
  report_reason: السبب
614
+ new_import:
615
+ accepted_mime_types:
616
+ csv: CSV
617
+ json: JSON
618
+ xlsx: XLSX
567
619
  newsletter_templates:
568
620
  index:
569
621
  preview_template: معاينة
@@ -600,7 +652,7 @@ ar:
600
652
  all_spaces: الكل
601
653
  confirm_deliver: هل أنت متأكد من أنك تريد تسليم هذه الرسالة الإخبارية؟ لا يمكن التراجع عن هذا الإجراء.
602
654
  deliver: تسليم النشرة الإخبارية
603
- none: لا شَيْء
655
+ none: لا شيء
604
656
  scopes_help: إرسال النشرة الإخبارية للمستخدمين الذين لديهم أي من المجالات المحددة تم تفعيله في إعدادات "اهتماماتي" لحسابهم.
605
657
  select_scopes: أختر للمستخدمين الذين فعلوا أي مجال محدد في إعدادات أهتماماتي لحساباتهم.
606
658
  title: حدد المستلمين للإرسال اليهم
@@ -682,6 +734,8 @@ ar:
682
734
  title: مشارك جديد الفضاء الخاص المشارك.
683
735
  participatory_space_private_users_csv_imports:
684
736
  new:
737
+ csv_upload:
738
+ title: قم بتحميل ملف CSV الخاص بك
685
739
  destroy:
686
740
  button: حذف جميع المشاركين الخاصين
687
741
  empty: ليس لديك أي مشاركين خاصين.
@@ -779,10 +833,12 @@ ar:
779
833
  areas: المناطق
780
834
  authorization_workflows: طرق التحقق
781
835
  dashboard: لوحة القيادة
836
+ edit_landing_page: محتويات الصفحة
782
837
  edit_organization_appearance: تعديل مظهر الصفحة الرئيسية
783
838
  impersonatable_users: المشاركون في الإدارة
784
839
  impersonations: إدارة المشاركين
785
840
  menu: القائمة الرئيسية
841
+ page_topics: المواضيع
786
842
  pages: الصفحات
787
843
  panel: مدير
788
844
  participants: المشاركين
@@ -802,14 +858,14 @@ ar:
802
858
  index:
803
859
  state:
804
860
  pending: قيد الانتظار
805
- rejected: مرفوض
806
- verified: التحقق
861
+ rejected: تم رفضه
862
+ verified: تم التحقق
807
863
  verify_via_csv: تحقق عبر CSV
808
864
  user_groups_csv_verifications:
809
865
  new:
810
866
  explanation: قم بتحميل ملف CSV الخاص بك. يجب أن يحتوي على رسائل البريد الإلكتروني الرسمية للمجموعات في مؤسستك في العمود الأول من الملف ، بدون رؤوس. سيتم التحقق من صحة المجموعات التي أكدت بريدها الإلكتروني والتي تحتوي على بريد إلكتروني ظاهر في ملف CSV.
811
867
  title: قم بتحميل ملف CSV الخاص بك
812
- upload: رفع
868
+ upload: حمّل
813
869
  users:
814
870
  create:
815
871
  error: كانت هناك مشكلة في دعوة هذا المشرف.
@@ -892,7 +892,7 @@ bg:
892
892
  success: Файлът във формат CSV беше качен успешно; изпращаме имейл с покана на участниците. Това може да отнеме известно време.
893
893
  new:
894
894
  csv_upload:
895
- title: Качете своя файл във формат CSV
895
+ title: Качете своя CSV файл
896
896
  destroy:
897
897
  button: Изтрийте всички частни участници
898
898
  confirm: Сигурни ли сте, че искате да изтриете всички частни участници? Това действие е необратимо, няма да можете да ги възстановите.
@@ -1055,7 +1055,7 @@ bg:
1055
1055
  index:
1056
1056
  state:
1057
1057
  pending: Изчакване
1058
- rejected: Отхвърлено
1058
+ rejected: Отхвърлен
1059
1059
  verified: Проверен
1060
1060
  verify_via_csv: Проверка чрез CSV
1061
1061
  user_groups_csv_verifications:
@@ -0,0 +1 @@
1
+ bn: