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.
- checksums.yaml +4 -4
- data/app/assets/config/decidim_admin_manifest.js +1 -1
- data/app/assets/javascripts/decidim/admin/bundle.js +17 -17
- data/app/assets/javascripts/decidim/admin/bundle.js.map +1 -1
- data/app/assets/javascripts/decidim/admin/resources_permissions.js.es6 +13 -0
- data/app/assets/javascripts/decidim/admin/subform_multi_toggler.component.js.es6 +43 -0
- data/app/assets/stylesheets/decidim/admin/bundle.scss +2 -1
- data/app/commands/decidim/admin/unhide_resource.rb +49 -0
- data/app/commands/decidim/admin/unreport_resource.rb +1 -1
- data/app/commands/decidim/admin/update_component_permissions.rb +14 -4
- data/app/commands/decidim/admin/update_organization_appearance.rb +13 -0
- data/app/commands/decidim/admin/update_resource_permissions.rb +67 -0
- data/app/controllers/decidim/admin/component_permissions_controller.rb +4 -37
- data/app/controllers/decidim/admin/components/base_controller.rb +4 -1
- data/app/controllers/decidim/admin/moderations_controller.rb +16 -0
- data/app/controllers/decidim/admin/resource_permissions_controller.rb +104 -0
- data/app/events/decidim/attachment_created_event.rb +1 -1
- data/app/forms/decidim/admin/organization_appearance_form.rb +6 -0
- data/app/forms/decidim/admin/permission_form.rb +24 -10
- data/app/helpers/decidim/admin/resource_permissions_helper.rb +14 -0
- data/app/permissions/decidim/admin/permissions.rb +8 -10
- data/app/views/decidim/admin/moderations/index.html.erb +8 -1
- data/app/views/decidim/admin/organization_appearance/_form.html.erb +40 -0
- data/app/views/decidim/admin/resource_permissions/_options_form.html.erb +19 -0
- data/app/views/decidim/admin/resource_permissions/edit.html.erb +58 -0
- data/config/locales/ar-SA.yml +113 -7
- data/config/locales/ca.yml +70 -58
- data/config/locales/cs-CZ.yml +18 -6
- data/config/locales/cs.yml +721 -0
- data/config/locales/de.yml +20 -8
- data/config/locales/en.yml +98 -85
- data/config/locales/es-MX.yml +20 -8
- data/config/locales/es-PY.yml +20 -8
- data/config/locales/es.yml +76 -64
- data/config/locales/eu.yml +20 -8
- data/config/locales/fi-pl.yml +18 -6
- data/config/locales/fi-plain.yml +721 -0
- data/config/locales/fi.yml +76 -64
- data/config/locales/fr.yml +20 -8
- data/config/locales/gl.yml +20 -8
- data/config/locales/hu.yml +20 -8
- data/config/locales/id-ID.yml +20 -8
- data/config/locales/it.yml +20 -8
- data/config/locales/nl.yml +20 -8
- data/config/locales/pl.yml +20 -8
- data/config/locales/pt-BR.yml +20 -8
- data/config/locales/pt.yml +20 -8
- data/config/locales/ru.yml +3 -6
- data/config/locales/sv.yml +20 -8
- data/config/locales/tr-TR.yml +20 -8
- data/config/locales/uk.yml +3 -6
- data/lib/decidim/admin/test/manage_component_permissions_examples.rb +148 -38
- data/lib/decidim/admin/version.rb +1 -1
- metadata +17 -11
- data/app/assets/javascripts/decidim/admin/component_permissions.js.es6 +0 -13
- data/app/views/decidim/admin/component_permissions/_options_form.html.erb +0 -14
- 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
|
@@ -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 :
|
8
|
-
attribute :
|
7
|
+
attribute :authorization_handlers, Hash
|
8
|
+
attribute :authorization_handlers_options, Hash
|
9
9
|
|
10
|
-
def
|
11
|
-
|
10
|
+
def authorization_handlers_names
|
11
|
+
authorization_handlers.keys.map(&:to_s)
|
12
12
|
end
|
13
13
|
|
14
|
-
def
|
15
|
-
|
14
|
+
def authorization_handler_options(handler_name)
|
15
|
+
find_handler(handler_name)[:options]
|
16
16
|
end
|
17
17
|
|
18
|
-
def
|
19
|
-
|
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
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
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" %>
|
data/config/locales/ar-SA.yml
CHANGED
@@ -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
|
-
|
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
|
-
|
625
|
+
impersonatable_users: المشاركون في الإدارة
|
626
|
+
impersonations: إدارة المشاركين
|
550
627
|
participants: المشاركين
|
551
628
|
scope_types: أنواع النطاق
|
552
629
|
scopes: نطاقات
|
553
630
|
static_pages: صفحات
|
554
|
-
|
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: المشاركين
|