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