decidim-core 0.26.7 → 0.26.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/cells/decidim/collapsible_list/show.erb +1 -1
- data/app/cells/decidim/version_cell.rb +1 -1
- data/app/cells/decidim/versions_list_cell.rb +1 -1
- data/app/commands/decidim/endorse_resource.rb +2 -0
- data/app/commands/decidim/unendorse_resource.rb +1 -1
- data/app/controllers/decidim/authorization_modals_controller.rb +1 -1
- data/app/controllers/decidim/devise/registrations_controller.rb +1 -1
- data/app/controllers/decidim/links_controller.rb +1 -1
- data/app/controllers/decidim/user_timeline_controller.rb +1 -1
- data/app/forms/decidim/account_form.rb +1 -1
- data/app/forms/decidim/notifications_settings_form.rb +0 -8
- data/app/forms/decidim/registration_form.rb +1 -1
- data/app/forms/url_validator.rb +1 -1
- data/app/helpers/decidim/layout_helper.rb +15 -4
- data/app/helpers/decidim/resource_helper.rb +2 -0
- data/app/jobs/decidim/data_portability_export_job.rb +3 -0
- data/app/jobs/decidim/open_data_job.rb +2 -0
- data/app/models/decidim/organization.rb +6 -0
- data/app/models/decidim/user.rb +9 -1
- data/app/packs/src/decidim/geocoding/attach_input.js +4 -1
- data/app/packs/src/decidim/geocoding/provider/here.js +17 -21
- data/app/packs/src/decidim/geocoding/provider/photon.js +1 -1
- data/app/packs/src/decidim/map/controller/drag_marker.js +0 -2
- data/app/packs/src/decidim/map/controller/markers.js +0 -1
- data/app/packs/src/decidim/map/controller/static.js +0 -1
- data/app/packs/src/decidim/map/controller.js +0 -2
- data/app/packs/src/decidim/map/factory.js +4 -1
- data/app/packs/src/decidim/map/icon.js +0 -1
- data/app/packs/src/decidim/map/legacy.js +0 -1
- data/app/packs/src/decidim/map/provider/default.js +2 -0
- data/app/packs/src/decidim/map/provider/here.js +2 -1
- data/app/queries/decidim/metrics/users_metric_manage.rb +6 -6
- data/app/views/decidim/notifications_settings/show.html.erb +1 -1
- data/config/environment.rb +3 -0
- data/config/locales/ar.yml +10 -15
- data/config/locales/bg.yml +0 -16
- data/config/locales/ca.yml +15 -11
- data/config/locales/cs.yml +28 -9
- data/config/locales/de.yml +84 -46
- data/config/locales/el.yml +106 -12
- data/config/locales/en.yml +4 -0
- data/config/locales/eo.yml +5 -3
- data/config/locales/es-MX.yml +13 -9
- data/config/locales/es-PY.yml +15 -11
- data/config/locales/es.yml +14 -10
- data/config/locales/eu.yml +383 -343
- data/config/locales/fi-plain.yml +27 -2
- data/config/locales/fi.yml +17 -13
- data/config/locales/fr-CA.yml +13 -9
- data/config/locales/fr.yml +14 -10
- data/config/locales/ga-IE.yml +0 -5
- data/config/locales/gl.yml +6 -18
- data/config/locales/hu.yml +31 -14
- data/config/locales/id-ID.yml +4 -19
- data/config/locales/is-IS.yml +4 -3
- data/config/locales/it.yml +4 -9
- data/config/locales/ja.yml +35 -18
- data/config/locales/kaa.yml +4 -0
- data/config/locales/lb.yml +6 -11
- data/config/locales/lt.yml +53 -8
- data/config/locales/lv.yml +0 -16
- data/config/locales/nl.yml +2 -7
- data/config/locales/no.yml +5 -10
- data/config/locales/pl.yml +14 -5
- data/config/locales/pt-BR.yml +50 -7
- data/config/locales/pt.yml +2 -7
- data/config/locales/ro-RO.yml +1 -6
- data/config/locales/ru.yml +2 -17
- data/config/locales/sk.yml +13 -19
- data/config/locales/sl.yml +0 -5
- data/config/locales/sq-AL.yml +1 -0
- data/config/locales/sr-CS.yml +8 -0
- data/config/locales/sv.yml +23 -13
- data/config/locales/th-TH.yml +1 -0
- data/config/locales/tr-TR.yml +9 -11
- data/config/locales/uk.yml +2 -14
- data/config/locales/zh-CN.yml +0 -6
- data/config/locales/zh-TW.yml +16 -7
- data/db/migrate/20181030090144_destroy_deleted_users_follows.rb +1 -1
- data/db/migrate/20181204110723_remove_following_users_count_from_users.rb +11 -2
- data/db/migrate/20181214101250_add_notification_types_to_users.rb +6 -1
- data/db/migrate/20190412131728_fix_user_names.rb +13 -6
- data/db/migrate/20200211173227_add_direct_message_types_to_users.rb +6 -1
- data/db/migrate/20210302150803_invalidate_all_sessions_for_deleted_users.rb +10 -3
- data/db/migrate/20210310120640_add_followable_counter_cache_to_users.rb +13 -3
- data/db/migrate/20231027142329_change_default_value_for_decidim_endorsements.rb +11 -0
- data/db/seeds.rb +1 -0
- data/lib/decidim/core/test/shared_examples/comments_examples.rb +24 -0
- data/lib/decidim/core/test/shared_examples/errors.rb +2 -0
- data/lib/decidim/core/test/shared_examples/map_examples.rb +4 -1
- data/lib/decidim/core/version.rb +1 -1
- data/lib/decidim/core.rb +44 -1
- data/lib/decidim/dependency_resolver.rb +278 -0
- data/lib/decidim/endorsable.rb +1 -1
- data/lib/decidim/exporters.rb +10 -1
- data/lib/decidim/form_builder.rb +6 -13
- data/lib/tasks/upgrade/decidim_deduplicate_endorsements.rake +53 -0
- data/lib/tasks/upgrade/decidim_user_moderation.rake +14 -0
- metadata +13 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b439f283c43183815f29f97ff9bf9098c8378b8a5cb16191390bd874e83cbb05
|
4
|
+
data.tar.gz: 117c9e1d3d6f9ac3dc55c5984e717c384e5274dc198babddc8ea7a1efe29e863
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 299d8bcecdf6084d93845ebcb256105c79077b2b6895f177dc22ddf296cf09973f92f5c425db5a078cb5e5eb9070f4e6ea6b3ad8e4c792236a6d567de7dc155d
|
7
|
+
data.tar.gz: 906b497e36d89c374d4f80114b5a6c4633d3a6da254832d26c8a9d22fa41c7dfc23fb5ce93ffcd1170e3e2f4caec1859c0e44c661a7dcc3567e31b75c969832c
|
@@ -31,7 +31,7 @@ module Decidim
|
|
31
31
|
query = if @current_group.present?
|
32
32
|
@resource.endorsements.where(decidim_user_group_id: @current_group&.id)
|
33
33
|
else
|
34
|
-
@resource.endorsements.where(author: @current_user, decidim_user_group_id:
|
34
|
+
@resource.endorsements.where(author: @current_user, decidim_user_group_id: 0)
|
35
35
|
end
|
36
36
|
query.destroy_all
|
37
37
|
end
|
@@ -17,7 +17,7 @@ module Decidim
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def current_component
|
20
|
-
@current_component ||= Decidim::Component.find(params[:component_id])
|
20
|
+
@current_component ||= Decidim::Component.where(participatory_space: current_organization.participatory_spaces).find(params[:component_id])
|
21
21
|
end
|
22
22
|
|
23
23
|
def authorization_action
|
@@ -12,7 +12,7 @@ module Decidim
|
|
12
12
|
helper_method :activities, :resource_types, :user
|
13
13
|
|
14
14
|
def index
|
15
|
-
raise ActionController::RoutingError, "Not Found"
|
15
|
+
raise ActionController::RoutingError, "Not Found" unless user && current_user == user
|
16
16
|
end
|
17
17
|
|
18
18
|
private
|
@@ -24,7 +24,7 @@ module Decidim
|
|
24
24
|
validates :nickname, presence: true, format: { with: Decidim::User::REGEXP_NICKNAME }
|
25
25
|
|
26
26
|
validates :nickname, length: { maximum: Decidim::User.nickname_max_length, allow_blank: true }
|
27
|
-
validates :password, confirmation:
|
27
|
+
validates :password, confirmation: { message: I18n.t("errors.messages.password_confirmation_message") }
|
28
28
|
validates :password, password: { name: :name, email: :email, username: :nickname }, if: -> { password.present? }
|
29
29
|
validates :password_confirmation, presence: true, if: :password_present
|
30
30
|
validates :avatar, passthru: { to: Decidim::User }
|
@@ -41,13 +41,5 @@ module Decidim
|
|
41
41
|
def direct_message_types
|
42
42
|
allow_public_contact ? "all" : "followed-only"
|
43
43
|
end
|
44
|
-
|
45
|
-
def user_is_moderator?(user)
|
46
|
-
Decidim.participatory_space_manifests.map do |manifest|
|
47
|
-
participatory_space_type = manifest.model_class_name.constantize
|
48
|
-
return true if participatory_space_type.moderators(user.organization).exists?(id: user.id)
|
49
|
-
end
|
50
|
-
false
|
51
|
-
end
|
52
44
|
end
|
53
45
|
end
|
@@ -17,7 +17,7 @@ module Decidim
|
|
17
17
|
validates :name, presence: true, format: { with: Decidim::User::REGEXP_NAME }
|
18
18
|
validates :nickname, presence: true, format: { with: Decidim::User::REGEXP_NICKNAME }, length: { maximum: Decidim::User.nickname_max_length }
|
19
19
|
validates :email, presence: true, "valid_email_2/email": { disposable: true }
|
20
|
-
validates :password, confirmation:
|
20
|
+
validates :password, confirmation: { message: I18n.t("errors.messages.password_confirmation_message") }
|
21
21
|
validates :password, password: { name: :name, email: :email, username: :nickname }
|
22
22
|
validates :password_confirmation, presence: true
|
23
23
|
validates :tos_agreement, allow_nil: false, acceptance: true
|
data/app/forms/url_validator.rb
CHANGED
@@ -6,7 +6,7 @@
|
|
6
6
|
#
|
7
7
|
class UrlValidator < ActiveModel::EachValidator
|
8
8
|
def validate_each(record, attribute, value)
|
9
|
-
record.errors
|
9
|
+
record.errors.add attribute, :url_format, **options unless url_valid?(value)
|
10
10
|
end
|
11
11
|
|
12
12
|
# a URL may be technically well-formed but may
|
@@ -74,8 +74,11 @@ module Decidim
|
|
74
74
|
classes = _icon_classes(options) + ["external-icon"]
|
75
75
|
|
76
76
|
if path.split(".").last == "svg"
|
77
|
+
icon_path = application_path(path)
|
78
|
+
return unless icon_path
|
79
|
+
|
77
80
|
attributes = { class: classes.join(" ") }.merge(options)
|
78
|
-
asset = File.read(
|
81
|
+
asset = File.read(icon_path)
|
79
82
|
asset.gsub("<svg ", "<svg#{tag_builder.tag_options(attributes)} ").html_safe
|
80
83
|
else
|
81
84
|
image_pack_tag(path, class: classes.join(" "), style: "display: none")
|
@@ -83,9 +86,17 @@ module Decidim
|
|
83
86
|
end
|
84
87
|
|
85
88
|
def application_path(path)
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
+
# Force the path to be returned without the protocol and host even when a
|
90
|
+
# custom asset host has been defined. The host parameter needs to be a
|
91
|
+
# non-nil because otherwise it will be set to the asset host at
|
92
|
+
# ActionView::Helpers::AssetUrlHelper#compute_asset_host.
|
93
|
+
img_path = asset_pack_path(path, host: "", protocol: :relative)
|
94
|
+
path = Rails.public_path.join(img_path.sub(%r{^/}, ""))
|
95
|
+
return unless File.exist?(path)
|
96
|
+
|
97
|
+
path
|
98
|
+
rescue ::Webpacker::Manifest::MissingEntryError
|
99
|
+
nil
|
89
100
|
end
|
90
101
|
|
91
102
|
# Allows to create role attribute according to accessibility rules
|
@@ -67,6 +67,8 @@ module Decidim
|
|
67
67
|
|
68
68
|
# Returns an instance of ResourceLocatorPresenter with the given resource
|
69
69
|
def resource_locator(resource)
|
70
|
+
return resource.resource_locator if resource.respond_to?(:resource_locator)
|
71
|
+
|
70
72
|
::Decidim::ResourceLocatorPresenter.new(resource)
|
71
73
|
end
|
72
74
|
|
@@ -11,6 +11,8 @@ module Decidim
|
|
11
11
|
raise "Couldn't generate Open Data export" unless exporter.export.positive?
|
12
12
|
|
13
13
|
organization.open_data_file.attach(io: File.open(path, "rb"), filename: organization.open_data_file_path)
|
14
|
+
# Deletes the temporary file file
|
15
|
+
File.delete(path)
|
14
16
|
end
|
15
17
|
end
|
16
18
|
end
|
@@ -87,6 +87,12 @@ module Decidim
|
|
87
87
|
@top_scopes ||= scopes.top_level
|
88
88
|
end
|
89
89
|
|
90
|
+
def participatory_spaces
|
91
|
+
@participatory_spaces ||= Decidim.participatory_space_manifests.flat_map do |manifest|
|
92
|
+
manifest.participatory_spaces.call(self)
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
90
96
|
def public_participatory_spaces
|
91
97
|
@public_participatory_spaces ||= Decidim.participatory_space_manifests.flat_map do |manifest|
|
92
98
|
manifest.participatory_spaces.call(self).public_spaces
|
data/app/models/decidim/user.rb
CHANGED
@@ -202,7 +202,7 @@ module Decidim
|
|
202
202
|
end
|
203
203
|
|
204
204
|
def admin_terms_accepted?
|
205
|
-
|
205
|
+
admin_terms_accepted_at.present?
|
206
206
|
end
|
207
207
|
|
208
208
|
# Whether this user can be verified against some authorization or not.
|
@@ -253,6 +253,14 @@ module Decidim
|
|
253
253
|
Arel.sql(%{("decidim_users"."last_sign_in_at")::text})
|
254
254
|
end
|
255
255
|
|
256
|
+
def moderator?
|
257
|
+
Decidim.participatory_space_manifests.map do |manifest|
|
258
|
+
participatory_space_type = manifest.model_class_name.constantize
|
259
|
+
return true if participatory_space_type.moderators(organization).exists?(id: id)
|
260
|
+
end
|
261
|
+
false
|
262
|
+
end
|
263
|
+
|
256
264
|
protected
|
257
265
|
|
258
266
|
# Overrides devise email required validation.
|
@@ -125,7 +125,10 @@ export default function attachGeocoding($input, options, callback) {
|
|
125
125
|
$input.on("geocoder-suggest-coordinates.decidim", (_ev, coordinates) => {
|
126
126
|
setCoordinates(coordinates);
|
127
127
|
geocoded = true;
|
128
|
-
callback
|
128
|
+
if (typeof callback === "function") {
|
129
|
+
callback(coordinates);
|
130
|
+
return;
|
131
|
+
}
|
129
132
|
});
|
130
133
|
|
131
134
|
// Set the initial values if the field defines the coordinates
|
@@ -34,26 +34,28 @@ $(() => {
|
|
34
34
|
if (`${query}`.trim().length < queryMinLength) {
|
35
35
|
return;
|
36
36
|
}
|
37
|
-
|
37
|
+
// Changes to the autocomplete api call based on:
|
38
|
+
// https://developer.here.com/documentation/geocoding-search-api/migration_guide/migration-geocoder/topics-api/autocomplete.html
|
38
39
|
currentSuggestionQuery = setTimeout(() => {
|
39
40
|
$.ajax({
|
40
41
|
method: "GET",
|
41
|
-
url: "https://autocomplete.
|
42
|
+
url: "https://autocomplete.search.hereapi.com/v1/autocomplete",
|
42
43
|
data: {
|
43
44
|
apiKey: config.apiKey,
|
44
|
-
|
45
|
-
|
45
|
+
// eslint-disable-next-line
|
46
|
+
q: query,
|
47
|
+
lang: language
|
46
48
|
},
|
47
49
|
dataType: "json"
|
48
50
|
}).done((resp) => {
|
49
|
-
if (resp.
|
50
|
-
return callback(resp.
|
51
|
+
if (resp.items) {
|
52
|
+
return callback(resp.items.map((item) => {
|
51
53
|
const label = generateAddressLabel(item.address, addressFormat);
|
52
54
|
|
53
55
|
return {
|
54
56
|
key: label,
|
55
57
|
value: label,
|
56
|
-
locationId: item.
|
58
|
+
locationId: item.id
|
57
59
|
}
|
58
60
|
}));
|
59
61
|
}
|
@@ -65,30 +67,24 @@ $(() => {
|
|
65
67
|
$input.on("geocoder-suggest-select.decidim", (_ev, selectedItem) => {
|
66
68
|
$.ajax({
|
67
69
|
method: "GET",
|
68
|
-
url: "https://
|
70
|
+
url: "https://lookup.search.hereapi.com/v1/lookup",
|
69
71
|
data: {
|
70
72
|
apiKey: config.apiKey,
|
71
|
-
|
72
|
-
jsonattributes: 1,
|
73
|
-
locationid: selectedItem.locationId
|
73
|
+
id: selectedItem.locationId
|
74
74
|
},
|
75
75
|
dataType: "json"
|
76
76
|
}).done((resp) => {
|
77
|
-
if (!resp
|
78
|
-
resp.response.view.length < 1
|
77
|
+
if (!resp || Object.keys(resp).length < 1
|
79
78
|
) {
|
80
79
|
return;
|
81
80
|
}
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
return;
|
81
|
+
const position = resp.position;
|
82
|
+
if (!position || !position.lat || !position.lng) {
|
83
|
+
return
|
86
84
|
}
|
87
|
-
|
88
|
-
const result = view.result[0];
|
89
85
|
const coordinates = [
|
90
|
-
|
91
|
-
|
86
|
+
position.lat,
|
87
|
+
position.lng
|
92
88
|
];
|
93
89
|
|
94
90
|
$input.trigger(
|
@@ -1,3 +1,5 @@
|
|
1
|
+
import "src/decidim/map/icon"
|
2
|
+
|
1
3
|
import MapMarkersController from "src/decidim/map/controller/markers"
|
2
4
|
import MapStaticController from "src/decidim/map/controller/static"
|
3
5
|
import MapDragMarkerController from "src/decidim/map/controller/drag_marker"
|
@@ -22,7 +24,8 @@ import MapDragMarkerController from "src/decidim/map/controller/drag_marker"
|
|
22
24
|
* window.Decidim.createMapController = (mapId, config) => {
|
23
25
|
* if (config.type === "custom") {
|
24
26
|
* // Obviously you need to implement CustomMapController for this to
|
25
|
-
* // work.
|
27
|
+
* // work. You can find an example at:
|
28
|
+
* // decidim-dev/app/packs/src/decidim/dev/test/custom_map_factory.js
|
26
29
|
* return new window.Decidim.CustomMapController(mapId, config);
|
27
30
|
* }
|
28
31
|
*
|
@@ -11,15 +11,15 @@ module Decidim
|
|
11
11
|
private
|
12
12
|
|
13
13
|
def query
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
14
|
+
@query ||= Decidim::User.where(organization: @organization)
|
15
|
+
.where("deleted_at IS NULL OR deleted_at > ?", end_time)
|
16
|
+
.where("blocked_at IS NULL OR blocked_at > ?", end_time)
|
17
|
+
.confirmed
|
18
|
+
.where("created_at <= ?", end_time)
|
19
19
|
end
|
20
20
|
|
21
21
|
def quantity
|
22
|
-
@quantity ||=
|
22
|
+
@quantity ||= query.where("created_at >= ?", start_time).count
|
23
23
|
end
|
24
24
|
end
|
25
25
|
end
|
@@ -45,7 +45,7 @@
|
|
45
45
|
</label>
|
46
46
|
</div>
|
47
47
|
|
48
|
-
<% if
|
48
|
+
<% if current_user.moderator? %>
|
49
49
|
<p><strong><%= t(".administrators") %></strong></p>
|
50
50
|
<div class="switch tiny switch-with-label email_on_moderations">
|
51
51
|
<label>
|
data/config/locales/ar.yml
CHANGED
@@ -391,7 +391,7 @@ ar:
|
|
391
391
|
request_confirmation_instructions: طلب تعليمات التأكيد
|
392
392
|
title: تأكيد البريد الإلكتروني
|
393
393
|
show:
|
394
|
-
close_modal:
|
394
|
+
close_modal: اغلاق النموذج
|
395
395
|
block_user_mailer:
|
396
396
|
notify:
|
397
397
|
body_1: تم حظر الحساب الخاص بك.
|
@@ -514,9 +514,8 @@ ar:
|
|
514
514
|
already_have_an_account?: هل لديك حساب؟
|
515
515
|
newsletter: تلقي رسالة إخبارية من حين لآخر مع المعلومات ذات الصلة
|
516
516
|
newsletter_title: الاتصال إذن
|
517
|
-
nickname_help: الاسم المستعار الخاص بك في %{organization}. يمكن أن يحتوي فقط على أحرف
|
517
|
+
nickname_help: الاسم المستعار الخاص بك في %{organization}. يمكن أن يحتوي فقط على أحرف وأرقام '-' و '_'.
|
518
518
|
password_help: "%{minimun_characters} أحرف كحد أدنى، يجب أن لا تكون شائعة جدا (مثل 123456) ويجب أن تكون مختلفة عن اسمك المستعار وعن بريدك الإلكتروني."
|
519
|
-
sign_in: تسجيل الدخول
|
520
519
|
sign_up: انشئ حسابًا
|
521
520
|
sign_up_as:
|
522
521
|
legend: الاشتراك باسم
|
@@ -537,7 +536,7 @@ ar:
|
|
537
536
|
newsletter_modal:
|
538
537
|
buttons:
|
539
538
|
check: تحقق واستمر
|
540
|
-
close_modal:
|
539
|
+
close_modal: اغلاق النموذج
|
541
540
|
uncheck: إبقاءه غير مختار
|
542
541
|
notice: |-
|
543
542
|
<p>مهلا ، هل أنت متأكد أنك لا تريد تلقي رسالة إخبارية؟<br>
|
@@ -574,7 +573,7 @@ ar:
|
|
574
573
|
success: تم تحميل الصورة بنجاح
|
575
574
|
drag_and_drop_help: يمكن إضافة صور عن طريق سحبها وإسقاطها أو لصقها.
|
576
575
|
endorsable:
|
577
|
-
endorsements:
|
576
|
+
endorsements: الدعم والتأييد
|
578
577
|
endorsements_count: عد أصوات التأييدات
|
579
578
|
endorsements:
|
580
579
|
identities:
|
@@ -921,7 +920,7 @@ ar:
|
|
921
920
|
body_1: أنت على وشك زيارة رابط خارجي ونرجو منك أن تتحلى بالحذر فيما يتعلق بالمحتوى الموجود في الموقع الخارجي.
|
922
921
|
body_2: الرجاء التحقق من الرابط الذي توشك على زيارته والتأكد من التعرف عليه كموقع آمن قبل المتابعة.
|
923
922
|
cancel: إلغاء
|
924
|
-
close_modal:
|
923
|
+
close_modal: اغلاق النموذج
|
925
924
|
proceed: المواصلة
|
926
925
|
title: فتح رابط خارجي
|
927
926
|
log:
|
@@ -1011,7 +1010,7 @@ ar:
|
|
1011
1010
|
ok: حسناً
|
1012
1011
|
index:
|
1013
1012
|
ago: منذ
|
1014
|
-
close:
|
1013
|
+
close: اغلاق النموذج
|
1015
1014
|
from: من
|
1016
1015
|
groups: فِرَقي
|
1017
1016
|
last_message: آخر رسالة
|
@@ -1143,7 +1142,6 @@ ar:
|
|
1143
1142
|
proposals: اقتراحات
|
1144
1143
|
proposals_explanation: تقديم مقترحات ، ودعم المقترحات الحالية وتعزيز التغييرات التي تريد رؤيتها.
|
1145
1144
|
footer_sub_hero:
|
1146
|
-
footer_sub_hero_body: دعونا نبني مجتمعًا أكثر انفتاحًا وشفافية وتعاونًا.<br /> انضموا وشاركوا وقرّروا.
|
1147
1145
|
footer_sub_hero_headline: مرحبًا بكم على المنصة التشاركية لـ %{organization}.
|
1148
1146
|
register: تسجيل
|
1149
1147
|
hero:
|
@@ -1174,7 +1172,7 @@ ar:
|
|
1174
1172
|
refuse:
|
1175
1173
|
modal_body: إذا رفضت ، فلن تتمكن من استخدام النظام الأساسي ، يمكنك <a href="%{data_portability_path}">تنزيل بياناتك</a> و / أو <a href="%{delete_path}">حذف حسابك</a>.
|
1176
1174
|
modal_btn_exit: سأراجعها لاحقًا
|
1177
|
-
modal_close:
|
1175
|
+
modal_close: اغلاق النموذج
|
1178
1176
|
modal_title: هل ترفض حقًا الأحكام والشروط المحدثة؟
|
1179
1177
|
required_review:
|
1180
1178
|
alert: لقد قمنا بتحديث شروط الخدمة الخاصة بنا ، يرجى مراجعتها.
|
@@ -1268,7 +1266,7 @@ ar:
|
|
1268
1266
|
future: مستقبل
|
1269
1267
|
past: الماضي
|
1270
1268
|
filters_small_view:
|
1271
|
-
close_modal:
|
1269
|
+
close_modal: اغلاق النموذج
|
1272
1270
|
filter: منقي
|
1273
1271
|
filter_by: مصنف بواسطة
|
1274
1272
|
unfold: كشف
|
@@ -1376,7 +1374,7 @@ ar:
|
|
1376
1374
|
index:
|
1377
1375
|
add_max_users: 'يمكن إضافة مستخدمين إلى المحادثة: 9 مستخدمين كحد أقصى'
|
1378
1376
|
add_users_placeholder: البحث…
|
1379
|
-
close:
|
1377
|
+
close: قريب
|
1380
1378
|
conversations_info: المحادثات خاصة. لا يمكن لأحد آخر أن يراها. يمكن بدء محادثة مع أي مشارك أو مجموعة مسجلة على المنصة.
|
1381
1379
|
from: من
|
1382
1380
|
last_message: آخر رسالة
|
@@ -1397,7 +1395,7 @@ ar:
|
|
1397
1395
|
back: عرض كافة المحادثات
|
1398
1396
|
deleted_accounts: لا يمكن أن يكون لديك محادثة مع حسابات محذوفة.
|
1399
1397
|
not_allowed: هذا المستخدم لم يعد يستقبل المزيد من الرسائل المباشرة.
|
1400
|
-
title:
|
1398
|
+
title: المحادثة مع %{usernames}
|
1401
1399
|
update:
|
1402
1400
|
error: لم يتم إرسال الرسالة. حاول مرة أخرى في وقت لاحق
|
1403
1401
|
user_interests:
|
@@ -1564,8 +1562,6 @@ ar:
|
|
1564
1562
|
updated: تم تحديث حسابك بنجاح.
|
1565
1563
|
sessions:
|
1566
1564
|
already_signed_out: تم الخروج بنجاح
|
1567
|
-
new:
|
1568
|
-
sign_in: تسجيل الدخول
|
1569
1565
|
signed_in: تم تسجيل الدخول بنجاح
|
1570
1566
|
signed_out: تم الخروج بنجاح
|
1571
1567
|
shared:
|
@@ -1574,7 +1570,6 @@ ar:
|
|
1574
1570
|
didn_t_receive_confirmation_instructions: لم تتلق تعليمات التأكيد؟
|
1575
1571
|
didn_t_receive_unlock_instructions: لم تتلق تعليمات فتح؟
|
1576
1572
|
forgot_your_password: نسيت رقمك السري؟
|
1577
|
-
sign_in: تسجيل الدخول
|
1578
1573
|
sign_in_with_provider: تسجيل الدخول مع %{provider}
|
1579
1574
|
sign_up: انشئ حسابًا
|
1580
1575
|
minimum_password_length:
|