decidim-admin 0.16.1 → 0.17.0

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

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: المشاركين