avo 2.27.2.pre.pr1606 → 2.28.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of avo might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/Gemfile.lock +16 -16
- data/README.md +23 -9
- data/app/components/avo/fields/common/single_file_viewer_component.html.erb +2 -2
- data/app/components/avo/fields/common/single_file_viewer_component.rb +3 -2
- data/app/components/avo/fields/file_field/edit_component.html.erb +3 -1
- data/app/components/avo/fields/file_field/edit_component.rb +1 -0
- data/app/components/avo/fields/files_field/edit_component.html.erb +3 -1
- data/app/components/avo/fields/files_field/edit_component.rb +1 -0
- data/app/controllers/avo/application_controller.rb +1 -1
- data/app/controllers/avo/attachments_controller.rb +10 -0
- data/lib/avo/fields/belongs_to_field.rb +5 -0
- data/lib/avo/fields/concerns/file_authorization.rb +31 -0
- data/lib/avo/fields/concerns/use_resource.rb +13 -0
- data/lib/avo/fields/has_base_field.rb +2 -4
- data/lib/avo/fields/tags_field.rb +11 -0
- data/lib/avo/version.rb +1 -1
- data/lib/generators/avo/templates/locales/avo.ar.yml +126 -0
- data/public/avo-assets/avo.base.js +98 -98
- data/public/avo-assets/avo.base.js.map +2 -2
- metadata +7 -5
- data/config/master.key +0 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 793c8545f234434ece6d95719bbc92501755c47c27515996bae6bd47c8668da8
|
4
|
+
data.tar.gz: 528f58dc08e61cdcb2d9d2bcc48b9341793c47d44fdc7b71c9999318aef845d0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 90c629713202b14315db0975c1ebe5cc34c2c5f8f9c9e2509f9d6f05da199ee8b645cc55cc4da6f8a78c4197c59b3c5207b4d00432516698fa068f9490bfb5d8
|
7
|
+
data.tar.gz: ea1c21161d42a030d788a0cc3d92dccf5c551de9f466c2cc830a5035d9d1601fc2aee8ec83f7a1c1583060b01236b9adfad3433cd3512a7c04be7768cee3eeb5
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
avo (2.
|
4
|
+
avo (2.28.0)
|
5
5
|
actionview (>= 6.0)
|
6
6
|
active_link_to
|
7
7
|
activerecord (>= 6.0)
|
@@ -85,7 +85,7 @@ GEM
|
|
85
85
|
zeitwerk (~> 2.3)
|
86
86
|
acts-as-taggable-on (9.0.1)
|
87
87
|
activerecord (>= 6.0, < 7.1)
|
88
|
-
acts_as_list (1.0
|
88
|
+
acts_as_list (1.1.0)
|
89
89
|
activerecord (>= 4.2)
|
90
90
|
addressable (2.8.1)
|
91
91
|
public_suffix (>= 2.0.2, < 6.0)
|
@@ -124,7 +124,7 @@ GEM
|
|
124
124
|
parser (>= 2.4)
|
125
125
|
smart_properties
|
126
126
|
bindex (0.8.1)
|
127
|
-
bootsnap (1.
|
127
|
+
bootsnap (1.16.0)
|
128
128
|
msgpack (~> 1.2)
|
129
129
|
brakeman (5.4.0)
|
130
130
|
builder (3.2.4)
|
@@ -141,6 +141,7 @@ GEM
|
|
141
141
|
regexp_parser (>= 1.5, < 3.0)
|
142
142
|
xpath (~> 3.2)
|
143
143
|
chartkick (4.2.1)
|
144
|
+
childprocess (4.1.0)
|
144
145
|
concurrent-ruby (1.2.0)
|
145
146
|
countries (4.2.3)
|
146
147
|
i18n_data (~> 0.16.0)
|
@@ -157,7 +158,7 @@ GEM
|
|
157
158
|
database_cleaner-core (~> 2.0.0)
|
158
159
|
database_cleaner-core (2.0.1)
|
159
160
|
date (3.3.3)
|
160
|
-
devise (4.
|
161
|
+
devise (4.9.0)
|
161
162
|
bcrypt (~> 3.0)
|
162
163
|
orm_adapter (~> 0.1)
|
163
164
|
railties (>= 4.1.0)
|
@@ -254,7 +255,7 @@ GEM
|
|
254
255
|
mini_magick (4.12.0)
|
255
256
|
mini_mime (1.1.2)
|
256
257
|
mini_portile2 (2.8.1)
|
257
|
-
minitest (5.
|
258
|
+
minitest (5.18.0)
|
258
259
|
msgpack (1.5.6)
|
259
260
|
multi_xml (0.6.0)
|
260
261
|
net-imap (0.3.4)
|
@@ -267,18 +268,18 @@ GEM
|
|
267
268
|
net-smtp (0.3.3)
|
268
269
|
net-protocol
|
269
270
|
nio4r (2.5.8)
|
270
|
-
nokogiri (1.
|
271
|
+
nokogiri (1.13.10)
|
271
272
|
mini_portile2 (~> 2.8.0)
|
272
273
|
racc (~> 1.4)
|
273
|
-
nokogiri (1.
|
274
|
+
nokogiri (1.13.10-x86_64-linux)
|
274
275
|
racc (~> 1.4)
|
275
276
|
orm_adapter (0.5.0)
|
276
277
|
pagy (6.0.2)
|
277
278
|
parallel (1.22.1)
|
278
279
|
parser (3.2.0.0)
|
279
280
|
ast (~> 2.4.1)
|
280
|
-
pg (1.4.
|
281
|
-
prefixed_ids (1.
|
281
|
+
pg (1.4.6)
|
282
|
+
prefixed_ids (1.4.0)
|
282
283
|
hashids (>= 1.0.0, < 2.0.0)
|
283
284
|
rails (>= 6.0.0)
|
284
285
|
public_suffix (5.0.1)
|
@@ -287,7 +288,7 @@ GEM
|
|
287
288
|
pundit (2.2.0)
|
288
289
|
activesupport (>= 3.0.0)
|
289
290
|
racc (1.6.2)
|
290
|
-
rack (2.2.6.
|
291
|
+
rack (2.2.6.3)
|
291
292
|
rack-test (2.0.2)
|
292
293
|
rack (>= 1.3)
|
293
294
|
rails (6.1.7.2)
|
@@ -332,7 +333,7 @@ GEM
|
|
332
333
|
rb-fsevent (0.11.1)
|
333
334
|
rb-inotify (0.10.1)
|
334
335
|
ffi (~> 1.0)
|
335
|
-
redis (4.8.
|
336
|
+
redis (4.8.1)
|
336
337
|
regexp_parser (2.7.0)
|
337
338
|
responders (3.0.1)
|
338
339
|
actionpack (>= 5.0)
|
@@ -378,10 +379,10 @@ GEM
|
|
378
379
|
ruby-vips (2.1.4)
|
379
380
|
ffi (~> 1.12)
|
380
381
|
rubyzip (2.3.2)
|
381
|
-
selenium-webdriver (4.
|
382
|
+
selenium-webdriver (4.1.0)
|
383
|
+
childprocess (>= 0.5, < 5.0)
|
382
384
|
rexml (~> 3.2, >= 3.2.5)
|
383
|
-
rubyzip (>= 1.2.2
|
384
|
-
websocket (~> 1.0)
|
385
|
+
rubyzip (>= 1.2.2)
|
385
386
|
simple_po_parser (1.1.6)
|
386
387
|
simplecov (0.22.0)
|
387
388
|
docile (~> 1.1)
|
@@ -412,7 +413,7 @@ GEM
|
|
412
413
|
test-prof (1.0.10)
|
413
414
|
thor (1.2.1)
|
414
415
|
timeout (0.3.0)
|
415
|
-
turbo-rails (1.
|
416
|
+
turbo-rails (1.4.0)
|
416
417
|
actionpack (>= 6.0.0)
|
417
418
|
activejob (>= 6.0.0)
|
418
419
|
railties (>= 6.0.0)
|
@@ -438,7 +439,6 @@ GEM
|
|
438
439
|
addressable (>= 2.8.0)
|
439
440
|
crack (>= 0.3.2)
|
440
441
|
hashdiff (>= 0.4.0, < 2.0.0)
|
441
|
-
websocket (1.2.9)
|
442
442
|
websocket-driver (0.7.5)
|
443
443
|
websocket-extensions (>= 0.1.0)
|
444
444
|
websocket-extensions (0.1.5)
|
data/README.md
CHANGED
@@ -72,19 +72,33 @@ Please read the [RELEASE.MD](./RELEASE.MD)
|
|
72
72
|
|
73
73
|
# ✨ [Contributors](https://avohq.io/contributors)
|
74
74
|
|
75
|
-
<a href="https://
|
75
|
+
<a href="https://avohq.io/contributors">
|
76
76
|
<img src="https://contrib.rocks/image?repo=avo-hq/avo" />
|
77
77
|
</a>
|
78
78
|
<!-- https://contrib.rocks -->
|
79
79
|
|
80
|
-
# 🥇
|
81
|
-
|
82
|
-
<
|
83
|
-
|
84
|
-
|
85
|
-
<
|
86
|
-
|
87
|
-
|
80
|
+
# 🥇 Sponsors
|
81
|
+
|
82
|
+
<table>
|
83
|
+
<tr>
|
84
|
+
<td>
|
85
|
+
<a href="https://equipetechnique.com/?utm_source=github&utm_medium=link&utm_campaign=avo" target="_blank">
|
86
|
+
<picture>
|
87
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://avohq.io/img/sponsors/ET-dark.jpeg">
|
88
|
+
<img alt="Equipe Technique Busines Sponsor" src="https://avohq.io/img/sponsors/ET-light.jpeg" width="180px">
|
89
|
+
</picture>
|
90
|
+
</a>
|
91
|
+
</td>
|
92
|
+
<td>
|
93
|
+
<a href="https://www.greenhats.com/?utm_source=github&utm_medium=link&utm_campaign=avo" target="_blank">
|
94
|
+
<picture>
|
95
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://avohq.io/img/sponsors/greenhats-dark.png">
|
96
|
+
<img alt="Greenhats Start-up Sponsor" src="https://avohq.io/img/sponsors/greenhats-light.png" width="360px">
|
97
|
+
</picture>
|
98
|
+
</a>
|
99
|
+
</td>
|
100
|
+
</tr>
|
101
|
+
</table>
|
88
102
|
|
89
103
|
[Become a sponsor ](https://github.com/sponsors/adrianthedev)
|
90
104
|
|
@@ -20,7 +20,7 @@
|
|
20
20
|
</div>
|
21
21
|
<div class="flex space-x-2">
|
22
22
|
<div class="flex">
|
23
|
-
<% if
|
23
|
+
<% if can_download_file? %>
|
24
24
|
<%= a_link Rails.application.routes.url_helpers.rails_blob_path(file, only_path: true, disposition: :attachment),
|
25
25
|
icon: 'heroicons/outline/download',
|
26
26
|
color: :primary,
|
@@ -33,7 +33,7 @@
|
|
33
33
|
<% end %>
|
34
34
|
</div>
|
35
35
|
<div>
|
36
|
-
<% if
|
36
|
+
<% if can_delete_file? %>
|
37
37
|
<%= a_link destroy_path,
|
38
38
|
icon: 'heroicons/outline/trash',
|
39
39
|
color: :red,
|
@@ -2,8 +2,9 @@
|
|
2
2
|
|
3
3
|
class Avo::Fields::Common::SingleFileViewerComponent < ViewComponent::Base
|
4
4
|
include Avo::ApplicationHelper
|
5
|
+
include Avo::Fields::Concerns::FileAuthorization
|
5
6
|
|
6
|
-
def initialize(
|
7
|
+
def initialize(field:, resource:, file: nil)
|
7
8
|
@file = file
|
8
9
|
@field = field
|
9
10
|
@resource = resource
|
@@ -45,7 +46,7 @@ class Avo::Fields::Common::SingleFileViewerComponent < ViewComponent::Base
|
|
45
46
|
record_persisted?
|
46
47
|
end
|
47
48
|
|
48
|
-
|
49
|
+
# If model is not persistent blob is automatically destroyed otherwise it can be "lost" on storage
|
49
50
|
def record_persisted?
|
50
51
|
return true if @resource.model.persisted?
|
51
52
|
|
@@ -5,7 +5,7 @@
|
|
5
5
|
</div>
|
6
6
|
<% end %>
|
7
7
|
|
8
|
-
<% if
|
8
|
+
<% if can_upload_file? %>
|
9
9
|
<%= @form.file_field @field.id,
|
10
10
|
accept: @field.accept,
|
11
11
|
data: @field.get_html(:data, view: view, element: :input),
|
@@ -14,5 +14,7 @@
|
|
14
14
|
style: @field.get_html(:style, view: view, element: :input),
|
15
15
|
class: "w-full"
|
16
16
|
%>
|
17
|
+
<% else %>
|
18
|
+
—
|
17
19
|
<% end %>
|
18
20
|
<% end %>
|
@@ -1,7 +1,7 @@
|
|
1
1
|
<%= field_wrapper **field_wrapper_args, full_width: true do %>
|
2
2
|
<%= render Avo::Fields::Common::FilesListViewerComponent.new(field: @field, resource: @resource) if @field.value.present? %>
|
3
3
|
|
4
|
-
<% if
|
4
|
+
<% if can_upload_file? %>
|
5
5
|
<div class="mt-2">
|
6
6
|
<%= @form.file_field @field.id,
|
7
7
|
accept: @field.accept,
|
@@ -13,5 +13,7 @@
|
|
13
13
|
class: "w-full"
|
14
14
|
%>
|
15
15
|
</div>
|
16
|
+
<% else %>
|
17
|
+
—
|
16
18
|
<% end %>
|
17
19
|
<% end %>
|
@@ -18,8 +18,8 @@ module Avo
|
|
18
18
|
before_action :init_app
|
19
19
|
before_action :check_avo_license
|
20
20
|
before_action :set_resource_name
|
21
|
-
before_action :set_authorization
|
22
21
|
before_action :_authenticate!
|
22
|
+
before_action :set_authorization
|
23
23
|
before_action :set_container_classes
|
24
24
|
before_action :add_initial_breadcrumbs
|
25
25
|
before_action :set_view
|
@@ -23,6 +23,8 @@ module Avo
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def destroy
|
26
|
+
raise Avo::NotAuthorizedError.new unless authorized_to :delete
|
27
|
+
|
26
28
|
attachment = ActiveStorage::Attachment.find(params[:attachment_id])
|
27
29
|
path = resource_path(model: @model, resource: @resource)
|
28
30
|
|
@@ -34,5 +36,13 @@ module Avo
|
|
34
36
|
redirect_back fallback_location: path, notice: t("avo.failed_to_find_attachment")
|
35
37
|
end
|
36
38
|
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def authorized_to(action)
|
43
|
+
if @resource.authorization.authorize_action("#{action}_attachments?".to_sym, raise_exception: false)
|
44
|
+
@resource.authorization.authorize_action("#{action}_#{params[:attachment_name]}?", record: @model, raise_exception: false)
|
45
|
+
end
|
46
|
+
end
|
37
47
|
end
|
38
48
|
end
|
@@ -57,6 +57,8 @@ module Avo
|
|
57
57
|
# - is_disabled?
|
58
58
|
|
59
59
|
class BelongsToField < BaseField
|
60
|
+
include Avo::Fields::Concerns::UseResource
|
61
|
+
|
60
62
|
attr_accessor :target
|
61
63
|
|
62
64
|
attr_reader :polymorphic_as
|
@@ -79,6 +81,7 @@ module Avo
|
|
79
81
|
@attach_scope = args[:attach_scope]
|
80
82
|
@polymorphic_help = args[:polymorphic_help]
|
81
83
|
@target = args[:target]
|
84
|
+
@use_resource = args[:use_resource] || nil
|
82
85
|
end
|
83
86
|
|
84
87
|
def searchable
|
@@ -222,6 +225,8 @@ module Avo
|
|
222
225
|
end
|
223
226
|
|
224
227
|
def target_resource
|
228
|
+
return use_resource if use_resource.present?
|
229
|
+
|
225
230
|
if is_polymorphic?
|
226
231
|
if value.present?
|
227
232
|
return App.get_resource_by_model_name(value.class)
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Avo
|
2
|
+
module Fields
|
3
|
+
module Concerns
|
4
|
+
module FileAuthorization
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
delegate :authorization, to: :@resource
|
8
|
+
delegate :authorize_action, to: :authorization
|
9
|
+
delegate :id, :model, to: :@field
|
10
|
+
|
11
|
+
def can_upload_file?
|
12
|
+
authorize_file_action(:upload)
|
13
|
+
end
|
14
|
+
|
15
|
+
def can_delete_file?
|
16
|
+
authorize_file_action(:delete)
|
17
|
+
end
|
18
|
+
|
19
|
+
def can_download_file?
|
20
|
+
authorize_file_action(:download)
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def authorize_file_action(action)
|
26
|
+
authorize_action("#{action}_attachments?", raise_exception: false) || authorize_action("#{action}_#{id}?", record: model, raise_exception: false)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -1,6 +1,8 @@
|
|
1
1
|
module Avo
|
2
2
|
module Fields
|
3
3
|
class HasBaseField < BaseField
|
4
|
+
include Avo::Fields::Concerns::UseResource
|
5
|
+
|
4
6
|
attr_accessor :display
|
5
7
|
attr_accessor :scope
|
6
8
|
attr_accessor :attach_scope
|
@@ -27,10 +29,6 @@ module Avo
|
|
27
29
|
@searchable && ::Avo::App.license.has_with_trial(:searchable_associations)
|
28
30
|
end
|
29
31
|
|
30
|
-
def use_resource
|
31
|
-
App.get_resource @use_resource
|
32
|
-
end
|
33
|
-
|
34
32
|
def resource
|
35
33
|
@resource || Avo::App.get_resource_by_model_name(@model.class)
|
36
34
|
end
|
@@ -18,9 +18,12 @@ module Avo
|
|
18
18
|
add_array_prop args, :suggestions
|
19
19
|
add_string_prop args, :mode, nil
|
20
20
|
add_string_prop args, :fetch_values_from
|
21
|
+
add_string_prop args, :fetch_labels
|
21
22
|
end
|
22
23
|
|
23
24
|
def field_value
|
25
|
+
return fetched_labels if @fetch_labels.present?
|
26
|
+
|
24
27
|
return json_value if acts_as_taggable_on.present?
|
25
28
|
|
26
29
|
value || []
|
@@ -81,6 +84,14 @@ module Avo
|
|
81
84
|
|
82
85
|
private
|
83
86
|
|
87
|
+
def fetched_labels
|
88
|
+
if @fetch_labels.respond_to?(:call)
|
89
|
+
Avo::Hosts::ResourceRecordHost.new(block: @fetch_labels, resource: resource, record: model).handle
|
90
|
+
else
|
91
|
+
@fetch_labels
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
84
95
|
def act_as_taggable_attribute(key)
|
85
96
|
"#{key.singularize}_list="
|
86
97
|
end
|
data/lib/avo/version.rb
CHANGED
@@ -0,0 +1,126 @@
|
|
1
|
+
---
|
2
|
+
ar:
|
3
|
+
avo:
|
4
|
+
action_ran_successfully: 'تم تنفيذ الأمر بنجاح!'
|
5
|
+
actions: أوامر
|
6
|
+
and_x_other_resources: و %{count} موارد أخرى
|
7
|
+
are_you_sure: هل أنت متأكد؟
|
8
|
+
are_you_sure_detach_item: هل أنت متأكد أنك تريد فصل هذا الـ٪{item}؟
|
9
|
+
are_you_sure_you_want_to_run_this_option: هل أنت متأكد أنك تريد تشغيل هذا الخيار؟
|
10
|
+
attach: ربط
|
11
|
+
attach_and_attach_another: ربط وربط آخر
|
12
|
+
attach_item: ربط %{item}
|
13
|
+
attachment_class_attached: '%{attachment_class} تم ربط'
|
14
|
+
attachment_class_detached: '%{attachment_class} تم فصل'
|
15
|
+
attachment_destroyed: تم حذف المرفق
|
16
|
+
cancel: إلغاء
|
17
|
+
choose_a_country: اختر دولة
|
18
|
+
choose_an_option: اختر خيارًا
|
19
|
+
choose_item: اختر %{item}
|
20
|
+
clear_value: مسح القيمة
|
21
|
+
click_to_reveal_filters: انقر لإظهار المرشحات
|
22
|
+
confirm: تأكيد
|
23
|
+
create_new_item: إنشاء %{item} جديد
|
24
|
+
dashboard: لوحة القيادة
|
25
|
+
dashboards: لوحات القيادة
|
26
|
+
delete: حذف
|
27
|
+
delete_file: حذف الملف
|
28
|
+
delete_item: حذف %{item}
|
29
|
+
detach_item: فصل %{item}
|
30
|
+
details: تفاصيل
|
31
|
+
download: تنزيل
|
32
|
+
download_file: تنزيل الملف
|
33
|
+
download_item: تنزيل %{item}
|
34
|
+
edit: تعديل
|
35
|
+
edit_item: تعديل %{item}
|
36
|
+
empty_dashboard_message: أضف بطاقات إلى هذه اللوحة
|
37
|
+
failed: فشل
|
38
|
+
failed_to_find_attachment: فشل في العثور على المرفق
|
39
|
+
failed_to_load: فشل التحميل
|
40
|
+
field_translations:
|
41
|
+
file:
|
42
|
+
one: ملف
|
43
|
+
other: ملفات
|
44
|
+
zero: ملفات
|
45
|
+
people:
|
46
|
+
one: شخص
|
47
|
+
other: أشخاص
|
48
|
+
zero: أشخاص
|
49
|
+
filter_by: تصفية حسب
|
50
|
+
filters: مرشحات
|
51
|
+
go_back: العودة للخلف
|
52
|
+
grid_view: عرض الشبكة
|
53
|
+
hide_content: إخفاء المحتوى
|
54
|
+
home: الصفحة الرئيسية
|
55
|
+
key_value_field:
|
56
|
+
add_row: إضافة صف
|
57
|
+
delete_row: حذف صف
|
58
|
+
key: المفتاح
|
59
|
+
value: القيمة
|
60
|
+
list_is_empty: القائمة فارغة
|
61
|
+
loading: جاري التحميل
|
62
|
+
more: المزيد
|
63
|
+
new: جديد
|
64
|
+
next_page: الصفحة التالية
|
65
|
+
no_cards_present: لا توجد بطاقات
|
66
|
+
no_item_found: لا يوجد سجلات
|
67
|
+
no_options_available: لا توجد خيارات متاحة
|
68
|
+
no_related_item_found: لم يتم العثور على سجلات متعلقة
|
69
|
+
not_authorized: ليس لديك الصلاحية للقيام بهذا الإجراء.
|
70
|
+
number_of_items:
|
71
|
+
one: سجل %{item} واحد
|
72
|
+
other: "%{count} سجل %{item}"
|
73
|
+
zero: لا يوجد %{item}
|
74
|
+
oops_nothing_found: عذراً! لم يتم العثور على شيء...
|
75
|
+
order:
|
76
|
+
higher: حرك السجل للأعلى
|
77
|
+
lower: حرك السجل للأسفل
|
78
|
+
reorder_record: إعادة ترتيب السجل
|
79
|
+
to_bottom: حرك السجل للأسفل بشكل كامل
|
80
|
+
to_top: حرك السجل للأعلى بشكل كامل
|
81
|
+
per_page: لكل صفحة
|
82
|
+
prev_page: الصفحة السابقة
|
83
|
+
remove_selection: إزالة التحديد
|
84
|
+
reset_filters: إعادة تعيين الفلاتر
|
85
|
+
resource_created: تم إنشاء السجل
|
86
|
+
resource_destroyed: تم حذف السجل
|
87
|
+
resource_translations:
|
88
|
+
team_members:
|
89
|
+
one: عضو فريق
|
90
|
+
other: أعضاء الفريق
|
91
|
+
zero: أعضاء الفريق
|
92
|
+
user:
|
93
|
+
one: مستخدم
|
94
|
+
other: مستخدمين
|
95
|
+
zero: مستخدمين
|
96
|
+
resource_updated: تم تحديث السجل
|
97
|
+
resources: المصادر
|
98
|
+
run: تشغيل
|
99
|
+
save: حفظ
|
100
|
+
search:
|
101
|
+
cancel_button: إلغاء
|
102
|
+
placeholder: البحث
|
103
|
+
select_all: تحديد الكل
|
104
|
+
select_all_matching: تحديد كل المطابق
|
105
|
+
select_item: تحديد العنصر
|
106
|
+
show_content: عرض المحتوى
|
107
|
+
sign_out: تسجيل الخروج
|
108
|
+
switch_to_view: التبديل إلى عرض %{view_type}
|
109
|
+
table_view: عرض الجدول
|
110
|
+
tools: الأدوات
|
111
|
+
type_to_search: اكتب للبحث.
|
112
|
+
unauthorized: غير مصرح به
|
113
|
+
undo: تراجع
|
114
|
+
view: عرض
|
115
|
+
view_item: عرض %{item}
|
116
|
+
was_successfully_created: تم إنشاؤه بنجاح
|
117
|
+
was_successfully_updated: تم تحديثه بنجاح
|
118
|
+
x_items_more:
|
119
|
+
one: عنصر واحد إضافي
|
120
|
+
other: "%{count} عناصر إضافية"
|
121
|
+
zero: لا توجد عناصر إضافية
|
122
|
+
x_records_selected_from_a_total_of_x_html: <span class="font-bold text-gray-700">%{selected}</span> السجلات المحددة في هذه الصفحة من إجمالي<span class="font-bold text-gray-700">%{count}</span>
|
123
|
+
x_records_selected_from_all_pages_html: <span class="font-bold text-gray-700">%{count}</span> السجلات المحددة من كل الصفحات
|
124
|
+
you_missed_something_check_form: ربما نسيت شيئًا، يرجى التحقق من البيانات.
|
125
|
+
|
126
|
+
|