decidim-admin 0.16.1 → 0.17.0

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-admin might be problematic. Click here for more details.

Files changed (57) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/config/decidim_admin_manifest.js +1 -1
  3. data/app/assets/javascripts/decidim/admin/bundle.js +17 -17
  4. data/app/assets/javascripts/decidim/admin/bundle.js.map +1 -1
  5. data/app/assets/javascripts/decidim/admin/resources_permissions.js.es6 +13 -0
  6. data/app/assets/javascripts/decidim/admin/subform_multi_toggler.component.js.es6 +43 -0
  7. data/app/assets/stylesheets/decidim/admin/bundle.scss +2 -1
  8. data/app/commands/decidim/admin/unhide_resource.rb +49 -0
  9. data/app/commands/decidim/admin/unreport_resource.rb +1 -1
  10. data/app/commands/decidim/admin/update_component_permissions.rb +14 -4
  11. data/app/commands/decidim/admin/update_organization_appearance.rb +13 -0
  12. data/app/commands/decidim/admin/update_resource_permissions.rb +67 -0
  13. data/app/controllers/decidim/admin/component_permissions_controller.rb +4 -37
  14. data/app/controllers/decidim/admin/components/base_controller.rb +4 -1
  15. data/app/controllers/decidim/admin/moderations_controller.rb +16 -0
  16. data/app/controllers/decidim/admin/resource_permissions_controller.rb +104 -0
  17. data/app/events/decidim/attachment_created_event.rb +1 -1
  18. data/app/forms/decidim/admin/organization_appearance_form.rb +6 -0
  19. data/app/forms/decidim/admin/permission_form.rb +24 -10
  20. data/app/helpers/decidim/admin/resource_permissions_helper.rb +14 -0
  21. data/app/permissions/decidim/admin/permissions.rb +8 -10
  22. data/app/views/decidim/admin/moderations/index.html.erb +8 -1
  23. data/app/views/decidim/admin/organization_appearance/_form.html.erb +40 -0
  24. data/app/views/decidim/admin/resource_permissions/_options_form.html.erb +19 -0
  25. data/app/views/decidim/admin/resource_permissions/edit.html.erb +58 -0
  26. data/config/locales/ar-SA.yml +113 -7
  27. data/config/locales/ca.yml +70 -58
  28. data/config/locales/cs-CZ.yml +18 -6
  29. data/config/locales/cs.yml +721 -0
  30. data/config/locales/de.yml +20 -8
  31. data/config/locales/en.yml +98 -85
  32. data/config/locales/es-MX.yml +20 -8
  33. data/config/locales/es-PY.yml +20 -8
  34. data/config/locales/es.yml +76 -64
  35. data/config/locales/eu.yml +20 -8
  36. data/config/locales/fi-pl.yml +18 -6
  37. data/config/locales/fi-plain.yml +721 -0
  38. data/config/locales/fi.yml +76 -64
  39. data/config/locales/fr.yml +20 -8
  40. data/config/locales/gl.yml +20 -8
  41. data/config/locales/hu.yml +20 -8
  42. data/config/locales/id-ID.yml +20 -8
  43. data/config/locales/it.yml +20 -8
  44. data/config/locales/nl.yml +20 -8
  45. data/config/locales/pl.yml +20 -8
  46. data/config/locales/pt-BR.yml +20 -8
  47. data/config/locales/pt.yml +20 -8
  48. data/config/locales/ru.yml +3 -6
  49. data/config/locales/sv.yml +20 -8
  50. data/config/locales/tr-TR.yml +20 -8
  51. data/config/locales/uk.yml +3 -6
  52. data/lib/decidim/admin/test/manage_component_permissions_examples.rb +148 -38
  53. data/lib/decidim/admin/version.rb +1 -1
  54. metadata +17 -11
  55. data/app/assets/javascripts/decidim/admin/component_permissions.js.es6 +0 -13
  56. data/app/views/decidim/admin/component_permissions/_options_form.html.erb +0 -14
  57. data/app/views/decidim/admin/component_permissions/edit.html.erb +0 -53
@@ -0,0 +1,104 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Admin
5
+ # Controller that allows managing resource permissions.
6
+ #
7
+ class ResourcePermissionsController < Decidim::Admin::ApplicationController
8
+ helper Decidim::ResourceHelper
9
+
10
+ helper_method :authorizations, :other_authorizations_for, :resource_params, :resource
11
+
12
+ def edit
13
+ @permissions_form = PermissionsForm.new(
14
+ permissions: permission_forms
15
+ )
16
+ end
17
+
18
+ def update
19
+ @permissions_form = PermissionsForm.from_params(params).with_context(current_organization: current_organization)
20
+
21
+ UpdateResourcePermissions.call(@permissions_form, resource) do
22
+ on(:ok) do
23
+ flash[:notice] = t("resource_permissions.update.success", scope: "decidim.admin")
24
+ redirect_to return_path
25
+ end
26
+
27
+ on(:invalid) do
28
+ render action: :edit
29
+ end
30
+ end
31
+ end
32
+
33
+ private
34
+
35
+ def return_path
36
+ ResourceLocatorPresenter.new(resource).admin_index
37
+ end
38
+
39
+ def resource_params
40
+ params.permit(:resource_id, :resource_name).to_h.symbolize_keys
41
+ end
42
+
43
+ def resource_symbol
44
+ @resource_symbol ||= resource.class.name.demodulize.underscore.to_sym
45
+ end
46
+
47
+ def permission_forms
48
+ actions.inject({}) do |result, action|
49
+ form = PermissionForm.new(
50
+ authorization_handlers: authorizations_for(action),
51
+ authorizations_handlers_options: options_for(action)
52
+ )
53
+
54
+ result.update(action => form)
55
+ end
56
+ end
57
+
58
+ def actions
59
+ @actions ||= resource&.resource_manifest&.actions
60
+ end
61
+
62
+ def authorizations
63
+ Verifications::Adapter.from_collection(
64
+ current_organization.available_authorizations
65
+ )
66
+ end
67
+
68
+ def other_authorizations_for(action)
69
+ Verifications::Adapter.from_collection(
70
+ current_organization.available_authorizations - authorizations_for(action).keys
71
+ )
72
+ end
73
+
74
+ def resource
75
+ return if params[:resource_name].blank?
76
+
77
+ resource_id = params["#{params[:resource_name]}_id"]
78
+ @resource ||= Decidim.find_resource_manifest(params[:resource_name])&.model_class&.find_by(id: resource_id)
79
+ @resource if @resource&.allow_resource_permissions?
80
+ end
81
+
82
+ def manifest_name
83
+ @manifest_name ||= resource.manifest.name
84
+ end
85
+
86
+ def permissions
87
+ @permissions ||= (resource&.permissions || {})
88
+ end
89
+
90
+ def authorizations_for(action)
91
+ if permissions.dig(action, "authorization_handler_name")
92
+ opts = permissions.dig(action, "options")
93
+ { permissions.dig(action, "authorization_handler_name") => opts.blank? ? {} : { "options" => opts } }
94
+ else
95
+ permissions.dig(action, "authorization_handlers") || {}
96
+ end
97
+ end
98
+
99
+ def options_for(action)
100
+ authorizations_for(action)&.transform_values { |value| value["options"] }&.reject { |_, value| value.blank? }
101
+ end
102
+ end
103
+ end
104
+ end
@@ -9,7 +9,7 @@ module Decidim
9
9
  end
10
10
 
11
11
  def resource_url
12
- @resource.url
12
+ attached_to_url
13
13
  end
14
14
 
15
15
  def resource_text
@@ -29,6 +29,12 @@ module Decidim
29
29
  attribute :enable_omnipresent_banner, Boolean, default: false
30
30
  attribute :omnipresent_banner_url, String
31
31
 
32
+ attribute :primary_color, String, default: "#ef604d"
33
+ attribute :secondary_color, String, default: "#599aa6"
34
+ attribute :success_color, String, default: "#57d685"
35
+ attribute :warning_color, String, default: "#ffae00"
36
+ attribute :alert_color, String, default: "#ec5840"
37
+
32
38
  translatable_attribute :cta_button_text, String
33
39
  translatable_attribute :description, String
34
40
  translatable_attribute :highlighted_content_banner_title, String
@@ -4,25 +4,39 @@ module Decidim
4
4
  module Admin
5
5
  # This form handles permissions for a particular action in the admin panel.
6
6
  class PermissionForm < Form
7
- attribute :authorization_handler_name, String
8
- attribute :options, Hash
7
+ attribute :authorization_handlers, Hash
8
+ attribute :authorization_handlers_options, Hash
9
9
 
10
- def manifest
11
- Decidim::Verifications.find_workflow_manifest(authorization_handler_name)
10
+ def authorization_handlers_names
11
+ authorization_handlers.keys.map(&:to_s)
12
12
  end
13
13
 
14
- def options_schema
15
- @options_schema ||= options_manifest.schema.new(options || {})
14
+ def authorization_handler_options(handler_name)
15
+ find_handler(handler_name)[:options]
16
16
  end
17
17
 
18
- def options_attributes
19
- options_manifest.attributes
18
+ def manifest(handler_name)
19
+ Decidim::Verifications.find_workflow_manifest(handler_name)
20
+ end
21
+
22
+ def options_schema(handler_name)
23
+ options_manifest(handler_name).schema.new(find_handler(handler_name)["options"] || {})
24
+ end
25
+
26
+ def options_attributes(handler_name)
27
+ manifest = options_manifest(handler_name)
28
+ manifest ? manifest.attributes : []
20
29
  end
21
30
 
22
31
  private
23
32
 
24
- def options_manifest
25
- manifest.options
33
+ def options_manifest(handler_name)
34
+ manifest(handler_name).options
35
+ end
36
+
37
+ def find_handler(handler_name)
38
+ authorization_handlers[handler_name.to_s] ||
39
+ authorization_handlers[handler_name.to_sym]
26
40
  end
27
41
  end
28
42
  end
@@ -19,6 +19,20 @@ module Decidim
19
19
  t("actions.permissions", scope: "decidim.admin"),
20
20
  class: "action-icon--permissions #{"action-icon--highlighted" if resource.permissions.present?}"
21
21
  end
22
+
23
+ # Public: Render a link to the permissions page for a resource not
24
+ # related with a component and participatory space.
25
+ #
26
+ # resource - The resource which permissions are going to be modified
27
+ def free_resource_permissions_link(resource)
28
+ resource_key = resource.resource_manifest.name.to_sym
29
+ return unless resource.allow_resource_permissions? && allowed_to?(:update, resource_key, resource_key => resource)
30
+
31
+ icon_link_to "key",
32
+ send("edit_#{resource_key}_permissions_path", resource.id, resource_name: resource.resource_manifest.name),
33
+ t("actions.permissions", scope: "decidim.admin"),
34
+ class: "action-icon--permissions #{"action-icon--highlighted" if resource.permissions.present?}"
35
+ end
22
36
  end
23
37
  end
24
38
  end
@@ -139,16 +139,14 @@ module Decidim
139
139
 
140
140
  def space_allows_admin_access_to_current_action?
141
141
  Decidim.participatory_space_manifests.any? do |manifest|
142
- begin
143
- new_permission_action = Decidim::PermissionAction.new(
144
- action: permission_action.action,
145
- scope: permission_action.scope,
146
- subject: permission_action.subject
147
- )
148
- manifest.permissions_class.new(user, new_permission_action, context).permissions.allowed?
149
- rescue Decidim::PermissionAction::PermissionNotSetError
150
- nil
151
- end
142
+ new_permission_action = Decidim::PermissionAction.new(
143
+ action: permission_action.action,
144
+ scope: permission_action.scope,
145
+ subject: permission_action.subject
146
+ )
147
+ manifest.permissions_class.new(user, new_permission_action, context).permissions.allowed?
148
+ rescue Decidim::PermissionAction::PermissionNotSetError
149
+ nil
152
150
  end
153
151
  end
154
152
 
@@ -51,7 +51,7 @@
51
51
  <% end %>
52
52
  <td class="actions">
53
53
 
54
- <% if allowed_to?(:unreport, :moderation) %>
54
+ <% if !moderation.reportable.hidden? && allowed_to?(:unreport, :moderation) %>
55
55
  <%= icon_link_to "action-undo",
56
56
  unreport_moderation_path(id: moderation),
57
57
  t("actions.unreport", scope: "decidim.moderations"),
@@ -65,6 +65,13 @@
65
65
  class: "action-icon--hide",
66
66
  method: :put %>
67
67
  <% end %>
68
+ <% if moderation.reportable.hidden? && allowed_to?(:unhide, :moderation) %>
69
+ <%= icon_link_to "eye",
70
+ unhide_moderation_path(id: moderation),
71
+ t("actions.unhide", scope: "decidim.moderations"),
72
+ method: :put %>
73
+ <% end %>
74
+
68
75
  </td>
69
76
  </tr>
70
77
  <% end %>
@@ -126,3 +126,43 @@
126
126
  <% end %>
127
127
  </div>
128
128
  </div>
129
+
130
+ <div class="card">
131
+ <div class="card-divider">
132
+ <h2 class="card-title"><%= t ".colors_title" %></h2>
133
+ </div>
134
+ <div class="card-section">
135
+ <div class="row">
136
+ <div class="columns xlarge-6">
137
+ <%= form.color_field :primary_color, value: current_organization.colors["primary"] %>
138
+ </div>
139
+
140
+ <div class="columns xlarge-6">
141
+ <%= form.color_field :secondary_color, value: current_organization.colors["secondary"] %>
142
+ </div>
143
+ </div>
144
+
145
+ <div class="row">
146
+ <div class="columns xlarge-6">
147
+ <%= form.color_field :success_color, value: current_organization.colors["success"] %>
148
+ </div>
149
+
150
+ <div class="columns xlarge-6">
151
+ <%= form.color_field :warning_color, value: current_organization.colors["warning"] %>
152
+ </div>
153
+ </div>
154
+
155
+ <div class="row">
156
+ <div class="columns xlarge-6">
157
+ <%= form.color_field :alert_color, value: current_organization.colors["alert"] %>
158
+ </div>
159
+ </div>
160
+
161
+ <% if Decidim.enable_html_header_snippets %>
162
+ <div class="row column">
163
+ <%= form.text_area :header_snippets %>
164
+ <p class="help-text"><%= t(".header_snippets_help") %></p>
165
+ </div>
166
+ <% end %>
167
+ </div>
168
+ </div>
@@ -0,0 +1,19 @@
1
+ <%
2
+ handler_name = local_assigns[:handler_name]
3
+ schema = form.object.options_schema(handler_name)
4
+ attributes = form.object.options_attributes(handler_name)
5
+ %>
6
+
7
+ <%= form.fields_for(:authorization_handlers_options) do |options_form| %>
8
+ <%= options_form.fields_for(handler_name, schema) do |attribute_options_form| %>
9
+ <% attributes.each do |name, attribute| %>
10
+ <%= settings_attribute_input(
11
+ attribute_options_form,
12
+ attribute,
13
+ name,
14
+ label: t("authorization_handlers.#{handler_name}.fields.#{name}", scope: "decidim"),
15
+ tabs_prefix: "#{name}_tabs_prefix"
16
+ ) %>
17
+ <% end %>
18
+ <% end %>
19
+ <% end %>
@@ -0,0 +1,58 @@
1
+ <section id="components">
2
+ <div class="row">
3
+ <div class="columns">
4
+ <h3>
5
+ <%= t(".title") %>
6
+ <% if resource %>
7
+ -
8
+ <% if resource.is_a?(Decidim::Resourceable) %>
9
+ <%= link_to(resource_title(resource), resource_locator(resource).path) %>
10
+ <% else %>
11
+ <%= resource_title(resource) %>
12
+ <% end %>
13
+ <% end %>
14
+ </h3>
15
+ </div>
16
+ </div>
17
+ <%= form_for @permissions_form, url: url_for(action: :update, **resource_params), method: "put" do |permissions_form| %>
18
+ <%= permissions_form.fields_for :permissions, permissions_form.object do |action_permission_form| %>
19
+ <% action_permission_form.object.permissions.each do |action, permission| %>
20
+ <fieldset class="card <%= action %>-permission">
21
+ <% if @component %>
22
+ <div class="card-divider"><%= t("#{@component.manifest.name}.actions.#{action}", scope: "decidim.components") %></div>
23
+ <% else %>
24
+ <div class="card-divider"><%= t("#{resource.manifest.name}.actions.#{action}", scope: "decidim.resources") %></div>
25
+ <% end %>
26
+
27
+ <div class="card-section">
28
+ <%= action_permission_form.fields_for(action, permission) do |permission_form| %>
29
+ <%= permission_form.collection_check_boxes :authorization_handlers,
30
+ authorizations,
31
+ :name,
32
+ :description do |b| %>
33
+ <div>
34
+ <%= b.label { b.check_box + b.text } %>
35
+ <% if permission.authorization_handlers_names.include? b.value %>
36
+ <div id="authorization-handler-<%= b.value %>" class="authorization-handler">
37
+ <%= render "options_form", form: permission_form, handler_name: b.value %>
38
+ </div>
39
+ <% else %>
40
+ <% missing_permission = Decidim::Admin::PermissionForm.new(authorization_handlers: { b.value => {} }) %>
41
+ <%= action_permission_form.fields_for(action, missing_permission) do |missing_permission_form| %>
42
+ <div id="authorization-handler-<%= b.value %>" class="authorization-handler" style="display:none">
43
+ <%= render "options_form", form: missing_permission_form, handler_name: b.value %>
44
+ </div>
45
+ <% end %>
46
+ <% end %>
47
+ </div>
48
+ <% end %>
49
+ <% end %>
50
+ </div>
51
+ </fieldset>
52
+ <% end %>
53
+ <% end %>
54
+ <%= permissions_form.submit t(".submit") %>
55
+ <% end %>
56
+ </section>
57
+
58
+ <%= javascript_include_tag "decidim/admin/resources_permissions" %>
@@ -36,6 +36,7 @@ ar:
36
36
  organization_url: عنوان URL للمؤسسة
37
37
  redirect_uri: إعادة توجيه URI
38
38
  organization:
39
+ alert_color: تنبيه
39
40
  badges_enabled: تمكين الشارات
40
41
  cta_button_path: دعوة إلى العمل مسار زر
41
42
  cta_button_text: نص زر Call To Action
@@ -62,10 +63,15 @@ ar:
62
63
  omnipresent_banner_short_description: وصف قصير
63
64
  omnipresent_banner_title: عنوان
64
65
  omnipresent_banner_url: URL
66
+ primary_color: ابتدائي
65
67
  reference_prefix: بادئة المرجع
68
+ secondary_color: ثانوي
66
69
  show_statistics: عرض إحصائيات
70
+ success_color: نجاح
67
71
  tos_version: شروط وأحكام الخدمة
68
72
  twitter_handler: التغريد معالج
73
+ user_groups_enabled: تمكين المجموعات
74
+ warning_color: تحذير
69
75
  youtube_handler: معالج YouTube
70
76
  scope:
71
77
  code: الشفرة
@@ -101,10 +107,10 @@ ar:
101
107
  must_be_ssl: يجب أن يكون URI لإعادة التوجيه SSL URI
102
108
  organization:
103
109
  attributes:
104
- official_img_header:
105
- allowed_file_content_types: ملف صورة غير صالح
106
110
  official_img_footer:
107
111
  allowed_file_content_types: ملف صورة غير صالح
112
+ official_img_header:
113
+ allowed_file_content_types: ملف صورة غير صالح
108
114
  activerecord:
109
115
  attributes:
110
116
  decidim/static_page:
@@ -132,6 +138,7 @@ ar:
132
138
  verify: التحقق
133
139
  area_types:
134
140
  create:
141
+ error: حدثت مشكلة أثناء إنشاء نوع منطقة جديد.
135
142
  success: تم إنشاء نوع المنطقة بنجاح.
136
143
  destroy:
137
144
  success: نوع المنطقة دمرت بنجاح
@@ -142,9 +149,11 @@ ar:
142
149
  create: إنشاء نوع المنطقة
143
150
  title: نوع منطقة جديدة
144
151
  update:
152
+ error: حدثت مشكلة أثناء تحديث هذا النوع من المناطق.
145
153
  success: تم تحديث نوع المنطقة بنجاح
146
154
  areas:
147
155
  create:
156
+ error: كانت هناك مشكلة في إنشاء منطقة جديدة.
148
157
  success: تم إنشاء المنطقة بنجاح.
149
158
  destroy:
150
159
  success: تم تدمير المنطقة بنجاح
@@ -156,9 +165,11 @@ ar:
156
165
  title: منطقة جديدة
157
166
  no_areas: لا توجد مناطق
158
167
  update:
168
+ error: حدثت مشكلة أثناء تحديث هذا المجال.
159
169
  success: تم تحديث المنطقة بنجاح
160
170
  attachment_collections:
161
171
  create:
172
+ error: حدثت مشكلة أثناء إنشاء مجلد جديد.
162
173
  success: تم إنشاء المجلد بنجاح.
163
174
  destroy:
164
175
  success: تم تدمير المجلد بنجاح.
@@ -172,9 +183,11 @@ ar:
172
183
  create: خلق
173
184
  title: ملف جديد
174
185
  update:
186
+ error: حدثت مشكلة أثناء تحديث هذا المجلد.
175
187
  success: تم تحديث المجلد بنجاح.
176
188
  attachments:
177
189
  create:
190
+ error: حدثت مشكلة أثناء إنشاء مرفق جديد.
178
191
  success: تم إنشاء المرفق بنجاح.
179
192
  destroy:
180
193
  success: تم تدمير المرفق بنجاح.
@@ -187,14 +200,17 @@ ar:
187
200
  create: إنشاء مرفق
188
201
  title: مرفق جديد
189
202
  update:
203
+ error: حدثت مشكلة أثناء تحديث هذا المرفق.
190
204
  success: تم تحديث المرفق بنجاح.
191
205
  autocomplete:
192
206
  no_results: لا توجد نتائج
193
207
  search_prompt: اكتب ثلاثة أحرف على الأقل للبحث
194
208
  categories:
195
209
  create:
210
+ error: كانت هناك مشكلة في إنشاء هذه الفئة.
196
211
  success: تم إنشاء الفئة بنجاح.
197
212
  destroy:
213
+ error: حدثت مشكلة في حذف هذه الفئة. يرجى حذف أي فئة فرعية أولاً ، تأكد من عدم وجود كيان آخر ينتمي إلى هذه الفئة وحاول مرة أخرى.
198
214
  success: تم حذف الفئة بنجاح.
199
215
  edit:
200
216
  title: تحرير الفئة
@@ -206,14 +222,17 @@ ar:
206
222
  create: إنشاء فئة
207
223
  title: فئة جديدة
208
224
  update:
225
+ error: حدثت مشكلة أثناء تحديث هذه الفئة.
209
226
  success: تم تحديث الفئة بنجاح.
210
227
  component_permissions:
211
228
  update:
212
229
  success: تم تحديث الأذونات بنجاح.
213
230
  components:
214
231
  create:
232
+ error: حدثت مشكلة أثناء إنشاء هذا المكون.
215
233
  success: مكون تم إنشاؤه بنجاح.
216
234
  destroy:
235
+ error: حدثت مشكلة أثناء تدمير هذا المكون.
217
236
  success: تم حذف المكون بنجاح.
218
237
  edit:
219
238
  title: تحرير المكون
@@ -237,6 +256,7 @@ ar:
237
256
  unpublish:
238
257
  success: تم إلغاء نشر المكون بنجاح.
239
258
  update:
259
+ error: حدثت مشكلة أثناء تحديث هذا المكون.
240
260
  success: تم تحديث المكون بنجاح.
241
261
  dashboard:
242
262
  show:
@@ -246,6 +266,7 @@ ar:
246
266
  export_as: "%{name} ك %{export_format}"
247
267
  notice: التصدير الخاص بك قيد التقدم حاليًا. ستتلقى بريدًا إلكترونيًا عند اكتماله.
248
268
  help_sections:
269
+ error: حدثت مشكلة أثناء تحديث أقسام المساعدة
249
270
  form:
250
271
  save: حفظ
251
272
  success: تم تحديث أقسام المساعدة بنجاح
@@ -257,6 +278,7 @@ ar:
257
278
  not_managed: غير مُدار
258
279
  filter_by: مصنف بواسطة
259
280
  impersonate: انتحال
281
+ impersonate_new_managed_user: إدارة مشارك جديد
260
282
  managed: تمكن
261
283
  name: اسم
262
284
  needs_authorization_warning: تحتاج إلى تمكين تفويض واحد على الأقل لهذه المؤسسة.
@@ -267,19 +289,31 @@ ar:
267
289
  view_logs: عرض السجلات
268
290
  impersonations:
269
291
  close_session:
292
+ error: حدثت مشكلة أثناء إغلاق جلسة إدارة المشاركين الحالية.
270
293
  success: تم إنهاء جلسة التمثيل الحالية بنجاح.
294
+ create:
295
+ error: كانت هناك مشكلة في إدارة المشارك.
296
+ success: تم إنشاء المشارك المُدار بنجاح.
271
297
  form:
272
298
  authorization_method: طريقة التفويض
273
299
  name: اسم
274
300
  reason: السبب
275
301
  new:
276
302
  impersonate: انتحال
303
+ impersonate_existing_managed_user: إدارة المشارك "%{name}"
304
+ impersonate_existing_user: إدارة المشارك "%{name}"
305
+ impersonate_new_managed_user: إدارة مشارك جديد
277
306
  logs:
278
307
  logs_list:
279
308
  no_logs_yet: لا توجد سجلات حتى الآن
280
309
  managed_users:
310
+ promotion:
311
+ error: كانت هناك مشكلة في تعزيز المشارك المُدار.
312
+ success: تمت ترقية المشارك المُدار بنجاح.
281
313
  promotions:
282
314
  new:
315
+ explanation: يمكن ترقية المشاركين المدارين إلى مشاركين عاديين. يعني ذلك أنه سيتم دعوتهم إلى التطبيق ولن تتمكن من إدارته مرة أخرى. سيتلقى المشارك المدعو رسالة بريد إلكتروني لقبول دعوتك.
316
+ new_managed_user_promotion: ترويج مشارك جديد مُدار
283
317
  promote: تروج \ يشجع \ يعزز \ ينمى \ يطور
284
318
  menu:
285
319
  admin_log: سجل نشاط المسؤول
@@ -299,7 +333,8 @@ ar:
299
333
  scopes: نطاقات
300
334
  settings: الإعدادات
301
335
  static_pages: صفحات
302
- users: المستخدمون
336
+ user_groups: المجموعات
337
+ users: المشاركون
303
338
  models:
304
339
  area:
305
340
  fields:
@@ -327,7 +362,7 @@ ar:
327
362
  expired_at: انتهت في
328
363
  reason: السبب
329
364
  started_at: بدأت في
330
- user: المستخدم
365
+ user: مشارك
331
366
  newsletter:
332
367
  fields:
333
368
  created_at: أنشئت في
@@ -340,6 +375,8 @@ ar:
340
375
  created_at: أنشئت في
341
376
  name: اسم
342
377
  name: تطبيق OAuth
378
+ participatory_space_private_user:
379
+ name: المشاركة الفضاء المشارك الخاص
343
380
  scope:
344
381
  fields:
345
382
  name: اسم
@@ -361,6 +398,8 @@ ar:
361
398
  role: وظيفة
362
399
  roles:
363
400
  admin: مشرف
401
+ user_manager: مدير مشارك
402
+ name: مشارك
364
403
  user_group:
365
404
  fields:
366
405
  actions: أفعال
@@ -369,6 +408,7 @@ ar:
369
408
  name: اسم
370
409
  phone: هاتف
371
410
  state: حالة
411
+ users_count: عدد المشاركين
372
412
  moderations:
373
413
  index:
374
414
  title: الإعتدال
@@ -379,8 +419,10 @@ ar:
379
419
  spam: بريد مؤذي
380
420
  newsletters:
381
421
  create:
422
+ error: كانت هناك مشكلة في إنشاء هذه الرسالة الإخبارية.
382
423
  success: تم إنشاء النشرة الإخبارية بنجاح. من فضلك ، قم بمراجعته قبل الإرسال.
383
424
  deliver:
425
+ error: كانت هناك مشكلة في توصيل هذه الرسالة الإخبارية.
384
426
  success: تم تسليم النشرة الإخبارية بنجاح.
385
427
  destroy:
386
428
  error_already_sent: 'لا يمكن تدمير الرسالة الإخبارية: لقد تم إرسالها بالفعل.'
@@ -402,11 +444,14 @@ ar:
402
444
  preview: معاينة
403
445
  subject: الموضوع
404
446
  update:
447
+ error: حدثت مشكلة أثناء تحديث هذه الرسالة الإخبارية.
405
448
  success: تم تحديث النشرة الإخبارية بنجاح. يرجى مراجعته قبل الإرسال.
406
449
  oauth_applications:
407
450
  create:
451
+ error: حدثت مشكلة أثناء إنشاء هذا التطبيق.
408
452
  success: تم إنشاء التطبيق بنجاح.
409
453
  destroy:
454
+ error: حدثت مشكلة أثناء تدمير هذا التطبيق.
410
455
  success: تم تدمير التطبيق بنجاح.
411
456
  edit:
412
457
  save: حفظ
@@ -418,8 +463,13 @@ ar:
418
463
  save: حفظ
419
464
  title: تطبيق جديد
420
465
  update:
466
+ error: حدثت مشكلة أثناء تحديث هذا التطبيق.
421
467
  success: تم تحديث التطبيق بنجاح.
422
468
  officializations:
469
+ create:
470
+ success: مشارك رسمي بنجاح
471
+ destroy:
472
+ success: مشارك غير رسمي بنجاح
423
473
  index:
424
474
  actions: أفعال
425
475
  badge: شارة
@@ -441,6 +491,7 @@ ar:
441
491
  new:
442
492
  badge: شارة رسمية
443
493
  officialize: الصفة الرسمية
494
+ title: إضفاء الطابع الرسمي على المشارك "%{name}"
444
495
  organization:
445
496
  edit:
446
497
  title: تحرير المنظمة
@@ -454,11 +505,13 @@ ar:
454
505
  url: رابط
455
506
  youtube: يوتيوب
456
507
  update:
508
+ error: حدثت مشكلة أثناء تحديث هذه المؤسسة.
457
509
  success: تم تحديث المنظمة بنجاح.
458
510
  organization_appearance:
459
511
  edit:
460
512
  update: تحديث
461
513
  form:
514
+ colors_title: ألوان المنظمة
462
515
  cta_button_path_help: 'يمكنك الكتابة فوق المكان الذي يرتبط به زر Call To Action في الصفحة الرئيسية. استخدم المسارات الجزئية ، وليس عناوين URL الكاملة هنا. يقبل الحروف والأرقام والشرطات والمائلة ، ويجب أن يبدأ بحرف. يظهر زر Call To Action في الصفحة الرئيسية بين نص الترحيب والوصف. مثال: %{url}'
463
516
  cta_button_text_help: يمكنك الكتابة فوق نص زر Call To Action في الصفحة الرئيسية لكل لغة متاحة في مؤسستك. إذا لم يتم تعيينها ، سيتم استخدام القيمة الافتراضية. يظهر زر Call To Action في الصفحة الرئيسية بين نص الترحيب والوصف.
464
517
  header_snippets_help: استخدم هذا الحقل لإضافة أشياء إلى رأس HTML. الاستخدام الأكثر شيوعًا هو دمج خدمات الجهات الخارجية التي تتطلب بعض JavaScript أو CSS إضافية. أيضًا ، يمكنك استخدامه لإضافة علامات وصفية إضافية إلى HTML. لاحظ أنه سيتم عرض هذا فقط في الصفحات العامة ، وليس في قسم المسؤول.
@@ -474,10 +527,25 @@ ar:
474
527
  edit:
475
528
  update: تحديث
476
529
  participatory_space_private_users:
530
+ create:
531
+ error: حدثت مشكلة أثناء إضافة مشارك خاص لهذه المساحة التشاركية.
532
+ success: المشاركة الفضاء الفضاء المشترك وصول خلق بنجاح.
533
+ destroy:
534
+ error: حدثت مشكلة في حذف مشارك خاص لهذه المساحة التشاركية.
535
+ success: المشاركة الفضاء الفضاء وصول المشاركين دمرت بنجاح.
536
+ index:
537
+ title: المشاركة الفضاء المشارك الخاص
477
538
  new:
478
539
  create: خلق
540
+ title: مشارك جديد الفضاء الخاص المشارك.
541
+ resource_permissions:
542
+ edit:
543
+ submit: خضع
544
+ update:
545
+ success: تم تحديث الأذونات بنجاح.
479
546
  scope_types:
480
547
  create:
548
+ error: حدثت مشكلة أثناء إنشاء نوع نطاق جديد.
481
549
  success: تم إنشاء نوع النطاق بنجاح.
482
550
  destroy:
483
551
  success: نوع النطاق دمرت بنجاح
@@ -488,9 +556,11 @@ ar:
488
556
  create: إنشاء نوع النطاق
489
557
  title: نطاق جديد
490
558
  update:
559
+ error: حدثت مشكلة أثناء تحديث نوع النطاق هذا.
491
560
  success: تم تحديث نوع النطاق بنجاح
492
561
  scopes:
493
562
  create:
563
+ error: كانت هناك مشكلة في إنشاء نطاق جديد.
494
564
  success: تم إنشاء النطاق بنجاح.
495
565
  destroy:
496
566
  success: نطاق دمرت بنجاح
@@ -502,9 +572,11 @@ ar:
502
572
  title: نطاق جديد
503
573
  no_scopes: لا نطاقات على هذا المستوى.
504
574
  update:
575
+ error: حدثت مشكلة أثناء تحديث هذا النطاق.
505
576
  success: تم تحديث النطاق بنجاح
506
577
  static_page_topics:
507
578
  create:
579
+ error: كانت هناك مشكلة في إنشاء موضوع جديد.
508
580
  success: تم إنشاء الموضوع بنجاح.
509
581
  destroy:
510
582
  success: الموضوع دمر بنجاح
@@ -515,15 +587,18 @@ ar:
515
587
  create: خلق الموضوع
516
588
  title: موضوع جديد
517
589
  update:
590
+ error: حدثت مشكلة أثناء تحديث هذا الموضوع.
518
591
  success: تم تحديث الموضوع بنجاح
519
592
  static_pages:
520
593
  actions:
521
594
  view: عرض الصفحة العامة
522
595
  create:
596
+ error: كانت هناك مشكلة في إنشاء صفحة جديدة.
523
597
  success: تم إنشاء الصفحة بنجاح.
524
598
  destroy:
525
599
  success: تم تدمير الصفحة بنجاح
526
600
  edit:
601
+ changed_notably_help: في حالة تحديده ، سيتم إخطار المشاركين بقبول البنود والشروط الجديدة.
527
602
  title: تعديل الصفحة
528
603
  update: تحديث
529
604
  form:
@@ -539,6 +614,7 @@ ar:
539
614
  empty: لا توجد صفحة تحت هذا الموضوع
540
615
  without_topic: صفحات بدون موضوع
541
616
  update:
617
+ error: حدثت مشكلة أثناء تحديث هذه الصفحة.
542
618
  success: تم تحديث الصفحة بنجاح
543
619
  titles:
544
620
  admin_log: سجل المسؤول
@@ -546,12 +622,24 @@ ar:
546
622
  areas: المناطق
547
623
  authorization_workflows: طرق التحقق
548
624
  dashboard: لوحة القيادة
549
- impersonations: التقليد
625
+ impersonatable_users: المشاركون في الإدارة
626
+ impersonations: إدارة المشاركين
550
627
  participants: المشاركين
551
628
  scope_types: أنواع النطاق
552
629
  scopes: نطاقات
553
630
  static_pages: صفحات
554
- users: المستخدمون
631
+ user_groups: المجموعات
632
+ users: المشاركين
633
+ user_group:
634
+ csv_verify:
635
+ invalid: حدثت مشكلة في قراءة ملف CSV.
636
+ success: تم تحميل ملف CSV بنجاح ، نحن نتحقق من مطابقة المجموعات للمعايير. وهذا قد يستغرق بعض الوقت.
637
+ reject:
638
+ invalid: حدثت مشكلة في رفض هذه المجموعة.
639
+ success: تم رفض المجموعة بنجاح
640
+ verify:
641
+ invalid: حدثت مشكلة أثناء التحقق من هذه المجموعة.
642
+ success: تم التحقق من المجموعة بنجاح
555
643
  user_groups:
556
644
  index:
557
645
  filter:
@@ -568,28 +656,46 @@ ar:
568
656
  verify_via_csv: تحقق عبر CSV
569
657
  user_groups_csv_verifications:
570
658
  new:
659
+ explanation: قم بتحميل ملف CSV الخاص بك. يجب أن يحتوي على رسائل البريد الإلكتروني الرسمية للمجموعات في مؤسستك في العمود الأول من الملف ، بدون رؤوس. سيتم التحقق من صحة المجموعات التي أكدت بريدها الإلكتروني والتي تحتوي على بريد إلكتروني ظاهر في ملف CSV.
571
660
  title: قم بتحميل ملف CSV الخاص بك
572
661
  upload: رفع
573
662
  users:
663
+ create:
664
+ error: كانت هناك مشكلة في دعوة هذا المشرف.
665
+ success: تمت دعوة المشارك بنجاح.
666
+ destroy:
667
+ error: حدثت مشكلة أثناء محاولة حذف هذا المشرف.
668
+ success: المشارك لم يعد مسؤول.
574
669
  form:
575
670
  email: البريد الإلكتروني
576
671
  name: اسم
577
672
  role: وظيفة
578
673
  new:
579
674
  create: دعا
675
+ title: دعوة مشارك كمسؤول
580
676
  view_public_page: عرض الصفحة العامة
677
+ forms:
678
+ errors:
679
+ impersonate_user:
680
+ reason: تحتاج إلى تقديم سبب عند إدارة مشارك غير مُدار
581
681
  moderations:
582
682
  actions:
583
683
  hidden: مخفي
584
684
  hide: إخفاء
585
685
  not_hidden: غير مخفي
586
686
  title: أفعال
687
+ unhide: إظهار
587
688
  unreport: Unreport
588
689
  admin:
589
690
  reportable:
590
691
  hide:
692
+ invalid: حدثت مشكلة في إخفاء المورد.
591
693
  success: الموارد خفية بنجاح.
694
+ unhide:
695
+ invalid: حدثت مشكلة أثناء إخفاء المورد.
696
+ success: المورد غير مخفي بنجاح.
592
697
  unreport:
698
+ invalid: حدثت مشكلة أثناء الإبلاغ عن المورد.
593
699
  success: المورد لم يتم الإبلاغ عنه بنجاح.
594
700
  models:
595
701
  moderation:
@@ -611,4 +717,4 @@ ar:
611
717
  settings:
612
718
  title: الإعدادات
613
719
  users:
614
- title: المستخدمون
720
+ title: المشاركين