">
- <%= l(newsletter.created_at, format: :long) if newsletter.created_at %>
+ <%= l(newsletter.created_at, format: :decidim_short) if newsletter.created_at %>
">
- <%= l(newsletter.sent_at, format: :long) if newsletter.sent_at %>
+ <%= l(newsletter.sent_at, format: :decidim_short) if newsletter.sent_at %>
">
diff --git a/decidim-admin/config/locales/en.yml b/decidim-admin/config/locales/en.yml
index 4ea88441b3089..5d01ead593d08 100644
--- a/decidim-admin/config/locales/en.yml
+++ b/decidim-admin/config/locales/en.yml
@@ -36,7 +36,7 @@ en:
id: ID
newsletter:
body: Body
- send_to_all_users: Send to all users
+ send_to_all_users: Send to all participants
send_to_followers: Send to followers
send_to_participants: Send to participants
subject: Subject
@@ -294,13 +294,13 @@ en:
block_user:
bulk_new:
action: Block accounts and send justification
- already_reported_html: Continuing with this action you will also hide all the participants contents.
+ already_reported_html: By continuing with this action, you will also hide all the participant's content.
description: Blocking a user will render their account unusable. You may provide in your justification any guidelines on ways you would consider unblocking the user.
justification: Justification
title: Block Users
new:
action: Block account and send justification
- already_reported_html: Continuing with this action you will also hide all the participants contents.
+ already_reported_html: By continuing with this action, you will also hide all the participant's content.
description: Blocking a user will render their account unusable. You may provide in your justification any guidelines on ways you would consider unblocking the user.
justification: Justification
title: Block User %{name}
@@ -394,7 +394,7 @@ en:
form:
domain_too_short: Domain too short
update:
- error: Failed to update list of allowed external domains
+ error: Failed to update list of allowed external domains.
success: The list of allowed external domain successfully updated.
exports:
export_as: "%{name} as %{export_format}"
@@ -479,7 +479,7 @@ en:
import_csv:
explanation: 'Guidance for file:'
message_1: CSV files are supported
- message_2: ".csv file with emails data"
+ message_2: ".csv file with email data"
help_sections:
error: There was a problem updating the help sections.
form:
@@ -1271,7 +1271,7 @@ en:
last_day: Last day
last_month: Last month
last_week: Last week
- no_users_count_statistics_yet: There are no users count statistics yet.
+ no_users_count_statistics_yet: There are no participant count statistics yet.
participants: Participants
forms:
errors:
diff --git a/decidim-admin/config/locales/eu.yml b/decidim-admin/config/locales/eu.yml
index b37b6f9ae7763..d45d068f2a95c 100644
--- a/decidim-admin/config/locales/eu.yml
+++ b/decidim-admin/config/locales/eu.yml
@@ -48,7 +48,7 @@ eu:
customize_welcome_notification: Pertsonalizatu ongi etorri jakinarazpena
default_locale: Kokapen lehenetsia
description: Deskribapena
- enable_machine_translations: Gaitu itzulpen automatikoak
+ enable_machine_translations: Itzulpen automatikoak gaitu
enable_omnipresent_banner: Erakutsi banner nonahikoa
enable_participatory_space_filters: Gaitu iragazkiak parte hartzeko espazioan
facebook_handler: Facebook kudeatzailea
diff --git a/decidim-admin/decidim-admin.gemspec b/decidim-admin/decidim-admin.gemspec
index c484fe8e2d40e..13bd2e44ab3cd 100644
--- a/decidim-admin/decidim-admin.gemspec
+++ b/decidim-admin/decidim-admin.gemspec
@@ -19,7 +19,7 @@ Gem::Specification.new do |s|
"homepage_uri" => "https://decidim.org",
"source_code_uri" => "https://github.com/decidim/decidim"
}
- s.required_ruby_version = "~> 3.3.0"
+ s.required_ruby_version = "~> 3.4.0"
s.name = "decidim-admin"
s.summary = "Decidim organization administration"
diff --git a/decidim-admin/lib/decidim/admin/test/admin_participatory_space_access_examples.rb b/decidim-admin/lib/decidim/admin/test/admin_participatory_space_access_examples.rb
index 195b2809f2783..2cd2d18506ace 100644
--- a/decidim-admin/lib/decidim/admin/test/admin_participatory_space_access_examples.rb
+++ b/decidim-admin/lib/decidim/admin/test/admin_participatory_space_access_examples.rb
@@ -75,3 +75,21 @@
end
end
end
+
+shared_examples "admin menu shows only assigned space" do |space_name:, other_spaces: []|
+ before do
+ switch_to_host(organization.host)
+ login_as role, scope: :user
+ visit target_path
+ end
+
+ context "and does not show unassigned spaces" do
+ it "shows only the assigned space" do
+ expect(page).to have_content(space_name)
+
+ other_spaces.each do |other_space|
+ expect(page).to have_no_content(other_space)
+ end
+ end
+ end
+end
diff --git a/decidim-admin/lib/decidim/admin/test/admin_participatory_space_component_access_examples.rb b/decidim-admin/lib/decidim/admin/test/admin_participatory_space_component_access_examples.rb
new file mode 100644
index 0000000000000..c0cabd000fd16
--- /dev/null
+++ b/decidim-admin/lib/decidim/admin/test/admin_participatory_space_component_access_examples.rb
@@ -0,0 +1,36 @@
+# frozen_string_literal: true
+
+shared_examples "accessing the component in a participatory space" do
+ context "when the user is a visitor" do
+ let(:user) { nil }
+
+ it "shows the unauthenticated message" do
+ expect(page).to have_content "You need to log in or create an account before continuing."
+ end
+ end
+
+ context "when the user is a normal user" do
+ let(:user) { create(:user, :confirmed, organization:) }
+ let(:unauthorized_path) { "/" }
+
+ before do
+ login_as user, scope: :user
+ end
+
+ it_behaves_like "a 404 page" do
+ let(:target_path) { manage_component_path(component) }
+ end
+ end
+
+ context "when the user is a process admin" do
+ let(:user) { create(:process_admin, :confirmed, organization:, participatory_process:) }
+
+ before do
+ login_as user, scope: :user
+ end
+
+ it "access the index page" do
+ expect(page).to have_content(title)
+ end
+ end
+end
diff --git a/decidim-admin/lib/decidim/admin/test/manage_moderations_examples.rb b/decidim-admin/lib/decidim/admin/test/manage_moderations_examples.rb
index 7cd65a339c946..df037d030b7a0 100644
--- a/decidim-admin/lib/decidim/admin/test/manage_moderations_examples.rb
+++ b/decidim-admin/lib/decidim/admin/test/manage_moderations_examples.rb
@@ -27,7 +27,7 @@
click_on link_text
end
all("tbody tr").each_with_index do |row, _index|
- expect(row.find("td:nth-child(2)")).to have_content(reportables.first.id)
+ expect(row.find("td:nth-child(2)")).to have_content(reportables.first.class.model_name.human)
end
end
end
@@ -107,8 +107,8 @@
click_on "Reports count"
all("tbody tr").each_with_index do |row, index|
- reportable_id = moderations_ordered_by_report_count_asc[index].reportable.id
- expect(row.find("td:nth-child(2)")).to have_content(reportable_id)
+ reportable_type = moderations_ordered_by_report_count_asc[index].reportable.class.model_name.human
+ expect(row.find("td:nth-child(2)")).to have_content(reportable_type)
end
end
end
diff --git a/decidim-admin/spec/commands/decidim/admin/destroy_participatory_space_private_user_spec.rb b/decidim-admin/spec/commands/decidim/admin/destroy_participatory_space_private_user_spec.rb
index c91eb5e6c65fd..43ba90f553ff8 100644
--- a/decidim-admin/spec/commands/decidim/admin/destroy_participatory_space_private_user_spec.rb
+++ b/decidim-admin/spec/commands/decidim/admin/destroy_participatory_space_private_user_spec.rb
@@ -7,7 +7,6 @@ module Decidim::Admin
subject { described_class.new(participatory_space_private_user, user) }
let(:organization) { create(:organization) }
- # let(:privatable_to) { create :participatory_process }
let(:user) { create(:user, :admin, :confirmed, organization:) }
let(:participatory_space_private_user) { create(:participatory_space_private_user, user:) }
@@ -37,5 +36,43 @@ module Decidim::Admin
action_log = Decidim::ActionLog.last
expect(action_log.version).to be_nil
end
+
+ context "when assembly is private and user follows assembly" do
+ let(:normal_user) { create(:user, organization:) }
+ let(:assembly) { create(:assembly, :private, :published, organization: user.organization) }
+ let!(:participatory_space_private_user) { create(:participatory_space_private_user, user: normal_user, privatable_to: assembly) }
+ let!(:follow) { create(:follow, followable: assembly, user: normal_user) }
+
+ context "and assembly is transparent" do
+ it "does not enqueue a job" do
+ assembly.update(is_transparent: true)
+ expect(Decidim::Follow.where(user: normal_user).count).to eq(1)
+ expect { subject.call }.not_to have_enqueued_job(DestroyPrivateUsersFollowsJob)
+ end
+ end
+
+ context "when assembly is not transparent" do
+ it "enqueues a job" do
+ assembly.update(is_transparent: false)
+ expect(Decidim::Follow.where(user: normal_user).count).to eq(1)
+ expect { subject.call }.to have_enqueued_job(DestroyPrivateUsersFollowsJob)
+ end
+ end
+ end
+
+ context "when participatory process is private" do
+ let(:normal_user) { create(:user, organization:) }
+ let(:participatory_process) { create(:participatory_process, :private, :published, organization: user.organization) }
+ let!(:participatory_space_private_user) { create(:participatory_space_private_user, user: normal_user, privatable_to: participatory_process) }
+
+ context "and user follows process" do
+ let!(:follow) { create(:follow, followable: participatory_process, user: normal_user) }
+
+ it "enqueues a job" do
+ expect(Decidim::Follow.where(user: normal_user).count).to eq(1)
+ expect { subject.call }.to have_enqueued_job(DestroyPrivateUsersFollowsJob)
+ end
+ end
+ end
end
end
diff --git a/decidim-admin/spec/jobs/destroy_private_users_follows_job_spec.rb b/decidim-admin/spec/jobs/destroy_private_users_follows_job_spec.rb
new file mode 100644
index 0000000000000..15ad1b33c7240
--- /dev/null
+++ b/decidim-admin/spec/jobs/destroy_private_users_follows_job_spec.rb
@@ -0,0 +1,61 @@
+# frozen_string_literal: true
+
+require "spec_helper"
+
+module Decidim
+ module Admin
+ describe DestroyPrivateUsersFollowsJob do
+ let(:organization) { create(:organization) }
+ let!(:user) { create(:user, :admin, :confirmed, organization:) }
+ let!(:normal_user) { create(:user, organization:) }
+ let!(:follow) { create(:follow, followable: participatory_space, user: normal_user) }
+ let(:component) { create(:dummy_component, participatory_space:) }
+ let(:resource) { create(:dummy_resource, component: component, author: user) }
+ let!(:followed_resource) { create(:follow, followable: resource, user: normal_user) }
+
+ context "when assembly is private and non transparent" do
+ let(:participatory_space) { create(:assembly, :private, :published, :opaque, organization: user.organization) }
+
+ it "deletes follows of non private users" do
+ # we have 2 follows, one for assembly, and one for a "child" resource
+ expect { described_class.perform_now(normal_user.id, participatory_space) }.to change(Decidim::Follow, :count).by(-2)
+ end
+ end
+
+ context "when assembly is private but transparent" do
+ let(:participatory_space) { create(:assembly, :private, :published, organization: user.organization) }
+
+ it "preserves follows of non private users" do
+ # we have 2 follows, one for assembly, and one for a "child" resource
+ expect { described_class.perform_now(normal_user.id, participatory_space) }.not_to change(Decidim::Follow, :count)
+ end
+ end
+
+ context "when assembly is public" do
+ let(:participatory_space) { create(:assembly, :published, organization: user.organization) }
+
+ it "preserves follows of non private users" do
+ # we have 2 follows, one for assembly, and one for a "child" resource
+ expect { described_class.perform_now(normal_user.id, participatory_space) }.not_to change(Decidim::Follow, :count)
+ end
+ end
+
+ context "when process is private" do
+ let(:participatory_space) { create(:participatory_process, :private, :published, organization: user.organization) }
+
+ it "deletes follows of non private users" do
+ # we have 2 follows, one for process, and one for a "child" resource
+ expect { described_class.perform_now(normal_user.id, participatory_space) }.to change(Decidim::Follow, :count).by(-2)
+ end
+ end
+
+ context "when process is public" do
+ let(:participatory_space) { create(:participatory_process, :published, organization: user.organization) }
+
+ it "preserves follows of non private users" do
+ expect { described_class.perform_now(normal_user.id, participatory_space) }.not_to change(Decidim::Follow, :count)
+ end
+ end
+ end
+ end
+end
diff --git a/decidim-admin/spec/system/admin_moderates_user_spec.rb b/decidim-admin/spec/system/admin_moderates_user_spec.rb
index b73b01ae3fad4..d18d31aed0801 100644
--- a/decidim-admin/spec/system/admin_moderates_user_spec.rb
+++ b/decidim-admin/spec/system/admin_moderates_user_spec.rb
@@ -58,7 +58,7 @@
end
expect(page).to have_current_path(decidim_admin.new_user_block_path(user_id: reportable.id), ignore_query: true)
- expect(page).to have_content("Continuing with this action you will also hide all the participants contents")
+ expect(page).to have_content("By continuing with this action, you will also hide all the participant's content.")
end
end
diff --git a/decidim-ai/decidim-ai.gemspec b/decidim-ai/decidim-ai.gemspec
index 84c127bee7b5a..49f507c746419 100644
--- a/decidim-ai/decidim-ai.gemspec
+++ b/decidim-ai/decidim-ai.gemspec
@@ -17,7 +17,7 @@ Gem::Specification.new do |s|
"homepage_uri" => "https://decidim.org",
"source_code_uri" => "https://github.com/decidim/decidim"
}
- s.required_ruby_version = "~> 3.3.0"
+ s.required_ruby_version = "~> 3.4.0"
s.name = "decidim-ai"
s.summary = "A Decidim module with AI tools"
diff --git a/decidim-api/decidim-api.gemspec b/decidim-api/decidim-api.gemspec
index ac8e4331a01ac..766f6235d5140 100644
--- a/decidim-api/decidim-api.gemspec
+++ b/decidim-api/decidim-api.gemspec
@@ -19,7 +19,7 @@ Gem::Specification.new do |s|
"homepage_uri" => "https://decidim.org",
"source_code_uri" => "https://github.com/decidim/decidim"
}
- s.required_ruby_version = "~> 3.3.0"
+ s.required_ruby_version = "~> 3.4.0"
s.name = "decidim-api"
s.summary = "Decidim API module"
diff --git a/decidim-api/docs/usage.md b/decidim-api/docs/usage.md
index c98b2ec316bdf..780ce727b59e1 100644
--- a/decidim-api/docs/usage.md
+++ b/decidim-api/docs/usage.md
@@ -296,7 +296,7 @@ Second, the response is not an Array, it is just the object we requested. We can
#### Components
-Every participatory space may (and should) have some components. There are 9 official components, these are `Proposals`, `Page`, `Meetings`, `Budgets`, `Surveys`, `Accountability`, `Debates`, `Sortitions` and `Blog`. Plugins may add their own components.
+Every participatory space may (and should) have some components. There are 9 official components, these are `Proposals`, `Page`, `Meetings`, `Budgets`, `Surveys`, `Accountability`, `Debates` and `Blog`. Plugins may add their own components.
If you know the `id`\* of a specific component you can obtain it by querying it directly:
diff --git a/decidim-api/lib/decidim/api/test/shared_examples/statistics_examples.rb b/decidim-api/lib/decidim/api/test/shared_examples/statistics_examples.rb
index 587471ee4c078..ea5b12e5a3a42 100644
--- a/decidim-api/lib/decidim/api/test/shared_examples/statistics_examples.rb
+++ b/decidim-api/lib/decidim/api/test/shared_examples/statistics_examples.rb
@@ -15,7 +15,6 @@
{ name: "surveys_count", data: [0], tooltip_key: "surveys_count_tooltip" },
{ name: "results_count", data: [0], tooltip_key: "results_count_tooltip" },
{ name: "debates_count", data: [0], tooltip_key: "debates_count_tooltip" },
- { name: "sortitions_count", data: [0], tooltip_key: "sortitions_count_tooltip" },
{ name: "posts_count", data: [0], tooltip_key: "posts_count_tooltip" },
{ name: "collaborative_texts_count", data: [0], tooltip_key: "collaborative_texts_count_tooltip" }
]))
@@ -36,7 +35,6 @@
{ "name" => { "translation" => "Surveys" }, "value" => 0 },
{ "name" => { "translation" => "Results" }, "value" => 0 },
{ "name" => { "translation" => "Debates" }, "value" => 0 },
- { "name" => { "translation" => "Sortitions" }, "value" => 0 },
{ "name" => { "translation" => "Posts" }, "value" => 0 },
{ "name" => { "translation" => "Collaborative texts" }, "value" => 0 }
]
diff --git a/decidim-assemblies/config/locales/en.yml b/decidim-assemblies/config/locales/en.yml
index d92e4f1c4076a..4252a87199e40 100644
--- a/decidim-assemblies/config/locales/en.yml
+++ b/decidim-assemblies/config/locales/en.yml
@@ -385,6 +385,7 @@ en:
assembly_type: The type of the assembly
closing_date: The closing date of the assembly
closing_date_reason: Why the assembly was closed
+ component_settings: The component settings of the assembly
composition: The composition of the assembly
created_at: The date this space was created
created_by: Who has created this assembly
diff --git a/decidim-assemblies/config/locales/sr-CS.yml b/decidim-assemblies/config/locales/sr-CS.yml
index 2cdc8fe79a622..1af376c3881bd 100644
--- a/decidim-assemblies/config/locales/sr-CS.yml
+++ b/decidim-assemblies/config/locales/sr-CS.yml
@@ -1,4 +1,8 @@
sr:
+ activemodel:
+ attributes:
+ assembly:
+ youtube: YouTube
decidim:
admin:
titles:
diff --git a/decidim-assemblies/db/migrate/20251112114736_remove_legacy_images_from_assemblies_module.rb b/decidim-assemblies/db/migrate/20251112114736_remove_legacy_images_from_assemblies_module.rb
new file mode 100644
index 0000000000000..4f16e1eabb44b
--- /dev/null
+++ b/decidim-assemblies/db/migrate/20251112114736_remove_legacy_images_from_assemblies_module.rb
@@ -0,0 +1,8 @@
+# frozen_string_literal: true
+
+class RemoveLegacyImagesFromAssembliesModule < ActiveRecord::Migration[7.2]
+ def change
+ remove_column :decidim_assemblies, :hero_image, :string
+ remove_column :decidim_assemblies, :banner_image, :string
+ end
+end
diff --git a/decidim-assemblies/decidim-assemblies.gemspec b/decidim-assemblies/decidim-assemblies.gemspec
index 28b6f50e83b84..e1cca4fd82b20 100644
--- a/decidim-assemblies/decidim-assemblies.gemspec
+++ b/decidim-assemblies/decidim-assemblies.gemspec
@@ -17,7 +17,7 @@ Gem::Specification.new do |s|
"homepage_uri" => "https://decidim.org",
"source_code_uri" => "https://github.com/decidim/decidim"
}
- s.required_ruby_version = "~> 3.3.0"
+ s.required_ruby_version = "~> 3.4.0"
s.name = "decidim-assemblies"
s.summary = "Decidim assemblies module"
diff --git a/decidim-assemblies/lib/decidim/assemblies/participatory_space.rb b/decidim-assemblies/lib/decidim/assemblies/participatory_space.rb
index 9a990ce36c0d6..140a4ea33bec8 100644
--- a/decidim-assemblies/lib/decidim/assemblies/participatory_space.rb
+++ b/decidim-assemblies/lib/decidim/assemblies/participatory_space.rb
@@ -46,10 +46,8 @@
end
participatory_space.exports :assemblies do |export|
- export.collection do
- Decidim::Assembly
- .public_spaces
- .includes(:attachment_collections)
+ export.collection do |participatory_space, _user|
+ Decidim::Assembly.public_spaces.includes(:attachment_collections).where(id: participatory_space)
end
export.include_in_open_data = true
diff --git a/decidim-assemblies/spec/system/admin/admin_access_spec.rb b/decidim-assemblies/spec/system/admin/admin_access_spec.rb
index 0dea02dcd6c01..e1c841f797dc2 100644
--- a/decidim-assemblies/spec/system/admin/admin_access_spec.rb
+++ b/decidim-assemblies/spec/system/admin/admin_access_spec.rb
@@ -16,6 +16,9 @@
let(:participatory_space_path) { decidim_assemblies.assembly_path(participatory_space) }
it_behaves_like "admin participatory space access"
+ it_behaves_like "admin menu shows only assigned space",
+ space_name: "Assemblies",
+ other_spaces: %w(Processes Initiatives Conferences)
describe "edit button" do
let(:target_path) { decidim_admin_assemblies.edit_assembly_landing_page_path(participatory_space) }
diff --git a/decidim-assemblies/spec/system/admin/admin_imports_assembly_spec.rb b/decidim-assemblies/spec/system/admin/admin_imports_assembly_spec.rb
index 9789073ab46e0..1103ea69c6537 100644
--- a/decidim-assemblies/spec/system/admin/admin_imports_assembly_spec.rb
+++ b/decidim-assemblies/spec/system/admin/admin_imports_assembly_spec.rb
@@ -62,7 +62,7 @@
within_admin_sidebar_menu do
click_on "Components"
end
- expect(Decidim::Assembly.last.components.size).to eq(9)
+ expect(Decidim::Assembly.last.components.size).to eq(8)
within ".table-list" do
Decidim::Assembly.last.components.each do |component|
expect(page).to have_content(translated(component.name))
diff --git a/decidim-assemblies/spec/system/assemblies_spec.rb b/decidim-assemblies/spec/system/assemblies_spec.rb
index 4a9bd7a290dae..10984a21afbfd 100644
--- a/decidim-assemblies/spec/system/assemblies_spec.rb
+++ b/decidim-assemblies/spec/system/assemblies_spec.rb
@@ -39,18 +39,6 @@
end
end
- context "when there are no assemblies and accessing from the homepage" do
- let!(:menu_content_block) { create(:content_block, organization:, manifest_name: :global_menu, scope_name: :homepage) }
-
- it "the menu link is not shown" do
- visit decidim.root_path
-
- within "#home__menu" do
- expect(page).to have_no_content("Assemblies")
- end
- end
- end
-
context "when the assembly does not exist" do
it_behaves_like "a 404 page" do
let(:target_path) { decidim_assemblies.assembly_path(99_999_999) }
@@ -68,18 +56,6 @@
let(:target_path) { decidim_assemblies.assemblies_path }
end
end
-
- context "and accessing from the homepage" do
- let!(:menu_content_block) { create(:content_block, organization:, manifest_name: :global_menu, scope_name: :homepage) }
-
- it "the menu link is not shown" do
- visit decidim.root_path
-
- within "#home__menu" do
- expect(page).to have_no_content("Assemblies")
- end
- end
- end
end
context "when there are some published assemblies" do
@@ -102,20 +78,6 @@
visit decidim_assemblies.assemblies_path
end
- context "and accessing from the homepage" do
- let!(:menu_content_block) { create(:content_block, organization:, manifest_name: :global_menu, scope_name: :homepage) }
-
- it "the menu link is shown" do
- visit decidim.root_path
-
- within "#home__menu" do
- click_on "Assemblies"
- end
-
- expect(page).to have_current_path decidim_assemblies.assemblies_path
- end
- end
-
it "lists all the highlighted assemblies" do
within "#highlighted-assemblies" do
expect(page).to have_content(translated(promoted_assembly.title, locale: :en))
diff --git a/decidim-blogs/app/controllers/decidim/blogs/posts_controller.rb b/decidim-blogs/app/controllers/decidim/blogs/posts_controller.rb
index 0a3dbb969658f..a0c885cfe7624 100644
--- a/decidim-blogs/app/controllers/decidim/blogs/posts_controller.rb
+++ b/decidim-blogs/app/controllers/decidim/blogs/posts_controller.rb
@@ -82,7 +82,7 @@ def paginate_posts
end
def post
- @post ||= posts.find(params[:id])
+ @post ||= posts.find_by(id: params[:id])
end
def post_presenter
@@ -103,6 +103,16 @@ def posts_most_commented
.select("count(decidim_comments_comments.id) as counter")
.select("decidim_blogs_posts.*").order("counter DESC").published_at_desc.limit(7)
end
+
+ def add_breadcrumb_item
+ return {} if post.blank?
+
+ {
+ label: translated_attribute(post.title),
+ url: Decidim::EngineRouter.main_proxy(current_component).post_path(post),
+ active: false
+ }
+ end
end
end
end
diff --git a/decidim-blogs/config/locales/ca-IT.yml b/decidim-blogs/config/locales/ca-IT.yml
index 3b6da1b7371de..d562c016e5d61 100644
--- a/decidim-blogs/config/locales/ca-IT.yml
+++ b/decidim-blogs/config/locales/ca-IT.yml
@@ -107,6 +107,7 @@ ca-IT:
destroy: Esborrar
like: '"M''agrada"'
update: Actualitzar
+ vote_comment: Votar el comentari
name: Blog
settings:
global:
diff --git a/decidim-blogs/config/locales/ca.yml b/decidim-blogs/config/locales/ca.yml
index f9eebfbc11824..bea99f26778a4 100644
--- a/decidim-blogs/config/locales/ca.yml
+++ b/decidim-blogs/config/locales/ca.yml
@@ -107,6 +107,7 @@ ca:
destroy: Esborrar
like: '"M''agrada"'
update: Actualitzar
+ vote_comment: Votar el comentari
name: Blog
settings:
global:
diff --git a/decidim-blogs/config/locales/en.yml b/decidim-blogs/config/locales/en.yml
index d7e172c686e1a..2ea4c132f231e 100644
--- a/decidim-blogs/config/locales/en.yml
+++ b/decidim-blogs/config/locales/en.yml
@@ -108,6 +108,7 @@ en:
destroy: Delete
like: Like
update: Update
+ vote_comment: Vote comment
name: Blog
settings:
global:
diff --git a/decidim-blogs/config/locales/es-MX.yml b/decidim-blogs/config/locales/es-MX.yml
index dbc1de7b3c21f..5264f4d561d9a 100644
--- a/decidim-blogs/config/locales/es-MX.yml
+++ b/decidim-blogs/config/locales/es-MX.yml
@@ -107,6 +107,7 @@ es-MX:
destroy: Borrar
like: '"Me gusta"'
update: Actualizar
+ vote_comment: Votar el comentario
name: Blog
settings:
global:
diff --git a/decidim-blogs/config/locales/es-PY.yml b/decidim-blogs/config/locales/es-PY.yml
index 03e8d98b2d2dc..9c1a227fa232b 100644
--- a/decidim-blogs/config/locales/es-PY.yml
+++ b/decidim-blogs/config/locales/es-PY.yml
@@ -107,6 +107,7 @@ es-PY:
destroy: Borrar
like: '"Me gusta"'
update: Actualizar
+ vote_comment: Votar el comentario
name: Blog
settings:
global:
diff --git a/decidim-blogs/config/locales/es.yml b/decidim-blogs/config/locales/es.yml
index 2e5e770ddc143..982823f590a40 100644
--- a/decidim-blogs/config/locales/es.yml
+++ b/decidim-blogs/config/locales/es.yml
@@ -107,6 +107,7 @@ es:
destroy: Borrar
like: '"Me gusta"'
update: Actualizar
+ vote_comment: Votar el comentario
name: Blog
settings:
global:
diff --git a/decidim-blogs/config/locales/fr-CA.yml b/decidim-blogs/config/locales/fr-CA.yml
index a98a8a6538a2b..10c06ad6bff58 100644
--- a/decidim-blogs/config/locales/fr-CA.yml
+++ b/decidim-blogs/config/locales/fr-CA.yml
@@ -106,6 +106,7 @@ fr-CA:
create: Créer
destroy: Supprimer
update: Mettre à jour
+ vote_comment: Vote sur le commentaire
name: Actualités
settings:
global:
diff --git a/decidim-blogs/config/locales/fr.yml b/decidim-blogs/config/locales/fr.yml
index caa1612c8034a..5a204cdb2010f 100644
--- a/decidim-blogs/config/locales/fr.yml
+++ b/decidim-blogs/config/locales/fr.yml
@@ -106,6 +106,7 @@ fr:
create: Créer
destroy: Supprimer
update: Mettre à jour
+ vote_comment: Vote sur le commentaire
name: Actualités
settings:
global:
diff --git a/decidim-blogs/decidim-blogs.gemspec b/decidim-blogs/decidim-blogs.gemspec
index 0ad92b049a1ed..8ed75da51dd31 100644
--- a/decidim-blogs/decidim-blogs.gemspec
+++ b/decidim-blogs/decidim-blogs.gemspec
@@ -19,7 +19,7 @@ Gem::Specification.new do |s|
"homepage_uri" => "https://decidim.org",
"source_code_uri" => "https://github.com/decidim/decidim"
}
- s.required_ruby_version = "~> 3.3.0"
+ s.required_ruby_version = "~> 3.4.0"
s.name = "decidim-blogs"
s.summary = "Decidim blogs module"
diff --git a/decidim-blogs/lib/decidim/blogs/component.rb b/decidim-blogs/lib/decidim/blogs/component.rb
index f87f03a37260a..58ef1eaeafd36 100644
--- a/decidim-blogs/lib/decidim/blogs/component.rb
+++ b/decidim-blogs/lib/decidim/blogs/component.rb
@@ -50,7 +50,7 @@
component.register_resource(:blogpost) do |resource|
resource.model_class_name = "Decidim::Blogs::Post"
resource.card = "decidim/blogs/post"
- resource.actions = %w(like comment)
+ resource.actions = %w(like comment vote_comment)
resource.searchable = true
end
diff --git a/decidim-blogs/spec/controllers/decidim/blogs/posts_controller_spec.rb b/decidim-blogs/spec/controllers/decidim/blogs/posts_controller_spec.rb
index 6351f93ded640..376039279c953 100644
--- a/decidim-blogs/spec/controllers/decidim/blogs/posts_controller_spec.rb
+++ b/decidim-blogs/spec/controllers/decidim/blogs/posts_controller_spec.rb
@@ -34,7 +34,7 @@ module Blogs
context "when not logged in" do
it "throws exception on non published page" do
expect { get :show, params: { id: unpublished.id } }
- .to raise_error(ActiveRecord::RecordNotFound)
+ .to raise_error(ActionController::RoutingError)
end
end
@@ -47,7 +47,7 @@ module Blogs
it "throws exception on non published page" do
expect { get :show, params: { id: unpublished.id } }
- .to raise_error(ActiveRecord::RecordNotFound)
+ .to raise_error(ActionController::RoutingError)
end
end
diff --git a/decidim-blogs/spec/system/admin_access_spec.rb b/decidim-blogs/spec/system/admin_access_spec.rb
new file mode 100644
index 0000000000000..d650e04270380
--- /dev/null
+++ b/decidim-blogs/spec/system/admin_access_spec.rb
@@ -0,0 +1,14 @@
+# frozen_string_literal: true
+
+require "spec_helper"
+
+require "decidim/admin/test/admin_participatory_space_component_access_examples"
+
+describe "AdminAccess" do
+ let(:manifest_name) { "blogs" }
+ let!(:post) { create(:post, component:, title: { en: "Blog post title" }) }
+ let(:title) { "Posts" }
+
+ include_context "when managing a component as an admin"
+ include_examples "accessing the component in a participatory space"
+end
diff --git a/decidim-blogs/spec/system/explore_posts_spec.rb b/decidim-blogs/spec/system/explore_posts_spec.rb
index f8596bad46a51..9cba82f5d0380 100644
--- a/decidim-blogs/spec/system/explore_posts_spec.rb
+++ b/decidim-blogs/spec/system/explore_posts_spec.rb
@@ -38,6 +38,9 @@
end
it "shows the component name in the sidebar" do
+ within(".menu-bar") do
+ expect(page).to have_content(translated(component.name))
+ end
within("aside") do
expect(page).to have_content(translated(component.name))
end
@@ -86,6 +89,10 @@
within ".author__name" do
expect(page).to have_content("Official")
end
+ within(".menu-bar") do
+ expect(page).to have_content(translated(component.name))
+ expect(page).to have_content(translated(post.title))
+ end
end
end
diff --git a/decidim-budgets/app/controllers/concerns/decidim/budgets/admin/filterable.rb b/decidim-budgets/app/controllers/concerns/decidim/budgets/admin/filterable.rb
index 3d191ae76fcee..fcb87792be20f 100644
--- a/decidim-budgets/app/controllers/concerns/decidim/budgets/admin/filterable.rb
+++ b/decidim-budgets/app/controllers/concerns/decidim/budgets/admin/filterable.rb
@@ -23,10 +23,6 @@ def base_query
collection.includes(:taxonomies).joins(:taxonomies)
end
- def search_field_predicate
- :id_string_or_title_cont
- end
-
def filters
[
:taxonomies_part_of_contains,
diff --git a/decidim-budgets/app/models/decidim/budgets/project.rb b/decidim-budgets/app/models/decidim/budgets/project.rb
index 261f69af96f4b..9990eab6dddcb 100644
--- a/decidim-budgets/app/models/decidim/budgets/project.rb
+++ b/decidim-budgets/app/models/decidim/budgets/project.rb
@@ -151,11 +151,11 @@ def self.ransackable_scopes(_auth_object = nil)
end
def self.ransackable_attributes(auth_object = nil)
- base = %w(search_text description title)
+ base = %w(id_string id search_text description title)
return base unless auth_object&.admin?
- base + %w(id_string id selected selected_at confirmed_orders_count)
+ base + %w(selected selected_at confirmed_orders_count)
end
def self.ransackable_associations(_auth_object = nil)
diff --git a/decidim-budgets/app/views/decidim/budgets/admin/projects/_project-tr.html.erb b/decidim-budgets/app/views/decidim/budgets/admin/projects/_project-tr.html.erb
index eef9246f9f198..17faa519d2eed 100644
--- a/decidim-budgets/app/views/decidim/budgets/admin/projects/_project-tr.html.erb
+++ b/decidim-budgets/app/views/decidim/budgets/admin/projects/_project-tr.html.erb
@@ -2,9 +2,6 @@
<% end %>
<% end %>
- <% meetings.group_by(&:category).each do |categories_block| %>
-
- <% categories_block.last.each do |meeting| %>
+ <% meetings.group_by(&:taxonomies).each do |taxonomies_block| %>
+
+ <% taxonomies_block.last.each do |meeting| %>
<%= render partial: "program_meeting", locals: { meeting: } %>
<% end %>
diff --git a/decidim-conferences/config/locales/ca-IT.yml b/decidim-conferences/config/locales/ca-IT.yml
index 6c42a2c109c13..6a6fe10d36622 100644
--- a/decidim-conferences/config/locales/ca-IT.yml
+++ b/decidim-conferences/config/locales/ca-IT.yml
@@ -442,6 +442,8 @@ ca-IT:
no_slots_available: No hi ha places disponibles
registration: Inscripció
conference_program:
+ program_item:
+ other_category: Altre
show:
program: Programa
conference_registration_mailer:
diff --git a/decidim-conferences/config/locales/ca.yml b/decidim-conferences/config/locales/ca.yml
index 41ceb56f19eaa..d82f4cd582c04 100644
--- a/decidim-conferences/config/locales/ca.yml
+++ b/decidim-conferences/config/locales/ca.yml
@@ -442,6 +442,8 @@ ca:
no_slots_available: No hi ha places disponibles
registration: Inscripció
conference_program:
+ program_item:
+ other_category: Altre
show:
program: Programa
conference_registration_mailer:
diff --git a/decidim-conferences/config/locales/en.yml b/decidim-conferences/config/locales/en.yml
index 575c80ad18808..10f890ace43f1 100644
--- a/decidim-conferences/config/locales/en.yml
+++ b/decidim-conferences/config/locales/en.yml
@@ -443,6 +443,8 @@ en:
no_slots_available: No slots available
registration: Registration
conference_program:
+ program_item:
+ other_category: Other
show:
program: Program
conference_registration_mailer:
@@ -621,6 +623,7 @@ en:
open_data:
help:
conferences:
+ component_settings: Component settings of the conference space
created_at: The date this space was created
decidim_scope_id: The scope of the conference
description: A long description of the conference
diff --git a/decidim-conferences/config/locales/es-MX.yml b/decidim-conferences/config/locales/es-MX.yml
index 0a85567f5b84e..bbca649525b0c 100644
--- a/decidim-conferences/config/locales/es-MX.yml
+++ b/decidim-conferences/config/locales/es-MX.yml
@@ -442,6 +442,8 @@ es-MX:
no_slots_available: No hay plazas disponibles
registration: Inscripción
conference_program:
+ program_item:
+ other_category: Otro
show:
program: Programa
conference_registration_mailer:
diff --git a/decidim-conferences/config/locales/es-PY.yml b/decidim-conferences/config/locales/es-PY.yml
index c2c719fc803b6..600d5d4900dfb 100644
--- a/decidim-conferences/config/locales/es-PY.yml
+++ b/decidim-conferences/config/locales/es-PY.yml
@@ -442,6 +442,8 @@ es-PY:
no_slots_available: No hay espacios disponibles
registration: Registro
conference_program:
+ program_item:
+ other_category: Otro
show:
program: Programa
conference_registration_mailer:
diff --git a/decidim-conferences/config/locales/es.yml b/decidim-conferences/config/locales/es.yml
index db8d91d038e95..8a45c03aa3e6a 100644
--- a/decidim-conferences/config/locales/es.yml
+++ b/decidim-conferences/config/locales/es.yml
@@ -442,6 +442,8 @@ es:
no_slots_available: No hay plazas disponibles
registration: Inscripción
conference_program:
+ program_item:
+ other_category: Otro
show:
program: Programa
conference_registration_mailer:
diff --git a/decidim-conferences/config/locales/eu.yml b/decidim-conferences/config/locales/eu.yml
index 9d5d522afa6fd..65fbfde7a97b8 100644
--- a/decidim-conferences/config/locales/eu.yml
+++ b/decidim-conferences/config/locales/eu.yml
@@ -442,6 +442,8 @@ eu:
no_slots_available: Ez dago plazarik
registration: Izen-ematea
conference_program:
+ program_item:
+ other_category: Beste bat
show:
program: Egitaraua
conference_registration_mailer:
diff --git a/decidim-conferences/config/locales/fr-CA.yml b/decidim-conferences/config/locales/fr-CA.yml
index d1aa62e09adba..454e86e1740ce 100644
--- a/decidim-conferences/config/locales/fr-CA.yml
+++ b/decidim-conferences/config/locales/fr-CA.yml
@@ -437,6 +437,8 @@ fr-CA:
no_slots_available: Il ne reste plus de place
registration: Inscription
conference_program:
+ program_item:
+ other_category: Autre
show:
program: Programme
conference_registration_mailer:
diff --git a/decidim-conferences/config/locales/fr.yml b/decidim-conferences/config/locales/fr.yml
index 5b6551ee25e3c..3c30205baa92d 100644
--- a/decidim-conferences/config/locales/fr.yml
+++ b/decidim-conferences/config/locales/fr.yml
@@ -437,6 +437,8 @@ fr:
no_slots_available: Il ne reste plus de place
registration: Inscription
conference_program:
+ program_item:
+ other_category: Autre
show:
program: Programme
conference_registration_mailer:
diff --git a/decidim-conferences/config/locales/ja.yml b/decidim-conferences/config/locales/ja.yml
index 4d35b6f3d1592..64b14a53698ec 100644
--- a/decidim-conferences/config/locales/ja.yml
+++ b/decidim-conferences/config/locales/ja.yml
@@ -438,6 +438,8 @@ ja:
no_slots_available: 利用可能なスロットがありません
registration: 登録
conference_program:
+ program_item:
+ other_category: その他
show:
program: プログラム
conference_registration_mailer:
diff --git a/decidim-conferences/config/locales/sv.yml b/decidim-conferences/config/locales/sv.yml
index c443a4b285323..3a54afab192a6 100644
--- a/decidim-conferences/config/locales/sv.yml
+++ b/decidim-conferences/config/locales/sv.yml
@@ -427,6 +427,8 @@ sv:
no_slots_available: Inga platser tillgängliga
registration: Registrering
conference_program:
+ program_item:
+ other_category: Övrigt
show:
program: Program
conference_registration_mailer:
diff --git a/decidim-conferences/db/migrate/20251112114826_remove_legacy_images_from_conferences_module.rb b/decidim-conferences/db/migrate/20251112114826_remove_legacy_images_from_conferences_module.rb
new file mode 100644
index 0000000000000..a920cc33a1df1
--- /dev/null
+++ b/decidim-conferences/db/migrate/20251112114826_remove_legacy_images_from_conferences_module.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+class RemoveLegacyImagesFromConferencesModule < ActiveRecord::Migration[7.2]
+ def change
+ remove_column :decidim_conferences, :hero_image, :string
+ remove_column :decidim_conferences, :banner_image, :string
+ remove_column :decidim_conferences, :main_logo, :string
+ remove_column :decidim_conferences, :signature, :string
+
+ remove_column :decidim_conference_speakers, :avatar, :string
+ remove_column :decidim_conferences_partners, :logo, :string
+ end
+end
diff --git a/decidim-conferences/decidim-conferences.gemspec b/decidim-conferences/decidim-conferences.gemspec
index 1eec50811e176..65358fcb4d35a 100644
--- a/decidim-conferences/decidim-conferences.gemspec
+++ b/decidim-conferences/decidim-conferences.gemspec
@@ -17,7 +17,7 @@ Gem::Specification.new do |s|
"homepage_uri" => "https://decidim.org",
"source_code_uri" => "https://github.com/decidim/decidim"
}
- s.required_ruby_version = "~> 3.3.0"
+ s.required_ruby_version = "~> 3.4.0"
s.name = "decidim-conferences"
s.summary = "Decidim conferences module"
diff --git a/decidim-conferences/lib/decidim/conferences/participatory_space.rb b/decidim-conferences/lib/decidim/conferences/participatory_space.rb
index eed900f6c2319..b2cd8e49fced6 100644
--- a/decidim-conferences/lib/decidim/conferences/participatory_space.rb
+++ b/decidim-conferences/lib/decidim/conferences/participatory_space.rb
@@ -51,10 +51,8 @@
end
participatory_space.exports :conferences do |export|
- export.collection do
- Decidim::Conference
- .public_spaces
- .includes(:taxonomies, :attachment_collections)
+ export.collection do |participatory_space, _user|
+ Decidim::Conference.public_spaces.includes(:taxonomies, :attachment_collections).where(id: participatory_space)
end
export.include_in_open_data = true
diff --git a/decidim-conferences/spec/system/admin/admin_access_spec.rb b/decidim-conferences/spec/system/admin/admin_access_spec.rb
index 5b32a9b146388..9fd1bcd8fec28 100644
--- a/decidim-conferences/spec/system/admin/admin_access_spec.rb
+++ b/decidim-conferences/spec/system/admin/admin_access_spec.rb
@@ -17,6 +17,9 @@
it_behaves_like "admin participatory space access"
it_behaves_like "admin participatory space edit button"
+ it_behaves_like "admin menu shows only assigned space",
+ space_name: "Conferences",
+ other_spaces: %w(Processes Initiatives Assemblies)
end
context "with participatory space evaluator" do
diff --git a/decidim-conferences/spec/system/conference_program_spec.rb b/decidim-conferences/spec/system/conference_program_spec.rb
index 6449c9c2e5b65..091136f369ee4 100644
--- a/decidim-conferences/spec/system/conference_program_spec.rb
+++ b/decidim-conferences/spec/system/conference_program_spec.rb
@@ -39,8 +39,10 @@
context "when there are some conference meetings" do
let!(:conference_speakers) { create_list(:conference_speaker, 3, :with_meeting, conference:, meetings_component: component) }
let(:meetings) { Decidim::ConferenceMeeting.where(component:) }
+ let(:taxonomy) { create(:taxonomy, parent: create(:taxonomy, organization:), organization:) }
before do
+ meetings.each { |meeting| meeting.update(taxonomies: [taxonomy]) }
visit decidim_conferences.conference_conference_program_path(conference, component)
end
@@ -79,5 +81,11 @@
end
end
end
+
+ it "has the taxonomy name" do
+ within "[data-conference-program-day]" do
+ expect(page).to have_content(translated_attribute(taxonomy.name))
+ end
+ end
end
end
diff --git a/decidim-conferences/spec/system/conferences_spec.rb b/decidim-conferences/spec/system/conferences_spec.rb
index 849d8fffc114e..340f0b6a63987 100644
--- a/decidim-conferences/spec/system/conferences_spec.rb
+++ b/decidim-conferences/spec/system/conferences_spec.rb
@@ -28,18 +28,6 @@
end
end
- context "when there are no conferences and accessing from the homepage" do
- let!(:menu_content_block) { create(:content_block, organization:, manifest_name: :global_menu, scope_name: :homepage) }
-
- it "the menu link is not shown" do
- visit decidim.root_path
-
- within "#home__menu" do
- expect(page).to have_no_content("Conferences")
- end
- end
- end
-
context "when the conference does not exist" do
it_behaves_like "a 404 page" do
let(:target_path) { decidim_conferences.conference_path(99_999_999) }
@@ -57,18 +45,6 @@
let(:target_path) { decidim_conferences.conferences_path }
end
end
-
- context "and accessing from the homepage" do
- let!(:menu_content_block) { create(:content_block, organization:, manifest_name: :global_menu, scope_name: :homepage) }
-
- it "the menu link is not shown" do
- visit decidim.root_path
-
- within "#home__menu" do
- expect(page).to have_no_content("Conferences")
- end
- end
- end
end
context "when there are some published conferences" do
@@ -85,20 +61,6 @@
let(:manifest_name) { :conferences }
end
- context "and accessing from the homepage" do
- let!(:menu_content_block) { create(:content_block, organization:, manifest_name: :global_menu, scope_name: :homepage) }
-
- it "the menu link is shown" do
- visit decidim.root_path
-
- within "#home__menu" do
- click_on "Conferences"
- end
-
- expect(page).to have_current_path decidim_conferences.conferences_path
- end
- end
-
it "lists all the highlighted conferences" do
within "#highlighted-conferences" do
expect(page).to have_content(translated(promoted_conference.title, locale: :en))
diff --git a/decidim-core/app/cells/decidim/content_blocks/global_menu/show.erb b/decidim-core/app/cells/decidim/content_blocks/global_menu/show.erb
deleted file mode 100644
index 374b85592098c..0000000000000
--- a/decidim-core/app/cells/decidim/content_blocks/global_menu/show.erb
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
- <% menu_items.each do |item| %>
-
- <%= link_to item.url, class: "button button__text home__menu-element--link" do %>
- <%= item.label %>
- <% end %>
-
- <% (available_locales - [I18n.locale.to_s]).each do |locale| %>
-
+
+
-
+
<% end %>
diff --git a/decidim-core/config/locales/ar.yml b/decidim-core/config/locales/ar.yml
index d01366657902b..e615d82bfb737 100644
--- a/decidim-core/config/locales/ar.yml
+++ b/decidim-core/config/locales/ar.yml
@@ -435,8 +435,6 @@ ar:
description: الوصف
footer_sub_hero:
name: تذييل البطل الفرعي راية
- global_menu:
- name: القائمة العامة
hero_settings_form:
background_image: الصورة الخلفية
welcome_text: نص الترحيب
@@ -793,7 +791,6 @@ ar:
latlng_text: 'العرض: %{latitude}، الطول: %{longitude}'
map_service_brand: OpenStreetMap
menu:
- help: المساعدة
home: الصفحة الرئيسية
messaging:
conversation_mailer:
diff --git a/decidim-core/config/locales/bg.yml b/decidim-core/config/locales/bg.yml
index d229d181c887b..92ebcd767b2f9 100644
--- a/decidim-core/config/locales/bg.yml
+++ b/decidim-core/config/locales/bg.yml
@@ -489,8 +489,6 @@ bg:
description: Описание
footer_sub_hero:
name: Долен колонтитул на под-геройския банер
- global_menu:
- name: Основно меню
hero:
name: Профилно изображение и бутон "Призив към действие"
hero_settings_form:
@@ -910,7 +908,6 @@ bg:
latlng_text: 'географска ширина: %{latitude}, географска дължина: %{longitude}'
map_service_brand: OpenStreetMap
menu:
- help: Помощ
home: Начало
messaging:
conversation_mailer:
diff --git a/decidim-core/config/locales/ca-IT.yml b/decidim-core/config/locales/ca-IT.yml
index 2759f102569f8..bad3cdab97abf 100644
--- a/decidim-core/config/locales/ca-IT.yml
+++ b/decidim-core/config/locales/ca-IT.yml
@@ -198,6 +198,7 @@ ca-IT:
success: El teu compte s'ha eliminat correctament.
download_your_data_export:
export_expired: L'exportació ha caducat. Intenta generar una nova exportació.
+ export_not_found: L'exportació a la qual has accedit no existeix o no tens accés o permisos per descarregar-la
file_no_exists: L'arxiu no existeix
notice: La descàrrega de les teves dades està en curs. Rebràs un correu electrònic quan estigui completa.
email_change:
@@ -585,8 +586,6 @@ ca-IT:
description: Descripció
footer_sub_hero:
name: Peu de pàgina sub-hero
- global_menu:
- name: Menú global
hero:
name: Imatge principal i botó d'acció
hero_settings_form:
@@ -1148,6 +1147,7 @@ ca-IT:
create_with_space: "%{user_name} ha creat %{resource_name} a %{space_name}"
delete: "%{user_name} ha eliminat %{resource_name}"
delete_with_space: "%{user_name} ha eliminat %{resource_name} en %{space_name}"
+ publish: "%{user_name} ha publicat %{resource_name}"
publish_with_space: "%{user_name} ha publicat %{resource_name} en %{space_name}"
unknown_action: "%{user_name} ha realitzat una acció a %{resource_name}"
unknown_action_with_space: "%{user_name} ha realitzat una acció a %{resource_name} en %{space_name}"
@@ -1180,7 +1180,6 @@ ca-IT:
latlng_text: 'latitud: %{latitude}, longitud: %{longitude}'
map_service_brand: OpenStreetMap
menu:
- help: Ajuda
home: Inici
messaging:
conversation_mailer:
@@ -2169,8 +2168,8 @@ ca-IT:
profile: Perfil
title: Configuració de la participant
locale:
- name: Català
- name_with_error: Català (error!)
+ name: Alguerés
+ name_with_error: Alguerés (error!)
number:
currency:
format:
diff --git a/decidim-core/config/locales/ca.yml b/decidim-core/config/locales/ca.yml
index dc2301b218262..74a0e406d3ebc 100644
--- a/decidim-core/config/locales/ca.yml
+++ b/decidim-core/config/locales/ca.yml
@@ -198,6 +198,7 @@ ca:
success: El teu compte s'ha eliminat correctament.
download_your_data_export:
export_expired: L'exportació ha caducat. Intenta generar una nova exportació.
+ export_not_found: L'exportació a la qual has accedit no existeix o no tens accés o permisos per descarregar-la
file_no_exists: L'arxiu no existeix
notice: La descàrrega de les teves dades està en curs. Rebràs un correu electrònic quan estigui completa.
email_change:
@@ -585,8 +586,6 @@ ca:
description: Descripció
footer_sub_hero:
name: Peu de pàgina sub-hero
- global_menu:
- name: Menú global
hero:
name: Imatge principal i botó d'acció
hero_settings_form:
@@ -1148,6 +1147,7 @@ ca:
create_with_space: "%{user_name} ha creat %{resource_name} a %{space_name}"
delete: "%{user_name} ha eliminat %{resource_name}"
delete_with_space: "%{user_name} ha eliminat %{resource_name} en %{space_name}"
+ publish: "%{user_name} ha publicat %{resource_name}"
publish_with_space: "%{user_name} ha publicat %{resource_name} en %{space_name}"
unknown_action: "%{user_name} ha realitzat una acció a %{resource_name}"
unknown_action_with_space: "%{user_name} ha realitzat una acció a %{resource_name} en %{space_name}"
@@ -1180,7 +1180,6 @@ ca:
latlng_text: 'latitud: %{latitude}, longitud: %{longitude}'
map_service_brand: OpenStreetMap
menu:
- help: Ajuda
home: Inici
messaging:
conversation_mailer:
diff --git a/decidim-core/config/locales/cs.yml b/decidim-core/config/locales/cs.yml
index 5772c1a228ce6..253c2f993635c 100644
--- a/decidim-core/config/locales/cs.yml
+++ b/decidim-core/config/locales/cs.yml
@@ -619,8 +619,6 @@ cs:
description: Popis
footer_sub_hero:
name: Zápatí pod hlavním pruhem
- global_menu:
- name: Globální menu
hero:
name: Obrázek hrdiny a CTA
hero_settings_form:
@@ -1208,7 +1206,6 @@ cs:
latlng_text: 'zeměpisná šířka: %{latitude}, zeměpisná délka: %{longitude}'
map_service_brand: OpenStreetMap
menu:
- help: Pomoc
home: Úvod
messaging:
conversation_mailer:
diff --git a/decidim-core/config/locales/de.yml b/decidim-core/config/locales/de.yml
index 60fff8074f4b0..a908ea3e24932 100644
--- a/decidim-core/config/locales/de.yml
+++ b/decidim-core/config/locales/de.yml
@@ -588,8 +588,6 @@ de:
description: Beschreibung
footer_sub_hero:
name: Abschnitt mit Plattformslogan
- global_menu:
- name: Globales Menü
hero:
name: Banner-Bild und Handlungsaufforderung
hero_settings_form:
@@ -685,7 +683,7 @@ de:
newsletter_title: Kontakterlaubnis
sign_up: Konto erstellen
subtitle: Erstellen Sie ein Konto, um auf der Plattform teilzunehmen.
- terms: die Nutzungsbedingungen
+ terms: den Nutzungsbedingungen
tos_agreement: Mit der Anmeldung stimmen Sie %{link} zu.
tos_title: Nutzungsbedingungen
username_help: Öffentlich sichtbarer Name, der in Ihren Beiträgen angezeigt wird. Um Anonymität zu gewährleisten, kann es sich um einen beliebigen Namen handeln.
@@ -1187,7 +1185,6 @@ de:
latlng_text: 'Breitengrad: %{latitude}, Längengrad: %{longitude}'
map_service_brand: OpenStreetMap
menu:
- help: Hilfe
home: Start
messaging:
conversation_mailer:
diff --git a/decidim-core/config/locales/el.yml b/decidim-core/config/locales/el.yml
index 422d0ec269ec4..d6ca16c1af240 100644
--- a/decidim-core/config/locales/el.yml
+++ b/decidim-core/config/locales/el.yml
@@ -698,7 +698,6 @@ el:
latlng_text: 'γεωγραφικό πλάτος: %{latitude}, γεωγραφικό μήκος: %{longitude}'
map_service_brand: OpenStreetMap
menu:
- help: Βοήθεια
home: Αρχική σελίδα
messaging:
conversation_mailer:
diff --git a/decidim-core/config/locales/en.yml b/decidim-core/config/locales/en.yml
index fdd27c9ff8e57..cf9de5bbd89e0 100644
--- a/decidim-core/config/locales/en.yml
+++ b/decidim-core/config/locales/en.yml
@@ -590,8 +590,6 @@ en:
description: Description
footer_sub_hero:
name: Footer sub hero banner
- global_menu:
- name: Global menu
hero:
name: Hero image and CTA
hero_settings_form:
@@ -767,7 +765,7 @@ en:
created_at: The date when this conversation was created
id: The unique identifier for this conversation
messages: The messages of this conversation
- updated_at: The date when this converstaion was last updated
+ updated_at: The date when this conversation was last updated
notifications:
created_at: The date and time when the notification was created
event_class: The class of the event that triggered the notification
@@ -792,7 +790,7 @@ en:
reason: The reason of this report
updated_at: The date and time when this report was last updated
users:
- about: The biography of this user
+ about: The profile description of this participant
accepted_tos_version: The date when the Terms of Service of this platform was accepted by the user
admin: Whether this user is an administrator
confirmation_sent_at: The date and time when the confirmation was sent
@@ -803,7 +801,7 @@ en:
delete_reason: The reason given for deleting this user
deleted_at: The date and time when this user was deleted
email: The email address of this user
- followers_count: The number of participants that are following to this user
+ followers_count: The number of participants that are following this user
following_count: The number of participants this user is following
id: The unique identifier of this user
invitation_accepted_at: The date and time when the invitation was accepted
@@ -811,16 +809,16 @@ en:
invitation_sent_at: The date and time when the invitation was sent
invitations_count: The number of invitations sent to this user
invited_by: The user who invited this user
- last_sign_in_at: The date and time of the last login
- last_sign_in_ip: The IP address of the last login
+ last_sign_in_at: The date and time of the previous login
+ last_sign_in_ip: The IP address of the previous login
locale: The locale (language) that this user has selected
managed: Whether this user is managed by another user
name: The name of this user
- newsletter_notifications_at: The date and time when this user last received a newsletter
+ newsletter_notifications_at: The date and time when this participant subscribed to receive a newsletter
nickname: The nickname of this user
notification_settings: The notification settings that this user has selected
notifications_sending_frequency: The frequency of the notifications that this user receives
- officialized_as: The name of the officialization (Counsellor, Mayor, etc)
+ officialized_as: The name of the officialization (Councillor, Mayor, etc)
officialized_at: The date and time when this user was officialized
organization: The organization that this user belongs to
password_updated_at: The date when their password was changed for the last time
@@ -858,7 +856,7 @@ en:
files:
file_cannot_be_processed: File cannot be processed
file_resolution_too_large: File resolution is too large
- not_inside_organization: The file is not attached to any organization
+ not_inside_organization: The file is not attached to any organization.
internal_server_error:
copied: Text copied!
copy_error_message_clarification: Copy error message to clipboard
@@ -1055,7 +1053,7 @@ en:
file:
explanation: 'Guidance for file:'
message_1: Has to be an image or a document.
- message_2: If it is an image, it preferably be a landscape image that does not have any text. The service crops the image.
+ message_2: If it is an image, it preferably be a landscape image that does not have any text. The platform crops the image.
icon:
explanation: 'Guidance for icon:'
message_1: Has to be a square image.
@@ -1190,7 +1188,6 @@ en:
latlng_text: 'latitude: %{latitude}, longitude: %{longitude}'
map_service_brand: OpenStreetMap
menu:
- help: Help
home: Home
messaging:
conversation_mailer:
@@ -1299,11 +1296,11 @@ en:
same_language: The content has been posted in your preferred language (%{language}), this is why no automated translation is displayed in this email.
translated_text: 'Automatically translated text:'
notifications:
- action_error: There was a problem updating the notifications.
+ action_error: There was a problem updating the notification settings.
no_notifications: No notifications yet.
show:
missing_event: Oops, this notification belongs to an item that is no longer available. You can discard it.
- moderated: Content moderated
+ moderated: Content has been hidden through moderation.
notifications_digest_mailer:
header:
daily: Daily Notification Digest
@@ -1312,7 +1309,7 @@ en:
hello: Hello %{name},
intro:
daily: 'These are the notifications from the last day based on the activity you are following:'
- real_time: 'These is a notification on the activity you are following:'
+ real_time: 'This is a notification on the activity you are following:'
weekly: 'These are the notifications from the last week based on the activity you are following:'
outro: You have received these notifications because you are following this content or its authors. You can unfollow them from their respective pages.
see_more: See more notifications
@@ -1455,9 +1452,9 @@ en:
title: How to open and work with these files
license:
body_1_html: This %{organization_name} database is made available under the %{link_database}. Any rights in individual contents of the database are licensed under the %{link_contents}.
- license_contents_link: http://opendatacommons.org/licenses/dbcl/1.0/
+ license_contents_link: https://opendatacommons.org/licenses/dbcl/1.0/
license_contents_name: Database Contents License
- license_database_link: http://opendatacommons.org/licenses/odbl/1.0/
+ license_database_link: https://opendatacommons.org/licenses/odbl/1.0/
license_database_name: Open Database License
title: License
title: Open Data
@@ -1480,7 +1477,7 @@ en:
footer_sub_hero:
footer_sub_hero_body_html: Let's build a more open, transparent and collaborative society. Join, participate and decide.
footer_sub_hero_headline: Welcome to %{organization} participatory platform.
- register: Register
+ register: Create an account
hero:
participate: Participate
participate_title: Participate in the platform's processes
@@ -1488,7 +1485,7 @@ en:
statistics:
headline: Statistics
sub_hero:
- register: Register
+ register: Create an account
register_title: Create an account
index:
standalone_pages: Pages
@@ -2142,7 +2139,7 @@ en:
language_chooser:
choose_language: Choose language
navigation:
- aria_label: Navigation menu- %{title}
+ aria_label: 'Navigation menu: %{title}'
notifications_dashboard:
mark_all_as_read: Mark all as read
mark_as_read: Mark as read
diff --git a/decidim-core/config/locales/es-MX.yml b/decidim-core/config/locales/es-MX.yml
index fd084dc03de03..56bbc79eb75df 100644
--- a/decidim-core/config/locales/es-MX.yml
+++ b/decidim-core/config/locales/es-MX.yml
@@ -198,6 +198,7 @@ es-MX:
success: Tu cuenta se ha eliminado correctamente.
download_your_data_export:
export_expired: La exportación ha caducado. Intenta generar una nueva exportación.
+ export_not_found: La exportación a la que has accedido no existe o no tienes acceso o permisos para descargarla
file_no_exists: El archivo no existe
notice: La descarga de tus datos está en curso. Recibirás un correo electrónico cuando se complete.
email_change:
@@ -588,8 +589,6 @@ es-MX:
description: Descripción
footer_sub_hero:
name: Banner de sub-hero de pie de página
- global_menu:
- name: Menú global
hero:
name: Imagen principal y botón de acción
hero_settings_form:
@@ -1151,6 +1150,7 @@ es-MX:
create_with_space: "%{user_name} creó %{resource_name} en %{space_name}"
delete: "%{user_name} eliminó %{resource_name}"
delete_with_space: "%{user_name} eliminó %{resource_name} en %{space_name}"
+ publish: "%{user_name} publicó %{resource_name}"
publish_with_space: "%{user_name} ha publicado %{resource_name} en %{space_name}"
unknown_action: "%{user_name} realizó una acción en %{resource_name}"
unknown_action_with_space: "%{user_name} realizó una acción en %{resource_name} en %{space_name}"
@@ -1183,7 +1183,6 @@ es-MX:
latlng_text: 'latitud: %{latitude}, longitud: %{longitude}'
map_service_brand: OpenStreetMap
menu:
- help: Ayuda
home: Inicio
messaging:
conversation_mailer:
diff --git a/decidim-core/config/locales/es-PY.yml b/decidim-core/config/locales/es-PY.yml
index 9d14c1350b6e6..7d7dc14de8885 100644
--- a/decidim-core/config/locales/es-PY.yml
+++ b/decidim-core/config/locales/es-PY.yml
@@ -198,6 +198,7 @@ es-PY:
success: Tu cuenta se ha eliminado correctamente.
download_your_data_export:
export_expired: La exportación ha caducado. Intenta generar una nueva exportación.
+ export_not_found: La exportación a la que has accedido no existe o no tienes acceso o permisos para descargarla
file_no_exists: El archivo no existe
notice: La descarga de tus datos está en curso. Recibirás un correo electrónico cuando se complete.
email_change:
@@ -588,8 +589,6 @@ es-PY:
description: Descripción
footer_sub_hero:
name: Banner de sub-hero de pie de página
- global_menu:
- name: Menú global
hero:
name: Imagen principal y botón de acción
hero_settings_form:
@@ -1151,6 +1150,7 @@ es-PY:
create_with_space: "%{user_name} creó %{resource_name} en %{space_name}"
delete: "%{user_name} eliminó %{resource_name}"
delete_with_space: "%{user_name} eliminó %{resource_name} en %{space_name}"
+ publish: "%{user_name} publicó %{resource_name}"
publish_with_space: "%{user_name} ha publicado %{resource_name} en %{space_name}"
unknown_action: "%{user_name} realizó una acción en %{resource_name}"
unknown_action_with_space: "%{user_name} realizó una acción en %{resource_name} en %{space_name}"
@@ -1183,7 +1183,6 @@ es-PY:
latlng_text: 'latitud: %{latitude}, longitud: %{longitude}'
map_service_brand: OpenStreetMap
menu:
- help: Ayuda
home: Inicio
messaging:
conversation_mailer:
diff --git a/decidim-core/config/locales/es.yml b/decidim-core/config/locales/es.yml
index 14fde8809a5fc..d1b82081f0395 100644
--- a/decidim-core/config/locales/es.yml
+++ b/decidim-core/config/locales/es.yml
@@ -198,6 +198,7 @@ es:
success: Tu cuenta se ha eliminado correctamente.
download_your_data_export:
export_expired: La exportación ha caducado. Intenta generar una nueva exportación.
+ export_not_found: La exportación a la que has accedido no existe o no tienes acceso o permisos para descargarla
file_no_exists: El archivo no existe
notice: La descarga de tus datos está en curso. Recibirás un correo electrónico cuando se complete.
email_change:
@@ -585,8 +586,6 @@ es:
description: Descripción
footer_sub_hero:
name: Banner de sub-hero de pie de página
- global_menu:
- name: Menú global
hero:
name: Imagen principal y botón de acción
hero_settings_form:
@@ -1148,6 +1147,7 @@ es:
create_with_space: "%{user_name} creó %{resource_name} en %{space_name}"
delete: "%{user_name} eliminó %{resource_name}"
delete_with_space: "%{user_name} eliminó %{resource_name} en %{space_name}"
+ publish: "%{user_name} publicó %{resource_name}"
publish_with_space: "%{user_name} ha publicado %{resource_name} en %{space_name}"
unknown_action: "%{user_name} realizó una acción en %{resource_name}"
unknown_action_with_space: "%{user_name} realizó una acción en %{resource_name} en %{space_name}"
@@ -1180,7 +1180,6 @@ es:
latlng_text: 'latitud: %{latitude}, longitud: %{longitude}'
map_service_brand: OpenStreetMap
menu:
- help: Ayuda
home: Inicio
messaging:
conversation_mailer:
diff --git a/decidim-core/config/locales/eu.yml b/decidim-core/config/locales/eu.yml
index 3c8a9df278320..1277ab6d6bda8 100644
--- a/decidim-core/config/locales/eu.yml
+++ b/decidim-core/config/locales/eu.yml
@@ -198,6 +198,7 @@ eu:
success: Zure kontua ezabatu egin da.
download_your_data_export:
export_expired: Esportazioa amaitu da. Saiatu beste esportazio bat sortzen.
+ export_not_found: Sartu zaren esportazioa ez da existitzen, edo ez duzu deskargatzeko aukerarik
file_no_exists: Fitxategia ez dago
notice: Une honetan zure datuak deskargatzen ari dira. Mezu elektroniko bat jasoko duzu amaitutakoan.
email_change:
@@ -413,7 +414,7 @@ eu:
heading: Aldaketa berrikustea
send: Onartu aldaketa
update_draft:
- error: Arazoa egon da zuzenketa-zirriborroa eguneratzean.
+ error: Arazo bat egon da zuzenketa-zirriborroa eguneratzean.
success: Zuzenketa-zirriborroa zuzen eguneratu da.
withdraw:
error: Arazo bat izan da zuzenketa kentzean.
@@ -587,8 +588,6 @@ eu:
description: Deskribapena
footer_sub_hero:
name: Azpi-heroko bannerra orri-oinean
- global_menu:
- name: Menu globala
hero:
name: Irudi nagusia eta ekintza botoia
hero_settings_form:
@@ -670,7 +669,7 @@ eu:
nickname_help: Zure ezizena %{organization}-an. Letrak, zenbakiak, '-' eta '_' soilik eduki ditzake.
sign_up: Mesedez, osatu zure profila
subtitle: Mesedez, bete hurrengo formularioa kontua sortzen amaitzeko
- username_help: Zure mezuetan agertuko den izen publikoa. Anonimatua bermatze aldera, edozein izen izan daiteke.
+ username_help: Zure mezuetan agertzen den izen publikoa. Anonimotasuna bermatzeko helburuarekin, edozein izen izan daiteke.
new_tos_fields:
sign_up: Sortu kontu bat
sign_up_title: Zure kontua sortzen amaitu
@@ -687,7 +686,7 @@ eu:
terms: zerbitzuaren baldintzak
tos_agreement: 'Erregistratzean, hau onartzen duzu: %{link}.'
tos_title: Zerbitzuaren baldintzak
- username_help: Zure mezuetan agertuko den izen publikoa. Anonimatua bermatze aldera, edozein izen izan daiteke.
+ username_help: Zure mezuetan agertzen den izen publikoa. Anonimotasuna bermatzeko helburuarekin, edozein izen izan daiteke.
sessions:
new:
are_you_new?: Oraindik erregistratu gabe?
@@ -724,7 +723,7 @@ eu:
doorkeeper:
authorizations:
new:
- api_read: Irakurri edukia APIren bitartez
+ api_read: APIren bitartez edukia irakurri
authorize: Aplikazioa baimentzen du
by_organization_link_html: '%{link} bidez'
cancel: Ezeztatu
@@ -822,7 +821,7 @@ eu:
reset_password_sent_at: Zein datatan eta zein ordutan bidali zen pasahitza berriro
roles: Parte-hartzaile honek duen rola, baldin badute
sign_in_count: Zenbat aldiz hasi duen saioa parte-hartzaile honek
- type: Parte-hartzaile honek zer mota duen
+ type: Erabiltzaile honek dituen aukerak
unconfirmed_email: Parte-hartzaile honek oraindik baieztatu ez duen helbide elektronikoa
updated_at: Zein datatan eta zein ordutan eguneratu zen parte-hartzaile hau azken aldiz
show:
@@ -907,12 +906,12 @@ eu:
affected_user:
email_intro: '%{amendable_title} k zuzenketa ukatu egin du. Orrialde honetan ikus dezakezu:'
email_outro: 'Jakinarazpen hau jaso duzu honen egilea zarelako: %{amendable_title}.'
- email_subject: Aldaketa %{amendable_title} %{emendation_author_nickname} k ukatua
+ email_subject: Aldaketa %{amendable_title} %{emendation_author_nickname} egileak ukatua
notification_title: %{emendation_author_nickname} k egindako zuzenketa %{amendable_title} k ukatu du.
follower:
email_intro: 'Aldaketa ukatu egin da %{amendable_title}. Orrialde honetatik ikus dezakezu:'
email_outro: Jakinarazpen hau jaso duzu %{amendable_title} jarraitzen duzulako. Aurreko estekan jakinarazpenak jasotzeari utzi ahal diozu.
- email_subject: '%{emendation_author_nickname} k baztertu du %{amendable_title} aldaketa'
+ email_subject: '%{emendation_author_nickname} egileak baztertu du %{amendable_title} aldaketa'
notification_title: %{emendation_author_nickname} k sortutako zuzenketa %{amendable_title} k ukatu du.
emendation_promoted:
follower:
@@ -969,9 +968,9 @@ eu:
notification_title: |-
Administratzaile batek zure %{resource_type} ezabatu du salatua izan delako arrazoi honengatik %{report_reasons}.%{resource_content}
resource_liked:
- email_intro: '%{liker_name} %{liker_nickname} -k, zu jarraitzen ari zarenak, "%{resource_title}" atsegin du eta uste dugu interesatu ahal zaizula. Egiaztatu eta lagundu:'
+ email_intro: '%{liker_name} %{liker_nickname}, jarraitzen ari zaren horri "%{resource_title}" gustatu zaio, eta zuretzat interesgarria izan daitekeela uste dugu. Kontsultatu eta ekarri:'
email_outro: Jakinarazpen hau jaso duzu %{liker_nickname} jarraitzen duzulako. Ondorengo estekan sartu jakinarazpenak jasotzeari uzteko.
- email_subject: "%{liker_nickname} -k beste bat atsegin du"
+ email_subject: "%{liker_nickname}(e) k like berri bat egin du"
notification_title: %{liker_name} %{liker_nickname} -k %{resource_title} %{resource_type} ategin du.
resources:
soft_deleted:
@@ -1084,7 +1083,7 @@ eu:
dropzone: Bota fitxategiak hona edo egin klik igotzeko
explanation: Gida honetarako %{attribute}
gamification:
- all_badges_link: Ikusi eskuragarri dauden txapak.
+ all_badges_link: Ikusi eskuragarri dauden bereizgarri guztiak.
badges:
followers:
conditions:
@@ -1149,6 +1148,7 @@ eu:
create_with_space: "%{user_name} sortu %{resource_name} en %{space_name}"
delete: "%{user_name} parte-hartzaileak %{resource_name} ezabatu du"
delete_with_space: "%{user_name} parte-hartzaileak %{resource_name} ezabatu du %{space_name} espazioan"
+ publish: "%{user_name} parte-hartzaileak %{resource_name} argitaratu du"
publish_with_space: "%{user_name} parte-hartzaileak %{resource_name} argitaratu du %{space_name} espazioan"
unknown_action: "%{user_name} parte-hartzaileak ekintza batzuk egin ditu %{resource_name} ean"
unknown_action_with_space: "%{user_name} parte-hartzaileak ekintza batzuk egin ditu %{resource_name} ean %{space_name} espazioan"
@@ -1181,7 +1181,6 @@ eu:
latlng_text: 'latitudea: %{latitude}, longitudea: %{longitude}'
map_service_brand: OpenStreetMap
menu:
- help: Laguntza
home: Hasiera
messaging:
conversation_mailer:
@@ -1391,7 +1390,7 @@ eu:
name: Taxonomia honen izena
parent_id: Taxonomia nagusi honen identifikatzaile bakarrak (baldin badago)
part_of: Taxonomia hau beste taxonomia baten parte den jakiteko erabiltzen da
- taxonomizations_count: Taxonomia hau erabiltzen duten baliabideen zenbaketa
+ taxonomizations_count: Taxonomia hori erabiltzen duten baliabideen zenbaketa
updated_at: Zein datatan eguneratu zen taxonomia hau azkenekoz
weight: Zein ordenatan erakusten den taxonomia hau
users:
@@ -1725,18 +1724,27 @@ eu:
greeting: "%{name}, agurgarria:\n"
instructions_1: Sarbidea baduzu posta elektronikoko kontu horretarako, mesedez, kontsultatu zure sarrera-erretilua argibideetarako.
instructions_2: Horrela ez bada, zure lankideetako batek, pasahitza duenak, jarri beharko du eta kredentzialak zurekin partekatu.
+ instructions_intro: Taldeko kideek profil horretarako sarbidea partekatuko dute orain, saio-hasierako egiaztagiri partekatuak erabiliz (posta elektronikoa eta pasahitza). %{email}(e) ra jarraibideak bidali ditugu profilaren pasahitz berria ezartzeko.
+ instructions_title: "Zer esan nahi du horrek zuretzat"
+ subject: Taldearen profilari dagokionez, eguneraketa garrantzitsua
notify_deprecation_to_owner:
body_1: '%{organization_name} (e) n duzun taldearen profilari buruzko eguneraketa garrantzitsu baten berri ematera gatozkizu.'
body_2: 'Zurea bezalako erakundeen esperientzia sinplifikatzeko gure ahaleginen zati gisa, orain arte ezagutzen dugun "Erabiltzaile Taldeak" funtzioa zaharkituta geratuko da. Taldearen profila: %{name}, ohiko parte-hartzailearen profil bihurtu da.'
+ body_3: Zure kontuan sartzen jarraitzeko eta sarbidea partekatzeko, pasahitz bat ezartzea behar dugu. Behin ezarrita, saioa hasteko kredentzialak (posta elektronikoa eta pasahitza) edozeinekin parteka ditzakezu.
greeting: '%{name}, agurgarria:'
+ instructions_1: 'Egin klik beheko estekan zure pasahitza ezartzeko:'
+ instructions_2: 'Partekatu saioa hasteko kredentzialak (posta elektronikoa: %{email} eta pasahitz berria) zure lankideekin.'
+ instructions_title: "Egin beharrekoa"
+ set_password: Idatzi zure pasahitza
+ subject: Zure taldearen profilari buruzko eguneratze garrantzitsua
notify_user_group_patched:
body_1_html: 'Zure taldearen profilari buruzko eguneratze garrantzitsu baten berri emango dizugu hemen: %{organization_name}.'
body_2_html: 'Zurea bezalako erakundeen esperientzia sinplifikatzeko gure ahaleginen zati gisa, orain arte ezagutzen dugun "Erabiltzaile Taldeak" funtzioa zaharkituta geratuko da. Taldearen profila: %{name}, ohiko parte-hartzailearen profil bihurtu da.'
body_3_html: Zure kontuan sartzen jarraitzeko eta sarbidea partekatzeko, mezu elektroniko eta pasahitz berri bat ezar ditzazun behar dugu. Mesedez, kontuan izan zure taldeko kide bakoitzak mezu hau jasoko duela. Sarbide jarraitua bermatzeko, denek erabiliko dituzten kredentzial partekatuak (posta elektronikoa eta pasahitza) adostu beharko dituzu.
greeting: '%{name}, agurgarria:'
instructions_1_html: 'Erabili behin-behineko kredentzial hauek saioa hasteko:
Erabiltzailea: % {email} Pasahitza: % {password}
'
- instructions_2_html: Jarri helbide elektroniko berria eta pasahitza.
- instructions_3_html: Partekatu zure lankideekin aukeratutako sarrera-kredentzialak, talde osoak kontura sartzen jarraitu ahal izateko.
+ instructions_2_html: Helbide elektroniko berria eta pasahitza jarri.
+ instructions_3_html: Zure lankideekin aukeratutako sarrera-kredentzialak partekatu, talde osoak kontura sartzen jarraitu ahal izateko.
instructions_title_html: "Zer egin behar duzu?"
subject: Zure taldearen profilari buruzko eguneratze garrantzitsua
user_report_mailer:
@@ -1849,7 +1857,7 @@ eu:
reset_password_instructions:
action: Nire pasahitza aldatu
greeting: Kaixo %{recipient}!
- instruction: Norbaitek zure pasahitza aldatzeko esteka eskatu du, eta beheko estekan egin dezakezu.
+ instruction: Norbaitek esteka bat eskatu du zure pasahitza aldatzeko, eta beheko estekaren bidez egin dezakezu.
instruction_2: Ez baduzu hori eskatu, ez egin kasurik mezu honi.
instruction_3: Zure pasahitza ez da aldatuko aurreko estekara sartu eta beste bat sortu arte.
subject: Berrezarri pasahitzaren argibideak
@@ -2018,7 +2026,7 @@ eu:
long_words: luzeegiak diren hitzak ditu (35 karaktere baino gehiago)
must_start_with_caps: letra larriz hasi behartu
nesting_too_deep: ezin da egon azpikategoria batean
- not_found: ezin izan da aurkitu. Lehenago konturik sortu duzu?
+ not_found: ezin izan da aurkitu. Aurretik kontu bat sortu duzu?
not_locked: ez dago itxita
not_saved:
one: 'Errore bat izan da zure eskaera prozesatzean:'
diff --git a/decidim-core/config/locales/fi-plain.yml b/decidim-core/config/locales/fi-plain.yml
index 79ec34c05c0d5..efbc6bf0bee62 100644
--- a/decidim-core/config/locales/fi-plain.yml
+++ b/decidim-core/config/locales/fi-plain.yml
@@ -588,8 +588,6 @@ fi-pl:
description: Kuvaus
footer_sub_hero:
name: Alaosion esialueen banneri
- global_menu:
- name: Päänavigaatio
hero:
name: Pääkuva ja CTA-painike (call to action)
hero_settings_form:
@@ -1150,6 +1148,7 @@ fi-pl:
create_with_space: "%{user_name} loi %{resource_name} tilassa %{space_name}"
delete: "%{user_name} poisti %{resource_name}"
delete_with_space: "%{user_name} poisti %{resource_name} tilassa %{space_name}"
+ publish: "%{user_name} julkaisi kohteen %{resource_name}"
publish_with_space: "%{user_name} julkaisi %{resource_name} osallistumistilassa %{space_name}"
unknown_action: "%{user_name} suoritti toimenpiteen koskien kohdetta %{resource_name}"
unknown_action_with_space: "%{user_name} suoritti toimenpiteen koskien kohdetta %{resource_name} tilassa %{space_name}"
@@ -1182,7 +1181,6 @@ fi-pl:
latlng_text: 'leveysaste: %{latitude}, pituusaste: %{longitude}'
map_service_brand: OpenStreetMap
menu:
- help: Tietoa
home: Etusivu
messaging:
conversation_mailer:
@@ -1739,6 +1737,16 @@ fi-pl:
instructions_title: "Mitä sinun tulee tehdä"
set_password: Määritä salasana
subject: Tärkeä ryhmäprofiilia koskeva päivitys
+ notify_user_group_patched:
+ body_1_html: Tämä viesti koskee tärkeää päivitystä käyttäjäryhmät-toiminnossa palvelussa %{organization_name}.
+ body_2_html: Yksinkertaistaaksemme organisaatioiden kokemusta tällä alustalla, käyttäjäryhmät poistetaan alustalta. Käyttäjäryhmäsi %{name} profiili on nyt muutettu tavalliseksi osallistujaprofiiliksi.
+ body_3_html: Jatkaaksesi ryhmätilisi käyttöä, sinun tulee asettaa sille sähköpostiosoite ja salasana. Huomioithan, että jokainen ryhmäsi jäsen saa tämän sähköpostiviestin. Mikäli haluat jatkaa tilin käyttöä, yhden ryhmän jäsenen tulee jatkossa hallinnoida tiliä ryhmän sähköpostiosoitteella ja hänen asettamallaan salasanalla.
+ greeting: Hei %{name},
+ instructions_1_html: 'Käytä seuraavia väliaikaisia tunnuksia kirjautuaksesi sisään:
Sähköpostiosoite: %{email} Salasana %{password}
'
+ instructions_2_html: Aseta uusi sähköpostiosoite ja salasana.
+ instructions_3_html: Älä jaa näitä tunnuksia kenenkään kanssa. Ainoastaan ryhmän hallinnoija voi jatkossa kirjautua palveluun tällä tilillä.
+ instructions_title_html: "Mitä sinun täytyy tehdä?"
+ subject: Tärkeä ryhmäprofiilia koskeva päivitys
user_report_mailer:
notify:
body_1: Käyttäjä %{user} on ilmoitettu käyttäjän %{token} toimesta
diff --git a/decidim-core/config/locales/fi.yml b/decidim-core/config/locales/fi.yml
index a5145664be69b..67a956f0aa3e9 100644
--- a/decidim-core/config/locales/fi.yml
+++ b/decidim-core/config/locales/fi.yml
@@ -588,8 +588,6 @@ fi:
description: Kuvaus
footer_sub_hero:
name: Alaosion esialueen banneri
- global_menu:
- name: Päänavigaatio
hero:
name: Pääkuva ja CTA-painike (call to action)
hero_settings_form:
@@ -1150,6 +1148,7 @@ fi:
create_with_space: "%{user_name} loi %{resource_name} osallistumistilassa %{space_name}"
delete: "%{user_name} poisti %{resource_name}"
delete_with_space: "%{user_name} poisti %{resource_name} osallistumistilassa %{space_name}"
+ publish: "%{user_name} julkaisi kohteen %{resource_name}"
publish_with_space: "%{user_name} julkaisi %{resource_name} osallistumistilassa %{space_name}"
unknown_action: "%{user_name} suoritti toimenpiteen koskien kohdetta %{resource_name}"
unknown_action_with_space: "%{user_name} suoritti toimenpiteen koskien kohdetta %{resource_name} osallistumistilassa %{space_name}"
@@ -1182,7 +1181,6 @@ fi:
latlng_text: 'leveysaste: %{latitude}, pituusaste: %{longitude}'
map_service_brand: OpenStreetMap
menu:
- help: Tietoa
home: Etusivu
messaging:
conversation_mailer:
@@ -1739,6 +1737,16 @@ fi:
instructions_title: "Mitä sinun tulee tehdä"
set_password: Määritä salasana
subject: Tärkeä ryhmäprofiilia koskeva päivitys
+ notify_user_group_patched:
+ body_1_html: Tämä viesti koskee tärkeää päivitystä käyttäjäryhmät-toiminnossa palvelussa %{organization_name}.
+ body_2_html: Yksinkertaistaaksemme organisaatioiden kokemusta tällä alustalla, käyttäjäryhmät poistetaan alustalta. Käyttäjäryhmäsi %{name} profiili on nyt muutettu tavalliseksi osallistujaprofiiliksi.
+ body_3_html: Jatkaaksesi ryhmätilisi käyttöä, sinun tulee asettaa sille sähköpostiosoite ja salasana. Huomioithan, että jokainen ryhmäsi jäsen saa tämän sähköpostiviestin. Mikäli haluat jatkaa tilin käyttöä, yhden ryhmän jäsenen tulee jatkossa hallinnoida tiliä ryhmän sähköpostiosoitteella ja hänen asettamallaan salasanalla.
+ greeting: Hei %{name},
+ instructions_1_html: 'Käytä seuraavia väliaikaisia tunnuksia kirjautuaksesi sisään:
Sähköpostiosoite: %{email} Salasana %{password}
'
+ instructions_2_html: Aseta uusi sähköpostiosoite ja salasana.
+ instructions_3_html: Älä jaa näitä tunnuksia kenenkään kanssa. Ainoastaan ryhmän hallinnoija voi jatkossa kirjautua palveluun tällä tilillä.
+ instructions_title_html: "Mitä sinun täytyy tehdä?"
+ subject: Tärkeä ryhmäprofiilia koskeva päivitys
user_report_mailer:
notify:
body_1: Käyttäjä %{user} on ilmoitettu käyttäjän %{token} toimesta
diff --git a/decidim-core/config/locales/fr-CA.yml b/decidim-core/config/locales/fr-CA.yml
index 5d748fb77059b..8a28b6a9461b4 100644
--- a/decidim-core/config/locales/fr-CA.yml
+++ b/decidim-core/config/locales/fr-CA.yml
@@ -183,6 +183,7 @@ fr-CA:
success: Votre compte a été supprimé avec succès.
download_your_data_export:
export_expired: L'export a expiré. Essayez de générer un nouvel export.
+ export_not_found: L'export auquel vous avez tenté d'accéder n'existe pas, ou vous n'avez pas l'accès pour le télécharger
file_no_exists: Le fichier n'existe pas
notice: Le téléchargement de vos données est en cours. Vous recevrez un email lorsque celui-ci sera terminé.
email_change:
@@ -547,8 +548,6 @@ fr-CA:
description: Description
footer_sub_hero:
name: Section "Bienvenue sur la plateforme" (. footer_sub_hero)
- global_menu:
- name: Menu global
hero:
name: Image principale et bouton d'action
hero_settings_form:
@@ -1023,6 +1022,7 @@ fr-CA:
create_with_space: "%{user_name} a créé %{resource_name} dans %{space_name}"
delete: "%{user_name} a supprimé %{resource_name}"
delete_with_space: "%{user_name} a supprimé %{resource_name} dans %{space_name}"
+ publish: "%{user_name} a publié %{resource_name}"
publish_with_space: "%{user_name} a publié %{resource_name} dans %{space_name}"
unknown_action: "%{user_name} a effectué une action sur %{resource_name}"
unknown_action_with_space: "%{user_name} a effectué une action sur %{resource_name} dans %{space_name}"
@@ -1053,7 +1053,6 @@ fr-CA:
latlng_text: 'latitude : %{latitude}, longitude : %{longitude}'
map_service_brand: OpenStreetMap
menu:
- help: Aide
home: Accueil
messaging:
conversation_mailer:
@@ -1575,6 +1574,16 @@ fr-CA:
instructions_title: "Ce que vous devez faire"
set_password: Définissez votre mot de passe
subject: Mise à jour importante concernant votre profil de groupe
+ notify_user_group_patched:
+ body_1_html: Nous vous contactons pour vous informer d’une mise à jour importante concernant votre profil de groupe sur %{organization_name}.
+ body_2_html: Dans le cadre de nos efforts pour simplifier et améliorer l'expérience des organisations comme la vôtre, nous déprécions la fonctionnalité "Groupes d'utilisateurs". Votre groupe, %{name}a été converti en simple compte.
+ body_3_html: Pour continuer à accéder à votre compte et partager votre accès, nous avons besoin que vous définissiez une nouvelle adresse e-mail et un nouveau mot de passe. Veuillez noter que chaque membre de votre groupe recevra ce courriel. Pour assurer la continuité de l'accès, vous devrez convenir en interne des identifiants partagés (adresse e-mail et mot de passe) que tout le monde utilisera.
+ greeting: Cher(ère) %{name},
+ instructions_1_html: 'Utilisez les identifiants temporaires suivants pour vous connecter :
Nom d''utilisateur : %{email} Mot de passe : %{password}
'
+ instructions_2_html: Définir une nouvelle adresse e-mail et un nouveau mot de passe.
+ instructions_3_html: Partagez les identifiants de connexion choisis avec vos collègues pour que l'ensemble du groupe puisse continuer à accéder au compte.
+ instructions_title_html: "Ce que vous devez faire"
+ subject: Mise à jour importante concernant votre profil de groupe
user_report_mailer:
notify:
body_1: L'utilisateur %{user} a été signalé par %{token}
diff --git a/decidim-core/config/locales/fr.yml b/decidim-core/config/locales/fr.yml
index 232e5faddf352..a0d02d5ffc2eb 100644
--- a/decidim-core/config/locales/fr.yml
+++ b/decidim-core/config/locales/fr.yml
@@ -183,6 +183,7 @@ fr:
success: Votre compte a été supprimé avec succès.
download_your_data_export:
export_expired: L'export a expiré. Essayez de générer un nouvel export.
+ export_not_found: L'export auquel vous avez tenté d'accéder n'existe pas, ou vous n'avez pas l'accès pour le télécharger
file_no_exists: Le fichier n'existe pas
notice: Le téléchargement de vos données est en cours. Vous recevrez un email lorsque celui-ci sera terminé.
email_change:
@@ -547,8 +548,6 @@ fr:
description: Description
footer_sub_hero:
name: Section "Bienvenue sur la plateforme" (. footer_sub_hero)
- global_menu:
- name: Menu global
hero:
name: Image principale et bouton d'action
hero_settings_form:
@@ -1023,6 +1022,7 @@ fr:
create_with_space: "%{user_name} a créé %{resource_name} dans %{space_name}"
delete: "%{user_name} a supprimé %{resource_name}"
delete_with_space: "%{user_name} a supprimé %{resource_name} dans %{space_name}"
+ publish: "%{user_name} a publié %{resource_name}"
publish_with_space: "%{user_name} a publié %{resource_name} dans %{space_name}"
unknown_action: "%{user_name} a effectué une action sur %{resource_name}"
unknown_action_with_space: "%{user_name} a effectué une action sur %{resource_name} dans %{space_name}"
@@ -1053,7 +1053,6 @@ fr:
latlng_text: 'latitude : %{latitude}, longitude : %{longitude}'
map_service_brand: OpenStreetMap
menu:
- help: Aide
home: Accueil
messaging:
conversation_mailer:
@@ -1575,6 +1574,16 @@ fr:
instructions_title: "Ce que vous devez faire"
set_password: Définissez votre mot de passe
subject: Mise à jour importante concernant votre profil de groupe
+ notify_user_group_patched:
+ body_1_html: Nous vous contactons pour vous informer d’une mise à jour importante concernant votre profil de groupe sur %{organization_name}.
+ body_2_html: Dans le cadre de nos efforts pour simplifier et améliorer l'expérience des organisations comme la vôtre, nous déprécions la fonctionnalité "Groupes d'utilisateurs". Votre groupe, %{name}a été converti en simple compte.
+ body_3_html: Pour continuer à accéder à votre compte et partager votre accès, nous avons besoin que vous définissiez une nouvelle adresse e-mail et un nouveau mot de passe. Veuillez noter que chaque membre de votre groupe recevra ce courriel. Pour assurer la continuité de l'accès, vous devrez convenir en interne des identifiants partagés (adresse e-mail et mot de passe) que tout le monde utilisera.
+ greeting: Cher(ère) %{name},
+ instructions_1_html: 'Utilisez les identifiants temporaires suivants pour vous connecter :
Nom d''utilisateur : %{email} Mot de passe : %{password}
'
+ instructions_2_html: Définir une nouvelle adresse e-mail et un nouveau mot de passe.
+ instructions_3_html: Partagez les identifiants de connexion choisis avec vos collègues pour que l'ensemble du groupe puisse continuer à accéder au compte.
+ instructions_title_html: "Ce que vous devez faire"
+ subject: Mise à jour importante concernant votre profil de groupe
user_report_mailer:
notify:
body_1: L'utilisateur %{user} a été signalé par %{token}
diff --git a/decidim-core/config/locales/ga-IE.yml b/decidim-core/config/locales/ga-IE.yml
index 9e01223494896..894188efe78b7 100644
--- a/decidim-core/config/locales/ga-IE.yml
+++ b/decidim-core/config/locales/ga-IE.yml
@@ -134,7 +134,6 @@ ga:
cancel: Cealaigh
proceed: Gabh ar aghaidh
menu:
- help: Cabhair
home: Baile
messaging:
conversations:
diff --git a/decidim-core/config/locales/gl.yml b/decidim-core/config/locales/gl.yml
index 4d1e76f7b6026..93e927a51a1bf 100644
--- a/decidim-core/config/locales/gl.yml
+++ b/decidim-core/config/locales/gl.yml
@@ -500,7 +500,6 @@ gl:
managed_users:
expired_session: A sesión de suplantación actual caducou.
menu:
- help: Axuda
home: Inicio
messaging:
conversation_mailer:
diff --git a/decidim-core/config/locales/hu.yml b/decidim-core/config/locales/hu.yml
index 58b8e017a090a..c60dd23cbd910 100644
--- a/decidim-core/config/locales/hu.yml
+++ b/decidim-core/config/locales/hu.yml
@@ -446,8 +446,6 @@ hu:
description: Leírás
footer_sub_hero:
name: Lábléc sub hero banner
- global_menu:
- name: Globális menü
hero:
name: Hero image és CTA
hero_settings_form:
@@ -817,7 +815,6 @@ hu:
latlng_text: 'földrajzi szélesség: %{latitude}, földrajzi hosszúság: %{longitude}'
map_service_brand: OpenStreetMap
menu:
- help: Segítség
home: Kezdőlap
messaging:
conversation_mailer:
diff --git a/decidim-core/config/locales/id-ID.yml b/decidim-core/config/locales/id-ID.yml
index 04a0085aaa5a7..9c87a558efc35 100644
--- a/decidim-core/config/locales/id-ID.yml
+++ b/decidim-core/config/locales/id-ID.yml
@@ -450,7 +450,6 @@ id:
managed_users:
expired_session: Sesi peniruan saat ini telah kedaluwarsa.
menu:
- help: Membantu
home: Rumah
messaging:
conversation_mailer:
diff --git a/decidim-core/config/locales/it.yml b/decidim-core/config/locales/it.yml
index 4ce88413e7ed4..a2e05f61680bc 100644
--- a/decidim-core/config/locales/it.yml
+++ b/decidim-core/config/locales/it.yml
@@ -728,7 +728,6 @@ it:
latlng_text: 'latitudine: %{latitude}, longitudine: %{longitude}'
map_service_brand: Mappa OpenStreet
menu:
- help: Aiuto
home: Home
messaging:
conversation_mailer:
diff --git a/decidim-core/config/locales/ja.yml b/decidim-core/config/locales/ja.yml
index e88155f333dc1..e2fb4cc256e4e 100644
--- a/decidim-core/config/locales/ja.yml
+++ b/decidim-core/config/locales/ja.yml
@@ -185,6 +185,7 @@ ja:
success: アカウントが正常に削除されました。
download_your_data_export:
export_expired: エクスポートの有効期限が切れています。新しいエクスポートを生成してください。
+ export_not_found: アクセスしたエクスポートが存在しないか、ダウンロードする権限がありません
file_no_exists: ファイルが存在しません
notice: データのダウンロードは現在進行中です。完了した際にはメールでお知らせします。
email_change:
@@ -571,8 +572,6 @@ ja:
description: 説明
footer_sub_hero:
name: フッターサブヒーローバナー
- global_menu:
- name: グローバルメニュー
hero:
name: ヒーローイメージと CTA
hero_settings_form:
@@ -1132,6 +1131,7 @@ ja:
create_with_space: "%{user_name} が %{resource_name} に %{space_name} を作成しました"
delete: "%{user_name} が %{resource_name} を削除しました"
delete_with_space: "%{user_name} が %{resource_name} で %{space_name} を削除しました"
+ publish: "%{user_name} が %{resource_name}を公開しました"
publish_with_space: "%{user_name} が %{space_name} の %{resource_name} を公開しました"
unknown_action: "%{user_name} が %{resource_name} にいくつかのアクションを実行しました"
unknown_action_with_space: "%{user_name} が %{resource_name} で %{space_name} にアクションを実行しました"
@@ -1164,7 +1164,6 @@ ja:
latlng_text: '緯度: %{latitude}, 経度: %{longitude}'
map_service_brand: OpenStreetMap
menu:
- help: ヘルプ
home: ホーム
messaging:
conversation_mailer:
@@ -1705,10 +1704,30 @@ ja:
body_2: 組織向けの利用体験を簡素化する取り組みの一環として、「ユーザーグループ」機能は廃止される予定です。あなたのユーザーグループのプロフィールは通常の参加者プロフィールに変更されました。
greeting: こんにちは %{name} さん、
instructions_1: そのメールアカウントにアクセスできる場合は、受信トレイに届いている案内をご確認ください。
+ instructions_2: そうでない場合は、アクセス権を持つ同僚の一人がパスワードを設定し、ログイン情報をあなたと共有する必要があります。
+ instructions_intro: グループメンバーは、共有ログインクレデンシャル(メールアドレスとパスワード)を使用して、このプロファイルへのアクセスを共有するようになりました。 プロファイルの新しいパスワードを設定するための指示を %{email} に送信しました。
+ instructions_title: "あなたへの影響"
+ subject: グループプロフィールに関する重要な更新情報
notify_deprecation_to_owner:
body_1: '%{organization_name}でのグループプロフィールに関する重要なアップデートについてお知らせするためにご連絡しています。'
body_2: あなたのような組織向けの利用体験を簡素化・改善する取り組みの一環として、「ユーザーグループ」機能は廃止されます。あなたのグループ%{name}は通常のアカウントに変更されました。
+ body_3: 引き続きアカウントへアクセスしてアクセス権限を共有するためには、パスワードを設定する必要があります。設定後、ログイン認証情報(メールアドレスとパスワード)を任意の相手と共有することが可能になります。
greeting: こんにちは %{name} さん、
+ instructions_1: '以下のリンクをクリックしてパスワードを設定してください:'
+ instructions_2: 'ログイン認証情報(メールアドレス:%{email}、新規パスワード)を同僚と共有してください。'
+ instructions_title: "実施すべきこと"
+ set_password: パスワードの設定
+ subject: グループプロフィールに関する重要な更新事項
+ notify_user_group_patched:
+ body_1_html: '%{organization_name}におけるグループプロフィールに関する重要な更新についてお知らせします。'
+ body_2_html: 組織の利便性向上とシステムの簡素化を図るため、「ユーザーグループ」機能の廃止を決定いたしました。あなたのグループ %{name} は、通常のアカウント形式に変更されています。
+ body_3_html: 引き続きアカウントにアクセスしてアクセス権限を共有するためには、新しいメールアドレスとパスワードの設定が必要です。なお、グループの各メンバーにはこのメールが送信されます。継続的なアクセスを保証するため、共有する認証情報(メールアドレスとパスワード)について、グループ内で事前に合意していただく必要があります。
+ greeting: こんにちは %{name} さん、
+ instructions_1_html: '以下の仮認証情報を使用してログインしてください:
ユーザー名: %{email} パスワード: %{password}
'
+ instructions_2_html: 新しいメールアドレスとパスワードを設定します。
+ instructions_3_html: 選択したログイン認証情報を同僚の方々と共有し、グループ全体で引き続きアカウントにアクセスできるようにしてください。
+ instructions_title_html: "実施が必要な事項"
+ subject: グループプロフィールに関する重要なお知らせ
user_report_mailer:
notify:
body_1: ユーザー %{user} が %{token} によって報告されました
diff --git a/decidim-core/config/locales/lb.yml b/decidim-core/config/locales/lb.yml
index 1d03dae4ad8be..6a66f28ca5dda 100644
--- a/decidim-core/config/locales/lb.yml
+++ b/decidim-core/config/locales/lb.yml
@@ -593,7 +593,6 @@ lb:
latlng_text: 'Breedegrad:%{latitude}, Längegrad:%{longitude}'
map_service_brand: Stroosse-Kaart opmaachen
menu:
- help: Hëllef
home: Startsäit
messaging:
conversation_mailer:
diff --git a/decidim-core/config/locales/lt.yml b/decidim-core/config/locales/lt.yml
index 3eb32d1c251ac..c13e4f5c4b856 100644
--- a/decidim-core/config/locales/lt.yml
+++ b/decidim-core/config/locales/lt.yml
@@ -502,8 +502,6 @@ lt:
description: Aprašymas
footer_sub_hero:
name: Apatinės dalies reklamjuostė
- global_menu:
- name: Globalus meniu
hero_settings_form:
background_image: Foninis paveikslėlis
welcome_text: Pasveikinimo tekstas
@@ -900,7 +898,6 @@ lt:
latlng_text: 'platuma: %{latitude}, ilguma: %{longitude}'
map_service_brand: 'OpenStreetMap: Žemėlapis'
menu:
- help: Pagalba
home: Pagrindinis
messaging:
conversation_mailer:
diff --git a/decidim-core/config/locales/lv.yml b/decidim-core/config/locales/lv.yml
index f2c43205d970d..23f4475e6d243 100644
--- a/decidim-core/config/locales/lv.yml
+++ b/decidim-core/config/locales/lv.yml
@@ -509,7 +509,6 @@ lv:
managed_users:
expired_session: Pašreizējā dalībnieka administratora sesija ir beigusies.
menu:
- help: Palīdzība
home: Sākums
messaging:
conversation_mailer:
diff --git a/decidim-core/config/locales/nl.yml b/decidim-core/config/locales/nl.yml
index e5f38bcbd7457..a87106b9d86e5 100644
--- a/decidim-core/config/locales/nl.yml
+++ b/decidim-core/config/locales/nl.yml
@@ -594,7 +594,6 @@ nl:
latlng_text: 'breedte: %{latitude}, lengtegraad: %{longitude}'
map_service_brand: OpenStreetMap
menu:
- help: Help
home: Home
messaging:
conversation_mailer:
diff --git a/decidim-core/config/locales/no.yml b/decidim-core/config/locales/no.yml
index f9a3cfb1f8dc0..a09b65a0259a3 100644
--- a/decidim-core/config/locales/no.yml
+++ b/decidim-core/config/locales/no.yml
@@ -608,7 +608,6 @@
latlng_text: 'breddegrad: %{latitude}, lengdegrad: %{longitude}'
map_service_brand: OpenStreetMap
menu:
- help: Hjelp
home: Hjem
messaging:
conversation_mailer:
diff --git a/decidim-core/config/locales/pl.yml b/decidim-core/config/locales/pl.yml
index 646c8f23a8c01..eaf4a15a9f422 100644
--- a/decidim-core/config/locales/pl.yml
+++ b/decidim-core/config/locales/pl.yml
@@ -476,8 +476,6 @@ pl:
description: Opis
footer_sub_hero:
name: Baner podrzędny stopki
- global_menu:
- name: Globalne menu
hero:
name: Banner i CTA
hero_settings_form:
@@ -897,7 +895,6 @@ pl:
latlng_text: 'szerokość geograficzna: %{latitude}, długość geograficzna: %{longitude}'
map_service_brand: OpenStreetMap
menu:
- help: Pomoc
home: Strona główna
messaging:
conversation_mailer:
diff --git a/decidim-core/config/locales/pt-BR.yml b/decidim-core/config/locales/pt-BR.yml
index fe79dfe988bd6..78da420decc76 100644
--- a/decidim-core/config/locales/pt-BR.yml
+++ b/decidim-core/config/locales/pt-BR.yml
@@ -490,8 +490,6 @@ pt-BR:
description: Descrição
footer_sub_hero:
name: Rodapé do sub-herói banner
- global_menu:
- name: Menu global
hero_settings_form:
background_image: Imagem de fundo
welcome_text: Texto de boas-vindas
@@ -891,7 +889,6 @@ pt-BR:
latlng_text: 'latitude: %{latitude}, longitude: %{longitude}'
map_service_brand: OpenStreetMap
menu:
- help: Ajuda
home: Inicio
messaging:
conversation_mailer:
diff --git a/decidim-core/config/locales/pt.yml b/decidim-core/config/locales/pt.yml
index a8d7109d93fe5..999b4b4ad593e 100644
--- a/decidim-core/config/locales/pt.yml
+++ b/decidim-core/config/locales/pt.yml
@@ -597,7 +597,6 @@ pt:
latlng_text: 'latitude: %{latitude}, longitude: %{longitude}'
map_service_brand: OpenStreetMap
menu:
- help: Ajuda
home: Inicio
messaging:
conversation_mailer:
diff --git a/decidim-core/config/locales/ro-RO.yml b/decidim-core/config/locales/ro-RO.yml
index 6a842df105730..b2f1a437794a6 100644
--- a/decidim-core/config/locales/ro-RO.yml
+++ b/decidim-core/config/locales/ro-RO.yml
@@ -586,8 +586,6 @@ ro:
description: Descriere
footer_sub_hero:
name: Banner suberou suberou
- global_menu:
- name: Meniul global
hero:
name: Imagine Erou și CTA
hero_settings_form:
@@ -1049,7 +1047,6 @@ ro:
latlng_text: 'latitudine: %{latitude}, longitudine: %{longitude}'
map_service_brand: OpenStreetMap
menu:
- help: Ajutor
home: Acasă
messaging:
conversation_mailer:
diff --git a/decidim-core/config/locales/ru.yml b/decidim-core/config/locales/ru.yml
index 7a1f312911a2e..65f60880d59dc 100644
--- a/decidim-core/config/locales/ru.yml
+++ b/decidim-core/config/locales/ru.yml
@@ -377,7 +377,6 @@ ru:
managed_users:
expired_session: Текущий сеанс выступления в роли участника истек.
menu:
- help: Справка
home: Главная
messaging:
conversation_mailer:
diff --git a/decidim-core/config/locales/sk.yml b/decidim-core/config/locales/sk.yml
index 3150e453d7d8b..c46443498f6c4 100644
--- a/decidim-core/config/locales/sk.yml
+++ b/decidim-core/config/locales/sk.yml
@@ -522,7 +522,6 @@ sk:
managed_users:
expired_session: Aktuálna platnosť zosúhlasenia už vypršala.
menu:
- help: Pomoc
home: Domov
messaging:
conversation_mailer:
diff --git a/decidim-core/config/locales/sl.yml b/decidim-core/config/locales/sl.yml
index c18f19ff8fe18..d749341f00fd6 100644
--- a/decidim-core/config/locales/sl.yml
+++ b/decidim-core/config/locales/sl.yml
@@ -15,7 +15,6 @@ sl:
linked_classes:
meeting: Sestanki
menu:
- help: Pomoč
home: Domov
messaging:
conversations:
diff --git a/decidim-core/config/locales/sv.yml b/decidim-core/config/locales/sv.yml
index c284641d0ad67..9963903c5b656 100644
--- a/decidim-core/config/locales/sv.yml
+++ b/decidim-core/config/locales/sv.yml
@@ -570,8 +570,6 @@ sv:
description: Beskrivning
footer_sub_hero:
name: Sidfot sub hero banner
- global_menu:
- name: Global meny
hero:
name: Bild och CTA
hero_settings_form:
@@ -1099,7 +1097,6 @@ sv:
latlng_text: 'latitud: %{latitude}, longitud: %{longitude}'
map_service_brand: OpenStreetMap
menu:
- help: Hjälp
home: Hem
messaging:
conversation_mailer:
diff --git a/decidim-core/config/locales/tr-TR.yml b/decidim-core/config/locales/tr-TR.yml
index a9b3c38b358e1..928d7b553de47 100644
--- a/decidim-core/config/locales/tr-TR.yml
+++ b/decidim-core/config/locales/tr-TR.yml
@@ -604,7 +604,6 @@ tr:
latlng_text: 'latitude: %{latitude}, longitude: %{longitude}'
map_service_brand: OpenStreetMap
menu:
- help: Yardım
home: Ana Sayfa
messaging:
conversation_mailer:
diff --git a/decidim-core/config/locales/zh-CN.yml b/decidim-core/config/locales/zh-CN.yml
index 01e8cd2db48bf..aa051afcb7045 100644
--- a/decidim-core/config/locales/zh-CN.yml
+++ b/decidim-core/config/locales/zh-CN.yml
@@ -526,7 +526,6 @@ zh-CN:
latlng_text: '纬度: %{latitude}, 经度: %{longitude}'
map_service_brand: OpenStreetMap
menu:
- help: 帮助
home: 首页
messaging:
conversation_mailer:
diff --git a/decidim-core/config/locales/zh-TW.yml b/decidim-core/config/locales/zh-TW.yml
index d8c677b65c8a8..ab4ad56e5e910 100644
--- a/decidim-core/config/locales/zh-TW.yml
+++ b/decidim-core/config/locales/zh-TW.yml
@@ -796,7 +796,6 @@ zh-TW:
latlng_text: '緯度:%{latitude},經度:%{longitude}'
map_service_brand: 開放街圖
menu:
- help: 幫助
home: 首頁
messaging:
conversation_mailer:
diff --git a/decidim-core/db/migrate/20251112132305_remove_legacy_images_from_core_module.rb b/decidim-core/db/migrate/20251112132305_remove_legacy_images_from_core_module.rb
new file mode 100644
index 0000000000000..53fa74ae4c6d1
--- /dev/null
+++ b/decidim-core/db/migrate/20251112132305_remove_legacy_images_from_core_module.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+class RemoveLegacyImagesFromCoreModule < ActiveRecord::Migration[7.2]
+ def change
+ remove_column :decidim_organizations, :logo, :string
+ remove_column :decidim_organizations, :official_img_footer, :string
+ remove_column :decidim_organizations, :favicon, :string
+
+ remove_column :oauth_applications, :organization_logo, :string
+
+ remove_column :decidim_authorizations, :verification_attachment, :string
+
+ # The original decidim_attachments table creation was in decidim-participatory_processes
+ # at decidim-participatory_processes/db/migrate/20161116115156_create_attachments.rb
+ #
+ # We need to workaround this issue as when creating new application this table may not exist
+ # when this migration is run
+ remove_column :decidim_attachments, :file, :string if table_exists?(:decidim_attachments)
+
+ remove_column :decidim_users, :avatar, :string
+
+ remove_column :decidim_private_exports, :file, :string
+ end
+end
diff --git a/decidim-core/decidim-core.gemspec b/decidim-core/decidim-core.gemspec
index e52a29c4b9410..3f30a9dc57e25 100644
--- a/decidim-core/decidim-core.gemspec
+++ b/decidim-core/decidim-core.gemspec
@@ -22,7 +22,7 @@ Gem::Specification.new do |s|
s.summary = "The core of the Decidim framework."
s.description = "Adds core features so other engines can hook into the framework."
s.license = "AGPL-3.0-or-later"
- s.required_ruby_version = "~> 3.3.0"
+ s.required_ruby_version = "~> 3.4.0"
s.files = Dir.chdir(__dir__) do
`git ls-files -z`.split("\x0").select do |f|
diff --git a/decidim-core/lib/decidim/api/types/badge_score_type.rb b/decidim-core/lib/decidim/api/types/badge_score_type.rb
new file mode 100644
index 0000000000000..945566592842d
--- /dev/null
+++ b/decidim-core/lib/decidim/api/types/badge_score_type.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+
+module Decidim
+ module Core
+ class BadgeScoreType < Decidim::Api::Types::BaseObject
+ description "An user badge score"
+
+ field :description, GraphQL::Types::String, "The description of this badge", null: false
+ field :image, GraphQL::Types::String, "The image of this badge", null: false
+ field :level, GraphQL::Types::Int, "The level of this badge", null: false
+ field :name, GraphQL::Types::String, "The name of this badge", null: false, method: :badge_name
+ field :score, GraphQL::Types::Int, "The score of this badge", null: false
+
+ delegate :level, :score, to: :status
+ delegate :image, :description, to: :manifest
+
+ private
+
+ def manifest
+ @manifest ||= status.badge
+ end
+
+ def status
+ @status ||= Decidim::Gamification.status_for(object.user, object.badge_name)
+ end
+ end
+ end
+end
diff --git a/decidim-core/lib/decidim/api/types/moderation_type.rb b/decidim-core/lib/decidim/api/types/moderation_type.rb
new file mode 100644
index 0000000000000..5729ba6893c6b
--- /dev/null
+++ b/decidim-core/lib/decidim/api/types/moderation_type.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+module Decidim
+ module Core
+ # This type represents a content moderation record
+ class ModerationType < Decidim::Api::Types::BaseObject
+ description "A moderation detail"
+
+ implements Decidim::Core::TimestampsInterface
+
+ field :hidden_at, Decidim::Core::DateTimeType, "The date and time when the resource was hidden", null: true
+ field :id, GraphQL::Types::ID, "The ID of the moderation", null: false
+ field :report_count, GraphQL::Types::Int, "The number of reports of this resource", null: true
+ field :reported_content, GraphQL::Types::String, "The content that has been reported", null: true
+ field :reported_url, GraphQL::Types::String, "The URL of the resource that was reported", null: true
+ field :reports, [Decidim::Core::ReportableType, { null: true }], "The reports of this resource", null: true
+
+ def reported_url
+ return "" unless object.reportable.respond_to?(:reported_content_url)
+
+ object.reportable.reported_content_url
+ end
+ end
+ end
+end
diff --git a/decidim-core/lib/decidim/api/types/reportable_type.rb b/decidim-core/lib/decidim/api/types/reportable_type.rb
new file mode 100644
index 0000000000000..71f594d4e4f99
--- /dev/null
+++ b/decidim-core/lib/decidim/api/types/reportable_type.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+module Decidim
+ module Core
+ # This type represents a content report
+ class ReportableType < Decidim::Api::Types::BaseObject
+ description "A report object"
+
+ implements Decidim::Core::TimestampsInterface
+
+ field :details, GraphQL::Types::String, "The details of this report", null: false
+ field :id, GraphQL::Types::ID, "The ID of this reportable", null: false
+ field :locale, GraphQL::Types::String, "The locale of the reportable", null: false
+ field :reason, GraphQL::Types::String, "The reason of this report", null: false
+ field :user, UserType, "The author of this report", null: true
+ end
+ end
+end
diff --git a/decidim-core/lib/decidim/api/types/reportable_user_type.rb b/decidim-core/lib/decidim/api/types/reportable_user_type.rb
new file mode 100644
index 0000000000000..4be7d0919887f
--- /dev/null
+++ b/decidim-core/lib/decidim/api/types/reportable_user_type.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+module Decidim
+ module Core
+ # This type represents an user report
+ class ReportableUserType < Decidim::Api::Types::BaseObject
+ description "An user report"
+
+ implements Decidim::Core::TimestampsInterface
+
+ field :details, GraphQL::Types::String, "The details of this report", null: false
+ field :id, GraphQL::Types::ID, "The ID of this report", null: false
+ field :reason, GraphQL::Types::String, "The reason of this report", null: false
+ field :user, UserType, "The author of this report", null: true
+ end
+ end
+end
diff --git a/decidim-core/lib/decidim/api/types/user_moderation_type.rb b/decidim-core/lib/decidim/api/types/user_moderation_type.rb
new file mode 100644
index 0000000000000..2b56010416782
--- /dev/null
+++ b/decidim-core/lib/decidim/api/types/user_moderation_type.rb
@@ -0,0 +1,36 @@
+# frozen_string_literal: true
+
+module Decidim
+ module Core
+ # This type represents a user moderation
+ class UserModerationType < Decidim::Api::Types::BaseObject
+ description "A moderated user detail"
+
+ implements Decidim::Core::TimestampsInterface
+
+ field :about, GraphQL::Types::String, "The about data of this user", null: true
+ field :block_reasons, GraphQL::Types::String, "The reasons why the user was blocked", null: true
+ field :blocked_at, Decidim::Core::DateTimeType, "The date at which the user was blocked", null: true
+ field :blocking_user, UserType, "The user who blocked the user", null: true
+ field :id, GraphQL::Types::ID, "The ID of the moderation", null: false
+ field :reports, [Decidim::Core::ReportableUserType, { null: true }], "The reports for this user", null: true
+ field :user_id, GraphQL::Types::ID, "The ID of this user'", null: false, method: :decidim_user_id
+
+ def about
+ object.user.presenter.about
+ end
+
+ def block_reasons
+ object.blocking.justification
+ end
+
+ def blocked_at
+ object.user.blocked_at
+ end
+
+ def blocking_user
+ object.blocking.blocking_user
+ end
+ end
+ end
+end
diff --git a/decidim-core/lib/decidim/api/types/user_type.rb b/decidim-core/lib/decidim/api/types/user_type.rb
index caf4f47832c3d..d37833ab3927c 100644
--- a/decidim-core/lib/decidim/api/types/user_type.rb
+++ b/decidim-core/lib/decidim/api/types/user_type.rb
@@ -7,18 +7,25 @@ class UserType < Decidim::Api::Types::BaseObject
description "A user"
implements Decidim::Core::AuthorInterface
+ implements Decidim::Core::FollowableInterface
+ implements Decidim::Core::TimestampsInterface
+ field :about, GraphQL::Types::String, "The user's about data", null: true
field :avatar_url, GraphQL::Types::String, "The user's avatar url", null: false
field :badge, GraphQL::Types::String, "A badge for the user", null: false
+ field :badges, [Decidim::Core::BadgeScoreType, { null: true }], "The user's badges", null: true
field :deleted, GraphQL::Types::Boolean, "Whether the user's account has been deleted or not", null: false
field :direct_messages_enabled, GraphQL::Types::String,
null: false,
description: ["If the user making the request is logged in, it will return whether this recipient accepts a conversation or not.",
" It will return false for non-logged requests."].join
+ field :followers_count, GraphQL::Types::Int, "The number of users following this user", null: true
+ field :following_count, GraphQL::Types::Int, "The number of users this user is following", null: true
field :id, GraphQL::Types::ID, "The user's id", null: false
field :name, GraphQL::Types::String, "The user's name", null: false
field :nickname, GraphQL::Types::String, "The user's nickname", null: false
field :organization_name, Decidim::Core::TranslatedFieldType, "The user's organization name", null: false
+ field :personal_url, GraphQL::Types::String, "The user's personal url", null: true
field :profile_path, GraphQL::Types::String, "The user's profile url", null: false
def nickname
@@ -49,6 +56,12 @@ def badge
object.presenter.badge
end
+ def badges
+ return [] unless object.organization.badges_enabled?
+
+ Decidim::Gamification::BadgeScore.where(user_id: object.id)
+ end
+
def self.authorized?(object, context)
super && object.confirmed? && !object.blocked? && !object.deleted?
end
diff --git a/decidim-core/lib/decidim/assets/tailwind/tailwind.config.js.erb b/decidim-core/lib/decidim/assets/tailwind/tailwind.config.js.erb
index 6ec1835e2d52e..05c20574eaa06 100644
--- a/decidim-core/lib/decidim/assets/tailwind/tailwind.config.js.erb
+++ b/decidim-core/lib/decidim/assets/tailwind/tailwind.config.js.erb
@@ -81,6 +81,9 @@ module.exports = {
extend: {
transitionProperty: {
'top': 'top',
+ },
+ screens: {
+ 'xs': '375px'
}
}
},
diff --git a/decidim-core/lib/decidim/core/api.rb b/decidim-core/lib/decidim/core/api.rb
index 0a2e0170f09e4..b892cbe001731 100644
--- a/decidim-core/lib/decidim/core/api.rb
+++ b/decidim-core/lib/decidim/core/api.rb
@@ -18,6 +18,7 @@ module Core
autoload :AreaTypeType, "decidim/api/types/area_type_type"
autoload :AttachmentType, "decidim/api/types/attachment_type"
autoload :AttachmentCollectionType, "decidim/api/types/attachment_collection_type"
+ autoload :BadgeScoreType, "decidim/api/types/badge_score_type"
autoload :CategoryType, "decidim/api/types/category_type"
autoload :TaxonomyType, "decidim/api/types/taxonomy_type"
autoload :ComponentType, "decidim/api/types/component_type"
@@ -37,6 +38,10 @@ module Core
autoload :TraceVersionType, "decidim/api/types/trace_version_type"
autoload :TranslatedFieldType, "decidim/api/types/translated_field_type"
autoload :UserType, "decidim/api/types/user_type"
+ autoload :UserModerationType, "decidim/api/types/user_moderation_type"
+ autoload :ModerationType, "decidim/api/types/moderation_type"
+ autoload :ReportableUserType, "decidim/api/types/reportable_user_type"
+ autoload :ReportableType, "decidim/api/types/reportable_type"
autoload :StaticPageType, "decidim/api/types/static_page_type"
autoload :StaticPageTopicType, "decidim/api/types/static_page_topic_type"
diff --git a/decidim-core/lib/decidim/core/content_blocks/registry_manager.rb b/decidim-core/lib/decidim/core/content_blocks/registry_manager.rb
index 88baa9bf50170..6c7911588d9f0 100644
--- a/decidim-core/lib/decidim/core/content_blocks/registry_manager.rb
+++ b/decidim-core/lib/decidim/core/content_blocks/registry_manager.rb
@@ -26,12 +26,6 @@ def self.register_homepage_content_blocks!
content_block.default!
end
- Decidim.content_blocks.register(:homepage, :global_menu) do |content_block|
- content_block.cell = "decidim/content_blocks/global_menu"
- content_block.public_name_key = "decidim.content_blocks.global_menu.name"
- content_block.default!
- end
-
Decidim.content_blocks.register(:homepage, :sub_hero) do |content_block|
content_block.cell = "decidim/content_blocks/sub_hero"
content_block.public_name_key = "decidim.content_blocks.sub_hero.name"
diff --git a/decidim-core/lib/decidim/core/engine.rb b/decidim-core/lib/decidim/core/engine.rb
index 07cce68e13f3d..eb24a178971e9 100644
--- a/decidim-core/lib/decidim/core/engine.rb
+++ b/decidim-core/lib/decidim/core/engine.rb
@@ -471,8 +471,6 @@ def named_variants
end
initializer "decidim_core.menu" do
- Decidim::Core::Menu.register_menu!
- Decidim::Core::Menu.register_mobile_menu!
Decidim::Core::Menu.register_user_menu!
end
diff --git a/decidim-core/lib/decidim/core/menu.rb b/decidim-core/lib/decidim/core/menu.rb
index 7fc3f8cde1ce1..f462a5676d28d 100644
--- a/decidim-core/lib/decidim/core/menu.rb
+++ b/decidim-core/lib/decidim/core/menu.rb
@@ -3,32 +3,6 @@
module Decidim
module Core
class Menu
- def self.register_menu!
- Decidim.menu :menu do |menu|
- menu.add_item :root,
- I18n.t("menu.home", scope: "decidim"),
- decidim.root_path,
- position: 1,
- active: :exclusive
- end
- end
-
- def self.register_mobile_menu!
- Decidim.menu :mobile_menu do |menu|
- menu.add_item :root,
- I18n.t("menu.home", scope: "decidim"),
- decidim.root_path,
- position: 1,
- active: :exclusive
-
- menu.add_item :help,
- I18n.t("menu.help", scope: "decidim"),
- decidim.pages_path,
- position: 10,
- active: :exclusive
- end
- end
-
def self.register_user_menu!
Decidim.menu :user_menu do |menu|
menu.add_item :account,
diff --git a/decidim-core/lib/decidim/core/test/factories.rb b/decidim-core/lib/decidim/core/test/factories.rb
index 28645c1c3da3d..5bafdefd7f4ce 100644
--- a/decidim-core/lib/decidim/core/test/factories.rb
+++ b/decidim-core/lib/decidim/core/test/factories.rb
@@ -195,7 +195,7 @@ def generate_title(field = nil, skip_injection:)
tos_agreement { "1" }
avatar { Decidim::Dev.test_file("avatar.jpg", "image/jpeg") }
personal_url { Faker::Internet.url }
- about { generate_localized_title(:user_about, skip_injection:) }
+ about { generate_title(:user_about, skip_injection:) }
confirmation_sent_at { Time.current }
accepted_tos_version { organization.tos_version }
notifications_sending_frequency { "real_time" }
@@ -271,6 +271,12 @@ def generate_title(field = nil, skip_injection:)
end
end
+ factory :badge_score, class: "Decidim::Gamification::BadgeScore" do
+ user
+ badge_name { "followers" }
+ value { 1 }
+ end
+
factory :participatory_space_private_user, class: "Decidim::ParticipatorySpacePrivateUser" do
transient do
skip_injection { false }
@@ -617,8 +623,11 @@ def generate_title(field = nil, skip_injection:)
end
factory :taxonomization, class: "Decidim::Taxonomization" do
+ transient do
+ skip_injection { false }
+ end
taxonomy { association(:taxonomy, :with_parent) }
- taxonomizable { association(:dummy_resource) }
+ taxonomizable { association(:dummy_resource, organization: taxonomy.organization, skip_injection:) }
end
factory :taxonomy_filter, class: "Decidim::TaxonomyFilter" do
@@ -638,7 +647,7 @@ def generate_title(field = nil, skip_injection:)
factory :taxonomy_filter_item, class: "Decidim::TaxonomyFilterItem" do
taxonomy_filter
- taxonomy_item { association(:taxonomy, parent: taxonomy_filter.root_taxonomy) }
+ taxonomy_item { association(:taxonomy, organization: taxonomy_filter.root_taxonomy.organization, parent: taxonomy_filter.root_taxonomy) }
end
factory :coauthorship, class: "Decidim::Coauthorship" do
@@ -706,7 +715,7 @@ def generate_title(field = nil, skip_injection:)
skip_injection { false }
end
moderation
- user { build(:user, organization: moderation.reportable.organization, skip_injection:) }
+ user { build(:user, :confirmed, organization: moderation.reportable.organization, skip_injection:) }
reason { "spam" }
end
@@ -763,8 +772,8 @@ def generate_title(field = nil, skip_injection:)
skip_injection { false }
end
- originator { build(:user, skip_injection:) }
- interlocutors { [build(:user, skip_injection:)] }
+ originator { build(:user, organization: user.organization, skip_injection:) }
+ interlocutors { [build(:user, organization: originator.organization, skip_injection:)] }
body { Faker::Lorem.sentence }
user
@@ -865,6 +874,18 @@ def generate_title(field = nil, skip_injection:)
scopes { "profile" }
end
+ factory :oauth_access_grant, class: "Doorkeeper::AccessGrant" do
+ transient do
+ skip_injection { false }
+ organization { create(:organization) }
+ end
+ resource_owner_id { create(:user, organization: application.organization, skip_injection:).id }
+ application { create(:oauth_application, organization:, skip_injection:) }
+ redirect_uri { "https://app.com/callback" }
+ expires_in { 100 }
+ scopes { "public write" }
+ end
+
factory :private_export, class: "Decidim::PrivateExport" do
transient do
skip_injection { false }
@@ -915,9 +936,10 @@ def generate_title(field = nil, skip_injection:)
factory :amendment, class: "Decidim::Amendment" do
transient do
skip_injection { false }
+ organization { create(:organization, skip_injection:) }
end
- amendable { build(:dummy_resource, skip_injection:) }
- emendation { build(:dummy_resource, skip_injection:) }
+ amendable { build(:dummy_resource, organization:, skip_injection:) }
+ emendation { build(:dummy_resource, organization:, skip_injection:) }
amender { emendation.try(:creator_author) || emendation.try(:author) }
state { "evaluating" }
@@ -950,7 +972,7 @@ def generate_title(field = nil, skip_injection:)
end
reason { "spam" }
moderation { create(:user_moderation, user:, skip_injection:) }
- user { build(:user) }
+ user { build(:user, :confirmed) }
end
factory :user_moderation, class: "Decidim::UserModeration" do
@@ -1015,7 +1037,7 @@ def generate_title(field = nil, skip_injection:)
skip_injection { false }
end
reminder { create(:reminder, skip_injection:) }
- remindable { build(:dummy_resource, skip_injection:) }
+ remindable { build(:dummy_resource, organization: reminder.user.organization, skip_injection:) }
Decidim::ReminderRecord::STATES.keys.each do |defined_state|
trait defined_state do
diff --git a/decidim-core/lib/decidim/core/test/shared_examples/comments_examples.rb b/decidim-core/lib/decidim/core/test/shared_examples/comments_examples.rb
index c00da74d76413..ca4347652b189 100644
--- a/decidim-core/lib/decidim/core/test/shared_examples/comments_examples.rb
+++ b/decidim-core/lib/decidim/core/test/shared_examples/comments_examples.rb
@@ -234,6 +234,8 @@
describe "when using emojis" do
before do
+ skip("This spec does not work in focus mode, since there is no language selector.") if has_selector?(".main-bar--focus-mode-back-button")
+
within_language_menu do
click_on "Castellano"
end
diff --git a/decidim-core/lib/decidim/query_extensions.rb b/decidim-core/lib/decidim/query_extensions.rb
index c3a93aaf7ff43..323eb3a02c605 100644
--- a/decidim-core/lib/decidim/query_extensions.rb
+++ b/decidim-core/lib/decidim/query_extensions.rb
@@ -14,27 +14,21 @@ def self.included(type)
description "Lists the components this space contains."
argument :id, GraphQL::Types::ID, required: true, description: "The ID of the component to be found"
end
-
type.field :session, Core::SessionType, description: "Return's information about the logged in user", null: true
-
type.field :decidim, Core::DecidimType, "Decidim's framework properties.", null: true
-
type.field :organization, Core::OrganizationType, "The current organization", null: true
-
type.field :user,
- type: Core::AuthorInterface, null: true,
+ type: Core::UserType, null: true,
description: "A participant (user or group) in the current organization" do
argument :id, GraphQL::Types::ID, "The ID of the participant", required: false
argument :nickname, GraphQL::Types::String, "The @nickname of the participant", required: false
end
-
type.field :users,
- type: [Core::AuthorInterface], null: true,
+ type: [Core::UserType], null: true,
description: "The participants (users or groups) for the current organization" do
argument :order, Decidim::Core::UserEntityInputSort, "Provides several methods to order the results", required: false
argument :filter, Decidim::Core::UserEntityInputFilter, "Provides several methods to filter the results", required: false
end
-
type.field :participant_details, type: Decidim::Core::ParticipantDetailsType, null: true do
description "Participant details visible to admin users only"
argument :id, GraphQL::Types::ID, "The ID of the participant", required: true
@@ -44,6 +38,10 @@ def self.included(type)
description: "The static pages for the current organization"
type.field :static_page_topics, type: [Decidim::Core::StaticPageTopicType], null: true,
description: "The static page topics for the current organization"
+ type.field :moderated_users, type: [Decidim::Core::UserModerationType], null: true,
+ description: "The moderated users for the current organization"
+ type.field :moderations, type: [Decidim::Core::ModerationType], null: true,
+ description: "The moderation for the current organization"
end
def component(id: {})
@@ -95,5 +93,13 @@ def static_pages
def static_page_topics
static_pages.collect(&:topic).uniq.compact_blank
end
+
+ def moderated_users
+ Decidim::UserModeration.joins(:user).where(decidim_users: { decidim_organization_id: context[:current_organization]&.id }).where.not(decidim_users: { blocked_at: nil })
+ end
+
+ def moderations
+ Decidim::Moderation.where(participatory_space: context[:current_organization].participatory_spaces).includes(:reports).hidden
+ end
end
end
diff --git a/decidim-core/lib/tasks/decidim_tasks.rake b/decidim-core/lib/tasks/decidim_tasks.rake
index ada54b4d12490..35b4174b9a1cc 100644
--- a/decidim-core/lib/tasks/decidim_tasks.rake
+++ b/decidim-core/lib/tasks/decidim_tasks.rake
@@ -34,7 +34,6 @@ namespace :decidim do
decidim_pages
decidim_participatory_processes
decidim_proposals
- decidim_sortitions
decidim_surveys
decidim_system
decidim_templates
diff --git a/decidim-core/lib/tasks/upgrade/decidim_active_storage_migration_tasks.rake b/decidim-core/lib/tasks/upgrade/decidim_active_storage_migration_tasks.rake
index dde616480ef62..35833f75b0dac 100644
--- a/decidim-core/lib/tasks/upgrade/decidim_active_storage_migration_tasks.rake
+++ b/decidim-core/lib/tasks/upgrade/decidim_active_storage_migration_tasks.rake
@@ -57,7 +57,6 @@ namespace :decidim do
"Decidim::Category" => %w(description),
"Decidim::Blogs::Post" => %w(body),
"Decidim::Pages::Page" => %w(body),
- "Decidim::Sortitions::Sortition" => %w(additional_info witnesses cancel_reason),
"Decidim::Debates::Debate" => %w(description instructions information_updates conclusions),
"Decidim::Budgets::Budget" => %w(description),
"Decidim::Budgets::Project" => %w(description),
diff --git a/decidim-core/lib/tasks/upgrade/decidim_migrate_wysiwyg_content.rake b/decidim-core/lib/tasks/upgrade/decidim_migrate_wysiwyg_content.rake
index 54b940d6401a1..e80b966946d80 100644
--- a/decidim-core/lib/tasks/upgrade/decidim_migrate_wysiwyg_content.rake
+++ b/decidim-core/lib/tasks/upgrade/decidim_migrate_wysiwyg_content.rake
@@ -39,7 +39,6 @@ namespace :decidim do
Decidim::Upgrade::WysiwygMigrator.register_model("Decidim::Meetings::Meeting", [:description, :registration_terms, :registration_email_custom_content, :closing_report])
Decidim::Upgrade::WysiwygMigrator.register_model("Decidim::Pages::Page", [:body])
Decidim::Upgrade::WysiwygMigrator.register_model("Decidim::Proposals::Proposal", [:body, :answer, :cost_report, :execution_period])
- Decidim::Upgrade::WysiwygMigrator.register_model("Decidim::Sortitions::Sortition", [:witnesses, :additional_info, :cancel_reason])
end
desc "Updates the content entered through the WYSIWYG editors"
diff --git a/decidim-core/lib/tasks/upgrade/decidim_remove_deleted_users_left_data_tasks.rake b/decidim-core/lib/tasks/upgrade/decidim_remove_deleted_users_left_data_tasks.rake
new file mode 100644
index 0000000000000..d1e5a1ca7864e
--- /dev/null
+++ b/decidim-core/lib/tasks/upgrade/decidim_remove_deleted_users_left_data_tasks.rake
@@ -0,0 +1,30 @@
+# frozen_string_literal: true
+
+namespace :decidim do
+ namespace :upgrade do
+ desc "Removes deleted users left behind data"
+ task remove_deleted_users_left_data: :environment do
+ logger.info("=== Removing left behind data by 'Decidim::DestroyAccount'")
+ Decidim::User.where.not(deleted_at: nil).find_each do |deleted_user|
+ Decidim::Follow.where(followable: deleted_user).find_each(&:destroy)
+ Decidim::Follow.where(user: deleted_user).find_each(&:destroy)
+ Decidim::ParticipatorySpacePrivateUser.where(user: deleted_user).find_each(&:destroy)
+ Decidim::Gamification::BadgeScore.where(user: deleted_user).find_each(&:destroy)
+ Decidim::UserModeration.where(user: deleted_user).find_each(&:destroy)
+ Decidim::Like.where(author: deleted_user).find_each(&:destroy)
+
+ Decidim.participatory_space_manifests.each do |space_manifest|
+ space_manifest.invoke_on_destroy_account(deleted_user)
+ end
+
+ deleted_user.identities.find_each(&:destroy)
+ deleted_user.versions.find_each(&:destroy)
+ deleted_user.private_exports.find_each(&:destroy)
+ deleted_user.access_grants.find_each(&:destroy)
+ deleted_user.access_tokens.find_each(&:destroy)
+ deleted_user.reminders.find_each(&:destroy)
+ deleted_user.notifications.find_each(&:destroy)
+ end
+ end
+ end
+end
diff --git a/decidim-core/lib/tasks/upgrade/fix_deleted_private_follows.rake b/decidim-core/lib/tasks/upgrade/fix_deleted_private_follows.rake
new file mode 100644
index 0000000000000..9a77bc41bec85
--- /dev/null
+++ b/decidim-core/lib/tasks/upgrade/fix_deleted_private_follows.rake
@@ -0,0 +1,26 @@
+# frozen_string_literal: true
+
+namespace :decidim do
+ namespace :upgrade do
+ desc "Delete follows of private users deleted from a private space"
+ task fix_deleted_private_follows: :environment do
+ Decidim::Organization.all.each do |organization|
+ spaces = organization.participatory_spaces.collect { |space| space if space.respond_to?(:private_space?) && space.private_space? }.compact_blank
+
+ next if spaces.blank?
+
+ spaces = spaces.map { |space| space.respond_to?(:is_transparent?) ? (space unless space.is_transparent?) : space }.compact_blank
+
+ next if spaces.blank?
+
+ organization.users.find_each do |user|
+ next unless user.following_follows.count.positive?
+
+ spaces.each do |space|
+ Decidim::Admin::DestroyPrivateUsersFollowsJob.perform_later(user, space)
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/decidim-core/lib/tasks/upgrade/migrations.rake b/decidim-core/lib/tasks/upgrade/migrations.rake
index 1745277379e74..8f45060dd2b75 100644
--- a/decidim-core/lib/tasks/upgrade/migrations.rake
+++ b/decidim-core/lib/tasks/upgrade/migrations.rake
@@ -24,7 +24,6 @@ namespace :decidim do
"pages" => "Pages",
"participatory_processes" => "ParticipatoryProcesses",
"proposals" => "Proposals",
- "sortitions" => "Sortitions",
"surveys" => "Surveys",
"system" => "System",
"templates" => "Templates",
diff --git a/decidim-core/spec/cells/decidim/notification_cell_spec.rb b/decidim-core/spec/cells/decidim/notification_cell_spec.rb
index 89451babe0245..f35be4c17d9a2 100644
--- a/decidim-core/spec/cells/decidim/notification_cell_spec.rb
+++ b/decidim-core/spec/cells/decidim/notification_cell_spec.rb
@@ -40,7 +40,7 @@
let!(:resource) { create(:dummy_resource, :moderated, component:) }
it "does not render the resource" do
- expect(subject.to_s).to include("Content moderated")
+ expect(subject.to_s).to include("Content has been hidden through moderation.")
end
end
diff --git a/decidim-core/spec/commands/decidim/destroy_account_spec.rb b/decidim-core/spec/commands/decidim/destroy_account_spec.rb
index 1cedb756ea290..a5ef541383240 100644
--- a/decidim-core/spec/commands/decidim/destroy_account_spec.rb
+++ b/decidim-core/spec/commands/decidim/destroy_account_spec.rb
@@ -3,10 +3,9 @@
require "spec_helper"
module Decidim
- describe DestroyAccount do
+ describe DestroyAccount, :versioning => true do
let(:command) { described_class.new(form) }
let(:user) { create(:user, :confirmed) }
- let!(:identity) { create(:identity, user:) }
let(:valid) { true }
let(:data) do
{
@@ -62,41 +61,109 @@ module Decidim
expect(user.notifications_sending_frequency).to eq("none")
end
+ context "when user is admin" do
+ let(:user) { create(:user, :confirmed, :admin) }
+
+ it "removes admin role" do
+ command.call
+ expect(user.reload.admin).to be_falsey
+ end
+ end
+
it "destroys the current user avatar" do
command.call
expect(user.reload.avatar).not_to be_present
end
- it "deletes user's identities" do
- expect do
- command.call
- end.to change(Identity, :count).by(-1)
- end
+ context "when removing associated records" do
+ it "deletes user's access tokens" do
+ create(:oauth_access_token, resource_owner_id: user.id)
- it "deletes the follows" do
- other_user = create(:user)
- create(:follow, followable: user, user: other_user)
- create(:follow, followable: other_user, user:)
+ expect { command.call }.to change(::Doorkeeper::AccessToken, :count).by(-1)
+ end
- expect do
- command.call
- end.to change(Follow, :count).by(-2)
- end
+ it "deletes user's access grants" do
+ create(:oauth_access_grant, organization: user.organization, resource_owner_id: user.id)
- it "deletes participatory space private user" do
- create(:participatory_space_private_user, user:)
+ expect { command.call }.to change(::Doorkeeper::AccessGrant, :count).by(-1)
+ end
- expect do
- command.call
- end.to change(ParticipatorySpacePrivateUser, :count).by(-1)
- end
+ it "deletes user's notifications" do
+ create(:notification, user:)
- context "when user is admin" do
- let(:user) { create(:user, :confirmed, :admin) }
+ expect { command.call }.to change(Decidim::Notification, :count).by(-1)
+ end
- it "removes admin role" do
+ it "deletes user's reminders" do
+ create(:reminder, user:)
+
+ expect { command.call }.to change(Decidim::Reminder, :count).by(-1)
+ end
+
+ it "deletes user's private exports" do
+ create(:private_export, attached_to: user)
+
+ expect { command.call }.to change(Decidim::PrivateExport, :count).by(-1)
+ end
+
+ it "deletes user's identities" do
+ create(:identity, user:)
+
+ expect { command.call }.to change(Decidim::Identity, :count).by(-1)
+ end
+
+ it "deletes user's versions" do
+ expect(user.reload.versions.count).to eq(1)
command.call
- expect(user.reload.admin).to be_falsey
+ expect(user.reload.versions.count).to eq(0)
+ end
+
+ it "deletes the follows" do
+ other_user = create(:user)
+ create(:follow, followable: user, user: other_user)
+ create(:follow, followable: other_user, user:)
+
+ expect { command.call }.to change(Follow, :count).by(-2)
+ end
+
+ it "preserves the authorizations" do
+ create(:authorization, :granted, user:, unique_id: "12345678X")
+ create(:authorization, :granted, user:, unique_id: "A12345678")
+
+ expect { command.call }.not_to change(Decidim::Authorization, :count)
+ end
+
+ it "deletes participatory space private user" do
+ create(:participatory_space_private_user, user:)
+
+ expect { command.call }.to change(ParticipatorySpacePrivateUser, :count).by(-1)
+ end
+
+ it "deletes user likes" do
+ component = create(:dummy_component, organization: user.organization)
+ resource = create(:dummy_resource, component:)
+ create(:like, author: user, resource:)
+
+ expect(resource.likes.count).to eq(1)
+ expect { command.call }.to change(Like, :count).by(-1)
+ expect(resource.likes.count).to eq(0)
+ end
+
+ it "deletes user's badges" do
+ Decidim::Gamification::BadgeScore.find_or_create_by(user:, badge_name: :followers)
+
+ expect { command.call }.to change(Decidim::Gamification::BadgeScore, :count).by(-1)
+ end
+
+ it "deletes user's reports status" do
+ form_params = {
+ reason: "spam",
+ details: "some details about the report"
+ }
+ form = ReportForm.from_params(form_params).with_context(current_user: user)
+ Decidim::CreateUserReport.call(form, user)
+
+ expect { command.call }.to change(Decidim::UserModeration, :count).by(-1)
end
end
end
diff --git a/decidim-core/spec/factory_bot_spec.rb b/decidim-core/spec/factory_bot_spec.rb
index c6096efbeb846..6ddbca0c6b810 100644
--- a/decidim-core/spec/factory_bot_spec.rb
+++ b/decidim-core/spec/factory_bot_spec.rb
@@ -6,4 +6,24 @@
it "has 100% valid factories" do
expect { described_class.lint(traits: true) }.not_to raise_error
end
+
+ described_class.factories.each do |factory|
+ context "when using the #{factory.name} factory" do
+ # There are some factories that should not create an organization.
+ # We have this as an exclusion list from our expectation.
+ let(:increment) { %w(admin blob).include?(factory.name.to_s) ? 0 : 1 }
+
+ it "generates a single organization" do
+ expect { create(factory.name) }.to change(Decidim::Organization, :count).by(increment)
+ end
+
+ context "when using a trait" do
+ factory.defined_traits.collect(&:name).each do |trait|
+ it ":#{trait}" do
+ expect { create(factory.name, trait.to_sym) }.to change(Decidim::Organization, :count).by(increment)
+ end
+ end
+ end
+ end
+ end
end
diff --git a/decidim-core/spec/lib/decidim_spec.rb b/decidim-core/spec/lib/decidim_spec.rb
index cb4b5c539566c..f3e0067bd26a5 100644
--- a/decidim-core/spec/lib/decidim_spec.rb
+++ b/decidim-core/spec/lib/decidim_spec.rb
@@ -67,7 +67,6 @@
pages
participatory_processes
proposals
- sortitions
surveys
system
templates
diff --git a/decidim-core/spec/lib/dependency_resolver_spec.rb b/decidim-core/spec/lib/dependency_resolver_spec.rb
index 0640762d16dd3..56cb8924a7d73 100644
--- a/decidim-core/spec/lib/dependency_resolver_spec.rb
+++ b/decidim-core/spec/lib/dependency_resolver_spec.rb
@@ -124,7 +124,6 @@ module Decidim
decidim-pages
decidim-participatory_processes
decidim-proposals
- decidim-sortitions
decidim-surveys
decidim-system
decidim-templates
diff --git a/decidim-core/spec/lib/query_extensions_spec.rb b/decidim-core/spec/lib/query_extensions_spec.rb
index 86322509fecdd..6e87f32cc3bcc 100644
--- a/decidim-core/spec/lib/query_extensions_spec.rb
+++ b/decidim-core/spec/lib/query_extensions_spec.rb
@@ -73,6 +73,118 @@ module Core
end
end
+ describe "moderated_users" do
+ let(:user) { create(:user, :confirmed, :blocked, organization: current_organization) }
+ let(:reporter) { create(:user, :confirmed, organization: current_organization) }
+ let(:moderation) { create(:user_moderation, user:) }
+ let!(:user_block) { create(:user_block, user:, blocking_user: reporter) }
+ let!(:user_report) { create(:user_report, user: reporter, reason: "spam", details: "Lorem ipsum", moderation:) }
+
+ let(:query) do
+ %({
+ moderatedUsers {
+ about
+ blockReasons
+ blockedAt
+ blockingUser {
+ id
+ }
+ createdAt
+ id
+ reports {
+ createdAt
+ details
+ id
+ reason
+ updatedAt
+ user {
+ id
+ }
+ }
+ updatedAt
+ userId
+ }
+ })
+ end
+
+ it "returns all the moderated users" do
+ expect(response["moderatedUsers"].last).to include(
+ "about" => user.about,
+ "blockReasons" => user_block.justification,
+ "blockedAt" => user.blocked_at.to_time.iso8601,
+ "blockingUser" => { "id" => user_block.blocking_user.id.to_s },
+ "createdAt" => moderation.created_at.to_time.iso8601,
+ "id" => moderation.id.to_s,
+ "reports" => [
+ {
+ "createdAt" => user_report.created_at.to_time.iso8601,
+ "details" => user_report.details,
+ "id" => user_report.id.to_s,
+ "reason" => user_report.reason,
+ "updatedAt" => user_report.updated_at.to_time.iso8601,
+ "user" => { "id" => user_report.user.id.to_s }
+ }
+ ],
+ "updatedAt" => moderation.updated_at.to_time.iso8601,
+ "userId" => user.id.to_s
+ )
+ end
+ end
+
+ describe "moderations" do
+ let(:participatory_space) { create(:assembly, :published, organization: current_organization) }
+ let(:component) { create(:dummy_component, :published, participatory_space:) }
+ let(:commentable) { create(:dummy_resource, :published, component:) }
+ let(:moderation) { create(:moderation, reportable: commentable, hidden_at: 2.days.ago, report_count: 1, reported_content: "This is the content") }
+ let!(:report) { create(:report, moderation:, details: "This is a report", locale: "en") }
+
+ let(:query) do
+ %({
+ moderations {
+ createdAt
+ hiddenAt
+ id
+ reportCount
+ reportedContent
+ reportedUrl
+ reports {
+ createdAt
+ details
+ id
+ locale
+ reason
+ updatedAt
+ user { id }
+ }
+ updatedAt
+ }
+ })
+ end
+
+ it "returns all the moderations" do
+ expect(response["moderations"].last).to include(
+ "createdAt" => moderation.created_at.to_time.iso8601,
+ "hiddenAt" => moderation.hidden_at.to_time.iso8601,
+ "id" => moderation.id.to_s,
+ "reportCount" => moderation.reports.count,
+ "reportedContent" => translated(moderation.reported_content),
+ "reportedUrl" => moderation.reportable.reported_content_url,
+ "reports" => [
+ {
+ "createdAt" => report.created_at.to_time.iso8601,
+ "details" => report.details,
+ "id" => report.id.to_s,
+ "locale" => report.locale,
+ "reason" => report.reason,
+ "updatedAt" => report.updated_at.to_time.iso8601,
+ "user" => { "id" => report.user.id.to_s }
+ }
+ ],
+ "updatedAt" => moderation.updated_at.to_time.iso8601
+ )
+ end
+ end
+
describe "static_pages" do
let!(:model) { create(:static_page, :with_topic, organization: current_organization) }
diff --git a/decidim-core/spec/serializers/decidim/exporters/participatory_space_serializer_spec.rb b/decidim-core/spec/serializers/decidim/exporters/participatory_space_serializer_spec.rb
new file mode 100644
index 0000000000000..3eb0f84364bb5
--- /dev/null
+++ b/decidim-core/spec/serializers/decidim/exporters/participatory_space_serializer_spec.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+require "spec_helper"
+require "json"
+
+module Decidim::Exporters
+ describe ParticipatorySpaceSerializer do
+ subject { described_class.new(resource) }
+
+ let(:resource) { create(:participatory_process) }
+ let(:serialized) { subject.serialize }
+
+ describe "#serialize" do
+ it "includes the component settings of that space" do
+ expect(serialized).to include(:component_settings)
+ end
+
+ it "creates a column of settings in a JSON format" do
+ expect { serialized[:component_settings].to_json }.not_to raise_error(::JSON::GeneratorError)
+ end
+ end
+ end
+end
diff --git a/decidim-core/spec/services/decidim/open_data_exporter_spec.rb b/decidim-core/spec/services/decidim/open_data_exporter_spec.rb
index bd1420b6889ab..05c2a19b8b7be 100644
--- a/decidim-core/spec/services/decidim/open_data_exporter_spec.rb
+++ b/decidim-core/spec/services/decidim/open_data_exporter_spec.rb
@@ -52,8 +52,8 @@
it "includes the LICENSE content" do
expect(csv_data).to include("License")
- expect(csv_data).to include("is made available under the Open Database License: http://opendatacommons.org/licenses/odbl/1.0/")
- expect(csv_data).to include("Database Contents License: http://opendatacommons.org/licenses/dbcl/1.0/")
+ expect(csv_data).to include("is made available under the Open Database License: https://opendatacommons.org/licenses/odbl/1.0/")
+ expect(csv_data).to include("Database Contents License: https://opendatacommons.org/licenses/dbcl/1.0/")
end
end
end
@@ -162,6 +162,8 @@
let!(:participatory_process) { create(:participatory_process, :published, organization:) }
let!(:assembly) { create(:assembly, :published, organization:) }
+ let!(:another_tenant_process) { create(:participatory_process, :published) }
+
before do
subject.export
end
@@ -179,6 +181,19 @@
end
end
+ it "includes only one reference por participatory space" do
+ csv_data = zip_contents.glob("*open-data-participatory_processes.csv").first.get_input_stream.read
+ expect(csv_data).to include(participatory_process.title["en"].gsub(/"/, '""')).once
+ csv_data = zip_contents.glob("*open-data-assemblies.csv").first.get_input_stream.read
+ expect(csv_data).to include(assembly.title["en"].gsub(/"/, '""')).once
+ end
+
+ it "does not include data from other tenants" do
+ csv_data = zip_contents.glob("*open-data-participatory_processes.csv").first.get_input_stream.read
+ expect(csv_data).not_to include(another_tenant_process.title["en"].gsub(/"/, '""'))
+ expect(csv_data).to include(participatory_process.title["en"].gsub(/"/, '""')).once
+ end
+
describe "README content" do
let(:file_data) { zip_contents.glob("README.md").first.get_input_stream.read }
@@ -189,8 +204,8 @@
expect(file_data).to include("## results (1 resource)")
expect(file_data).to include("## meetings (1 resource)")
expect(file_data).to include("## meeting_comments (1 resource)")
- expect(file_data).to include("## participatory_processes (30 resources)")
- expect(file_data).to include("## assemblies (6 resources)")
+ expect(file_data).to include("## participatory_processes (5 resources)")
+ expect(file_data).to include("## assemblies (1 resource)")
end
it "does not have any missing translation" do
diff --git a/decidim-core/spec/system/components_spec.rb b/decidim-core/spec/system/components_spec.rb
deleted file mode 100644
index 169902885b8e6..0000000000000
--- a/decidim-core/spec/system/components_spec.rb
+++ /dev/null
@@ -1,25 +0,0 @@
-# frozen_string_literal: true
-
-require "spec_helper"
-
-describe "Components can be navigated" do
- include_context "with a component"
-
- let(:manifest_name) { "dummy" }
-
- describe "navigate to a component" do
- before do
- visit decidim_participatory_processes.participatory_process_path(participatory_process)
- end
-
- it "renders the content of the page" do
- within "#menu-bar" do
- expect(page).to have_content("Processes")
- find("a.menu-bar__breadcrumb-desktop__dropdown-trigger", text: translated(participatory_space.title)).sibling("button[data-controller='dropdown']").hover
- click_on(translated(component.name))
- end
-
- expect(page).to have_content("DUMMY ENGINE")
- end
- end
-end
diff --git a/decidim-core/spec/system/homepage_spec.rb b/decidim-core/spec/system/homepage_spec.rb
index bb05bd6f227d9..eaa4d7e94e63d 100644
--- a/decidim-core/spec/system/homepage_spec.rb
+++ b/decidim-core/spec/system/homepage_spec.rb
@@ -269,7 +269,6 @@
before do
visit current_path
- find_by_id("main-dropdown-summary").hover
end
it "does not show last activity section on menu bar main dropdown" do
@@ -285,7 +284,6 @@
before do
visit current_path
- find_by_id("main-dropdown-summary").hover
end
it "does not show last activity section on menu bar main dropdown" do
diff --git a/decidim-core/spec/system/locales_spec.rb b/decidim-core/spec/system/locales_spec.rb
index 8f907070cedb4..f4c36b3caba88 100644
--- a/decidim-core/spec/system/locales_spec.rb
+++ b/decidim-core/spec/system/locales_spec.rb
@@ -16,7 +16,7 @@
click_on "Català"
end
- expect(page).to have_content("Inici")
+ expect(page).to have_content("Menú")
end
it "only shows the available locales" do
@@ -32,9 +32,9 @@
click_on "Català"
end
- click_on "Inici", match: :first
+ click_on "Menú", match: :first
- expect(page).to have_content("Inici")
+ expect(page).to have_content("Menú")
end
it "displays devise messages with the right locale when not authenticated" do
@@ -77,7 +77,7 @@
end
it "uses the user's locale" do
- expect(page).to have_content("Inici")
+ expect(page).to have_content("Menú")
end
end
end
diff --git a/decidim-core/spec/system/menu_spec.rb b/decidim-core/spec/system/menu_spec.rb
index bb2f5adefb240..f9e438aa1cecc 100644
--- a/decidim-core/spec/system/menu_spec.rb
+++ b/decidim-core/spec/system/menu_spec.rb
@@ -12,7 +12,7 @@
context "when clicking on a menu entry" do
before do
- click_on("Help", match: :first)
+ visit decidim.pages_path
end
it "switches the active option" do
@@ -47,9 +47,7 @@
click_on(id: "main-dropdown-summary-mobile")
within "#breadcrumb-main-dropdown-mobile" do
- expect(page).to have_link("Home", href: "/")
expect(page).to have_link("Processes", href: "/processes")
- expect(page).to have_link("Help", href: "/pages")
end
end
end
@@ -70,37 +68,6 @@
end
end
- describe "header message in desktop" do
- let(:participatory_space) { create(:participatory_process, organization:) }
- let(:component) { create(:proposal_component, participatory_space:) }
- let(:proposal) { create(:proposal, component:) }
- let(:proposal_path) { Decidim::ResourceLocatorPresenter.new(proposal).path }
-
- before do
- visit proposal_path
- find_by_id("main-dropdown-summary").hover
- end
-
- context "when the organization does not have a description" do
- let(:organization) { create(:organization, description: { en: nil }) }
-
- it "shows the default message" do
- within "#breadcrumb-main-dropdown-desktop" do
- expect(page).to have_text("Let's build a more open, transparent and collaborative society.")
- end
- end
- end
-
- context "when the organization has a description" do
- it "shows the organization description" do
- within "#breadcrumb-main-dropdown-desktop" do
- expect(page).to have_no_text("Let's build a more open, transparent and collaborative society.")
- expect(page).to have_text(strip_tags(translated(organization.description)))
- end
- end
- end
- end
-
context "when the admin_insights_menu is displayed" do
let(:user) { create(:user, :admin, :confirmed, organization:) }
diff --git a/decidim-core/spec/system/pwa_features_spec.rb b/decidim-core/spec/system/pwa_features_spec.rb
index 4d9089a9b0e90..1c649d6219bd9 100644
--- a/decidim-core/spec/system/pwa_features_spec.rb
+++ b/decidim-core/spec/system/pwa_features_spec.rb
@@ -14,11 +14,9 @@
it "shows the account form when clicking on the menu" do
# Cache the homepage
visit decidim.root_path
- expect(page).to have_content("Home")
with_browser_in_offline_mode do
visit decidim.root_path
- expect(page).to have_content("Home")
expect(page).to have_content("Your network is offline. This is a previously cached version of the page you are visiting, perhaps the content is not up to date.")
end
end
diff --git a/decidim-core/spec/system/search_spec.rb b/decidim-core/spec/system/search_spec.rb
index 18c35e3ef30d9..186a3dc492f40 100644
--- a/decidim-core/spec/system/search_spec.rb
+++ b/decidim-core/spec/system/search_spec.rb
@@ -34,7 +34,7 @@
end
it "has all the resources to search" do
- within ".search__filter" do
+ within "#dropdown-menu-search" do
expect(page).to have_content("All").once
expect(page).to have_content("Participants").once
expect(page).to have_content("Participatory processes").once
diff --git a/decidim-core/spec/tasks/upgrade/decidim_remove_deleted_users_left_data_spec.rb b/decidim-core/spec/tasks/upgrade/decidim_remove_deleted_users_left_data_spec.rb
new file mode 100644
index 0000000000000..0bc4b466a40e8
--- /dev/null
+++ b/decidim-core/spec/tasks/upgrade/decidim_remove_deleted_users_left_data_spec.rb
@@ -0,0 +1,108 @@
+# frozen_string_literal: true
+
+require "spec_helper"
+
+describe "rake decidim:upgrade:remove_deleted_users_left_data", type: :task, versioning: true do
+ let!(:organization) { create(:organization) }
+ let(:user) { create(:user, :confirmed) }
+ let(:other_user) { create(:user, :confirmed) }
+ let(:deleted_user) { create(:user, :confirmed, :deleted) }
+
+ before do
+ create(:oauth_access_token, resource_owner_id: deleted_user.id)
+ create(:oauth_access_grant, organization: user.organization, resource_owner_id: deleted_user.id)
+ create(:notification, user: deleted_user)
+ create(:reminder, user: deleted_user)
+ create(:private_export, attached_to: deleted_user)
+ create(:identity, user: deleted_user)
+ create(:follow, followable: deleted_user, user: user)
+ create(:follow, followable: user, user: deleted_user)
+ create(:participatory_space_private_user, user: deleted_user)
+
+ create(:oauth_access_token, resource_owner_id: user.id)
+ create(:identity, user:)
+ create(:follow, followable: user, user: other_user)
+ create(:follow, followable: other_user, user:)
+ create(:private_export, attached_to: user)
+ end
+
+ context "when the task is performed" do
+ it "deletes the access tokens of deleted user" do
+ expect { task.execute }.to change(Doorkeeper::AccessToken, :count).by(-1)
+ end
+
+ it "deletes the follows of the deleted user" do
+ expect { task.execute }.to change(Decidim::Follow, :count).by(-2)
+ end
+
+ it "deletes the access grants of deleted user" do
+ expect { task.execute }.to change(Doorkeeper::AccessGrant, :count).by(-1)
+ end
+
+ it "deletes the notifications of deleted user" do
+ expect { task.execute }.to change(Decidim::Notification, :count).by(-1)
+ end
+
+ it "deletes the reminders of deleted user" do
+ expect { task.execute }.to change(Decidim::Reminder, :count).by(-1)
+ end
+
+ it "deletes the authorizations of deleted user" do
+ expect { task.execute }.not_to change(Decidim::Authorization, :count)
+ end
+
+ it "deletes the versions of deleted user" do
+ task.execute
+ expect(deleted_user.reload.versions.count).to eq(0)
+ end
+
+ it "deletes the private exports of deleted user" do
+ expect { task.execute }.to change(Decidim::PrivateExport, :count).by(-1)
+ end
+
+ it "deletes the identities of deleted user" do
+ expect { task.execute }.to change(Decidim::Identity, :count).by(-1)
+ end
+
+ it "deletes the participatory space private user of deleted user" do
+ expect { task.execute }.to change(Decidim::ParticipatorySpacePrivateUser, :count).by(-1)
+ end
+
+ it "deletes the badges of deleted user" do
+ Decidim::Gamification::BadgeScore.find_or_create_by(user: deleted_user, badge_name: :followers)
+
+ expect { task.execute }.to change(Decidim::Gamification::BadgeScore, :count).by(-1)
+ end
+
+ it "deletes user's reports status" do
+ form_params = {
+ reason: "spam",
+ details: "some details about the report"
+ }
+ form = Decidim::ReportForm.from_params(form_params).with_context(current_user: deleted_user)
+ Decidim::CreateUserReport.call(form, deleted_user)
+
+ expect { task.execute }.to change(Decidim::UserModeration, :count).by(-1)
+ end
+
+ it "deletes user likes" do
+ component = create(:dummy_component, organization: deleted_user.organization)
+ resource = create(:dummy_resource, component:)
+ create(:like, author: deleted_user, resource:)
+
+ expect { task.execute }.to change(Decidim::Like, :count).by(-1)
+ end
+ end
+
+ context "when task is performed for not deleted users" do
+ it "does not affects the user records" do
+ expect { task.execute }.not_to(change { user.reload.versions.count })
+ expect { task.execute }.not_to(change { user.reload.access_tokens.count })
+ expect { task.execute }.not_to(change { user.reload.identities.count })
+ expect { task.execute }.not_to(change { user.reload.follows.count })
+ expect { task.execute }.not_to(change { user.reload.private_exports.count })
+ expect { task.execute }.not_to change(Decidim::Authorization, :count)
+ expect { task.execute }.not_to change(Decidim::UserModeration, :count)
+ end
+ end
+end
diff --git a/decidim-core/spec/tasks/upgrade/fix_deleted_private_follows_spec.rb b/decidim-core/spec/tasks/upgrade/fix_deleted_private_follows_spec.rb
new file mode 100644
index 0000000000000..a0c4cd056668e
--- /dev/null
+++ b/decidim-core/spec/tasks/upgrade/fix_deleted_private_follows_spec.rb
@@ -0,0 +1,70 @@
+# frozen_string_literal: true
+
+require "spec_helper"
+
+describe "rake decidim:upgrade:fix_deleted_private_follows", type: :task do
+ let(:task) { Rake::Task["decidim:upgrade:fix_deleted_private_follows"] }
+ let(:organization) { create(:organization) }
+ let(:user) { create(:user, :admin, :confirmed, organization:) }
+ let(:second_user) { create(:user, :confirmed, organization:) }
+ let(:component) { create(:dummy_component, :published, participatory_space:) }
+ let!(:followable) { create(:dummy_resource, component: component, author: user) }
+ let!(:follow) { create(:follow, user:, followable: participatory_space) }
+ let!(:unwanted_follow) { create(:follow, user: second_user, followable: participatory_space) }
+ let!(:resource_follow) { create(:follow, followable:, user:) }
+ let!(:resource_unwanted_follow) { create(:follow, followable:, user: second_user) }
+ let!(:participatory_space_private_user) { create(:participatory_space_private_user, user:, privatable_to: participatory_space) }
+ let(:participatory_space) { create(:participatory_process, :published, organization: user.organization) }
+
+ around do |example|
+ perform_enqueued_jobs { example.run }
+ end
+
+ it "preloads the Rails environment" do
+ expect(task.prerequisites).to include "environment"
+ end
+
+ context "when assembly is private and non transparent" do
+ let(:participatory_space) { create(:assembly, :private, :published, :opaque, organization: user.organization) }
+
+ it "deletes follows of non private users" do
+ # we have 2 follows, one for assembly, and one for a "child" resource
+ expect { task.execute }.to change(Decidim::Follow, :count).by(-2)
+ end
+ end
+
+ context "when assembly is private but transparent" do
+ let(:participatory_space) { create(:assembly, :private, :published, organization: user.organization) }
+
+ it "preserves follows of non private users" do
+ # we have 2 follows, one for assembly, and one for a "child" resource
+ expect { task.execute }.not_to change(Decidim::Follow, :count)
+ end
+ end
+
+ context "when assembly is public" do
+ let(:participatory_space) { create(:assembly, :published, organization: user.organization) }
+
+ it "preserves follows of non private users" do
+ # we have 2 follows, one for assembly, and one for a "child" resource
+ expect { task.execute }.not_to change(Decidim::Follow, :count)
+ end
+ end
+
+ context "when process is private" do
+ let(:participatory_space) { create(:participatory_process, :private, :published, organization: user.organization) }
+
+ it "deletes follows of non private users" do
+ # we have 2 follows, one for process, and one for a "child" resource
+ expect { task.execute }.to change(Decidim::Follow, :count).by(-2)
+ end
+ end
+
+ context "when process is public" do
+ let(:participatory_space) { create(:participatory_process, :published, organization: user.organization) }
+
+ it "preserves follows of non private users" do
+ expect { task.execute }.not_to change(Decidim::Follow, :count)
+ end
+ end
+end
diff --git a/decidim-core/spec/types/badge_score_type_spec.rb b/decidim-core/spec/types/badge_score_type_spec.rb
new file mode 100644
index 0000000000000..7012f650de5ed
--- /dev/null
+++ b/decidim-core/spec/types/badge_score_type_spec.rb
@@ -0,0 +1,55 @@
+# frozen_string_literal: true
+
+require "spec_helper"
+require "decidim/api/test"
+
+module Decidim
+ module Core
+ describe BadgeScoreType do
+ include_context "with a graphql class type"
+
+ let(:model) { create(:badge_score) }
+ let(:status) { Decidim::Gamification.status_for(model.user, model.badge_name) }
+
+ describe "description" do
+ let(:query) { "{ description }" }
+
+ it "returns the badge's description" do
+ expect(response["description"]).to eq(translated(status.badge.description))
+ end
+ end
+
+ describe "image" do
+ let(:query) { "{ image }" }
+
+ it "returns the badge's image" do
+ expect(response["image"]).to eq(status.badge.image)
+ end
+ end
+
+ describe "level" do
+ let(:query) { "{ level }" }
+
+ it "returns the badge's level" do
+ expect(response["level"]).to eq(status.level)
+ end
+ end
+
+ describe "name" do
+ let(:query) { "{ name }" }
+
+ it "returns the badge's name" do
+ expect(response["name"]).to eq(model.badge_name)
+ end
+ end
+
+ describe "score" do
+ let(:query) { "{ score }" }
+
+ it "returns the badge's score" do
+ expect(response["score"]).to eq(status.score)
+ end
+ end
+ end
+ end
+end
diff --git a/decidim-core/spec/types/fingerprint_type_spec.rb b/decidim-core/spec/types/fingerprint_type_spec.rb
index ee6bc592bd3ca..02071c696e99e 100644
--- a/decidim-core/spec/types/fingerprint_type_spec.rb
+++ b/decidim-core/spec/types/fingerprint_type_spec.rb
@@ -27,7 +27,7 @@ module Core
let(:query) { "{ source }" }
it "returns source as a string" do
- expect(response["source"]).to eq("{\"test\"=>\"test object\"}")
+ expect(response["source"]).to eq("{\"test\" => \"test object\"}")
end
end
end
diff --git a/decidim-core/spec/types/moderation_type_spec.rb b/decidim-core/spec/types/moderation_type_spec.rb
new file mode 100644
index 0000000000000..e2edfe2c3bb4b
--- /dev/null
+++ b/decidim-core/spec/types/moderation_type_spec.rb
@@ -0,0 +1,66 @@
+# frozen_string_literal: true
+
+require "spec_helper"
+require "decidim/api/test"
+
+module Decidim
+ module Core
+ describe ModerationType do
+ include_context "with a graphql class type"
+
+ let(:model) { create(:moderation, :hidden, report_count: 1, reported_content: "This is the content") }
+ let!(:report) { create(:report, moderation: model) }
+
+ include_examples "timestamps interface"
+
+ describe "id" do
+ let(:query) { "{ id }" }
+
+ it "returns the id field" do
+ expect(response).to eq("id" => model.id.to_s)
+ end
+ end
+
+ describe "hiddenAt" do
+ let(:query) { "{ hiddenAt }" }
+
+ it "returns the hidden at date field" do
+ expect(response).to eq("hiddenAt" => model.hidden_at.to_time.iso8601)
+ end
+ end
+
+ describe "reportCount" do
+ let(:query) { "{ reportCount }" }
+
+ it "returns the report count field" do
+ expect(response).to eq("reportCount" => 1)
+ end
+ end
+
+ describe "reportedContent" do
+ let(:query) { "{ reportedContent }" }
+
+ it "returns the reported content" do
+ expect(response).to eq("reportedContent" => translated(model.reported_content))
+ end
+ end
+
+ describe "reportedUrl" do
+ let(:query) { "{ reportedUrl }" }
+
+ it "returns the reported content url field" do
+ expect(response).to eq("reportedUrl" => model.reportable.reported_content_url)
+ end
+ end
+
+ describe "reports" do
+ let(:query) { "{ reports { id } }" }
+
+ it "returns the reports" do
+ expect(response["reports"].count).to eq(1)
+ expect(response["reports"].first["id"]).to eq(report.id.to_s)
+ end
+ end
+ end
+ end
+end
diff --git a/decidim-core/spec/types/reportable_type_spec.rb b/decidim-core/spec/types/reportable_type_spec.rb
new file mode 100644
index 0000000000000..55944375888fa
--- /dev/null
+++ b/decidim-core/spec/types/reportable_type_spec.rb
@@ -0,0 +1,75 @@
+# frozen_string_literal: true
+
+require "spec_helper"
+require "decidim/api/test"
+
+module Decidim
+ module Core
+ describe ReportableType do
+ include_context "with a graphql class type"
+ let!(:model) { create(:report, details: "Testing reason", locale: "en") }
+
+ include_examples "timestamps interface"
+
+ describe "id" do
+ let(:query) { "{ id }" }
+
+ it "returns the id field" do
+ expect(response).to eq("id" => model.id.to_s)
+ end
+ end
+
+ describe "reason" do
+ let(:query) { "{ reason }" }
+
+ it "returns the reason field" do
+ expect(response["reason"]).to eq(model.reason)
+ end
+ end
+
+ describe "details" do
+ let(:query) { "{ details }" }
+
+ it "returns the details field" do
+ expect(response["details"]).to eq(model.details)
+ end
+ end
+
+ describe "locale" do
+ let(:query) { "{ locale }" }
+
+ it "returns the locale field" do
+ expect(response["locale"]).to eq(model.locale)
+ end
+ end
+
+ describe "user" do
+ let(:query) { "{ user { id } }" }
+
+ it "returns the user object" do
+ expect(response["user"]["id"]).to eq(model.user.id.to_s)
+ end
+
+ context "when the user is anonymous" do
+ let(:moderation) { create(:moderation) }
+
+ context "when user reporting deleted his account" do
+ let!(:model) { create(:report, moderation:, user: create(:user, :confirmed, :deleted, organization: moderation.reportable.organization), details: "Testing reason", locale: "en") }
+
+ it "returns nil" do
+ expect(response["user"]).to be_nil
+ end
+ end
+
+ context "when user reporting got blocked" do
+ let!(:model) { create(:report, moderation:, user: create(:user, :confirmed, :blocked, organization: moderation.reportable.organization), details: "Testing reason", locale: "en") }
+
+ it "returns nil" do
+ expect(response["user"]).to be_nil
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/decidim-core/spec/types/reportable_user_type_spec.rb b/decidim-core/spec/types/reportable_user_type_spec.rb
new file mode 100644
index 0000000000000..343e647a172c6
--- /dev/null
+++ b/decidim-core/spec/types/reportable_user_type_spec.rb
@@ -0,0 +1,73 @@
+# frozen_string_literal: true
+
+require "spec_helper"
+require "decidim/api/test"
+
+module Decidim
+ module Core
+ describe ReportableUserType do
+ include_context "with a graphql class type"
+ let!(:model) { create(:user_report, details: "Testing reason") }
+
+ include_examples "timestamps interface"
+
+ describe "id" do
+ let(:query) { "{ id }" }
+
+ it "returns the id field" do
+ expect(response).to eq("id" => model.id.to_s)
+ end
+ end
+
+ describe "reason" do
+ let(:query) { "{ reason }" }
+
+ it "returns the reason field" do
+ expect(response["reason"]).to eq(model.reason)
+ end
+ end
+
+ describe "details" do
+ let(:query) { "{ details }" }
+
+ it "returns the details field" do
+ expect(response["details"]).to eq(model.details)
+ end
+ end
+
+ describe "user" do
+ let(:query) { "{ user { id } }" }
+
+ it "returns the user object" do
+ expect(response["user"]["id"]).to eq(model.user.id.to_s)
+ end
+
+ context "when the user has an incidence (i.e. is deleted or blocked)" do
+ let(:moderation) { create(:user_moderation, user: create(:user)) }
+
+ let!(:model) { create(:user_report, moderation:, user: moderation.user, details: "Testing reason") }
+
+ it "returns nil" do
+ expect(response["user"]).to be_nil
+ end
+
+ context "when the user that made the report deleted their account" do
+ let(:moderation) { create(:user_moderation, user: create(:user, :confirmed, :deleted)) }
+
+ it "returns nil" do
+ expect(response["user"]).to be_nil
+ end
+ end
+
+ context "when the user that made the reporting got blocked" do
+ let(:moderation) { create(:user_moderation, user: create(:user, :confirmed, :blocked)) }
+
+ it "returns nil" do
+ expect(response["user"]).to be_nil
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/decidim-core/spec/types/user_moderation_type_spec.rb b/decidim-core/spec/types/user_moderation_type_spec.rb
new file mode 100644
index 0000000000000..030338b4c3b40
--- /dev/null
+++ b/decidim-core/spec/types/user_moderation_type_spec.rb
@@ -0,0 +1,79 @@
+# frozen_string_literal: true
+
+require "spec_helper"
+require "decidim/api/test"
+
+module Decidim
+ module Core
+ describe UserModerationType do
+ include_context "with a graphql class type"
+
+ let(:current_organization) { create(:organization) }
+ let(:user) { create(:user, :confirmed, :blocked, organization: current_organization) }
+ let(:reporter) { create(:user, :confirmed, organization: current_organization) }
+ let(:moderation) { create(:user_moderation, user:) }
+ let!(:user_block) { create(:user_block, user:, blocking_user: reporter) }
+ let!(:user_report) { create(:user_report, user: reporter, reason: "spam", details: "Lorem ipsum", moderation:) }
+
+ let(:model) { moderation }
+
+ include_examples "timestamps interface"
+
+ describe "about" do
+ let(:query) { "{ about }" }
+
+ it "returns the about field" do
+ expect(response).to eq("about" => user.about)
+ end
+ end
+
+ describe "block_reasons" do
+ let(:query) { "{ blockReasons }" }
+
+ it "returns the block_reasons field" do
+ expect(response).to eq("blockReasons" => user_block.justification)
+ end
+ end
+
+ describe "blocked_at" do
+ let(:query) { "{ blockedAt }" }
+
+ it "returns the blocked at date field" do
+ expect(response).to eq("blockedAt" => user.blocked_at.to_time.iso8601)
+ end
+ end
+
+ describe "blocking_user" do
+ let(:query) { "{ blockingUser { id } }" }
+
+ it "returns the blocking user object" do
+ expect(response).to eq("blockingUser" => { "id" => user_block.blocking_user.id.to_s })
+ end
+ end
+
+ describe "reports" do
+ let(:query) { "{ reports { id } }" }
+
+ it "returns the reports field" do
+ expect(response["reports"]).to include({ "id" => user_report.id.to_s })
+ end
+ end
+
+ describe "id" do
+ let(:query) { "{ id }" }
+
+ it "returns the id field" do
+ expect(response).to eq("id" => moderation.id.to_s)
+ end
+ end
+
+ describe "user_id" do
+ let(:query) { "{ userId }" }
+
+ it "returns the blocked user id field" do
+ expect(response).to eq("userId" => moderation.user.id.to_s)
+ end
+ end
+ end
+ end
+end
diff --git a/decidim-core/spec/types/user_type_spec.rb b/decidim-core/spec/types/user_type_spec.rb
index 2537d36024859..78e206d2e8f3c 100644
--- a/decidim-core/spec/types/user_type_spec.rb
+++ b/decidim-core/spec/types/user_type_spec.rb
@@ -10,6 +10,9 @@ module Core
let(:model) { create(:user, :confirmed) }
+ include_examples "timestamps interface"
+ include_examples "followable interface"
+
describe "unconfirmed user" do
let(:model) { create(:user) }
let(:query) { "{ id }" }
@@ -73,6 +76,36 @@ module Core
end
end
+ describe "badges" do
+ let(:query) { "{ badges { name } }" }
+
+ context "when the gamification is disabled" do
+ let(:organization) { create(:organization, badges_enabled: false) }
+ let(:model) { create(:user, :confirmed, organization:) }
+
+ it "returns empty" do
+ expect(response["badges"]).to be_empty
+ end
+ end
+
+ context "when the gamification is enabled" do
+ context "when the user has no badges" do
+ it "returns empty" do
+ expect(response["badges"]).to be_empty
+ end
+ end
+
+ context "when the user has badges" do
+ let!(:badge) { create(:badge_score, user: model) }
+
+ it "returns the tokenized name of the badge" do
+ expect(response["badges"]).to be_present
+ expect(response["badges"][0]["name"]).to eq("followers")
+ end
+ end
+ end
+ end
+
describe "avatarUrl" do
let(:query) { "{ avatarUrl }" }
@@ -116,10 +149,50 @@ module Core
describe "organizationName" do
let(:query) { '{ organizationName { translation(locale: "en") } } ' }
- it "returns the user's organization name" do
+ it "returns the organization name field" do
expect(response["organizationName"]["translation"]).to eq(translated(model.organization.name))
end
end
+
+ describe "followersCount" do
+ let(:query) { "{ followersCount }" }
+
+ it "returns the followers count field" do
+ expect(response).to include("followersCount" => model.followers.count)
+ end
+ end
+
+ describe "followingCount" do
+ let(:query) { "{ followingCount }" }
+
+ it "returns the following count field" do
+ expect(response).to include("followingCount" => model.following_count)
+ end
+ end
+
+ describe "followsCount" do
+ let(:query) { "{ followsCount }" }
+
+ it "returns the follows count field" do
+ expect(response).to include("followsCount" => model.follows.count)
+ end
+ end
+
+ describe "about" do
+ let(:query) { "{ about }" }
+
+ it "returns the about about" do
+ expect(response).to include("about" => model.about)
+ end
+ end
+
+ describe "personalUrl" do
+ let(:query) { "{ personalUrl }" }
+
+ it "returns the personal url field" do
+ expect(response).to include("personalUrl" => model.personal_url)
+ end
+ end
end
end
end
diff --git a/decidim-debates/app/controllers/decidim/debates/debates_controller.rb b/decidim-debates/app/controllers/decidim/debates/debates_controller.rb
index e224a8aaf84e7..d083d7cef1889 100644
--- a/decidim-debates/app/controllers/decidim/debates/debates_controller.rb
+++ b/decidim-debates/app/controllers/decidim/debates/debates_controller.rb
@@ -125,6 +125,16 @@ def default_filter_params
def tab_panel_items
@tab_panel_items ||= attachments_tab_panel_items(debate)
end
+
+ def add_breadcrumb_item
+ return {} if debate.blank?
+
+ {
+ label: translated_attribute(debate.title),
+ url: Decidim::EngineRouter.main_proxy(current_component).debate_path(debate),
+ active: false
+ }
+ end
end
end
end
diff --git a/decidim-debates/app/controllers/decidim/debates/versions_controller.rb b/decidim-debates/app/controllers/decidim/debates/versions_controller.rb
index d4f8623900dea..bd5744d6a9521 100644
--- a/decidim-debates/app/controllers/decidim/debates/versions_controller.rb
+++ b/decidim-debates/app/controllers/decidim/debates/versions_controller.rb
@@ -9,7 +9,17 @@ class VersionsController < Decidim::Debates::ApplicationController
include Decidim::ResourceVersionsConcern
def versioned_resource
- @versioned_resource ||= present(Debate.where(component: current_component).not_hidden.find(params[:debate_id]))
+ @versioned_resource ||= Debate.where(component: current_component).not_hidden.find(params[:debate_id])
+ end
+
+ def add_breadcrumb_item
+ return {} if versioned_resource.blank?
+
+ {
+ label: translated_attribute(versioned_resource.title),
+ url: Decidim::EngineRouter.main_proxy(current_component).debate_path(versioned_resource),
+ active: false
+ }
end
end
end
diff --git a/decidim-debates/app/views/decidim/debates/admin/debates/_debate-tr.html.erb b/decidim-debates/app/views/decidim/debates/admin/debates/_debate-tr.html.erb
index 8ebde884813d5..06006e18d194d 100644
--- a/decidim-debates/app/views/decidim/debates/admin/debates/_debate-tr.html.erb
+++ b/decidim-debates/app/views/decidim/debates/admin/debates/_debate-tr.html.erb
@@ -8,12 +8,12 @@
">
<% if debate.start_time %>
- <%= l debate.start_time, format: :long %>
+ <%= l debate.start_time, format: :decidim_short %>
<% end %>
">
<% if debate.end_time %>
- <%= l debate.end_time, format: :long %>
+ <%= l debate.end_time, format: :decidim_short %>
<% end %>
">
diff --git a/decidim-debates/config/locales/ca-IT.yml b/decidim-debates/config/locales/ca-IT.yml
index f31d0e19b7be4..af6718fe2c4c5 100644
--- a/decidim-debates/config/locales/ca-IT.yml
+++ b/decidim-debates/config/locales/ca-IT.yml
@@ -33,6 +33,7 @@ ca-IT:
comment: Comentar
create: Crear un debat
like: M'agrada
+ vote_comment: Votar el comentari
name: Debats
settings:
global:
diff --git a/decidim-debates/config/locales/ca.yml b/decidim-debates/config/locales/ca.yml
index aab636ff8c1c0..be4e917905eda 100644
--- a/decidim-debates/config/locales/ca.yml
+++ b/decidim-debates/config/locales/ca.yml
@@ -33,6 +33,7 @@ ca:
comment: Comentar
create: Crear un debat
like: M'agrada
+ vote_comment: Votar el comentari
name: Debats
settings:
global:
diff --git a/decidim-debates/config/locales/en.yml b/decidim-debates/config/locales/en.yml
index 0610386b9a8fa..cc04c98bf018f 100644
--- a/decidim-debates/config/locales/en.yml
+++ b/decidim-debates/config/locales/en.yml
@@ -34,6 +34,7 @@ en:
comment: Comment
create: Create a debate
like: Like
+ vote_comment: Vote comment
name: Debates
settings:
global:
diff --git a/decidim-debates/config/locales/es-MX.yml b/decidim-debates/config/locales/es-MX.yml
index 040cd26e28cd7..7ed7d0845d4b2 100644
--- a/decidim-debates/config/locales/es-MX.yml
+++ b/decidim-debates/config/locales/es-MX.yml
@@ -33,6 +33,7 @@ es-MX:
comment: Comentar
create: Crear un debate
like: Me gusta
+ vote_comment: Votar el comentario
name: Debates
settings:
global:
diff --git a/decidim-debates/config/locales/es-PY.yml b/decidim-debates/config/locales/es-PY.yml
index 59166d18a0633..a35967b8c698e 100644
--- a/decidim-debates/config/locales/es-PY.yml
+++ b/decidim-debates/config/locales/es-PY.yml
@@ -33,6 +33,7 @@ es-PY:
comment: Comentar
create: Crear un debate
like: Me gusta
+ vote_comment: Votar el comentario
name: Debates
settings:
global:
diff --git a/decidim-debates/config/locales/es.yml b/decidim-debates/config/locales/es.yml
index dca5ef91ba668..8373945af4364 100644
--- a/decidim-debates/config/locales/es.yml
+++ b/decidim-debates/config/locales/es.yml
@@ -33,6 +33,7 @@ es:
comment: Comentar
create: Crear un debate
like: Me gusta
+ vote_comment: Votar el comentario
name: Debates
settings:
global:
diff --git a/decidim-debates/config/locales/fr-CA.yml b/decidim-debates/config/locales/fr-CA.yml
index 41fc9a5d6a551..3198e13216293 100644
--- a/decidim-debates/config/locales/fr-CA.yml
+++ b/decidim-debates/config/locales/fr-CA.yml
@@ -32,6 +32,7 @@ fr-CA:
actions:
comment: Commenter
create: Créer un débat
+ vote_comment: Vote sur le commentaire
name: Débats
settings:
global:
diff --git a/decidim-debates/config/locales/fr.yml b/decidim-debates/config/locales/fr.yml
index bee942189a7f7..fe318b2fd036f 100644
--- a/decidim-debates/config/locales/fr.yml
+++ b/decidim-debates/config/locales/fr.yml
@@ -32,6 +32,7 @@ fr:
actions:
comment: Commenter
create: Créer un débat
+ vote_comment: Vote sur le commentaire
name: Débats
settings:
global:
diff --git a/decidim-debates/db/migrate/20251114092453_remove_legacy_images_from_debates_module.rb b/decidim-debates/db/migrate/20251114092453_remove_legacy_images_from_debates_module.rb
new file mode 100644
index 0000000000000..f53849baaad4a
--- /dev/null
+++ b/decidim-debates/db/migrate/20251114092453_remove_legacy_images_from_debates_module.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class RemoveLegacyImagesFromDebatesModule < ActiveRecord::Migration[7.2]
+ def change
+ remove_column :decidim_debates_debates, :image, :string
+ end
+end
diff --git a/decidim-debates/decidim-debates.gemspec b/decidim-debates/decidim-debates.gemspec
index c96a88791b7ed..499b750a7dddb 100644
--- a/decidim-debates/decidim-debates.gemspec
+++ b/decidim-debates/decidim-debates.gemspec
@@ -18,7 +18,7 @@ Gem::Specification.new do |s|
"homepage_uri" => "https://decidim.org",
"source_code_uri" => "https://github.com/decidim/decidim"
}
- s.required_ruby_version = "~> 3.3.0"
+ s.required_ruby_version = "~> 3.4.0"
s.name = "decidim-debates"
s.summary = "Decidim debates module"
diff --git a/decidim-debates/lib/decidim/api/debate_type.rb b/decidim-debates/lib/decidim/api/debate_type.rb
index 59dd2cec03e73..96b0618ad7cc1 100644
--- a/decidim-debates/lib/decidim/api/debate_type.rb
+++ b/decidim-debates/lib/decidim/api/debate_type.rb
@@ -21,7 +21,6 @@ class DebateType < Decidim::Api::Types::BaseObject
field :description, Decidim::Core::TranslatedFieldType, "The description for this debate", null: true
field :end_time, Decidim::Core::DateTimeType, "The end time for this debate", null: true
field :id, GraphQL::Types::ID, "The internal ID for this debate", null: false
- field :image, GraphQL::Types::String, "The image of this debate", null: true
field :information_updates, Decidim::Core::TranslatedFieldType, "The information updates for this debate", null: true
field :instructions, Decidim::Core::TranslatedFieldType, "The instructions for this debate", null: true
field :last_comment_at, Decidim::Core::DateTimeType, "The last comment time for this debate", null: true
diff --git a/decidim-debates/lib/decidim/debates/component.rb b/decidim-debates/lib/decidim/debates/component.rb
index c2abef4710945..36dc17e0512b5 100644
--- a/decidim-debates/lib/decidim/debates/component.rb
+++ b/decidim-debates/lib/decidim/debates/component.rb
@@ -67,10 +67,10 @@
resource.card = "decidim/debates/debate"
resource.reported_content_cell = "decidim/debates/reported_content"
resource.searchable = true
- resource.actions = %w(create like comment)
+ resource.actions = %w(create like comment vote_comment)
end
- component.actions = %w(create like comment)
+ component.actions = %w(create like comment vote_comment)
component.exports :debates do |exports|
exports.collection do |component_instance|
diff --git a/decidim-debates/spec/system/admin_access_spec.rb b/decidim-debates/spec/system/admin_access_spec.rb
new file mode 100644
index 0000000000000..edbffd3d01f50
--- /dev/null
+++ b/decidim-debates/spec/system/admin_access_spec.rb
@@ -0,0 +1,14 @@
+# frozen_string_literal: true
+
+require "spec_helper"
+
+require "decidim/admin/test/admin_participatory_space_component_access_examples"
+
+describe "AdminAccess" do
+ let(:manifest_name) { "debates" }
+ let!(:debate) { create(:debate, component:) }
+ let(:title) { "Debates" }
+
+ include_context "when managing a component as an admin"
+ include_examples "accessing the component in a participatory space"
+end
diff --git a/decidim-debates/spec/system/debates_versions_spec.rb b/decidim-debates/spec/system/debates_versions_spec.rb
index f75e6b2c21be8..0cf4735a66503 100644
--- a/decidim-debates/spec/system/debates_versions_spec.rb
+++ b/decidim-debates/spec/system/debates_versions_spec.rb
@@ -14,6 +14,10 @@
end
it "has only one version" do
+ within(".menu-bar") do
+ expect(page).to have_content(translated(component.name))
+ expect(page).to have_content(translated(debate.title))
+ end
expect(page).to have_content("Version number 1 (of 1)")
end
diff --git a/decidim-debates/spec/system/show_spec.rb b/decidim-debates/spec/system/show_spec.rb
index d6e21f95a87f2..579d5f892591c 100644
--- a/decidim-debates/spec/system/show_spec.rb
+++ b/decidim-debates/spec/system/show_spec.rb
@@ -66,7 +66,11 @@
context "when shows the debate component" do
it "shows the debate title" do
- expect(page).to have_content debate.title[I18n.locale.to_s]
+ within(".menu-bar") do
+ expect(page).to have_content(translated(component.name))
+ expect(page).to have_content(translated(debate.title))
+ end
+ expect(page).to have_content(translated(debate.title))
end
end
diff --git a/decidim-debates/spec/types/integration_schema_spec.rb b/decidim-debates/spec/types/integration_schema_spec.rb
index 1a1da4f307871..7a012b9420e25 100644
--- a/decidim-debates/spec/types/integration_schema_spec.rb
+++ b/decidim-debates/spec/types/integration_schema_spec.rb
@@ -33,7 +33,6 @@
followsCount
hasComments
id
- image
informationUpdates {
translation(locale: "#{locale}")
}
@@ -94,7 +93,6 @@
"followsCount" => 3,
"hasComments" => debate.comment_threads.size.positive?,
"id" => debate.id.to_s,
- "image" => nil,
"informationUpdates" => { "translation" => debate.information_updates[locale] },
"instructions" => { "translation" => debate.instructions[locale] },
"lastCommentAt" => debate.last_comment_at.to_time.iso8601,
@@ -179,7 +177,6 @@
followsCount
hasComments
id
- image
informationUpdates {
translation(locale: "#{locale}")
}
diff --git a/decidim-demographics/decidim-demographics.gemspec b/decidim-demographics/decidim-demographics.gemspec
index 9aefbefd265ce..7233c69e96af2 100644
--- a/decidim-demographics/decidim-demographics.gemspec
+++ b/decidim-demographics/decidim-demographics.gemspec
@@ -17,7 +17,7 @@ Gem::Specification.new do |s|
"homepage_uri" => "https://decidim.org",
"source_code_uri" => "https://github.com/decidim/decidim"
}
- s.required_ruby_version = "~> 3.3.0"
+ s.required_ruby_version = "~> 3.4.0"
s.name = "decidim-demographics"
s.summary = "A decidim demographics module"
diff --git a/decidim-design/app/helpers/decidim/design/cards_helper.rb b/decidim-design/app/helpers/decidim/design/cards_helper.rb
index b2b0ecf3506c6..f393340a8678f 100644
--- a/decidim-design/app/helpers/decidim/design/cards_helper.rb
+++ b/decidim-design/app/helpers/decidim/design/cards_helper.rb
@@ -171,7 +171,6 @@ def source_contents
contents += debates_items
contents += meetings_items
contents += proposals_items
- contents += sortitions_items
contents += assemblies_items
contents += conferences_items
contents += initiatives_items
@@ -412,26 +411,6 @@ def proposals_items
items
end
- def sortitions_items
- return [] unless Decidim.module_installed?(:sortitions) && (resource = Decidim::Sortitions::Sortition.last).present?
-
- [
- { values: section_subtitle(title: t("decidim.design.helpers.sortitions")) },
- cell_table_item(
- t("decidim.design.helpers.sortition_l"),
- {
- cell: "decidim/sortitions/sortition_l",
- args: [resource],
- call_string: [
- "card_for(_RESOURCE_)",
- 'cell("decidim/sortitions/sortition", _RESOURCE_)',
- 'cell("decidim/sortitions/sortition_l", _RESOURCE_)'
- ]
- }
- )
- ]
- end
-
def assemblies_items
return [] unless Decidim.module_installed?(:assemblies) && (resource = Decidim::Assembly.last).present?
diff --git a/decidim-design/config/locales/en.yml b/decidim-design/config/locales/en.yml
index cbf4f0d156a90..aa64ad755b0d3 100644
--- a/decidim-design/config/locales/en.yml
+++ b/decidim-design/config/locales/en.yml
@@ -256,8 +256,6 @@ en:
share_button: Share Button
share_usage_description_html: Make sure the partial decidim/shared/share_modal is present in the DOM. This partial is placed in the application layout.
sizes: Sizes
- sortition_l: sortition_l
- sortitions: Sortitions
source_code: Source Code
state: State
tab_panels_context_description: This tab-panel component gathers all the related contents or another resources of the main element displayed, in order to save vertical space. Clicking on the tab will activate the created panel to show the content.
diff --git a/decidim-design/decidim-design.gemspec b/decidim-design/decidim-design.gemspec
index 10e5e5c41bdef..3254c10c54d82 100644
--- a/decidim-design/decidim-design.gemspec
+++ b/decidim-design/decidim-design.gemspec
@@ -19,7 +19,7 @@ Gem::Specification.new do |s|
"homepage_uri" => "https://decidim.org",
"source_code_uri" => "https://github.com/decidim/decidim"
}
- s.required_ruby_version = "~> 3.3.0"
+ s.required_ruby_version = "~> 3.4.0"
s.name = "decidim-design"
s.summary = "Decidim Design Guide (DDG) module"
diff --git a/decidim-dev/app/models/decidim/dev/dummy_resource.rb b/decidim-dev/app/models/decidim/dev/dummy_resource.rb
index 9c41abce8f27b..a6af0e915e4d1 100644
--- a/decidim-dev/app/models/decidim/dev/dummy_resource.rb
+++ b/decidim-dev/app/models/decidim/dev/dummy_resource.rb
@@ -78,7 +78,10 @@ def user_allowed_to_comment?(user)
# Public: Whether the object can have new comment votes or not.
def user_allowed_to_vote_comment?(user)
- component.can_participate_in_space?(user)
+ return false unless accepts_new_comments?
+ return unless component.can_participate_in_space?(user)
+
+ ActionAuthorizer.new(user, "vote_comment", component, self).authorize.ok?
end
def self.user_collection(user)
diff --git a/decidim-dev/config/rubocop/ruby/configuration.yml b/decidim-dev/config/rubocop/ruby/configuration.yml
index c67062c21f1c2..f02aa6e69ba2f 100644
--- a/decidim-dev/config/rubocop/ruby/configuration.yml
+++ b/decidim-dev/config/rubocop/ruby/configuration.yml
@@ -68,7 +68,7 @@ AllCops:
# If a value is specified for TargetRubyVersion then it is used.
# Else if .ruby-version exists and it contains an MRI version it is used.
# Otherwise we fallback to the oldest officially supported Ruby version (2.0).
- TargetRubyVersion: 3.3
+ TargetRubyVersion: 3.4
# Indent private/protected/public as deep as method definitions
Layout/AccessModifierIndentation:
diff --git a/decidim-dev/decidim-dev.gemspec b/decidim-dev/decidim-dev.gemspec
index b1e8bac878dc4..2f1820f51d6f0 100644
--- a/decidim-dev/decidim-dev.gemspec
+++ b/decidim-dev/decidim-dev.gemspec
@@ -19,7 +19,7 @@ Gem::Specification.new do |s|
"homepage_uri" => "https://decidim.org",
"source_code_uri" => "https://github.com/decidim/decidim"
}
- s.required_ruby_version = "~> 3.3.0"
+ s.required_ruby_version = "~> 3.4.0"
s.name = "decidim-dev"
s.summary = "Decidim dev tools"
diff --git a/decidim-dev/lib/decidim/dev/assets/assemblies.json b/decidim-dev/lib/decidim/dev/assets/assemblies.json
index 1c1298dbdebb1..f04650bb7c651 100644
--- a/decidim-dev/lib/decidim/dev/assets/assemblies.json
+++ b/decidim-dev/lib/decidim/dev/assets/assemblies.json
@@ -578,23 +578,6 @@
"permissions": null,
"published_at": "2020-01-22 07:55:05 UTC"
},
- {
- "manifest_name": "sortitions",
- "id": 26,
- "name": {
- "ca": "Sortejos",
- "en": "Sortitions",
- "es": "Sorteos"
- },
- "participatory_space_id": 1,
- "participatory_space_type": "Decidim::Assembly",
- "settings": {
- "comments_enabled": true
- },
- "weight": 0,
- "permissions": null,
- "published_at": "2020-01-22 07:55:19 UTC"
- },
{
"manifest_name": "surveys",
"id": 23,
diff --git a/decidim-dev/lib/decidim/dev/dummy_translator.rb b/decidim-dev/lib/decidim/dev/dummy_translator.rb
index 7947458ae0154..c4da7d7b3b516 100644
--- a/decidim-dev/lib/decidim/dev/dummy_translator.rb
+++ b/decidim-dev/lib/decidim/dev/dummy_translator.rb
@@ -20,7 +20,7 @@ def initialize(resource, field_name, text, target_locale, source_locale)
def translate
translated_text = "#{target_locale} - #{text}"
- MachineTranslationSaveJob.perform_later(
+ Decidim::MachineTranslationSaveJob.perform_later(
resource,
field_name,
target_locale,
diff --git a/decidim-dev/lib/decidim/dev/test/factories.rb b/decidim-dev/lib/decidim/dev/test/factories.rb
index b0f7c8af8387e..cfaecb92bb625 100644
--- a/decidim-dev/lib/decidim/dev/test/factories.rb
+++ b/decidim-dev/lib/decidim/dev/test/factories.rb
@@ -15,9 +15,10 @@
transient do
skip_injection { false }
users { nil }
+ organization { create(:organization, skip_injection:) }
end
title { generate_localized_title(:dummy_resource_title, skip_injection:) }
- component { create(:dummy_component, skip_injection:) }
+ component { create(:dummy_component, organization:, skip_injection:) }
author { create(:user, :confirmed, organization: component.organization, skip_injection:) }
scope { create(:scope, organization: component.organization, skip_injection:) }
diff --git a/decidim-dev/lib/decidim/dev/test/rspec_support/helpers.rb b/decidim-dev/lib/decidim/dev/test/rspec_support/helpers.rb
index 2de57b3dfaf38..b78032386b153 100644
--- a/decidim-dev/lib/decidim/dev/test/rspec_support/helpers.rb
+++ b/decidim-dev/lib/decidim/dev/test/rspec_support/helpers.rb
@@ -33,7 +33,7 @@ def within_admin_menu
end
def within_language_menu(options = {})
- within(options[:admin] ? ".language-choose" : "footer") do
+ within(options[:admin] ? ".language-choose" : "header") do
find(options[:admin] ? "#admin-menu-trigger" : "#trigger-dropdown-language-chooser").click
yield
end
diff --git a/decidim-elections/README.md b/decidim-elections/README.md
index 5c2e483eaf4fe..f24fd3a50c4bd 100644
--- a/decidim-elections/README.md
+++ b/decidim-elections/README.md
@@ -12,6 +12,14 @@ To install this module, run in your console:
bundle add decidim-elections
```
+And then execute:
+
+```bash
+bundle
+bundle exec rails decidim_elections:install:migrations
+bundle exec rails db:migrate
+```
+
## Contributing
See [Decidim](https://github.com/decidim/decidim).
diff --git a/decidim-elections/app/commands/decidim/elections/admin/update_questions.rb b/decidim-elections/app/commands/decidim/elections/admin/update_questions.rb
index 895cc764a3ba9..c379e669d260b 100644
--- a/decidim-elections/app/commands/decidim/elections/admin/update_questions.rb
+++ b/decidim-elections/app/commands/decidim/elections/admin/update_questions.rb
@@ -47,6 +47,7 @@ def update_question(question_form, index)
body: question_form.body,
description: question_form.description,
question_type: question_form.question_type,
+ max_choices: question_form.max_choices,
position: index
)
diff --git a/decidim-elections/app/controllers/decidim/elections/elections_controller.rb b/decidim-elections/app/controllers/decidim/elections/elections_controller.rb
index 307b85d378e73..9984ba8381581 100644
--- a/decidim-elections/app/controllers/decidim/elections/elections_controller.rb
+++ b/decidim-elections/app/controllers/decidim/elections/elections_controller.rb
@@ -30,7 +30,7 @@ def elections
end
def election
- @election ||= current_user&.admin? ? available_elections.find(params[:id]) : elections.find(params[:id])
+ @election ||= current_user&.admin? ? available_elections.find_by(id: params[:id]) : elections.find_by(id: params[:id])
end
def questions
@@ -59,6 +59,16 @@ def default_filter_params
with_any_state: "all"
}
end
+
+ def add_breadcrumb_item
+ return {} if election.blank?
+
+ {
+ label: translated_attribute(election.title),
+ url: Decidim::EngineRouter.main_proxy(current_component).election_path(election),
+ active: false
+ }
+ end
end
end
end
diff --git a/decidim-elections/app/controllers/decidim/elections/votes_controller.rb b/decidim-elections/app/controllers/decidim/elections/votes_controller.rb
index 41311510db060..51576fab8eb57 100644
--- a/decidim-elections/app/controllers/decidim/elections/votes_controller.rb
+++ b/decidim-elections/app/controllers/decidim/elections/votes_controller.rb
@@ -20,6 +20,14 @@ def show
def update
enforce_permission_to(:create, :vote, election:)
+ response_ids = Array(params.dig(:response, question.id.to_s)).compact
+
+ if question.max_choices.present? && response_ids.size > question.max_choices
+ flash.now[:alert] = t("votes.question.max_choices_exceeded", scope: "decidim.elections", max: question.max_choices)
+ render :show
+ return
+ end
+
votes_buffer[question.id.to_s] = params.dig(:response, question.id.to_s)
redirect_to next_vote_step_path
end
diff --git a/decidim-elections/app/forms/decidim/elections/admin/question_form.rb b/decidim-elections/app/forms/decidim/elections/admin/question_form.rb
index 29579d7c3b02e..cb50cf84e9b02 100644
--- a/decidim-elections/app/forms/decidim/elections/admin/question_form.rb
+++ b/decidim-elections/app/forms/decidim/elections/admin/question_form.rb
@@ -10,6 +10,7 @@ class QuestionForm < Decidim::Form
attribute :question_type, String, default: "multiple_option"
attribute :response_options, Array[Decidim::Elections::Admin::ResponseOptionForm]
+ attribute :max_choices, Integer
attribute :deleted, Boolean, default: false
translatable_attribute :body, String
@@ -18,6 +19,7 @@ class QuestionForm < Decidim::Form
validates :body, translatable_presence: true
validates :question_type, inclusion: { in: Decidim::Elections::Question.question_types }, if: :editable?
validates :response_options, presence: true, if: :editable?
+ validates :max_choices, numericality: { only_integer: true, greater_than: 1, less_than_or_equal_to: ->(form) { form.number_of_options } }, allow_blank: true
def election
@election ||= context[:election]
@@ -32,6 +34,10 @@ def to_param
def editable?
@editable ||= id.blank? || Decidim::Elections::Question.exists?(id:)
end
+
+ def number_of_options
+ response_options.size
+ end
end
end
end
diff --git a/decidim-elections/app/forms/decidim/elections/censuses/internal_users_form.rb b/decidim-elections/app/forms/decidim/elections/censuses/internal_users_form.rb
index ee8033887501e..9f4f67e2695e7 100644
--- a/decidim-elections/app/forms/decidim/elections/censuses/internal_users_form.rb
+++ b/decidim-elections/app/forms/decidim/elections/censuses/internal_users_form.rb
@@ -8,6 +8,9 @@ class InternalUsersForm < Decidim::Form
validate :user_authenticated
delegate :election, :current_user, to: :context
+ delegate :organization, to: :current_user
+
+ attr_reader :authorization_status
def voter_uid
@voter_uid ||= election.census.users(election).find_by(id: current_user&.id)&.to_global_id&.to_s
@@ -18,7 +21,7 @@ def adapters
end
def authorization_handlers
- election.census_settings["authorization_handlers"] || {}
+ @authorization_handlers ||= election.census_settings&.fetch("authorization_handlers", {})&.slice(*organization.available_authorizations)
end
def authorizations
@@ -26,7 +29,7 @@ def authorizations
[
adapter,
Decidim::Verifications::Authorizations.new(
- organization: current_user.organization,
+ organization: organization,
user: current_user,
name: adapter.name
).first
@@ -43,20 +46,11 @@ def in_census?
def user_authenticated
return errors.add(:base, I18n.t("decidim.elections.censuses.internal_users_form.invalid")) unless in_census?
- invalid = authorizations.filter_map do |adapter, authorization|
- if !authorization || !authorization.granted?
- ["not_granted", adapter]
- elsif adapter.authorize(authorization, authorization_handlers.dig(adapter.name, "options"), election.component, election)&.first != :ok
- ["not_authorized", adapter]
- end
- end
+ @authorization_status = Decidim::ActionAuthorizer::AuthorizationStatusCollection.new(authorization_handlers, current_user, election.component, election)
- return if invalid.empty?
+ return if @authorization_status.ok?
errors.add(:base, I18n.t("decidim.elections.censuses.internal_users_form.invalid"))
- invalid.each do |error, adapter|
- errors.add(:base, I18n.t("decidim.elections.censuses.internal_users_form.#{error}", adapter: adapter.fullname))
- end
end
end
end
diff --git a/decidim-elections/app/helpers/decidim/elections/application_helper.rb b/decidim-elections/app/helpers/decidim/elections/application_helper.rb
index fb76d007ffb3c..7c793594ab53c 100644
--- a/decidim-elections/app/helpers/decidim/elections/application_helper.rb
+++ b/decidim-elections/app/helpers/decidim/elections/application_helper.rb
@@ -37,9 +37,13 @@ def component_name
(defined?(current_component) && translated_attribute(current_component&.name).presence) || t("decidim.components.elections.name")
end
- def question_title(question, tag = :h3, **options)
- content_tag(tag, **options) do
- translated_attribute(question.body)
+ def question_title(question, tag = :h3, **)
+ content_tag(tag, **) do
+ title = translated_attribute(question.body)
+ if question.max_choices.present? && question.question_type == "multiple_option"
+ title += " (#{t("decidim.elections.votes.question.max_choices", count: question.max_choices)})"
+ end
+ title.html_safe
end
end
diff --git a/decidim-elections/app/models/decidim/elections/question.rb b/decidim-elections/app/models/decidim/elections/question.rb
index d0ba336682ee0..6bfee4dd38532 100644
--- a/decidim-elections/app/models/decidim/elections/question.rb
+++ b/decidim-elections/app/models/decidim/elections/question.rb
@@ -28,6 +28,7 @@ def self.question_types
end
def max_votable_options
+ return max_choices if max_choices.present? && question_type == "multiple_option"
return response_options.size if question_type == "multiple_option"
1
diff --git a/decidim-elections/app/packs/entrypoints/decidim_elections.js b/decidim-elections/app/packs/entrypoints/decidim_elections.js
index 19a5a196bd98d..b24319e37f05a 100644
--- a/decidim-elections/app/packs/entrypoints/decidim_elections.js
+++ b/decidim-elections/app/packs/entrypoints/decidim_elections.js
@@ -1,3 +1,4 @@
+import "src/decidim/elections/elections.js"
import "src/decidim/elections/waiting_room.js"
import "src/decidim/elections/live_results_update.js";
diff --git a/decidim-elections/app/packs/src/decidim/elections/elections.js b/decidim-elections/app/packs/src/decidim/elections/elections.js
new file mode 100644
index 0000000000000..50fd9d555f724
--- /dev/null
+++ b/decidim-elections/app/packs/src/decidim/elections/elections.js
@@ -0,0 +1,32 @@
+document.addEventListener("turbo:load", () => {
+ const responseContainers = document.querySelectorAll(".response[data-max-choices]");
+ if (!responseContainers.length) {
+ return;
+ }
+
+ responseContainers.forEach((container) => {
+ const maxChoices = parseInt(container.dataset.maxChoices, 10);
+ if (!maxChoices) {
+ return;
+ }
+
+ const checkboxes = container.querySelectorAll("input[type=checkbox]");
+ const alertElement = container.querySelector(".max-choices-alert");
+
+ const checkLimit = () => {
+ const checkedCount = container.querySelectorAll("input[type=checkbox]:checked").length;
+
+ if (checkedCount > maxChoices) {
+ alertElement.style.display = "block";
+ } else {
+ alertElement.style.display = "none";
+ }
+ };
+
+ checkboxes.forEach((checkbox) => {
+ checkbox.addEventListener("change", checkLimit);
+ });
+
+ checkLimit();
+ });
+});
diff --git a/decidim-elections/app/views/decidim/elections/admin/elections/_election-tr.html.erb b/decidim-elections/app/views/decidim/elections/admin/elections/_election-tr.html.erb
index 33e27c637243f..b424a89655a2f 100644
--- a/decidim-elections/app/views/decidim/elections/admin/elections/_election-tr.html.erb
+++ b/decidim-elections/app/views/decidim/elections/admin/elections/_election-tr.html.erb
@@ -8,14 +8,14 @@
">
<% if election.start_at %>
- <%= l election.start_at, format: :long %>
+ <%= l election.start_at, format: :decidim_short %>
<% else %>
<%= t("decidim.elections.admin.elections.form.manual_start") %>
<% end %>
">
<% if election.end_at %>
- <%= l election.end_at, format: :long %>
+ <%= l election.end_at, format: :decidim_short %>
<% end %>
<% question.response_options.each do |option| %>
-
diff --git a/decidim-elections/config/locales/ca-IT.yml b/decidim-elections/config/locales/ca-IT.yml
index c7d6a2cafd64d..34477e12a20e4 100644
--- a/decidim-elections/config/locales/ca-IT.yml
+++ b/decidim-elections/config/locales/ca-IT.yml
@@ -44,7 +44,6 @@ ca-IT:
choose_census: Tria el tipus de cens que vols vincular a aquesta elecció
created_at: Creada el
identifier: Identificador d'usuària
- title: Tipus de cens
preview:
title:
one: La vista prèvia de la llista està limitada a %{count} registre.
diff --git a/decidim-elections/config/locales/ca.yml b/decidim-elections/config/locales/ca.yml
index b170de5dcf804..474b6fcd7745f 100644
--- a/decidim-elections/config/locales/ca.yml
+++ b/decidim-elections/config/locales/ca.yml
@@ -44,7 +44,6 @@ ca:
choose_census: Tria el tipus de cens que vols vincular a aquesta elecció
created_at: Creada el
identifier: Identificador d'usuària
- title: Tipus de cens
preview:
title:
one: La vista prèvia de la llista està limitada a %{count} registre.
diff --git a/decidim-elections/config/locales/cs.yml b/decidim-elections/config/locales/cs.yml
index f011de3f0d7b4..236addfc4cc1e 100644
--- a/decidim-elections/config/locales/cs.yml
+++ b/decidim-elections/config/locales/cs.yml
@@ -128,7 +128,22 @@ cs:
already_have_an_account?: Již máte účet?
are_you_new?: Nový účastník?
sign_in_description: Přihlaste se k hlasování v těchto volbách
+ sign_up_description: Vytvořte účet pro hlasování v této volbě
+ internal_users_form:
+ authorization_options_invalid: Bohužel, i když máte všechna požadovaná oprávnění, některé z nich pro tyto volby neplatí.
+ invalid: V těchto volbách nemáte oprávnění volit.
+ missing: Vašemu uživateli chybí některá požadovaná autorizace. Zkontrolujte prosím informace a zkuste to znovu.
+ resume_with_method: Pokračovat v ověřování pomocí %{name}
+ verify_with_method: Ověřit pomocí %{name}
token_csv:
+ example: |
+ e-mail;token
+ user@example.org;123456
+ user2@example.org;ABCXYZ
+ info_html: |
+ Musí být soubor ve formátu CSV se dvěma sloupci, jedna s e-mailovou adresou a druhá s hodnotou tokenu, který uživatel bude muset představit, aby mohl hlasovat.
+ Musí být oddělena středníkem (;)
+ label: Neregistrovaní účastníci s tokeny (fixní)
upload_file: Nahrát soubor
upload_new_census: Nahrát CSV soubor
token_csv_form:
@@ -146,6 +161,7 @@ cs:
other: "%{count} voleb"
elections:
empty: Nejsou k dispozici žádné volby.
+ empty_filters: Neexistují žádné volby, které by odpovídaly vašim filtrům.
filters:
all: Vše
state: Stav
@@ -163,6 +179,8 @@ cs:
show:
vote_button: Hlasovat
vote_results:
+ subtitle:
+ per_question: Výsledky jsou k dispozici na jednu otázku. Výsledky pro každou otázku můžete vidět po povolení hlasování a po zveřejnění výsledků.
title: Výsledky
models:
election:
@@ -175,11 +193,14 @@ cs:
per_question_votes:
waiting:
edit_vote: Upravte svůj hlas
+ exit_button: Odejít z čekací místnosti
+ title: Čekání na další otázku
status:
active: Aktivní
finished: Dokončeno
not_started: Nezahájeno
ongoing: Probíhající
+ published_results: Zveřejněné výsledky
scheduled: Naplánováno
unpublished: Nezveřejněno
voting_enabled: Probíhá hlasování
@@ -189,9 +210,11 @@ cs:
success: Váš hlas byl úspěšně odeslán.
check_census:
access: Přístup
+ election_not_open: Volby ještě nejsou otevřeny. Zkontrolujte prosím datum a zkuste to znovu.
failed: Vaši identitu nelze ověřit. Zkontrolujte zadané informace a zkuste to znovu.
form_title: Ověřte svou identitu
confirm:
+ edit_vote: Upravte svůj hlas
not_answered: Na tuto otázku jste neodpověděl.
title: Potvrďte svůj hlas
not_authorized: V těchto volbách nemáte oprávnění volit.
diff --git a/decidim-elections/config/locales/en.yml b/decidim-elections/config/locales/en.yml
index 3c970ec5c7a37..1f2e3d1adf4b0 100644
--- a/decidim-elections/config/locales/en.yml
+++ b/decidim-elections/config/locales/en.yml
@@ -2,6 +2,8 @@
en:
activemodel:
attributes:
+ elections_question:
+ max_choices: Maximum number of choices
token_csv:
file: File
remove_all: Remove all current census data
@@ -200,9 +202,6 @@ en:
authorization_options_invalid: Unfortunately, although you have all the required authorizations, some of them are not valid for this election.
exit_button: Exit the voting booth
invalid: You are not authorized to vote in this election.
- missing: Your user misses some required authorizations. Please check the information and try again.
- not_authorized: '"%{adapter}" authorization does not match the required conditions.'
- not_granted: '"%{adapter}" authorization is not granted.'
resume_with_method: Resume verification with %{name}
verify_with_method: Verify with %{name}
token_csv:
@@ -302,6 +301,9 @@ en:
question:
back: Back
cast_vote: Cast vote
+ max_choices: 'Max choices: %{count}'
+ max_choices_alert: You have selected too many options. Please deselect some to continue.
+ max_choices_exceeded: You cannot select more than %{max} options. Please go back and adjust your selection.
next: Next
receipt:
description: Yo can vote again at any time while the voting period is open. Your previous vote will be overwritten by the new one.
diff --git a/decidim-elections/config/locales/es-MX.yml b/decidim-elections/config/locales/es-MX.yml
index a713fdaaf03e6..b9f00c38dae2a 100644
--- a/decidim-elections/config/locales/es-MX.yml
+++ b/decidim-elections/config/locales/es-MX.yml
@@ -44,7 +44,6 @@ es-MX:
choose_census: Elige el tipo de censo que quieres vincular esta elección
created_at: Creado el
identifier: Identificador de usuaria
- title: Tipo de censo
preview:
title:
one: La vista previa de la lista está limitada a %{count} registro.
diff --git a/decidim-elections/config/locales/es-PY.yml b/decidim-elections/config/locales/es-PY.yml
index 7b50d4ac3b4b7..d899df8ca3fab 100644
--- a/decidim-elections/config/locales/es-PY.yml
+++ b/decidim-elections/config/locales/es-PY.yml
@@ -44,7 +44,6 @@ es-PY:
choose_census: Elige el tipo de censo que quieres vincular esta elección
created_at: Creado el
identifier: Identificador de usuaria
- title: Tipo de censo
preview:
title:
one: La vista previa de la lista está limitada a %{count} registro.
diff --git a/decidim-elections/config/locales/es.yml b/decidim-elections/config/locales/es.yml
index 0e107c8291698..26653fe7d7a95 100644
--- a/decidim-elections/config/locales/es.yml
+++ b/decidim-elections/config/locales/es.yml
@@ -44,7 +44,6 @@ es:
choose_census: Elige el tipo de censo que quieres vincular esta elección
created_at: Creado el
identifier: Identificador de usuaria
- title: Tipo de censo
preview:
title:
one: La vista previa de la lista está limitada a %{count} registro.
diff --git a/decidim-elections/config/locales/eu.yml b/decidim-elections/config/locales/eu.yml
index 4009958aa6e39..f978acc27c79d 100644
--- a/decidim-elections/config/locales/eu.yml
+++ b/decidim-elections/config/locales/eu.yml
@@ -44,7 +44,6 @@ eu:
choose_census: Hautatu hauteskunde hauetarako erabili nahi duzun errolda-mota
created_at: Sortze-data
identifier: Parte-hartzailearen identifikatzailea
- title: Errolda-mota
preview:
title:
one: Aurrebistaren zerrenda erregistro batera mugatuta dago.
@@ -180,7 +179,7 @@ eu:
unpublish: "%{user_name} parte-hartzaileak %{resource_name} hauteskundea despublikatu du %{space_name} espazioan"
update: "%{user_name} parte-hartzaileak %{resource_name} hauteskundea eguneratu du %{space_name} espazioan"
question:
- update: "%{user_name} -k eguneratu ditu %{resource_name} aukerako galderak"
+ update: "%{user_name} parte-hartzaileak eguneratu ditu %{resource_name} aukerako galderak"
censuses:
census_ready_html: Erroldako datuak kargatuta daude eta prest daude % %{election_title}{@eleccion_title} bozketan erabiltzeko.
census_size_html:
diff --git a/decidim-elections/config/locales/fi-plain.yml b/decidim-elections/config/locales/fi-plain.yml
index baa445dd43f2b..b2560c07ea471 100644
--- a/decidim-elections/config/locales/fi-plain.yml
+++ b/decidim-elections/config/locales/fi-plain.yml
@@ -44,7 +44,6 @@ fi-pl:
choose_census: Valitse henkilötietorekisterin tyyppi, jota haluat käyttää tälle vaalille
created_at: Luonnin ajankohta
identifier: Käyttäjän tunniste
- title: Henkilötietorekisterin tyyppi
preview:
title:
one: Esikatselulista on rajattu %{count} tietueeseen.
diff --git a/decidim-elections/config/locales/fi.yml b/decidim-elections/config/locales/fi.yml
index 09d527ab23005..9fb410f86b70e 100644
--- a/decidim-elections/config/locales/fi.yml
+++ b/decidim-elections/config/locales/fi.yml
@@ -44,7 +44,6 @@ fi:
choose_census: Valitse henkilötietorekisterin tyyppi, jota haluat käyttää tälle vaalille
created_at: Luonnin ajankohta
identifier: Käyttäjän tunniste
- title: Henkilötietorekisterin tyyppi
preview:
title:
one: Esikatselulista on rajattu %{count} tietueeseen.
diff --git a/decidim-elections/config/locales/fr-CA.yml b/decidim-elections/config/locales/fr-CA.yml
index b07e1de80e09d..ad54e715b1042 100644
--- a/decidim-elections/config/locales/fr-CA.yml
+++ b/decidim-elections/config/locales/fr-CA.yml
@@ -40,6 +40,7 @@ fr-CA:
admin:
census:
edit:
+ choose_census: Choisissez le type de recensement que vous souhaitez utiliser pour cette élection
created_at: Créée le
identifier: Identifiant de l'utilisateur
preview:
@@ -71,6 +72,7 @@ fr-CA:
publish_button: Publier les résultats
title: Résultats
status:
+ census: 'Recensement:'
results_availability:
after_end: Résultats disponibles après la fin de l'élection
per_question: Résultats disponibles par question
@@ -80,6 +82,8 @@ fr-CA:
create:
invalid: Il y a eu un problème lors de la création de l'élection.
success: Élection créée avec succès.
+ dashboard:
+ subtitle: 'Étape finale: éxaminez vos détails. Des modifications peuvent toujours être apportées avant de publier. Une fois publiée, vous serez toujours en mesure de mettre à jour la description de l''élection.'
edit:
title: Modifier l'élection
form:
@@ -142,6 +146,9 @@ fr-CA:
internal_users:
already_have_an_account?: Vous avez déjà un compte?
are_you_new?: Nouveau participant ?
+ info_html: |
+ Vous pouvez restreindre la participation à l'élection aux participants qui ont une autorisation.
+ Notez que les participants devront satisfaire aux autorisations sélectionnées pour voter. Laisser toutes les cases à cocher vides permettra à toute personne enregistrée de voter.
internal_type_title: Autorisations supplémentaires requises pour voter (facultatif)
sign_in_description: Connectez-vous pour voter durant cette élection
sign_up_description: Créer un compte pour voter durant cette élection
@@ -184,6 +191,7 @@ fr-CA:
state_values:
finished: Terminées
ongoing: En cours
+ scheduled: Programmé
orders:
end_at: Date de fin
label: Trier par
diff --git a/decidim-elections/config/locales/fr.yml b/decidim-elections/config/locales/fr.yml
index 68d35c0b00b69..7244ea07f2183 100644
--- a/decidim-elections/config/locales/fr.yml
+++ b/decidim-elections/config/locales/fr.yml
@@ -40,6 +40,7 @@ fr:
admin:
census:
edit:
+ choose_census: Choisissez le type de recensement que vous souhaitez utiliser pour cette élection
created_at: Créée le
identifier: Identifiant de l'utilisateur
preview:
@@ -71,6 +72,7 @@ fr:
publish_button: Publier les résultats
title: Résultats
status:
+ census: 'Recensement:'
results_availability:
after_end: Résultats disponibles après la fin de l'élection
per_question: Résultats disponibles par question
@@ -80,6 +82,8 @@ fr:
create:
invalid: Il y a eu un problème lors de la création de l'élection.
success: Élection créée avec succès.
+ dashboard:
+ subtitle: 'Étape finale: éxaminez vos détails. Des modifications peuvent toujours être apportées avant de publier. Une fois publiée, vous serez toujours en mesure de mettre à jour la description de l''élection.'
edit:
title: Modifier l'élection
form:
@@ -142,6 +146,9 @@ fr:
internal_users:
already_have_an_account?: Vous avez déjà un compte?
are_you_new?: Nouveau participant ?
+ info_html: |
+ Vous pouvez restreindre la participation à l'élection aux participants qui ont une autorisation.
+ Notez que les participants devront satisfaire aux autorisations sélectionnées pour voter. Laisser toutes les cases à cocher vides permettra à toute personne enregistrée de voter.
internal_type_title: Autorisations supplémentaires requises pour voter (facultatif)
sign_in_description: Connectez-vous pour voter durant cette élection
sign_up_description: Créer un compte pour voter durant cette élection
@@ -184,6 +191,7 @@ fr:
state_values:
finished: Terminées
ongoing: En cours
+ scheduled: Programmé
orders:
end_at: Date de fin
label: Trier par
diff --git a/decidim-elections/config/locales/ja.yml b/decidim-elections/config/locales/ja.yml
index 56db4c3bd6645..550cb2d9ca32e 100644
--- a/decidim-elections/config/locales/ja.yml
+++ b/decidim-elections/config/locales/ja.yml
@@ -44,7 +44,6 @@ ja:
choose_census: この選挙に使用したいセンサスの種類を選択してください
created_at: 作成日時
identifier: ユーザーID
- title: センサスの種類
preview:
title:
other: プレビューリストは %{count} レコードに制限されています。
diff --git a/decidim-elections/config/locales/sv.yml b/decidim-elections/config/locales/sv.yml
index 79514ca975b30..e4888aa9694d9 100644
--- a/decidim-elections/config/locales/sv.yml
+++ b/decidim-elections/config/locales/sv.yml
@@ -39,7 +39,6 @@ sv:
choose_census: Välj vilken typ av folkräkning du vill använda för detta val
created_at: Skapad den
identifier: Identifierare för användare
- title: Typ av folkräkning
preview:
title:
one: Förhandsgranskningen är begränsad till %{count} post.
diff --git a/decidim-elections/db/migrate/20251007113417_add_max_choices_to_decidim_elections_questions.rb b/decidim-elections/db/migrate/20251007113417_add_max_choices_to_decidim_elections_questions.rb
new file mode 100644
index 0000000000000..4e2d8aadcac24
--- /dev/null
+++ b/decidim-elections/db/migrate/20251007113417_add_max_choices_to_decidim_elections_questions.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class AddMaxChoicesToDecidimElectionsQuestions < ActiveRecord::Migration[7.2]
+ def change
+ add_column :decidim_elections_questions, :max_choices, :integer
+ end
+end
diff --git a/decidim-elections/decidim-elections.gemspec b/decidim-elections/decidim-elections.gemspec
index e46c1f172e9a8..c4d592bca87f1 100644
--- a/decidim-elections/decidim-elections.gemspec
+++ b/decidim-elections/decidim-elections.gemspec
@@ -17,7 +17,7 @@ Gem::Specification.new do |s|
"homepage_uri" => "https://decidim.org",
"source_code_uri" => "https://github.com/decidim/decidim"
}
- s.required_ruby_version = "~> 3.3.0"
+ s.required_ruby_version = "~> 3.4.0"
s.name = "decidim-elections"
s.summary = "A Decidim module for creating Elections."
diff --git a/decidim-elections/lib/decidim/elections/test/factories.rb b/decidim-elections/lib/decidim/elections/test/factories.rb
index 50ae7c6bd5cac..c50e57fc0fe00 100644
--- a/decidim-elections/lib/decidim/elections/test/factories.rb
+++ b/decidim-elections/lib/decidim/elections/test/factories.rb
@@ -69,8 +69,8 @@
end
trait :with_questions do
- after :create do |election, _evaluator|
- create_list(:election_question, 2, :with_response_options, :voting_enabled, election:)
+ after :create do |election, evaluator|
+ create_list(:election_question, 2, :with_response_options, :voting_enabled, election:, skip_injection: evaluator.skip_injection)
end
end
@@ -95,8 +95,12 @@
end
factory :election_question, class: "Decidim::Elections::Question" do
+ transient do
+ skip_injection { false }
+ end
+
association :election
- body { generate_localized_title(:question_body) }
+ body { generate_localized_title(:question_body, skip_injection:) }
description { generate_localized_description(:question_description) }
question_type { "multiple_option" }
sequence(:position) { |n| n }
diff --git a/decidim-elections/spec/commands/decidim/elections/admin/update_questions_spec.rb b/decidim-elections/spec/commands/decidim/elections/admin/update_questions_spec.rb
index 4d0d6369ec37b..b1d35796b0490 100644
--- a/decidim-elections/spec/commands/decidim/elections/admin/update_questions_spec.rb
+++ b/decidim-elections/spec/commands/decidim/elections/admin/update_questions_spec.rb
@@ -190,6 +190,67 @@ module Admin
end
end
+ context "when updating max_choices" do
+ let(:update_max_choices_params) do
+ {
+ "questions" => [
+ {
+ "id" => first_question.id,
+ "body" => first_question.body,
+ "description" => first_question.description,
+ "question_type" => "multiple_option",
+ "max_choices" => 2,
+ "response_options" => [
+ { "id" => first_question_first_option.id, "body" => first_question_first_option.body },
+ { "id" => first_question_second_option.id, "body" => first_question_second_option.body }
+ ]
+ }
+ ]
+ }
+ end
+
+ let(:form) { Decidim::Elections::Admin::QuestionsForm.from_params(update_max_choices_params).with_context(context_params) }
+ let(:command) { described_class.new(form, election) }
+
+ it "updates max_choices field" do
+ command.call
+ updated = election.reload.questions.find_by(id: first_question.id)
+ expect(updated.max_choices).to eq(2)
+ end
+ end
+
+ context "when adding a new question with max_choices" do
+ let(:add_with_max_choices_params) do
+ {
+ "questions" => [
+ {
+ "body" => { en: "Q with max choices" },
+ "description" => { en: "Description" },
+ "question_type" => "multiple_option",
+ "max_choices" => 3,
+ "response_options" => [
+ { "body" => { en: "Option 1" } },
+ { "body" => { en: "Option 2" } },
+ { "body" => { en: "Option 3" } },
+ { "body" => { en: "Option 4" } }
+ ]
+ }
+ ]
+ }
+ end
+
+ let(:form) { Decidim::Elections::Admin::QuestionsForm.from_params(add_with_max_choices_params).with_context(context_params) }
+ let(:command) { described_class.new(form, election) }
+
+ it "creates a new question with max_choices" do
+ expect { command.call }
+ .to change { election.reload.questions.count }.by(1)
+ new_question = election.reload.questions.last
+ expect(new_question.max_choices).to eq(3)
+ expect(new_question.response_options.size).to eq(4)
+ end
+ end
+
context "when updating, deleting, and adding at once" do
let(:combo_params) do
{
diff --git a/decidim-elections/spec/controllers/decidim/elections/votes_controller_spec.rb b/decidim-elections/spec/controllers/decidim/elections/votes_controller_spec.rb
index e340e150c9e3c..7cab91d3c4936 100644
--- a/decidim-elections/spec/controllers/decidim/elections/votes_controller_spec.rb
+++ b/decidim-elections/spec/controllers/decidim/elections/votes_controller_spec.rb
@@ -96,6 +96,56 @@ module Elections
expect(session[:votes_buffer]).to eq({ question.id.to_s => nil, second_question.id.to_s => nil })
expect(response).to redirect_to(confirm_election_votes_path)
end
+
+ context "when question has max_choices limit" do
+ let!(:question_with_limit) do
+ create(:election_question, :voting_enabled, election:, question_type: "multiple_option", max_choices: 2)
+ end
+ let!(:option1) { create(:election_response_option, question: question_with_limit) }
+ let!(:option2) { create(:election_response_option, question: question_with_limit) }
+ let!(:option3) { create(:election_response_option, question: question_with_limit) }
+
+ it "rejects vote when exceeding max_choices" do
+ patch :update, params: params.merge(
+ id: question_with_limit.id,
+ response: {
+ question_with_limit.id.to_s => [option1.id, option2.id, option3.id]
+ }
+ )
+
+ expect(response).to have_http_status(:ok)
+ expect(flash[:alert]).to match(/cannot select more than 2/)
+ expect(subject).to render_template(:show)
+ end
+
+ it "accepts vote when within max_choices limit" do
+ session[:votes_buffer] = { question.id.to_s => nil, second_question.id.to_s => nil }
+
+ patch :update, params: params.merge(
+ id: question_with_limit.id,
+ response: {
+ question_with_limit.id.to_s => [option1.id, option2.id]
+ }
+ )
+
+ expect(session[:votes_buffer][question_with_limit.id.to_s]).to eq([option1.id.to_s, option2.id.to_s])
+ expect(response).to redirect_to(confirm_election_votes_path)
+ end
+
+ it "accepts vote with less than max_choices" do
+ session[:votes_buffer] = { question.id.to_s => nil, second_question.id.to_s => nil }
+
+ patch :update, params: params.merge(
+ id: question_with_limit.id,
+ response: {
+ question_with_limit.id.to_s => [option1.id]
+ }
+ )
+
+ expect(session[:votes_buffer][question_with_limit.id.to_s]).to eq([option1.id.to_s])
+ expect(response).to redirect_to(confirm_election_votes_path)
+ end
+ end
end
end
diff --git a/decidim-elections/spec/forms/decidim/elections/admin/question_form_spec.rb b/decidim-elections/spec/forms/decidim/elections/admin/question_form_spec.rb
index f5a0349884b82..75e3f42235347 100644
--- a/decidim-elections/spec/forms/decidim/elections/admin/question_form_spec.rb
+++ b/decidim-elections/spec/forms/decidim/elections/admin/question_form_spec.rb
@@ -55,6 +55,72 @@ module Admin
it { is_expected.not_to be_valid }
end
+ describe "max_choices validation" do
+ let(:attributes) do
+ {
+ body_en: body_en,
+ description_en: description_en,
+ question_type: question_type,
+ response_options: response_options,
+ max_choices: max_choices
+ }
+ end
+
+ context "when max_choices is valid" do
+ let(:max_choices) { 2 }
+
+ it { is_expected.to be_valid }
+ end
+
+ context "when max_choices is greater than number of options" do
+ let(:max_choices) { 10 }
+
+ it { is_expected.not_to be_valid }
+
+ it "adds an error on max_choices" do
+ subject.valid?
+ expect(subject.errors[:max_choices]).not_to be_empty
+ end
+ end
+
+ context "when max_choices is 1" do
+ let(:max_choices) { 1 }
+
+ it { is_expected.not_to be_valid }
+
+ it "adds an error on max_choices" do
+ subject.valid?
+ expect(subject.errors[:max_choices]).not_to be_empty
+ end
+ end
+
+ context "when max_choices is nil" do
+ let(:max_choices) { nil }
+
+ it { is_expected.to be_valid }
+ end
+
+ context "when max_choices is blank string" do
+ let(:max_choices) { "" }
+
+ it { is_expected.to be_valid }
+ end
+ end
+
+ describe "#number_of_options" do
+ it "returns the count of response options" do
+ expect(subject.number_of_options).to eq(2)
+ end
+
+ context "when there are no response options" do
+ let(:response_options) { {} }
+
+ it "returns 0" do
+ expect(subject.number_of_options).to eq(0)
+ end
+ end
+ end
+
it_behaves_like "form to param", default_id: "questionnaire-question-id"
end
end
diff --git a/decidim-elections/spec/forms/decidim/elections/internal_users_form_spec.rb b/decidim-elections/spec/forms/decidim/elections/internal_users_form_spec.rb
index b97f8cf74614d..dc5f1b63cd5a4 100644
--- a/decidim-elections/spec/forms/decidim/elections/internal_users_form_spec.rb
+++ b/decidim-elections/spec/forms/decidim/elections/internal_users_form_spec.rb
@@ -18,6 +18,10 @@ module Censuses
{}
end
+ before do
+ organization.update!(available_authorizations: %w(dummy_authorization_handler))
+ end
+
subject { described_class.new.with_context(election:, current_user: user) }
it { is_expected.to be_valid }
@@ -77,6 +81,9 @@ module Censuses
it "adds an error for the base" do
subject.validate
expect(subject.errors[:base]).to include(I18n.t("decidim.elections.censuses.internal_users_form.invalid"))
+ expect(subject.authorization_status).to be_a(Decidim::ActionAuthorizer::AuthorizationStatusCollection)
+ expect(subject.authorization_status).not_to be_ok
+ expect(subject.authorization_status.statuses.first.data).to eq({ :extra_explanation => [{ :key => "extra_explanation.postal_codes", :params => { :scope => "decidim.verifications.dummy_authorization", :count => 1, :postal_codes => "08002" } }] })
end
context "when the user does not match the options" do
diff --git a/decidim-elections/spec/models/decidim/elections/question_spec.rb b/decidim-elections/spec/models/decidim/elections/question_spec.rb
index 3f33d9493f9e4..fad27465bc732 100644
--- a/decidim-elections/spec/models/decidim/elections/question_spec.rb
+++ b/decidim-elections/spec/models/decidim/elections/question_spec.rb
@@ -155,6 +155,22 @@ module Elections
it "returns the count of response options" do
expect(subject.max_votable_options).to eq(2)
end
+
+ context "when max_choices is set" do
+ let(:question) { create(:election_question, :with_response_options, question_type: "multiple_option", max_choices: 1) }
+
+ it "returns the max_choices value" do
+ expect(subject.max_votable_options).to eq(1)
+ end
+ end
+
+ context "when max_choices is nil" do
+ let(:question) { create(:election_question, :with_response_options, question_type: "multiple_option", max_choices: nil) }
+
+ it "returns the count of response options" do
+ expect(subject.max_votable_options).to eq(2)
+ end
+ end
end
end
@@ -182,6 +198,15 @@ module Elections
expect(question.safe_responses(response_ids)).to be_empty
end
end
+
+ context "when max_choices is set" do
+ let(:question) { create(:election_question, :with_response_options, question_type: "multiple_option", max_choices: 1) }
+
+ it "returns only max_choices number of responses" do
+ response_ids = question.response_options.pluck(:id)
+ expect(question.safe_responses(response_ids).count).to eq(1)
+ end
+ end
end
describe "#sibling_questions" do
diff --git a/decidim-elections/spec/system/admin/admin_access_spec.rb b/decidim-elections/spec/system/admin/admin_access_spec.rb
new file mode 100644
index 0000000000000..ce6e0ca70a8a0
--- /dev/null
+++ b/decidim-elections/spec/system/admin/admin_access_spec.rb
@@ -0,0 +1,14 @@
+# frozen_string_literal: true
+
+require "spec_helper"
+
+require "decidim/admin/test/admin_participatory_space_component_access_examples"
+
+describe "AdminAccess" do
+ let(:manifest_name) { "elections" }
+ let!(:election) { create(:election, :with_token_csv_census, :published, component:) }
+ let(:title) { "Elections" }
+
+ include_context "when managing a component as an admin"
+ include_examples "accessing the component in a participatory space"
+end
diff --git a/decidim-elections/spec/system/admin/admin_manages_election_questions_spec.rb b/decidim-elections/spec/system/admin/admin_manages_election_questions_spec.rb
index 74495a43005ea..53e36e01b138a 100644
--- a/decidim-elections/spec/system/admin/admin_manages_election_questions_spec.rb
+++ b/decidim-elections/spec/system/admin/admin_manages_election_questions_spec.rb
@@ -225,6 +225,74 @@
end
end
+ context "when admin user sets max_choices for multiple_option question" do
+ it "creates a question with max_choices" do
+ visit questions_edit_path
+
+ click_on "Add question"
+ expand_all_questions
+
+ within "form.edit_questions" do
+ within page.all(".questionnaire-question").first do
+ fill_in find_nested_form_field_locator("body_en"), with: "Select up to 2 options"
+ select "Multiple option", from: "Type"
+
+ 3.times { click_on "Add response option" }
+
+ page.all(".questionnaire-question-response-option").each_with_index do |option, idx|
+ within option do
+ fill_in find_nested_form_field_locator("body_en"), with: "Option #{idx + 1}"
+ end
+ end
+
+ select "2", from: "Maximum number of choices"
+ end
+ end
+
+ click_on "Save and continue"
+
+ expect(page).to have_admin_callout("successfully")
+
+ visit questions_edit_path
+ expand_all_questions
+
+ expect(page).to have_css("input[value='Select up to 2 options']")
+ expect(election.questions.last.max_choices).to eq(2)
+ end
+
+ it "updates max_choices on existing question" do
+ question = create(:election_question, :with_response_options,
+ election:,
+ question_type: "multiple_option",
+ max_choices: nil)
+
+ visit questions_edit_path
+ find("#questionnaire_question_#{question.id}-button").click
+
+ within "#accordion-questionnaire_question_#{question.id}-field" do
+ select "2", from: "Maximum number of choices"
+ end
+
+ click_on "Save and continue"
+
+ expect(page).to have_admin_callout("successfully")
+ expect(question.reload.max_choices).to eq(2)
+ end
+
+ it "shows 'Any' option for max_choices when unset" do
+ question = create(:election_question, :with_response_options,
+ election:,
+ question_type: "multiple_option")
+
+ visit questions_edit_path
+ find("#questionnaire_question_#{question.id}-button").click
+
+ within "#accordion-questionnaire_question_#{question.id}-field" do
+ expect(page).to have_select("Maximum number of choices", selected: "Any")
+ end
+ end
+ end
+
private
def find_nested_form_field_locator(attribute, visible: :visible)
diff --git a/decidim-elections/spec/system/election_results_spec.rb b/decidim-elections/spec/system/election_results_spec.rb
index a5c9adb11fb4f..0653401acf4d2 100644
--- a/decidim-elections/spec/system/election_results_spec.rb
+++ b/decidim-elections/spec/system/election_results_spec.rb
@@ -4,7 +4,7 @@
require "decidim/elections/test/vote_examples"
describe "Dashboard" do
- let(:election) { create(:election, :published, :ongoing, :real_time, :with_internal_users_census, :with_questions) }
+ let(:election) { create(:election, :published, :ongoing, :real_time, :with_internal_users_census, :with_questions, skip_injection: true) }
let(:question1) { election.questions.first }
let(:question2) { election.questions.second }
let(:option11) { question1.response_options.first }
@@ -70,8 +70,8 @@ def expect_vote_count(question, option, count)
context "when the election is per question" do
let(:election) { create(:election, :published, :ongoing, :per_question, :with_internal_users_census) }
- let!(:question1) { create(:election_question, :with_response_options, :voting_enabled, election:) }
- let!(:question2) { create(:election_question, :with_response_options, election:) }
+ let!(:question1) { create(:election_question, :with_response_options, :voting_enabled, election:, skip_injection: true) }
+ let!(:question2) { create(:election_question, :with_response_options, election:, skip_injection: true) }
let(:option11) { question1.response_options.first }
let(:option12) { question1.response_options.second }
let(:option21) { question2.response_options.first }
@@ -84,7 +84,7 @@ def expect_vote_count(question, option, count)
end
context "when all questions are enabled" do
- let!(:question2) { create(:election_question, :with_response_options, :voting_enabled, election:) }
+ let!(:question2) { create(:election_question, :with_response_options, :voting_enabled, election:, skip_injection: true) }
it_behaves_like "shows questions in an election"
end
diff --git a/decidim-elections/spec/system/user_votes_in_an_election_spec.rb b/decidim-elections/spec/system/user_votes_in_an_election_spec.rb
index bed6fc96a6fb4..54ec42daacb07 100644
--- a/decidim-elections/spec/system/user_votes_in_an_election_spec.rb
+++ b/decidim-elections/spec/system/user_votes_in_an_election_spec.rb
@@ -6,8 +6,8 @@
describe "Dashboard" do
let(:user) { create(:user, :confirmed, organization:) }
let!(:election) { create(:election, :published, :ongoing, :with_internal_users_census, census_settings:) }
- let!(:question1) { create(:election_question, :with_response_options, election:, question_type: "single_option") }
- let!(:question2) { create(:election_question, :with_response_options, election:, question_type: "multiple_option") }
+ let!(:question1) { create(:election_question, :with_response_options, skip_injection: true, election:, question_type: "single_option") }
+ let!(:question2) { create(:election_question, :with_response_options, skip_injection: true, election:, question_type: "multiple_option") }
let(:organization) { election.organization }
let(:census_settings) do
{
@@ -30,6 +30,7 @@ def election_vote_path(question)
end
before do
+ organization.update!(available_authorizations: %w(dummy_authorization_handler))
switch_to_host(organization.host)
end
@@ -94,6 +95,10 @@ def election_vote_path(question)
let(:election) { create(:election, :published, :finished, :with_internal_users_census) }
it "does not allow to vote" do
+ within(".menu-bar") do
+ expect(page).to have_content(translated(election.component.name))
+ expect(page).to have_content(translated(election.title))
+ end
expect(page).to have_no_link("Vote")
expect(page).to have_no_content("You have already voted.")
visit new_election_vote_path
@@ -103,6 +108,62 @@ def election_vote_path(question)
end
end
+ context "when question has max_choices limit", :js do
+ let(:election_with_limit) { create(:election, :published, :ongoing, :with_internal_users_census, component: election.component) }
+ let!(:question_with_limit) { create(:election_question, election: election_with_limit, question_type: "multiple_option", max_choices: 2, body: { en: "Choose your options" }) }
+ let!(:option1) { create(:election_response_option, question: question_with_limit, body: { en: "Option 1" }) }
+ let!(:option2) { create(:election_response_option, question: question_with_limit, body: { en: "Option 2" }) }
+ let!(:option3) { create(:election_response_option, question: question_with_limit, body: { en: "Option 3" }) }
+ let(:new_election_with_limit_vote_path) { Decidim::EngineRouter.main_proxy(election.component).new_election_vote_path(election_id: election_with_limit.id) }
+
+ before do
+ login_as user, scope: :user
+ visit new_election_with_limit_vote_path
+ end
+
+ it "shows max_choices in question title" do
+ expect(page).to have_content("Choose your options (Max choices: 2)")
+ end
+
+ it "shows alert when selecting more than max_choices" do
+ check "Option 1"
+ check "Option 2"
+ check "Option 3"
+
+ expect(page).to have_css(".max-choices-alert", visible: :visible)
+ end
+
+ it "hides alert when deselecting options" do
+ check "Option 1"
+ check "Option 2"
+ check "Option 3"
+
+ expect(page).to have_css(".max-choices-alert", visible: :visible)
+
+ uncheck "Option 3"
+
+ expect(page).to have_css(".max-choices-alert", visible: :hidden)
+ end
+
+ it "shows server-side validation error when exceeding limit" do
+ check "Option 1"
+ check "Option 2"
+ check "Option 3"
+
+ click_on "Next"
+
+ expect(page).to have_content("You cannot select more than 2 options")
+ end
+
+ context "when question is single_option" do
+ let!(:single_question) { create(:election_question, election: election_with_limit, question_type: "single_option", body: { en: "Choose one option" }) }
+
+ it "does not show max_choices for single_option questions" do
+ expect(page).to have_no_content("Choose one option (Max choices:")
+ end
+ end
+ end
+
context "when the election is per_question" do
let(:election) { create(:election, :published, :ongoing, :with_internal_users_census, :per_question) }
diff --git a/decidim-elections/spec/system/user_votes_in_an_per_question_election_spec.rb b/decidim-elections/spec/system/user_votes_in_an_per_question_election_spec.rb
index 87f3717b88796..7be60f6e774b7 100644
--- a/decidim-elections/spec/system/user_votes_in_an_per_question_election_spec.rb
+++ b/decidim-elections/spec/system/user_votes_in_an_per_question_election_spec.rb
@@ -21,8 +21,8 @@
let(:receipt_election_votes_path) { Decidim::EngineRouter.main_proxy(election.component).receipt_election_per_question_votes_path(election_id: election.id) }
let(:confirm_election_votes_path) { Decidim::EngineRouter.main_proxy(election.component).confirm_election_per_question_votes_path(election_id: election.id) }
let(:new_election_normal_vote_path) { Decidim::EngineRouter.main_proxy(election.component).new_election_vote_path(election_id: election.id) }
- let!(:question1) { create(:election_question, :with_response_options, :voting_enabled, question_type: "single_option", election:, position: 1) }
- let!(:question2) { create(:election_question, :with_response_options, election:, position: 2) }
+ let!(:question1) { create(:election_question, :with_response_options, :voting_enabled, skip_injection: true, question_type: "single_option", election:, position: 1) }
+ let!(:question2) { create(:election_question, :with_response_options, election:, skip_injection: true, position: 2) }
let(:voter_uid) { user.to_global_id.to_s }
def election_vote_path(question)
@@ -62,8 +62,8 @@ def election_vote_path(question)
end
context "when navigating through already voted questions" do
- let!(:question2) { create(:election_question, :with_response_options, :voting_enabled, election:, position: 2) }
- let!(:question3) { create(:election_question, :with_response_options, election:, position: 3) }
+ let!(:question2) { create(:election_question, :with_response_options, :voting_enabled, election:, skip_injection: true, position: 2) }
+ let!(:question3) { create(:election_question, :with_response_options, election:, skip_injection: true, position: 3) }
before do
login_as user, scope: :user
diff --git a/decidim-forms/config/locales/eu.yml b/decidim-forms/config/locales/eu.yml
index ede0eb99271a5..3faf10583f609 100644
--- a/decidim-forms/config/locales/eu.yml
+++ b/decidim-forms/config/locales/eu.yml
@@ -139,7 +139,7 @@ eu:
remove: Kendu
separator: Bereizlea
title_and_description:
- collapse: Kolapsoa
+ collapse: Tolestu
description: Deskribapena
expand: Zabaldu
remove: Kendu
@@ -195,7 +195,7 @@ eu:
body: Galdetegi honen ezaugarri batzuk desaktibatu egingo dira. Zure esperientzia hobetzeko, gaitu JavaScript zure nabigatzailean.
title: Javascript desaktibatuta dago
questionnaire_not_published:
- body: Argitalpen hau oraindik ez da argitaratu.
+ body: Formulario hau ez da oraindik argitaratu.
questionnaire_responded:
body: Dagoeneko inkesta hau erantzun duzu.
title: Dagoeneko erantzunda
diff --git a/decidim-forms/decidim-forms.gemspec b/decidim-forms/decidim-forms.gemspec
index e0220203de50f..0ce9b4620b584 100644
--- a/decidim-forms/decidim-forms.gemspec
+++ b/decidim-forms/decidim-forms.gemspec
@@ -19,7 +19,7 @@ Gem::Specification.new do |s|
"homepage_uri" => "https://decidim.org",
"source_code_uri" => "https://github.com/decidim/decidim"
}
- s.required_ruby_version = "~> 3.3.0"
+ s.required_ruby_version = "~> 3.4.0"
s.name = "decidim-forms"
s.summary = "Decidim forms"
diff --git a/decidim-forms/lib/decidim/forms/test/factories.rb b/decidim-forms/lib/decidim/forms/test/factories.rb
index d831bc65dc4b7..1aef9e948a7bf 100644
--- a/decidim-forms/lib/decidim/forms/test/factories.rb
+++ b/decidim-forms/lib/decidim/forms/test/factories.rb
@@ -117,14 +117,18 @@
end
trait :with_response_options do
- response_options do
- Array.new(3).collect { build(:response_option, skip_injection:) }
+ after(:build) do |question, evaluator|
+ question.response_options = Array.new(3).collect do
+ build(:response_option, question:, skip_injection: evaluator.skip_injection)
+ end
end
end
trait :conditioned do
- display_conditions do
- Array.new(3).collect { build(:display_condition, skip_injection:) }
+ after(:build) do |question, evaluator|
+ question.display_conditions = Array.new(3).collect do
+ build(:display_condition, question:, skip_injection: evaluator.skip_injection)
+ end
end
end
@@ -194,7 +198,7 @@
transient do
skip_injection { false }
end
- condition_question { create(:questionnaire_question, skip_injection:) }
+ condition_question { create(:questionnaire_question, questionnaire: question.questionnaire, skip_injection:) }
question { create(:questionnaire_question, position: 1, skip_injection:) }
condition_type { :responded }
mandatory { true }
diff --git a/decidim-generators/Gemfile.lock b/decidim-generators/Gemfile.lock
index 85ca866494936..444107ddf8bd0 100644
--- a/decidim-generators/Gemfile.lock
+++ b/decidim-generators/Gemfile.lock
@@ -17,7 +17,6 @@ PATH
decidim-pages (= 0.32.0.dev)
decidim-participatory_processes (= 0.32.0.dev)
decidim-proposals (= 0.32.0.dev)
- decidim-sortitions (= 0.32.0.dev)
decidim-surveys (= 0.32.0.dev)
decidim-system (= 0.32.0.dev)
decidim-verifications (= 0.32.0.dev)
@@ -187,11 +186,6 @@ PATH
decidim-core (= 0.32.0.dev)
doc2text (~> 0.4.0, >= 0.4.8)
redcarpet (~> 3.5, >= 3.5.1)
- decidim-sortitions (0.32.0.dev)
- decidim-admin (= 0.32.0.dev)
- decidim-comments (= 0.32.0.dev)
- decidim-core (= 0.32.0.dev)
- decidim-proposals (= 0.32.0.dev)
decidim-surveys (0.32.0.dev)
decidim-core (= 0.32.0.dev)
decidim-forms (= 0.32.0.dev)
@@ -342,7 +336,7 @@ GEM
fast-stemmer (~> 1.0)
matrix (~> 0.4)
cmdparse (3.0.7)
- commonmarker (0.23.11)
+ commonmarker (0.23.12)
concurrent-ruby (1.3.5)
connection_pool (2.5.4)
crack (1.0.0)
@@ -934,7 +928,7 @@ DEPENDENCIES
web-console (~> 4.2)
RUBY VERSION
- ruby 3.3.4p94
+ ruby 3.4.7p58
BUNDLED WITH
2.4.20
diff --git a/decidim-generators/decidim-generators.gemspec b/decidim-generators/decidim-generators.gemspec
index 078ba9acc0dd0..bb97cc67019b2 100644
--- a/decidim-generators/decidim-generators.gemspec
+++ b/decidim-generators/decidim-generators.gemspec
@@ -18,7 +18,7 @@ Gem::Specification.new do |s|
"homepage_uri" => "https://decidim.org",
"source_code_uri" => "https://github.com/decidim/decidim"
}
- s.required_ruby_version = "~> 3.3.0"
+ s.required_ruby_version = "~> 3.4.0"
s.name = "decidim-generators"
diff --git a/decidim-generators/exe/decidim b/decidim-generators/exe/decidim
index 0e047a7add583..f778b9ce4e838 100755
--- a/decidim-generators/exe/decidim
+++ b/decidim-generators/exe/decidim
@@ -9,25 +9,25 @@ if File.exist?(File.expand_path("../../.git", __dir__))
end
case ARGV[0]
-when "--component"
+when "--component", "-c"
ARGV.replace(["component", *ARGV[1..-1]])
require "decidim/generators/component_generator"
Decidim::Generators::ComponentGenerator.start
-when "--version"
+when "--version", "-v"
require "decidim/core/version"
puts Decidim::Core.version
-when "--help"
+when "--help", "-h"
require "decidim/core/version"
puts "Decidim #{Decidim::Core.version}
Syntax: decidim [options] [App or Module name]
https://decidim.org
Options:
- --help display this help and exit
- --version output version information and exit
- --component [name] creates a component for Decidim
+ -h, --help display this help and exit
+ -v, --version output version information and exit
+ -c, --component [name] creates a component for Decidim
[name] creates an application based on Decidim
App generation extra options (ignored if the --component flag is on):
@@ -48,6 +48,10 @@ App generation extra options (ignored if the --component flag is on):
--seed_db [true|false] Seed the database: generate demo data for each participatory space and component
--recreate_db Recreate the database after installing Decidim
+Component generation extra options (ignored if the --component flag is not defined)
+ --external To create a new module external to the main decidim repository
+ --destination-folder IF you want to point to an existing folder or give it a custom name
+
Examples:
decidim my-application
decidim --storage=s3 my-application
@@ -55,6 +59,9 @@ Examples:
decidim --locales=en,ca,es,fr my-application
decidim --queue sidekiq my-application
decidim --queue sidekiq --storage s3 my-application
+
+ decidim --component --external my_component
+ decidim --component --external my_component --destination-folder my-comp
"
else
require "decidim/generators/app_generator"
diff --git a/decidim-generators/lib/decidim/generators/app_generator.rb b/decidim-generators/lib/decidim/generators/app_generator.rb
index 344f2329303cf..d9dcaaa69e581 100644
--- a/decidim-generators/lib/decidim/generators/app_generator.rb
+++ b/decidim-generators/lib/decidim/generators/app_generator.rb
@@ -323,8 +323,7 @@ def modify_gitignore
# Ignore the files and folders generated through Webpack
/public/decidim-packs
/public/packs-test
- /public/sw.js
- /public/sw.js.map
+ /public/sw.js*
# Ignore node modules
/node_modules
diff --git a/decidim-generators/lib/decidim/generators/app_templates/.ruby-version b/decidim-generators/lib/decidim/generators/app_templates/.ruby-version
index a0891f563f38b..2aa5131992119 100644
--- a/decidim-generators/lib/decidim/generators/app_templates/.ruby-version
+++ b/decidim-generators/lib/decidim/generators/app_templates/.ruby-version
@@ -1 +1 @@
-3.3.4
+3.4.7
diff --git a/decidim-generators/lib/decidim/generators/component_templates/.ruby-version b/decidim-generators/lib/decidim/generators/component_templates/.ruby-version
index a0891f563f38b..2aa5131992119 100644
--- a/decidim-generators/lib/decidim/generators/component_templates/.ruby-version
+++ b/decidim-generators/lib/decidim/generators/component_templates/.ruby-version
@@ -1 +1 @@
-3.3.4
+3.4.7
diff --git a/decidim-initiatives/app/controllers/concerns/decidim/initiatives/admin/filterable.rb b/decidim-initiatives/app/controllers/concerns/decidim/initiatives/admin/filterable.rb
index afe754f4f9f99..a79d068133eee 100644
--- a/decidim-initiatives/app/controllers/concerns/decidim/initiatives/admin/filterable.rb
+++ b/decidim-initiatives/app/controllers/concerns/decidim/initiatives/admin/filterable.rb
@@ -18,7 +18,7 @@ def base_query
end
def search_field_predicate
- :title_or_description_or_id_string_or_author_name_or_author_nickname_cont
+ :title_or_description_or_author_name_or_author_nickname_cont
end
def filters
diff --git a/decidim-initiatives/app/models/decidim/initiative.rb b/decidim-initiatives/app/models/decidim/initiative.rb
index 93bfcd3476409..df2118eb55a85 100644
--- a/decidim-initiatives/app/models/decidim/initiative.rb
+++ b/decidim-initiatives/app/models/decidim/initiative.rb
@@ -450,6 +450,10 @@ def user_allowed_to_comment?(user)
ActionAuthorizer.new(user, "comment", self, nil).authorize.ok?
end
+ def user_allowed_to_vote_comment?(user)
+ ActionAuthorizer.new(user, "vote_comment", self, nil).authorize.ok?
+ end
+
def shareable_url(share_token)
EngineRouter.main_proxy(self).initiative_url(self, share_token: share_token.token)
end
diff --git a/decidim-initiatives/app/views/decidim/initiatives/admin/initiatives/index.html.erb b/decidim-initiatives/app/views/decidim/initiatives/admin/initiatives/index.html.erb
index 19a54708fd59a..83c31bc92a853 100644
--- a/decidim-initiatives/app/views/decidim/initiatives/admin/initiatives/index.html.erb
+++ b/decidim-initiatives/app/views/decidim/initiatives/admin/initiatives/index.html.erb
@@ -19,7 +19,6 @@
">
<% if allowed_to? :edit, :initiative, initiative: initiative %>
<%= link_to translated_attribute(initiative.title),
diff --git a/decidim-initiatives/config/locales/ar.yml b/decidim-initiatives/config/locales/ar.yml
index d56a3199a3994..85925b7e0ad35 100644
--- a/decidim-initiatives/config/locales/ar.yml
+++ b/decidim-initiatives/config/locales/ar.yml
@@ -68,7 +68,6 @@ ar:
initiatives:
fields:
created_at: أنشئت في
- id: هوية شخصية
state: الحالة
supports_count: توقيعات
title: المبادرات
diff --git a/decidim-initiatives/config/locales/bg.yml b/decidim-initiatives/config/locales/bg.yml
index e1ed9cf8c1dbf..48c836ebc93f4 100644
--- a/decidim-initiatives/config/locales/bg.yml
+++ b/decidim-initiatives/config/locales/bg.yml
@@ -111,7 +111,6 @@ bg:
initiatives:
fields:
created_at: Създадено на
- id: ID
published_at: Публикувано на
state: Статус
supports_count: Подписи
diff --git a/decidim-initiatives/config/locales/ca-IT.yml b/decidim-initiatives/config/locales/ca-IT.yml
index 44ec84876aaeb..450b14f52f788 100644
--- a/decidim-initiatives/config/locales/ca-IT.yml
+++ b/decidim-initiatives/config/locales/ca-IT.yml
@@ -96,7 +96,7 @@ ca-IT:
type_id_eq:
label: Tipus
search_placeholder:
- title_or_description_or_id_string_or_author_name_or_author_nickname_cont: Cercar %{collection} per títol, descripció, ID o autoria
+ title_or_description_or_author_name_or_author_nickname_cont: Cercar %{collection} per títol, descripció, ID o autoria
initiatives_settings:
update:
error: S'ha produït un error en actualitzar la configuració de les iniciatives.
@@ -118,7 +118,6 @@ ca-IT:
initiatives:
fields:
created_at: Data de creació
- id: ID
published_at: Publicat el
state: Estat
supports_count: Signatures
@@ -687,6 +686,7 @@ ca-IT:
initiative:
actions:
comment: Comentar
+ vote_comment: Votar el comentari
initiatives_type:
actions:
create: Crear una iniciativa
diff --git a/decidim-initiatives/config/locales/ca.yml b/decidim-initiatives/config/locales/ca.yml
index cda6777ada941..7825a93223e6e 100644
--- a/decidim-initiatives/config/locales/ca.yml
+++ b/decidim-initiatives/config/locales/ca.yml
@@ -96,7 +96,7 @@ ca:
type_id_eq:
label: Tipus
search_placeholder:
- title_or_description_or_id_string_or_author_name_or_author_nickname_cont: Cercar %{collection} per títol, descripció, ID o autoria
+ title_or_description_or_author_name_or_author_nickname_cont: Cercar %{collection} per títol, descripció, ID o autoria
initiatives_settings:
update:
error: S'ha produït un error en actualitzar la configuració de les iniciatives.
@@ -118,7 +118,6 @@ ca:
initiatives:
fields:
created_at: Data de creació
- id: ID
published_at: Publicat el
state: Estat
supports_count: Signatures
@@ -687,6 +686,7 @@ ca:
initiative:
actions:
comment: Comentar
+ vote_comment: Votar el comentari
initiatives_type:
actions:
create: Crear una iniciativa
diff --git a/decidim-initiatives/config/locales/cs.yml b/decidim-initiatives/config/locales/cs.yml
index 73903772a73f2..b84342d94c7ed 100644
--- a/decidim-initiatives/config/locales/cs.yml
+++ b/decidim-initiatives/config/locales/cs.yml
@@ -122,7 +122,6 @@ cs:
initiatives:
fields:
created_at: Vytvořeno v
- id: ID
published_at: Publikováno v
state: Stav
supports_count: Podpisy
diff --git a/decidim-initiatives/config/locales/de.yml b/decidim-initiatives/config/locales/de.yml
index dd86a8a6c8bfd..8949af2e45cff 100644
--- a/decidim-initiatives/config/locales/de.yml
+++ b/decidim-initiatives/config/locales/de.yml
@@ -95,8 +95,6 @@ de:
validating: Technische Validierung
type_id_eq:
label: Typ
- search_placeholder:
- title_or_description_or_id_string_or_author_name_or_author_nickname_cont: Suche in %{collection} nach Titel, Beschreibung, ID oder Autoren
initiatives_settings:
update:
error: Beim Aktualisieren der Initiativeneinstellungen ist ein Fehler aufgetreten.
@@ -118,7 +116,6 @@ de:
initiatives:
fields:
created_at: Erstellt am
- id: ID
published_at: Veröffentlicht am
state: Status
supports_count: Unterschriften
diff --git a/decidim-initiatives/config/locales/el.yml b/decidim-initiatives/config/locales/el.yml
index 1e7434e586960..4c1c277aa2155 100644
--- a/decidim-initiatives/config/locales/el.yml
+++ b/decidim-initiatives/config/locales/el.yml
@@ -66,7 +66,6 @@ el:
initiatives:
fields:
created_at: Δημιουργήθηκε στις
- id: Αναγνωριστικό
published_at: Δημοσιεύτηκε στις
state: Κατάσταση
supports_count: Υπογραφές
diff --git a/decidim-initiatives/config/locales/en.yml b/decidim-initiatives/config/locales/en.yml
index 92827bf22f216..60adc39386bcf 100644
--- a/decidim-initiatives/config/locales/en.yml
+++ b/decidim-initiatives/config/locales/en.yml
@@ -97,7 +97,7 @@ en:
type_id_eq:
label: Type
search_placeholder:
- title_or_description_or_id_string_or_author_name_or_author_nickname_cont: Search %{collection} by title, description, ID or author name
+ title_or_description_or_author_name_or_author_nickname_cont: Search %{collection} by title, description, or author name
initiatives_settings:
update:
error: There was a problem updating the initiatives settings.
@@ -119,7 +119,6 @@ en:
initiatives:
fields:
created_at: Created at
- id: ID
published_at: Published at
state: Status
supports_count: Signatures
@@ -688,6 +687,7 @@ en:
initiative:
actions:
comment: Comment
+ vote_comment: Vote comment
initiatives_type:
actions:
create: Create an initiative
diff --git a/decidim-initiatives/config/locales/es-MX.yml b/decidim-initiatives/config/locales/es-MX.yml
index c6d2597552805..236ecf58b917a 100644
--- a/decidim-initiatives/config/locales/es-MX.yml
+++ b/decidim-initiatives/config/locales/es-MX.yml
@@ -96,7 +96,7 @@ es-MX:
type_id_eq:
label: Tipo
search_placeholder:
- title_or_description_or_id_string_or_author_name_or_author_nickname_cont: Buscar %{collection} por título, descripción, ID o autoría
+ title_or_description_or_author_name_or_author_nickname_cont: Buscar %{collection} por título, descripción, ID o autoría
initiatives_settings:
update:
error: Se produjo un problema al actualizar la configuración de las iniciativas.
@@ -118,7 +118,6 @@ es-MX:
initiatives:
fields:
created_at: Creado en
- id: CARNÉ DE IDENTIDAD
published_at: Publicada en
state: Estado
supports_count: Firmas
@@ -687,6 +686,7 @@ es-MX:
initiative:
actions:
comment: Comentar
+ vote_comment: Votar el comentario
initiatives_type:
actions:
create: Crear una iniciativa
diff --git a/decidim-initiatives/config/locales/es-PY.yml b/decidim-initiatives/config/locales/es-PY.yml
index 9b6f30f9d3e46..fc51b30d3dd40 100644
--- a/decidim-initiatives/config/locales/es-PY.yml
+++ b/decidim-initiatives/config/locales/es-PY.yml
@@ -96,7 +96,7 @@ es-PY:
type_id_eq:
label: Tipo
search_placeholder:
- title_or_description_or_id_string_or_author_name_or_author_nickname_cont: Buscar %{collection} por título, descripción, ID o autoría
+ title_or_description_or_author_name_or_author_nickname_cont: Buscar %{collection} por título, descripción, ID o autoría
initiatives_settings:
update:
error: Se produjo un problema al actualizar la configuración de las iniciativas.
@@ -118,7 +118,6 @@ es-PY:
initiatives:
fields:
created_at: Creado en
- id: CARNÉ DE IDENTIDAD
published_at: Publicada en
state: Estado
supports_count: Firmas
@@ -687,6 +686,7 @@ es-PY:
initiative:
actions:
comment: Comentar
+ vote_comment: Votar el comentario
initiatives_type:
actions:
create: Crear una iniciativa
diff --git a/decidim-initiatives/config/locales/es.yml b/decidim-initiatives/config/locales/es.yml
index 812a353df7273..95543251355d3 100644
--- a/decidim-initiatives/config/locales/es.yml
+++ b/decidim-initiatives/config/locales/es.yml
@@ -96,7 +96,7 @@ es:
type_id_eq:
label: Tipo
search_placeholder:
- title_or_description_or_id_string_or_author_name_or_author_nickname_cont: Buscar %{collection} por título, descripción, ID o autoría
+ title_or_description_or_author_name_or_author_nickname_cont: Buscar %{collection} por título, descripción, ID o autoría
initiatives_settings:
update:
error: Se produjo un problema al actualizar la configuración de las iniciativas.
@@ -118,7 +118,6 @@ es:
initiatives:
fields:
created_at: Creado en
- id: ID
published_at: Publicada el
state: Estado
supports_count: Firmas
@@ -687,6 +686,7 @@ es:
initiative:
actions:
comment: Comentar
+ vote_comment: Votar el comentario
initiatives_type:
actions:
create: Crear una iniciativa
diff --git a/decidim-initiatives/config/locales/eu.yml b/decidim-initiatives/config/locales/eu.yml
index 12346f4bb34dc..3bc1263ba7b8e 100644
--- a/decidim-initiatives/config/locales/eu.yml
+++ b/decidim-initiatives/config/locales/eu.yml
@@ -95,8 +95,6 @@ eu:
validating: Baliozkotze teknikoa
type_id_eq:
label: Mota
- search_placeholder:
- title_or_description_or_id_string_or_author_name_or_author_nickname_cont: Bilatu %{collection} izenburuaren, deskribapenaren, IDaren edo egiletzaren arabera
initiatives_settings:
update:
error: Arazo bat izan da ekimenen konfigurazioak eguneratzean.
@@ -118,7 +116,6 @@ eu:
initiatives:
fields:
created_at: Sortze-data
- id: ID
published_at: Argitaratze-data
state: Egoera
supports_count: Sinadurak
diff --git a/decidim-initiatives/config/locales/fi-plain.yml b/decidim-initiatives/config/locales/fi-plain.yml
index 794e55b6339eb..22ea49a2e9554 100644
--- a/decidim-initiatives/config/locales/fi-plain.yml
+++ b/decidim-initiatives/config/locales/fi-plain.yml
@@ -95,8 +95,6 @@ fi-pl:
validating: Teknisessä validoinnissa
type_id_eq:
label: Tyyppi
- search_placeholder:
- title_or_description_or_id_string_or_author_name_or_author_nickname_cont: Hae kohteesta %{collection} otsikon, kuvauksen, ID-numeron tai tekijän nimen perusteella
initiatives_settings:
update:
error: Aloitteiden asetusten päivittäminen epäonnistui.
@@ -118,7 +116,6 @@ fi-pl:
initiatives:
fields:
created_at: Luontiaika
- id: ID
published_at: Julkaisuaika
state: Maakunta/osavaltio
supports_count: Allekirjoituksia
diff --git a/decidim-initiatives/config/locales/fi.yml b/decidim-initiatives/config/locales/fi.yml
index 94569eb72433c..5d622d101e8a3 100644
--- a/decidim-initiatives/config/locales/fi.yml
+++ b/decidim-initiatives/config/locales/fi.yml
@@ -95,8 +95,6 @@ fi:
validating: Teknisessä validoinnissa
type_id_eq:
label: Tyyppi
- search_placeholder:
- title_or_description_or_id_string_or_author_name_or_author_nickname_cont: Hae kohteesta %{collection} otsikon, kuvauksen, ID-numeron tai tekijän nimen perusteella
initiatives_settings:
update:
error: Aloitteiden asetusten päivittäminen epäonnistui.
@@ -118,7 +116,6 @@ fi:
initiatives:
fields:
created_at: Luontiaika
- id: ID
published_at: Julkaisuaika
state: Tila
supports_count: Allekirjoitusta
diff --git a/decidim-initiatives/config/locales/fr-CA.yml b/decidim-initiatives/config/locales/fr-CA.yml
index 2334d76e6e1a6..71b433a759466 100644
--- a/decidim-initiatives/config/locales/fr-CA.yml
+++ b/decidim-initiatives/config/locales/fr-CA.yml
@@ -94,7 +94,7 @@ fr-CA:
type_id_eq:
label: Type d'initiative
search_placeholder:
- title_or_description_or_id_string_or_author_name_or_author_nickname_cont: Rechercher %{collection} par titre, description, ID ou nom de l'auteur
+ title_or_description_or_author_name_or_author_nickname_cont: Rechercher %{collection} par titre, description ou nom de l'auteur
initiatives_settings:
update:
success: Les paramètres des pétitions ont bien été mis à jour.
@@ -115,7 +115,6 @@ fr-CA:
initiatives:
fields:
created_at: Créé à
- id: ID
published_at: Publiée à
state: État
supports_count: Signatures
@@ -572,6 +571,7 @@ fr-CA:
initiative:
actions:
comment: Commenter
+ vote_comment: Vote sur le commentaire
initiatives_type:
actions:
title: Actions
diff --git a/decidim-initiatives/config/locales/fr.yml b/decidim-initiatives/config/locales/fr.yml
index 024f96cb54f51..0136ce82712a3 100644
--- a/decidim-initiatives/config/locales/fr.yml
+++ b/decidim-initiatives/config/locales/fr.yml
@@ -94,7 +94,7 @@ fr:
type_id_eq:
label: Type de pétition
search_placeholder:
- title_or_description_or_id_string_or_author_name_or_author_nickname_cont: Rechercher %{collection} par titre, description, ID ou nom de l'auteur
+ title_or_description_or_author_name_or_author_nickname_cont: Rechercher %{collection} par titre, description ou nom de l'auteur
initiatives_settings:
update:
success: Les paramètres des pétitions ont bien été mis à jour.
@@ -115,7 +115,6 @@ fr:
initiatives:
fields:
created_at: Créé à
- id: ID
published_at: Publiée à
state: État
supports_count: Signatures
@@ -572,6 +571,7 @@ fr:
initiative:
actions:
comment: Commenter
+ vote_comment: Vote sur le commentaire
initiatives_type:
actions:
title: Actions
diff --git a/decidim-initiatives/config/locales/ga-IE.yml b/decidim-initiatives/config/locales/ga-IE.yml
index 71cb86bd126b2..179674e5350cd 100644
--- a/decidim-initiatives/config/locales/ga-IE.yml
+++ b/decidim-initiatives/config/locales/ga-IE.yml
@@ -37,7 +37,6 @@ ga:
models:
initiatives:
fields:
- id: ID
state: Stádas
initiatives_type_scope:
fields:
diff --git a/decidim-initiatives/config/locales/gl.yml b/decidim-initiatives/config/locales/gl.yml
index 3db7e3af43b67..9d9bfe1f052bc 100644
--- a/decidim-initiatives/config/locales/gl.yml
+++ b/decidim-initiatives/config/locales/gl.yml
@@ -58,7 +58,6 @@ gl:
initiatives:
fields:
created_at: Creado en
- id: ID
state: Estado
supports_count: Sinaturas
title: Iniciativas
diff --git a/decidim-initiatives/config/locales/hu.yml b/decidim-initiatives/config/locales/hu.yml
index 4fb31cb31bbde..bf2cab5327663 100644
--- a/decidim-initiatives/config/locales/hu.yml
+++ b/decidim-initiatives/config/locales/hu.yml
@@ -102,7 +102,6 @@ hu:
initiatives:
fields:
created_at: 'Létrehozva:'
- id: ID
published_at: Publikálás ideje
state: Állapot
supports_count: Aláírások
diff --git a/decidim-initiatives/config/locales/id-ID.yml b/decidim-initiatives/config/locales/id-ID.yml
index 48ba6bf066a59..3f6ab86ecb35d 100644
--- a/decidim-initiatives/config/locales/id-ID.yml
+++ b/decidim-initiatives/config/locales/id-ID.yml
@@ -53,7 +53,6 @@ id:
initiatives:
fields:
created_at: Dibuat di
- id: ID
state: Negara
supports_count: Tanda tangan
title: Inisiatif
diff --git a/decidim-initiatives/config/locales/it.yml b/decidim-initiatives/config/locales/it.yml
index 282eaa3bfc8b7..7fee86bd4165d 100644
--- a/decidim-initiatives/config/locales/it.yml
+++ b/decidim-initiatives/config/locales/it.yml
@@ -88,7 +88,6 @@ it:
initiatives:
fields:
created_at: Creato il
- id: ID
published_at: Pubblicato il
state: Stato
supports_count: Firme
diff --git a/decidim-initiatives/config/locales/ja.yml b/decidim-initiatives/config/locales/ja.yml
index 8f34ea4a8521c..ec4b11ebd5fe9 100644
--- a/decidim-initiatives/config/locales/ja.yml
+++ b/decidim-initiatives/config/locales/ja.yml
@@ -92,8 +92,6 @@ ja:
validating: 技術的検証
type_id_eq:
label: タイプ
- search_placeholder:
- title_or_description_or_id_string_or_author_name_or_author_nickname_cont: '%{collection} をタイトル、説明、ID、著者名で検索'
initiatives_settings:
update:
error: イニシアチブ設定の更新中に問題が発生しました。
@@ -115,7 +113,6 @@ ja:
initiatives:
fields:
created_at: 作成日時
- id: ID
published_at: 公開日時
state: ステータス
supports_count: 署名
diff --git a/decidim-initiatives/config/locales/lb.yml b/decidim-initiatives/config/locales/lb.yml
index 6eb5b0b1eaf94..9220ab06b52ac 100644
--- a/decidim-initiatives/config/locales/lb.yml
+++ b/decidim-initiatives/config/locales/lb.yml
@@ -85,7 +85,6 @@ lb:
initiatives:
fields:
created_at: Erstellt am
- id: ID
published_at: Veröffentlicht am
state: Status
supports_count: Unterschriften
diff --git a/decidim-initiatives/config/locales/lt.yml b/decidim-initiatives/config/locales/lt.yml
index 73347a4409052..e510452887251 100644
--- a/decidim-initiatives/config/locales/lt.yml
+++ b/decidim-initiatives/config/locales/lt.yml
@@ -111,7 +111,6 @@ lt:
initiatives:
fields:
created_at: Sukurta
- id: ID
published_at: Publikuota
state: Būsena
supports_count: Parašai
diff --git a/decidim-initiatives/config/locales/nl.yml b/decidim-initiatives/config/locales/nl.yml
index 81466883883dc..cd6f6459ce634 100644
--- a/decidim-initiatives/config/locales/nl.yml
+++ b/decidim-initiatives/config/locales/nl.yml
@@ -69,7 +69,6 @@ nl:
initiatives:
fields:
created_at: Aangemaakt op
- id: ID kaart
published_at: Gepubliceerd op
state: Status
supports_count: Handtekeningen
diff --git a/decidim-initiatives/config/locales/no.yml b/decidim-initiatives/config/locales/no.yml
index 1bc89c9bcc240..3b795d018cc33 100644
--- a/decidim-initiatives/config/locales/no.yml
+++ b/decidim-initiatives/config/locales/no.yml
@@ -86,7 +86,6 @@
initiatives:
fields:
created_at: Opprettet på
- id: ID
published_at: Publisert i
state: Status
supports_count: Underskrifter
diff --git a/decidim-initiatives/config/locales/pl.yml b/decidim-initiatives/config/locales/pl.yml
index fe020ce12e2ca..ae790c50bef07 100644
--- a/decidim-initiatives/config/locales/pl.yml
+++ b/decidim-initiatives/config/locales/pl.yml
@@ -117,7 +117,6 @@ pl:
initiatives:
fields:
created_at: Utworzono
- id: ID
published_at: Opublikowano
state: Stan
supports_count: Podpisy
diff --git a/decidim-initiatives/config/locales/pt-BR.yml b/decidim-initiatives/config/locales/pt-BR.yml
index 18faf2c67f14f..5e01705bcb1a4 100644
--- a/decidim-initiatives/config/locales/pt-BR.yml
+++ b/decidim-initiatives/config/locales/pt-BR.yml
@@ -94,7 +94,6 @@ pt-BR:
initiatives:
fields:
created_at: Criado em
- id: identidade
published_at: Publicado em
state: Estado
supports_count: Assinaturas
diff --git a/decidim-initiatives/config/locales/pt.yml b/decidim-initiatives/config/locales/pt.yml
index 715590bdc0fe6..2ec4eb919075f 100644
--- a/decidim-initiatives/config/locales/pt.yml
+++ b/decidim-initiatives/config/locales/pt.yml
@@ -85,7 +85,6 @@ pt:
initiatives:
fields:
created_at: Criado em
- id: Identidade
published_at: Publicado em
state: Estado
supports_count: Assinaturas
diff --git a/decidim-initiatives/config/locales/ro-RO.yml b/decidim-initiatives/config/locales/ro-RO.yml
index 4204d5c137e2f..b1359215bf439 100644
--- a/decidim-initiatives/config/locales/ro-RO.yml
+++ b/decidim-initiatives/config/locales/ro-RO.yml
@@ -100,7 +100,6 @@ ro:
initiatives:
fields:
created_at: Creat la
- id: ID
published_at: Publicat la
state: Status
supports_count: Semnături
diff --git a/decidim-initiatives/config/locales/sk.yml b/decidim-initiatives/config/locales/sk.yml
index 5de6c91811186..c63ae655ec065 100644
--- a/decidim-initiatives/config/locales/sk.yml
+++ b/decidim-initiatives/config/locales/sk.yml
@@ -60,7 +60,6 @@ sk:
initiatives:
fields:
created_at: Vytvorené u
- id: ID
state: Štát
supports_count: Podpisy
title: Iniciatívy
diff --git a/decidim-initiatives/config/locales/sv.yml b/decidim-initiatives/config/locales/sv.yml
index 312bc7f0adb47..a7b8f1aa2eba6 100644
--- a/decidim-initiatives/config/locales/sv.yml
+++ b/decidim-initiatives/config/locales/sv.yml
@@ -93,8 +93,6 @@ sv:
validating: Teknisk validering
type_id_eq:
label: Typ
- search_placeholder:
- title_or_description_or_id_string_or_author_name_or_author_nickname_cont: Sök %{collection} med titel, beskrivning, ID eller författarnamn
initiatives_settings:
update:
error: Det gick inte att uppdatera inställningarna för initiativ.
@@ -116,7 +114,6 @@ sv:
initiatives:
fields:
created_at: Skapad
- id: ID
published_at: Publicerad
state: Status
supports_count: Underskrifter
diff --git a/decidim-initiatives/config/locales/tr-TR.yml b/decidim-initiatives/config/locales/tr-TR.yml
index 82d0df5b36d5f..2c8de984dc3da 100644
--- a/decidim-initiatives/config/locales/tr-TR.yml
+++ b/decidim-initiatives/config/locales/tr-TR.yml
@@ -83,7 +83,6 @@ tr:
initiatives:
fields:
created_at: Düzenlendi
- id: İD
published_at: Tarihinde yayınlandı
state: Belirtmek, bildirmek
supports_count: İmzalar
diff --git a/decidim-initiatives/config/locales/zh-CN.yml b/decidim-initiatives/config/locales/zh-CN.yml
index af8dc822f9398..0cad7d1a7bf1f 100644
--- a/decidim-initiatives/config/locales/zh-CN.yml
+++ b/decidim-initiatives/config/locales/zh-CN.yml
@@ -80,7 +80,6 @@ zh-CN:
initiatives:
fields:
created_at: 创建于
- id: ID
published_at: 发布于
state: 状态
supports_count: 签名
diff --git a/decidim-initiatives/config/locales/zh-TW.yml b/decidim-initiatives/config/locales/zh-TW.yml
index 3cf9a08793845..8421676f0b850 100644
--- a/decidim-initiatives/config/locales/zh-TW.yml
+++ b/decidim-initiatives/config/locales/zh-TW.yml
@@ -102,7 +102,6 @@ zh-TW:
initiatives:
fields:
created_at: 建立於
- id: ID
published_at: 發佈於
state: 狀態
supports_count: 簽名
diff --git a/decidim-initiatives/db/migrate/20251112114520_remove_legacy_images_from_initiatives_module.rb b/decidim-initiatives/db/migrate/20251112114520_remove_legacy_images_from_initiatives_module.rb
new file mode 100644
index 0000000000000..3484b1f1d0ff1
--- /dev/null
+++ b/decidim-initiatives/db/migrate/20251112114520_remove_legacy_images_from_initiatives_module.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class RemoveLegacyImagesFromInitiativesModule < ActiveRecord::Migration[7.2]
+ def change
+ remove_column :decidim_initiatives_types, :banner_image, :string
+ end
+end
diff --git a/decidim-initiatives/decidim-initiatives.gemspec b/decidim-initiatives/decidim-initiatives.gemspec
index b69cdc05bb6b9..de517f4cd23f5 100644
--- a/decidim-initiatives/decidim-initiatives.gemspec
+++ b/decidim-initiatives/decidim-initiatives.gemspec
@@ -17,7 +17,7 @@ Gem::Specification.new do |s|
"homepage_uri" => "https://decidim.org",
"source_code_uri" => "https://github.com/decidim/decidim"
}
- s.required_ruby_version = "~> 3.3.0"
+ s.required_ruby_version = "~> 3.4.0"
s.name = "decidim-initiatives"
s.summary = "Decidim initiatives module"
diff --git a/decidim-initiatives/lib/decidim/initiatives/participatory_space.rb b/decidim-initiatives/lib/decidim/initiatives/participatory_space.rb
index 487945432d998..c25dbaebc0f3d 100644
--- a/decidim-initiatives/lib/decidim/initiatives/participatory_space.rb
+++ b/decidim-initiatives/lib/decidim/initiatives/participatory_space.rb
@@ -23,7 +23,7 @@
participatory_space.breadcrumb_cell = "decidim/initiatives/initiative_dropdown_metadata"
participatory_space.register_resource(:initiative) do |resource|
- resource.actions = %w(comment)
+ resource.actions = %w(comment vote_comment)
resource.permissions_class_name = "Decidim::Initiatives::Permissions"
resource.model_class_name = "Decidim::Initiative"
resource.card = "decidim/initiatives/initiative"
@@ -57,8 +57,8 @@
]
participatory_space.exports :initiatives do |export|
- export.collection do
- Decidim::Initiative.public_spaces
+ export.collection do |participatory_space, _user|
+ Decidim::Initiative.public_spaces.where(id: participatory_space)
end
export.include_in_open_data = true
diff --git a/decidim-initiatives/spec/system/admin/admin_manages_initiatives_spec.rb b/decidim-initiatives/spec/system/admin/admin_manages_initiatives_spec.rb
index 28bc1d65f0a08..84c0eb88ab9f7 100644
--- a/decidim-initiatives/spec/system/admin/admin_manages_initiatives_spec.rb
+++ b/decidim-initiatives/spec/system/admin/admin_manages_initiatives_spec.rb
@@ -113,12 +113,6 @@ def initiative_without_area(area)
expect(page).to have_content(translated(open_initiative.title))
end
- it "can be searched by id" do
- search_by_text(open_initiative.id)
-
- expect(page).to have_content(translated(open_initiative.title))
- end
-
it "can be searched by author name" do
search_by_text(open_initiative.author.name)
diff --git a/decidim-initiatives/spec/system/authorized_comments_spec.rb b/decidim-initiatives/spec/system/authorized_comments_spec.rb
index ad819d87cd0b3..6b1f32c848902 100644
--- a/decidim-initiatives/spec/system/authorized_comments_spec.rb
+++ b/decidim-initiatives/spec/system/authorized_comments_spec.rb
@@ -40,19 +40,44 @@
end
end
- context "when the initiative has no restriction on commenting" do
+ shared_examples_for "allowed to vote a comment" do
+ it do
+ within "#comment_#{comments[0].id}" do
+ page.find(".js-comment__votes--up").click
+ end
+
+ expect(page).to have_css(".js-comment__votes--up", text: /1/)
+ end
+ end
+
+ shared_examples_for "not allowed to vote a comment" do
+ it "does not allow voting" do
+ within "#comment_#{comments[0].id}" do
+ expect(page).to have_css(".js-comment__votes--up", text: /0/)
+ page.find(".js-comment__votes--up").click
+ # The vote counter should not have changed
+ expect(page).to have_css(".js-comment__votes--up", text: /0/)
+ end
+ end
+ end
+
+ context "when the initiative has no restriction on commenting and voting comments" do
before do
visit resource_path
end
it_behaves_like "allowed to comment"
+ it_behaves_like "allowed to vote a comment"
end
- context "when the initiative has restrictions on commenting" do
+ context "when the initiative has restrictions on commenting and/or voting comments" do
let!(:resource_permission) { commentable.create_resource_permission(permissions:) }
let(:comment_permission) do
{ comment: authorization_handlers }
end
+ let(:vote_comment_permission) do
+ { vote_comment: authorization_handlers }
+ end
let(:authorization_handlers) do
{ authorization_handlers: { authorization_handler_name => { "options" => {} } } }
end
@@ -70,6 +95,19 @@
it_behaves_like "not allowed to comment"
end
+
+ describe "restricted vote_comment action" do
+ let(:permissions) { vote_comment_permission }
+
+ it_behaves_like "not allowed to vote a comment"
+ end
+
+ describe "restricted comment and vote_comment action" do
+ let(:permissions) { comment_permission.merge(vote_comment_permission) }
+
+ it_behaves_like "not allowed to comment"
+ it_behaves_like "not allowed to vote a comment"
+ end
end
context "and user is verified" do
@@ -80,6 +118,19 @@
it_behaves_like "allowed to comment"
end
+
+ describe "restricted vote_comment action" do
+ let(:permissions) { vote_comment_permission }
+
+ it_behaves_like "allowed to vote a comment"
+ end
+
+ describe "restricted comment and vote_comment action" do
+ let(:permissions) { comment_permission.merge(vote_comment_permission) }
+
+ it_behaves_like "allowed to comment"
+ it_behaves_like "allowed to vote a comment"
+ end
end
end
end
diff --git a/decidim-initiatives/spec/system/initiative_types_spec.rb b/decidim-initiatives/spec/system/initiative_types_spec.rb
index 0ecd93d52e2e1..bfcfc2e635925 100644
--- a/decidim-initiatives/spec/system/initiative_types_spec.rb
+++ b/decidim-initiatives/spec/system/initiative_types_spec.rb
@@ -8,21 +8,12 @@
let(:base_initiative) do
create(:initiative, organization:)
end
- let!(:menu_content_block) { create(:content_block, organization:, manifest_name: :global_menu, scope_name: :homepage) }
before do
switch_to_host(organization.host)
end
context "when initiative types and scopes have not been created" do
- it "does not show the menu link" do
- visit decidim.root_path
-
- within "#home__menu" do
- expect(page).to have_no_content("Initiatives")
- end
- end
-
it "does not let access to the initiatives" do
visit decidim_initiatives.initiatives_path
@@ -36,17 +27,6 @@
create(:initiative, organization:)
end
- it "shows the menu link" do
- type = create(:initiatives_type, organization:)
- create(:initiatives_type_scope, type:)
-
- visit decidim.root_path
-
- within "#home__menu" do
- expect(page).to have_content("Initiatives")
- end
- end
-
context "when there are some published initiatives" do
let!(:initiative) { base_initiative }
let!(:unpublished_initiative) do
@@ -75,13 +55,9 @@
it "the menu link is shown" do
visit decidim_initiatives.initiatives_path
- find_by_id("main-dropdown-summary").hover
- within ".menu-bar__dropdown-menu" do
+ within "#menu-bar" do
expect(page).to have_content("Initiatives")
- click_on "Initiatives"
end
-
- expect(page).to have_current_path(decidim_initiatives.initiatives_path)
end
end
diff --git a/decidim-initiatives/spec/system/initiatives_spec.rb b/decidim-initiatives/spec/system/initiatives_spec.rb
index faeb4857b299a..44d2df87efa0c 100644
--- a/decidim-initiatives/spec/system/initiatives_spec.rb
+++ b/decidim-initiatives/spec/system/initiatives_spec.rb
@@ -8,21 +8,12 @@
let(:base_initiative) do
create(:initiative, organization:)
end
- let!(:menu_content_block) { create(:content_block, organization:, manifest_name: :global_menu, scope_name: :homepage) }
before do
switch_to_host(organization.host)
end
context "when initiative types and scopes have not been created" do
- it "does not show the menu link" do
- visit decidim.root_path
-
- within "#home__menu" do
- expect(page).to have_no_content("Initiatives")
- end
- end
-
it "does not let access to the initiatives" do
visit decidim_initiatives.initiatives_path
@@ -36,17 +27,6 @@
create(:initiative, organization:)
end
- it "shows the menu link" do
- type = create(:initiatives_type, organization:)
- create(:initiatives_type_scope, type:)
-
- visit decidim.root_path
-
- within "#home__menu" do
- expect(page).to have_content("Initiatives")
- end
- end
-
context "when there are some published initiatives" do
let!(:initiative) { base_initiative }
let!(:unpublished_initiative) do
diff --git a/decidim-meetings/app/cells/decidim/meetings/meeting_cell.rb b/decidim-meetings/app/cells/decidim/meetings/meeting_cell.rb
index e9ae6a277f9b3..a6e47514c13cc 100644
--- a/decidim-meetings/app/cells/decidim/meetings/meeting_cell.rb
+++ b/decidim-meetings/app/cells/decidim/meetings/meeting_cell.rb
@@ -16,12 +16,7 @@ def show
private
def card_size
- case @options[:size]
- when :s
- "decidim/meetings/meeting_s"
- else
- "decidim/meetings/meeting_l"
- end
+ "decidim/meetings/meeting_l"
end
def resource_icon
diff --git a/decidim-meetings/app/cells/decidim/meetings/meeting_s_cell.rb b/decidim-meetings/app/cells/decidim/meetings/meeting_s_cell.rb
deleted file mode 100644
index cde9e16e665b8..0000000000000
--- a/decidim-meetings/app/cells/decidim/meetings/meeting_s_cell.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-# frozen_string_literal: true
-
-module Decidim
- module Meetings
- # This cell renders the Search (:s) meeting card
- # for a given instance of a Meeting
- class MeetingSCell < Decidim::CardSCell
- private
-
- def metadata_cell
- "decidim/meetings/meeting_card_metadata"
- end
- end
- end
-end
diff --git a/decidim-meetings/app/controllers/concerns/decidim/meetings/admin/filterable.rb b/decidim-meetings/app/controllers/concerns/decidim/meetings/admin/filterable.rb
index 3ee6589bdf8c5..b65690789a4f8 100644
--- a/decidim-meetings/app/controllers/concerns/decidim/meetings/admin/filterable.rb
+++ b/decidim-meetings/app/controllers/concerns/decidim/meetings/admin/filterable.rb
@@ -45,10 +45,6 @@ def filters_with_values
}
end
- def search_field_predicate
- :id_string_or_title_cont
- end
-
def meeting_types
Meeting::TYPE_OF_MEETING
end
diff --git a/decidim-meetings/app/controllers/decidim/meetings/meetings_controller.rb b/decidim-meetings/app/controllers/decidim/meetings/meetings_controller.rb
index f209131c97ffa..be43cad6c15e9 100644
--- a/decidim-meetings/app/controllers/decidim/meetings/meetings_controller.rb
+++ b/decidim-meetings/app/controllers/decidim/meetings/meetings_controller.rb
@@ -201,6 +201,16 @@ def previous_space
rescue NameError, LoadError
nil
end
+
+ def add_breadcrumb_item
+ return {} if meeting.blank?
+
+ {
+ label: translated_attribute(meeting.title),
+ url: Decidim::EngineRouter.main_proxy(current_component).meeting_path(meeting),
+ active: false
+ }
+ end
end
end
end
diff --git a/decidim-meetings/app/controllers/decidim/meetings/versions_controller.rb b/decidim-meetings/app/controllers/decidim/meetings/versions_controller.rb
index f43d416399fcf..d7d33bbc463a5 100644
--- a/decidim-meetings/app/controllers/decidim/meetings/versions_controller.rb
+++ b/decidim-meetings/app/controllers/decidim/meetings/versions_controller.rb
@@ -9,6 +9,16 @@ class VersionsController < Decidim::Meetings::ApplicationController
def versioned_resource
@versioned_resource ||= Meeting.not_hidden.where(component: current_component).find(params[:meeting_id])
end
+
+ def add_breadcrumb_item
+ return {} if versioned_resource.blank?
+
+ {
+ label: translated_attribute(versioned_resource.title),
+ url: Decidim::EngineRouter.main_proxy(current_component).meeting_path(versioned_resource),
+ active: false
+ }
+ end
end
end
end
diff --git a/decidim-meetings/app/views/decidim/meetings/admin/invites/index.html.erb b/decidim-meetings/app/views/decidim/meetings/admin/invites/index.html.erb
index 4bb2461857ba8..f1867fe1ba9a0 100644
--- a/decidim-meetings/app/views/decidim/meetings/admin/invites/index.html.erb
+++ b/decidim-meetings/app/views/decidim/meetings/admin/invites/index.html.erb
@@ -48,7 +48,7 @@
<% if invite.sent_at %>
- <%= l invite.sent_at, format: :long %>
+ <%= l invite.sent_at, format: :decidim_short %>
<% end %>
- <% end %>
-<% end %>
diff --git a/decidim-sortitions/bin/rails b/decidim-sortitions/bin/rails
deleted file mode 100755
index 7765ef4833ae0..0000000000000
--- a/decidim-sortitions/bin/rails
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/usr/bin/env ruby
-# frozen_string_literal: true
-
-# This command will automatically be run when you run "rails" with Rails gems
-# installed from the root of your application.
-
-ENGINE_ROOT = File.expand_path("..", __dir__)
-ENGINE_PATH = File.expand_path("../lib/decidim/sortitions/engine", __dir__)
-
-# Set up gems listed in the Gemfile.
-ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile", __dir__)
-require "bundler/setup"
-
-require "rails/all"
-require "rails/engine/commands"
diff --git a/decidim-sortitions/config/assets.rb b/decidim-sortitions/config/assets.rb
deleted file mode 100644
index d4a499e57edf8..0000000000000
--- a/decidim-sortitions/config/assets.rb
+++ /dev/null
@@ -1,8 +0,0 @@
-# frozen_string_literal: true
-
-base_path = File.expand_path("..", __dir__)
-
-Decidim::Shakapacker.register_path("#{base_path}/app/packs")
-Decidim::Shakapacker.register_entrypoints(
- decidim_sortitions: "#{base_path}/app/packs/entrypoints/decidim_sortitions.js"
-)
diff --git a/decidim-sortitions/config/locales/am-ET.yml b/decidim-sortitions/config/locales/am-ET.yml
deleted file mode 100644
index 9e7679c0df56d..0000000000000
--- a/decidim-sortitions/config/locales/am-ET.yml
+++ /dev/null
@@ -1 +0,0 @@
-am:
diff --git a/decidim-sortitions/config/locales/ar-SA.yml b/decidim-sortitions/config/locales/ar-SA.yml
deleted file mode 100644
index 0cba9b0ee4d25..0000000000000
--- a/decidim-sortitions/config/locales/ar-SA.yml
+++ /dev/null
@@ -1,175 +0,0 @@
-ar:
- activemodel:
- attributes:
- sortition:
- additional_info: معلومات التصنيف
- decidim_category_id: فئات مجموعة المقترحات التي تريد تطبيق السحب عليها
- decidim_proposals_component_id: مجموعة المقترحات
- dice: نتيجة يموت لفة. قم بلف قالب من 6 جوانب ، أو ابحث عن طريقة عشوائية أخرى لإنشاء رقم من 1 إلى 6 ، وأدخل هنا الرقم الناتج أمام بعض الشهود. هذا يساهم في جودة وضمانات عشوائية النتيجة
- target_items: عدد المقترحات التي سيتم اختيارها (يشير إلى عدد المقترحات التي تريد تحديدها عن طريق رسم الكثير من مجموعة المقترحات التي اخترتها سابقًا)
- title: عنوان
- witnesses: شهود عيان
- models:
- decidim/sortitions/create_sortition_event: Sortition
- activerecord:
- models:
- decidim/sortitions/sortition:
- zero: Sortitions
- one: Sortition
- two: Sortitions
- few: Sortitions
- many: Sortitions
- other: Sortitions
- decidim:
- components:
- sortitions:
- name: Sortitions
- settings:
- global:
- comments_enabled: تم تمكين التعليقات
- events:
- sortitions:
- sortition_created:
- email_intro: تمت إضافة التصنيف "%{resource_title}" إلى "%{participatory_space_title}" الذي تتابعه.
- email_outro: لقد تلقيت هذا الإشعار لأنك تتابع "%{participatory_space_title}". يمكنك إلغاء تتبعه من الرابط السابق.
- email_subject: تمت إضافة تصنيف جديد إلى %{participatory_space_title}
- notification_title: تمت إضافة التصنيف %{resource_title} إلى %{participatory_space_title}
- pages:
- home:
- statistics:
- sortitions_count: Sortitions
- participatory_processes:
- statistics:
- sortitions_count: Sortitions
- sortitions:
- admin:
- actions:
- destroy: إلغاء الفرز
- edit: تعديل
- new: فرز جديد
- show: تفاصيل الفرز
- models:
- sortition:
- fields:
- category: الفئة
- created_at: تاريخ الإنشاء
- decidim_proposals_component: مكون الاقتراحات
- dice: حجر النرد
- reference: مرجع
- request_timestamp: رسم الوقت
- seed: بذرة
- target_items: عناصر للاختيار
- title: عنوان
- name:
- zero: Sortitions
- one: Sortition
- two: Sortitions
- few: Sortitions
- many: Sortitions
- other: Sortitions
- sortitions:
- confirm_destroy:
- confirm_destroy: هل أنت متأكد أنك تريد إلغاء هذا التصنيف؟
- destroy: إلغاء التصنيف
- title: إلغاء التصنيف
- create:
- error: كانت هناك مشكلة في إنشاء فرز جديد.
- success: تم إنشاء التصنيف بنجاح
- destroy:
- error: لا يمكن إلغاء التصنيف.
- success: تم الغاء التصنيف بنجاح
- edit:
- title: تحديث المعلومات حول الفرز
- update: تحديث
- form:
- all_categories: جميع الفئات
- select_proposal_component: حدد مجموعة المقترحات
- title: ترتيب جديد للمقترحات
- index:
- title: Sortitions
- new:
- confirm: بالضغط على الزر التالي ، سوف يسجل Decidim التاريخ والوقت (بدقة من الثواني) وجنبا إلى جنب مع لفة النرد ، سيتم استخدام هذه المعلومات لإنشاء اختيار عشوائي. لن يكون الإجراء قابلاً للرجوع إليه ، بمجرد النقر فوق الزر سيتم نشر نتيجة هذا السحب مع البيانات التي تم إدخالها في هذا النموذج ولا يمكن تعديلها ، يرجى التحقق من المحتوى بعناية
- create: إنشاء
- title: فرز جديد
- show:
- selected_proposals: مقترحات مختارة للقرعة
- update:
- error: حدثت مشكلة أثناء تحديث التصنيف.
- success: تم تحديث التصنيف بنجاح
- admin_log:
- sortition:
- create: "%{user_name} خلق %{resource_name} التصنيف في %{space_name}"
- delete: "%{user_name} ألغى التصنيف %{resource_name} في %{space_name}"
- update: "%{user_name} تحديث %{resource_name} التصنيف في %{space_name}"
- sortitions:
- count:
- proposals_count:
- zero: "%{count} مقترحات"
- one: اقتراح واحد
- two: "%{count} مقترحات"
- few: "%{count} مقترحات"
- many: "%{count} مقترحات"
- other: "%{count} مقترحات"
- filters:
- active: نشيط
- all: الكل
- cancelled: ألغيت
- category: الفئة
- category_prompt: اختر تصنيف
- search: بحث
- state: الحالة
- filters_small_view:
- close_modal: إغلاق مشروط
- filter: منقي
- filter_by: مصنف بواسطة
- unfold: كشف
- linked_sortitions:
- selected_proposals: مقترحات مختارة
- orders:
- label: 'ترتيب الفرز حسب:'
- random: عشوائية
- recent: الأخيرة
- results_count:
- count:
- zero: مقترحات مختارة
- one: الاقتراح المحدد
- two: مقترحات مختارة
- few: مقترحات مختارة
- many: مقترحات مختارة
- other: مقترحات مختارة
- show:
- algorithm: رمز خوارزمية التصنيف
- any_category: من جميع الفئات
- cancelled: فرز الملغاة
- candidate_proposal_ids: ترتيب المقترحات الترتيب ومعرفات
- candidate_proposals_info: 'تم تنفيذ التصنيف بين المقترحات التالية (%{category_label}) ، مع المعرفات التالية (بالخط العريض للمقترحات المختارة) '
- category: من %{category} الفئة
- dice_result: "(1) نتيجة النرد"
- introduction: 'تحتوي هذه الصفحة على نتائج الفرز %{reference}. من خلال هذا sortition، %{target_items} تم اختيارها عشوائيا عدد من النتائج ومع التوزيع الاحتمالي على قدم المساواة من مجموعة من المقترحات المعروضة رفع الصوت عاليا. جنبًا إلى جنب مع النتائج ، توفر المعلومات المعروضة على هذه الصفحة جميع المعلومات المطلوبة لزيادة الضمانات وإعادة إنتاج النتائج. المفتاح لجودة هذا الفرز هو العشوائية المزدوجة التي يوفرها المتداول من الزهر (التحقق من قبل الشهود) والوقت الدقيق للترتيب الذي يوفر مدخلات لخوارزمية يولد اختيار عشوائي. إن البذر الزمني للفرز دقيق للغاية (بالثواني) بحيث يستحيل على البشر التحكم فيه ، مما يوفر مدخلات مزدوجة "لا يمكن السيطرة عليها" لضمان نتيجة عادلة. '
- mathematical_result: النتيجة (1) × (2)
- proposals_selected_by_sortition: مقترحات مختارة من قبل الفرز
- sortition_reproducibility_details: تفاصيل استنساخ الفرز
- time_seed: "(2) الوقت البذور"
- witnesses: شهود عيان
- sortition:
- random_seed: البذور عشوائي
- selected_proposals:
- zero: مقترحات مختارة
- one: تم اختيار الاقتراح
- two: مقترحات مختارة
- few: مقترحات مختارة
- many: مقترحات مختارة
- other: مقترحات مختارة
- view: رأي
- sortition_author:
- deleted: مشارك محذوف
- sortition_cancel_author:
- deleted: مشارك محذوف
- sortitions_count:
- count:
- zero: "%{count} التصنيف"
- one: 1 التصنيف
- two: "%{count} التصنيف"
- few: "%{count} التصنيف"
- many: "%{count} التصنيف"
- other: "%{count} التصنيف"
diff --git a/decidim-sortitions/config/locales/ar.yml b/decidim-sortitions/config/locales/ar.yml
deleted file mode 100644
index e74011ef36735..0000000000000
--- a/decidim-sortitions/config/locales/ar.yml
+++ /dev/null
@@ -1,139 +0,0 @@
-ar:
- activemodel:
- attributes:
- sortition:
- additional_info: معلومات التصنيف
- decidim_proposals_component_id: مجموعة المقترحات
- dice: نتيجة يموت لفة. قم بلف قالب من 6 جوانب ، أو ابحث عن طريقة عشوائية أخرى لإنشاء رقم من 1 إلى 6 ، وأدخل هنا الرقم الناتج أمام بعض الشهود. هذا يساهم في جودة وضمانات عشوائية النتيجة
- target_items: عدد المقترحات التي سيتم اختيارها (يشير إلى عدد المقترحات التي تريد تحديدها عن طريق رسم الكثير من مجموعة المقترحات التي اخترتها سابقًا)
- title: عنوان
- witnesses: شهود عيان
- models:
- decidim/sortitions/create_sortition_event: Sortition
- activerecord:
- models:
- decidim/sortitions/sortition:
- zero: Sortitions
- one: Sortition
- two: Sortitions
- few: Sortitions
- many: Sortitions
- other: Sortitions
- decidim:
- components:
- sortitions:
- name: Sortitions
- settings:
- global:
- comments_enabled: تم تمكين التعليقات
- events:
- sortitions:
- sortition_created:
- email_intro: تمت إضافة التصنيف "%{resource_title}" إلى "%{participatory_space_title}" الذي تتابعه.
- email_outro: لقد تلقيت هذا الإشعار لأنك تتابع "%{participatory_space_title}". يمكنك إلغاء تتبعه من الرابط السابق.
- email_subject: تمت إضافة تصنيف جديد إلى %{participatory_space_title}
- notification_title: تمت إضافة التصنيف %{resource_title} إلى %{participatory_space_title}
- sortitions:
- admin:
- actions:
- destroy: إلغاء الفرز
- edit: تعديل
- show: تفاصيل الفرز
- models:
- sortition:
- fields:
- created_at: تاريخ الإنشاء
- decidim_proposals_component: مكون الاقتراحات
- dice: حجر النرد
- reference: مرجع
- request_timestamp: رسم الوقت
- seed: بذرة
- target_items: عناصر للاختيار
- title: عنوان
- sortitions:
- confirm_destroy:
- confirm_destroy: هل أنت متأكد أنك تريد إلغاء هذا التصنيف؟
- destroy: إلغاء التصنيف
- title: إلغاء التصنيف
- create:
- error: كانت هناك مشكلة في إنشاء فرز جديد.
- edit:
- title: تحديث المعلومات حول الفرز
- update: تحديث
- form:
- select_proposal_component: حدد مجموعة المقترحات
- index:
- title: Sortitions
- new:
- create: إنشاء
- title: فرز جديد
- show:
- selected_proposals: مقترحات مختارة للقرعة
- update:
- error: حدثت مشكلة أثناء تحديث التصنيف.
- admin_log:
- sortition:
- create: "%{user_name} خلق %{resource_name} التصنيف في %{space_name}"
- delete: "%{user_name} ألغى التصنيف %{resource_name} في %{space_name}"
- update: "%{user_name} تحديث %{resource_name} التصنيف في %{space_name}"
- sortitions:
- count:
- proposals_count:
- zero: "%{count} مقترحات"
- one: اقتراح واحد
- two: "%{count} مقترحات"
- few: "%{count} مقترحات"
- many: "%{count} مقترحات"
- other: "%{count} مقترحات"
- filters:
- active: نشيط
- all: الكل
- cancelled: ألغيت
- category: الفئة
- state: الحالة
- linked_sortitions:
- selected_proposals: مقترحات مختارة
- orders:
- label: 'ترتيب الفرز حسب:'
- random: عشوائية
- recent: الأخيرة
- results_count:
- count:
- zero: مقترحات مختارة
- one: الاقتراح المحدد
- two: مقترحات مختارة
- few: مقترحات مختارة
- many: مقترحات مختارة
- other: مقترحات مختارة
- show:
- algorithm: رمز خوارزمية التصنيف
- cancelled: فرز الملغاة
- candidate_proposal_ids: ترتيب المقترحات الترتيب ومعرفات
- dice_result: (1) نتيجة النرد
- introduction: 'تحتوي هذه الصفحة على نتائج الفرز %{reference}. من خلال هذا sortition، %{target_items} تم اختيارها عشوائيا عدد من النتائج ومع التوزيع الاحتمالي على قدم المساواة من مجموعة من المقترحات المعروضة رفع الصوت عاليا. جنبًا إلى جنب مع النتائج ، توفر المعلومات المعروضة على هذه الصفحة جميع المعلومات المطلوبة لزيادة الضمانات وإعادة إنتاج النتائج. المفتاح لجودة هذا الفرز هو العشوائية المزدوجة التي يوفرها المتداول من الزهر (التحقق من قبل الشهود) والوقت الدقيق للترتيب الذي يوفر مدخلات لخوارزمية يولد اختيار عشوائي. إن البذر الزمني للفرز دقيق للغاية (بالثواني) بحيث يستحيل على البشر التحكم فيه ، مما يوفر مدخلات مزدوجة "لا يمكن السيطرة عليها" لضمان نتيجة عادلة. '
- mathematical_result: النتيجة (1) × (2)
- proposals_selected_by_sortition: مقترحات مختارة من قبل الفرز
- sortition_reproducibility_details: تفاصيل استنساخ الفرز
- time_seed: (2) الوقت البذور
- witnesses: شهود عيان
- sortition:
- random_seed: البذور عشوائي
- selected_proposals:
- zero: مقترحات مختارة
- one: تم اختيار الاقتراح
- two: مقترحات مختارة
- few: مقترحات مختارة
- many: مقترحات مختارة
- other: مقترحات مختارة
- sortition_author:
- deleted: مشارك محذوف
- sortition_cancel_author:
- deleted: مشارك محذوف
- sortitions_count:
- count:
- zero: "%{count} التصنيف"
- one: 1 التصنيف
- two: "%{count} التصنيف"
- few: "%{count} التصنيف"
- many: "%{count} التصنيف"
- other: "%{count} التصنيف"
diff --git a/decidim-sortitions/config/locales/bg-BG.yml b/decidim-sortitions/config/locales/bg-BG.yml
deleted file mode 100644
index d55e72dd1d977..0000000000000
--- a/decidim-sortitions/config/locales/bg-BG.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-bg:
- activemodel:
- attributes:
- sortition:
- additional_info: Сортиране на информация
- decidim_category_id: Категории от набора от предложения, в които искате да приложите жребий
- decidim_proposals_component_id: Предложенията са зададени
diff --git a/decidim-sortitions/config/locales/bg.yml b/decidim-sortitions/config/locales/bg.yml
deleted file mode 100644
index 487895ad302aa..0000000000000
--- a/decidim-sortitions/config/locales/bg.yml
+++ /dev/null
@@ -1,133 +0,0 @@
-bg:
- activemodel:
- attributes:
- sortition:
- additional_info: Информация за сортировката
- decidim_proposals_component_id: Предложенията са зададени
- dice: Резултат от хвърлянето на зара. Хвърлете 6-странен зар или потърсете друг произволен начин за генериране на число от 1 до 6 и въведете тук полученото число пред няколко свидетели. Това допринася за качеството и гаранции за случайността на резултата
- target_items: Брой на предложенията, които да бъдат избрани (указва броя на предложенията, които искате да бъдат избрани чрез хвърляне на жребий от групата предложения, които сте избрали по-рано)
- title: Заглавие
- witnesses: Свидетели
- models:
- decidim/sortitions/create_sortition_event: Сортиране
- activerecord:
- models:
- decidim/sortitions/sortition:
- one: Сортиране
- other: Сортирания
- decidim:
- components:
- sortitions:
- actions:
- comment: Коментар
- name: Сортирания
- settings:
- global:
- comments_enabled: Коментарите са разрешени
- comments_max_length: Максимална дължина на коментарите (Оставете 0 за стойност по подразбиране)
- events:
- sortitions:
- sortition_created:
- email_intro: Сортировката „%{resource_title}“ беше добавена към пространството за участие „%{participatory_space_title}“, което следвате.
- email_outro: Получавате това известие, защото следвате "%{participatory_space_title}". Може да премахнете следването чрез предходния линк.
- email_subject: Беше добавена нова сортировка в(ъв) %{participatory_space_title}
- notification_title: Сортировката %{resource_title} беше добавена в(ъв) %{participatory_space_title}
- sortitions:
- admin:
- actions:
- destroy: Отмяна на сортировката
- edit: Редактирай
- new_sortition: Нова сортировка
- show: Детайли за сортировката
- models:
- sortition:
- fields:
- created_at: Дата на създаване
- decidim_proposals_component: Компонент Предложения
- dice: Зар
- reference: Препоръка
- request_timestamp: Време за теглене на жребий
- seed: Seed
- target_items: Елементи за селектиране
- title: Заглавие
- sortitions:
- confirm_destroy:
- confirm_destroy: Наистина ли искате да отмените тази сортировка?
- destroy: Отмяна на сортировка
- title: Отменяне на сортировката
- create:
- error: Възникна проблем при създаването на нова сортировка.
- success: Сортировката беше създадена успешно.
- destroy:
- error: Сортировката не може бъде отменена.
- success: Сортировката беше отменена успешно.
- edit:
- title: Актуализирайте информацията за сортировката
- update: Актуализация
- form:
- select_proposal_component: Изберете набора от предложения
- index:
- title: Сортировки
- new:
- confirm: Когато натиснете бутона „Напред“, системата ще запише датата и часа (с точност до секунди) и заедно с хвърлянето на зара тази информация ще се използва за генериране на избор на случаен принцип. Действието няма да може да бъде отменено — когато щракнете върху бутона, резултатът от жребия ще бъде публикуван заедно с въведените в този формуляр данни и няма да подлежи на промяна. Моля, прегледайте съдържанието внимателно.
- create: Създаване
- title: Нова сортировка
- show:
- selected_proposals: Избрани предложения за жребия
- update:
- error: Възникна проблем при актуализирането на сортировката.
- success: Сортировката беше актуализирана успешно.
- admin_log:
- sortition:
- create: "%{user_name} създаде сортировка %{resource_name} в пространството %{space_name}"
- delete: "%{user_name} отмени сортировката %{resource_name} в пространството %{space_name}"
- update: "%{user_name} актуализира сортировката %{resource_name} в пространството %{space_name}"
- sortitions:
- count:
- proposals_count:
- one: 1 предложение
- other: "%{count} предложения"
- filters:
- active: Активно
- all: Всички
- cancelled: Отменено
- category: Категория
- state: Статус
- index:
- empty: Все още няма сортировки.
- linked_sortitions:
- selected_proposals: Избрани предложения
- orders:
- label: 'Подреждане на сортировките по:'
- random: Случаен
- recent: Скорошни
- results_count:
- count:
- one: Избрано предложение
- other: Избрани предложения
- show:
- algorithm: Код на алгоритъма за жребия в сортировката
- cancelled: Отменена сортировка
- candidate_proposal_ids: Ред и ID номерата на предложенията в сортировката
- dice_result: Резултат от жребия
- introduction: 'Тази страница съдържа резултатите от сортирането %{reference}. Чрез това сортиране, %{target_items} брой резултати са избрани на случаен принцип и с равно вероятностно разпределение от набора от предложения, показани по-долу. Заедно с резултатите, информацията, показана на тази страница, предоставя цялата информация, необходима за максимизиране на гаранциите и за възпроизвеждане на резултатите. Ключът към качеството на това сортиране е двойната случайност, осигурена от хвърлянето на зарове (потвърдено от свидетели) и точното време на сортирането, което осигурява вход за алгоритъм, който генерира случаен избор. Времето за начало за сортирането е толкова точно (секунди), че е невъзможно да се контролира от хора, като по този начин се осигурява двоен „неконтролируем“ вход, за да се гарантира справедлив резултат. '
- mathematical_result: Резулатат (Зарове х Разбъркване)
- proposals_selected_by_sortition: Избрани чрез (жребий) сортировка предложения
- sortition_reproducibility_details: Подробности за възпроизвеждане на сортировката
- time_seed: Време за разбъркване
- witnesses: Свидетели
- sortition:
- random_seed: Случаен подбор
- selected_proposals:
- one: избрано предложение
- other: избрани предложения
- sortition_author:
- deleted: Изтрит участник
- sortition_cancel_author:
- deleted: Изтрит участник
- sortitions_count:
- count:
- one: 1 сортировка
- other: "%{count} сортировки"
- statistics:
- sortitions_count: Сортировки
diff --git a/decidim-sortitions/config/locales/bn-BD.yml b/decidim-sortitions/config/locales/bn-BD.yml
deleted file mode 100644
index 152c698290639..0000000000000
--- a/decidim-sortitions/config/locales/bn-BD.yml
+++ /dev/null
@@ -1 +0,0 @@
-bn:
diff --git a/decidim-sortitions/config/locales/bs-BA.yml b/decidim-sortitions/config/locales/bs-BA.yml
deleted file mode 100644
index e9e174462a158..0000000000000
--- a/decidim-sortitions/config/locales/bs-BA.yml
+++ /dev/null
@@ -1 +0,0 @@
-bs:
diff --git a/decidim-sortitions/config/locales/ca-IT.yml b/decidim-sortitions/config/locales/ca-IT.yml
deleted file mode 100644
index e31f53512f582..0000000000000
--- a/decidim-sortitions/config/locales/ca-IT.yml
+++ /dev/null
@@ -1,147 +0,0 @@
-ca-IT:
- activemodel:
- attributes:
- sortition:
- additional_info: Informació del sorteig
- decidim_proposals_component_id: Propostes establertes
- dice: Resultat de la tirada de daus. Tira un dau de sis cares o busca alguna altra manera de generar un número de l'u al sis i introdueix-lo aquí davant d'algunes testimonies. Això contribueix en la qualitat i garantia de l'aletorietat del resultat
- target_items: Nombre de propostes a seleccionar (indica el nombre de propostes que vols seleccionar mitjançant el sorteig del grup de propostes que hàgiu triat prèviament)
- title: Títol
- witnesses: Testimonis
- models:
- decidim/sortitions/create_sortition_event: Sorteig
- activerecord:
- models:
- decidim/sortitions/sortition:
- one: Sorteig
- other: Sortejos
- decidim:
- components:
- sortitions:
- actions:
- comment: Comentar
- name: Sortejos
- settings:
- global:
- clear_all: Netejar-ho tot
- comments_enabled: Comentaris habilitats
- comments_max_length: Longitud màxima dels comentaris (deixa 0 si vols mantenir la configuració per defecte)
- define_taxonomy_filters: Si us plau, defineix algunes filtres per aquest espai de participació abans de fer servir aquesta configuració.
- no_taxonomy_filters_found: No s'han trobat filtres de taxonomia.
- taxonomy_filters: Seleccionar filtres pel component
- taxonomy_filters_add: Afegir un filtre
- events:
- sortitions:
- sortition_created:
- email_intro: El sorteig "%{resource_title}" s'ha afegit a "%{participatory_space_title}" que segueixes.
- email_outro: Has rebut aquesta notificació perquè estàs seguint l'espai "%{participatory_space_title}". Pots deixar de seguir-lo des de l'enllaç anterior.
- email_subject: Nou sorteig afegit a %{participatory_space_title}
- notification_title: El sorteig %{resource_title} s'ha afegit a %{participatory_space_title}
- sortitions:
- admin:
- actions:
- destroy: Cancel·la el sorteig
- edit: Edita
- new_sortition: Afegir sorteig
- show: Detalls del sorteig
- title: Accions
- deprecation_warning_html: "⚠️ Avís de Desús/Obsolescència. El mòdul de sorteigs s'eliminarà a Decidim v.0.32. Si us plau, planifiqueu en conseqüència i considereu solucions alternatives per a la selecció d'elements a l'atzar."
- models:
- sortition:
- fields:
- created_at: Data de creació
- decidim_proposals_component: Component de Propostes
- dice: Dau
- reference: Referència
- request_timestamp: Temps de dibuixar
- seed: Llavor
- target_items: Elements a seleccionar
- taxonomies: Taxonomies
- title: Títol
- sortitions:
- confirm_destroy:
- confirm_destroy: Segur que vols cancel·lar aquest sorteig?
- destroy: Cancel·lar el sorteig
- title: Cancel·lació del sorteig
- create:
- error: S'ha produït un error en crear un nou sorteig.
- success: El sorteig s'ha creat correctament.
- destroy:
- error: No es pot cancel·lar el sorteig.
- success: El sorteig s'ha cancel·lat correctament.
- edit:
- title: Actualitza la informació sobre el sorteig
- update: Actualitzar
- form:
- all_taxonomies: Totes les taxonomies
- select_proposal_component: Selecciona el grup de propostes
- select_taxonomies: Taxonomies del conjunt de propostes del qual vols aplicar per dibuixar. Deixar buit per aplicar a totes les propostes de la taxonomia.
- index:
- title: Sortejos
- new:
- confirm: Pressionant el següent botó, la plataforma registrarà la data i l'hora (amb precisió de segons) i, juntament amb la tirada de daus, aquesta informació s'utilitzarà per generar una selecció aleatòria. L'acció serà irreversible, una vegada que es faci clic al botó, es publicarà el resultat d'aquest sorteig, juntament amb les dades introduïdes en aquest formulari i que no es poden modificar. Si us plau, comprova el contingut acuradament.
- create: Crear
- title: Nou sorteig
- show:
- selected_proposals: Propostes seleccionades per al sorteig
- update:
- error: S'ha produït un error en actualitzar el sorteig.
- success: El sorteig s'ha actualitzat correctament.
- admin_log:
- sortition:
- create: "%{user_name} ha creat el sorteig %{resource_name} a %{space_name}"
- delete: "%{user_name} ha cancel·lat el sorteig %{resource_name} a %{space_name}"
- update: "%{user_name} ha actualitzat el sorteig %{resource_name} a %{space_name}"
- sortitions:
- count:
- proposals_count:
- one: 1 proposta
- other: "%{count} propostes"
- filters:
- active: Actius
- all: Tots
- cancelled: Cancel·lat
- category: Categoria
- state: Estat
- index:
- empty: Encara no hi ha cap sorteig.
- linked_sortitions:
- selected_proposals: Propostes seleccionades
- orders:
- label: 'Ordena els sortejos per:'
- random: Aleatori
- recent: Recent
- results_count:
- count:
- one: proposta seleccionada
- other: propostes seleccionades
- show:
- algorithm: Codi d'algoritme del sorteig
- any_taxonomy: de totes les taxonomies
- cancelled: Sorteig cancel·lat
- candidate_proposal_ids: Ordre i IDs de les propostes del sorteig
- candidate_proposals_info: 'La resolució es va dur a terme entre les següents propostes (%{taxonomy_labels}), amb les següents IDs (en negreta, les propostes seleccionades) '
- dice_result: (1) Resultat de la tirada de daus
- introduction: 'Aquesta pàgina conté els resultats del sorteig %{reference}. Mitjançant aquest sorteig, %{target_items} nombre de resultats han estat seleccionats aleatòriament i amb una distribució de probabilitat igual al conjunt de propostes que es mostra a continuació. Juntament amb els resultats, la informació que es mostra en aquesta pàgina proporciona tota la informació necessària per maximitzar les garanties i reproduir els resultats. La clau per a la qualitat d''aquest sorteig és l''aleatorietat doble proporcionada per una tirada d''un dau (verificat pels testimonis) i el temps precís de l''assentament que proporciona entrada per a un algorisme que genera una selecció aleatòria. El llindar de temps per a l''assaig és tan precís (segons) que és impossible de controlar pels humans, oferint així una doble entrada "incontrolable" per garantir un resultat just. '
- mathematical_result: Resultat (1) x (2)
- proposals_selected_by_sortition: Propostes seleccionades pel sorteig
- sortition_reproducibility_details: Detalls de la reproductibilitat del sorteig
- taxonomies: de les taxonomies %{taxonomies}
- time_seed: (2) Llavor de temps
- witnesses: Testimonis
- sortition:
- random_seed: Llavor aleatòria
- selected_proposals:
- one: proposta seleccionada
- other: propostes seleccionades
- sortition_author:
- deleted: Participant eliminada
- sortition_cancel_author:
- deleted: Participant eliminada
- sortitions_count:
- count:
- one: 1 sorteig
- other: "%{count} classificacions"
- statistics:
- sortitions_count: Sortejos
- sortitions_count_tooltip: El nombre de seleccions aleatòries realitzades per a la presa de decisions.
diff --git a/decidim-sortitions/config/locales/ca.yml b/decidim-sortitions/config/locales/ca.yml
deleted file mode 100644
index 55e8ba5d8c9bd..0000000000000
--- a/decidim-sortitions/config/locales/ca.yml
+++ /dev/null
@@ -1,147 +0,0 @@
-ca:
- activemodel:
- attributes:
- sortition:
- additional_info: Informació del sorteig
- decidim_proposals_component_id: Propostes establertes
- dice: Resultat de la tirada de daus. Tira un dau de sis cares o busca alguna altra manera de generar un número de l'u al sis i introdueix-lo aquí davant d'algunes testimonies. Això contribueix en la qualitat i garantia de l'aletorietat del resultat
- target_items: Nombre de propostes a seleccionar (indica el nombre de propostes que vols seleccionar mitjançant el sorteig del grup de propostes que hàgiu triat prèviament)
- title: Títol
- witnesses: Testimonis
- models:
- decidim/sortitions/create_sortition_event: Sorteig
- activerecord:
- models:
- decidim/sortitions/sortition:
- one: Sorteig
- other: Sortejos
- decidim:
- components:
- sortitions:
- actions:
- comment: Comentar
- name: Sortejos
- settings:
- global:
- clear_all: Netejar-ho tot
- comments_enabled: Comentaris habilitats
- comments_max_length: Longitud màxima dels comentaris (deixa 0 si vols mantenir la configuració per defecte)
- define_taxonomy_filters: Si us plau, defineix algunes filtres per aquest espai de participació abans de fer servir aquesta configuració.
- no_taxonomy_filters_found: No s'han trobat filtres de taxonomia.
- taxonomy_filters: Seleccionar filtres pel component
- taxonomy_filters_add: Afegir un filtre
- events:
- sortitions:
- sortition_created:
- email_intro: El sorteig "%{resource_title}" s'ha afegit a "%{participatory_space_title}" que segueixes.
- email_outro: Has rebut aquesta notificació perquè estàs seguint l'espai "%{participatory_space_title}". Pots deixar de seguir-lo des de l'enllaç anterior.
- email_subject: Nou sorteig afegit a %{participatory_space_title}
- notification_title: El sorteig %{resource_title} s'ha afegit a %{participatory_space_title}
- sortitions:
- admin:
- actions:
- destroy: Cancel·la el sorteig
- edit: Edita
- new_sortition: Afegir sorteig
- show: Detalls del sorteig
- title: Accions
- deprecation_warning_html: "⚠️ Avís de Desús/Obsolescència. El mòdul de sorteigs s'eliminarà a Decidim v.0.32. Si us plau, planifiqueu en conseqüència i considereu solucions alternatives per a la selecció d'elements a l'atzar."
- models:
- sortition:
- fields:
- created_at: Data de creació
- decidim_proposals_component: Component de Propostes
- dice: Dau
- reference: Referència
- request_timestamp: Temps de dibuixar
- seed: Llavor
- target_items: Elements a seleccionar
- taxonomies: Taxonomies
- title: Títol
- sortitions:
- confirm_destroy:
- confirm_destroy: Segur que vols cancel·lar aquest sorteig?
- destroy: Cancel·lar el sorteig
- title: Cancel·lació del sorteig
- create:
- error: S'ha produït un error en crear un nou sorteig.
- success: El sorteig s'ha creat correctament.
- destroy:
- error: No es pot cancel·lar el sorteig.
- success: El sorteig s'ha cancel·lat correctament.
- edit:
- title: Actualitza la informació sobre el sorteig
- update: Actualitzar
- form:
- all_taxonomies: Totes les taxonomies
- select_proposal_component: Selecciona el grup de propostes
- select_taxonomies: Taxonomies del conjunt de propostes del qual vols aplicar per dibuixar. Deixar buit per aplicar a totes les propostes de la taxonomia.
- index:
- title: Sortejos
- new:
- confirm: Pressionant el següent botó, la plataforma registrarà la data i l'hora (amb precisió de segons) i, juntament amb la tirada de daus, aquesta informació s'utilitzarà per generar una selecció aleatòria. L'acció serà irreversible, una vegada que es faci clic al botó, es publicarà el resultat d'aquest sorteig, juntament amb les dades introduïdes en aquest formulari i que no es poden modificar. Si us plau, comprova el contingut acuradament.
- create: Crear
- title: Nou sorteig
- show:
- selected_proposals: Propostes seleccionades per al sorteig
- update:
- error: S'ha produït un error en actualitzar el sorteig.
- success: El sorteig s'ha actualitzat correctament.
- admin_log:
- sortition:
- create: "%{user_name} ha creat el sorteig %{resource_name} a %{space_name}"
- delete: "%{user_name} ha cancel·lat el sorteig %{resource_name} a %{space_name}"
- update: "%{user_name} ha actualitzat el sorteig %{resource_name} a %{space_name}"
- sortitions:
- count:
- proposals_count:
- one: 1 proposta
- other: "%{count} propostes"
- filters:
- active: Actius
- all: Tots
- cancelled: Cancel·lat
- category: Categoria
- state: Estat
- index:
- empty: Encara no hi ha cap sorteig.
- linked_sortitions:
- selected_proposals: Propostes seleccionades
- orders:
- label: 'Ordena els sortejos per:'
- random: Aleatori
- recent: Recent
- results_count:
- count:
- one: proposta seleccionada
- other: propostes seleccionades
- show:
- algorithm: Codi d'algoritme del sorteig
- any_taxonomy: de totes les taxonomies
- cancelled: Sorteig cancel·lat
- candidate_proposal_ids: Ordre i IDs de les propostes del sorteig
- candidate_proposals_info: 'La resolució es va dur a terme entre les següents propostes (%{taxonomy_labels}), amb les següents IDs (en negreta, les propostes seleccionades) '
- dice_result: (1) Resultat de la tirada de daus
- introduction: 'Aquesta pàgina conté els resultats del sorteig %{reference}. Mitjançant aquest sorteig, %{target_items} nombre de resultats han estat seleccionats aleatòriament i amb una distribució de probabilitat igual al conjunt de propostes que es mostra a continuació. Juntament amb els resultats, la informació que es mostra en aquesta pàgina proporciona tota la informació necessària per maximitzar les garanties i reproduir els resultats. La clau per a la qualitat d''aquest sorteig és l''aleatorietat doble proporcionada per una tirada d''un dau (verificat pels testimonis) i el temps precís de l''assentament que proporciona entrada per a un algorisme que genera una selecció aleatòria. El llindar de temps per a l''assaig és tan precís (segons) que és impossible de controlar pels humans, oferint així una doble entrada "incontrolable" per garantir un resultat just. '
- mathematical_result: Resultat (1) x (2)
- proposals_selected_by_sortition: Propostes seleccionades pel sorteig
- sortition_reproducibility_details: Detalls de la reproductibilitat del sorteig
- taxonomies: de les taxonomies %{taxonomies}
- time_seed: (2) Llavor de temps
- witnesses: Testimonis
- sortition:
- random_seed: Llavor aleatòria
- selected_proposals:
- one: proposta seleccionada
- other: propostes seleccionades
- sortition_author:
- deleted: Participant eliminada
- sortition_cancel_author:
- deleted: Participant eliminada
- sortitions_count:
- count:
- one: 1 sorteig
- other: "%{count} classificacions"
- statistics:
- sortitions_count: Sortejos
- sortitions_count_tooltip: El nombre de seleccions aleatòries realitzades per a la presa de decisions.
diff --git a/decidim-sortitions/config/locales/cs-CZ.yml b/decidim-sortitions/config/locales/cs-CZ.yml
deleted file mode 100644
index 0954df19f0593..0000000000000
--- a/decidim-sortitions/config/locales/cs-CZ.yml
+++ /dev/null
@@ -1,163 +0,0 @@
-cs:
- activemodel:
- attributes:
- sortition:
- additional_info: Informace o sortimentu
- decidim_category_id: Kategorie sady návrhů, ve kterých chcete použít remízu
- decidim_proposals_component_id: Návrhy jsou nastaveny
- dice: Výsledek válce. Otočte šestistrannou zápustku nebo vyhledejte jiný náhodný způsob, jak vygenerovat číslo od 1 do 6, a zadejte zde výsledné číslo před některými svědky. To přispívá ke kvalitě a zárukám náhodnosti výsledku
- target_items: Počet návrhů, které mají být vybrány (udává počet návrhů, které chcete vybrat, čerpáním ze skupiny návrhů, které jste předtím vybrali)
- title: Titul
- witnesses: Svědkové
- models:
- decidim/sortitions/create_sortition_event: Sortiment
- activerecord:
- models:
- decidim/sortitions/sortition:
- one: Sortiment
- few: Sortitions
- many: Sortitions
- other: Sortitions
- decidim:
- components:
- sortitions:
- name: Sortitions
- settings:
- global:
- comments_enabled: Komentáře povoleny
- events:
- sortitions:
- sortition_created:
- email_intro: Řádek "%{resource_title}" byl přidán k "%{participatory_space_title}", který sledujete.
- email_outro: Toto oznámení jste obdrželi, protože jste sledovali "%{participatory_space_title}". Můžete jej odhlásit od předchozího odkazu.
- email_subject: Nová sortie byla přidána k číslu %{participatory_space_title}
- notification_title: Výsledek %{resource_title} byl přidán k %{participatory_space_title}
- pages:
- home:
- statistics:
- sortitions_count: Sortitions
- participatory_processes:
- statistics:
- sortitions_count: Sortitions
- sortitions:
- admin:
- actions:
- destroy: Zrušit výběr
- edit: Upravit
- new: Nové rozvržení
- show: Podrobnosti o sortimentu
- models:
- sortition:
- fields:
- category: Kategorie
- created_at: Datum vzniku
- decidim_proposals_component: Součást návrhů
- dice: Kostky
- reference: Odkaz
- request_timestamp: Doba kreslení
- seed: Semínko
- target_items: Položky, které chcete vybrat
- title: Titul
- name:
- one: Sortiment
- few: Sortitions
- many: Sortitions
- other: Sortitions
- sortitions:
- confirm_destroy:
- confirm_destroy: Opravdu chcete tuto nabídku zrušit?
- destroy: Zrušit výběr
- title: Zrušení výběrového řízení
- create:
- error: Při vytváření nového rozvržení došlo k chybě.
- success: Sorta byla úspěšně vytvořena
- destroy:
- error: Výběr nelze zrušit.
- success: Sorta byla úspěšně zrušena
- edit:
- title: Aktualizujte informace o sortimentu
- update: Aktualizace
- form:
- all_categories: Všechny kategorie
- select_proposal_component: Vyberte návrhy
- title: Nové návrhy na návrhy
- index:
- title: Sortitions
- new:
- confirm: Stisknutím dalšího tlačítka Decidim zaznamenáte datum a čas (s přesností na sekundy) a společně s kolečkem o kostkách budou tyto informace použity pro generování náhodného výběru. Akce bude nevratná, po kliknutí na tlačítko se výsledky této kresby zveřejní společně s údaji uvedenými v tomto formuláři a nelze je změnit, zkontrolujte prosím pozorně obsah
- create: Vytvořit
- title: Nové rozvržení
- show:
- selected_proposals: Návrhy vybrané pro kreslení
- update:
- error: Při aktualizaci výběru došlo k chybě.
- success: Sortifikace byla úspěšně aktualizována
- admin_log:
- sortition:
- create: "%{user_name} vytvořil %{resource_name} sortit v %{space_name}"
- delete: "%{user_name} zrušil %{resource_name} sortit v %{space_name}"
- update: "%{user_name} aktualizoval %{resource_name} sorotu v %{space_name}"
- sortitions:
- count:
- proposals_count:
- one: 1
- few: "%{count} návrhů"
- many: "%{count} návrhů"
- other: "%{count} návrhů"
- filters:
- active: Aktivní
- all: Všechno
- cancelled: Zrušeno
- category: Kategorie
- category_prompt: Vyberte kategorii
- search: Vyhledávání
- state: Stát
- filters_small_view:
- close_modal: Zavřít modální
- filter: Filtr
- filter_by: Filtrovat podle
- unfold: Rozvinout
- linked_sortitions:
- selected_proposals: Vybrané návrhy
- orders:
- label: 'Objednat sortitions podle:'
- random: Náhodný
- recent: Nedávno
- results_count:
- count:
- one: vybraný návrh
- few: vybrané návrhy
- many: vybrané návrhy
- other: vybrané návrhy
- show:
- algorithm: Kód algoritmu Sortition
- any_category: ze všech kategorií
- cancelled: Zrušený výběr
- candidate_proposal_ids: Sortimentní objednávky a ID
- candidate_proposals_info: 'Rozbor byl proveden mezi následujícími návrhy (%{category_label}), s následujícími ID (označené tučně vybranými návrhy) '
- category: z kategorie %{category}
- dice_result: "(1) Výsledek kostky"
- introduction: 'Tato stránka obsahuje výsledky výběru %{reference}. Prostřednictvím tohoto výběru bylo vybráno %{target_items} počet výsledků náhodně a se stejným rozdělením pravděpodobnosti ze souboru návrhů zobrazených níže. Spolu s výsledky informace zobrazené na této stránce poskytují všechny informace potřebné pro maximalizaci záruk a reprodukci výsledků. Klíčem k kvalitě tohoto rozvratu je dvojitá náhodnost, kterou poskytuje vázání kostky (ověřené svědky) a přesný čas výběru, který poskytuje vstup pro algoritmus, který generuje náhodný výběr. Časové osivo pro sortiment je tak přesné (sekundy), že není možné ovládat lidi, a tak poskytnout dvojitý "nekontrolovatelný" vstup, který zaručí spravedlivý výsledek. '
- mathematical_result: Výsledek (1) x (2)
- proposals_selected_by_sortition: Návrhy vybrané výběrem
- sortition_reproducibility_details: Sortifikace reprodukovatelnosti
- time_seed: "(2) Časové osivo"
- witnesses: Svědkové
- sortition:
- random_seed: Náhodné osivo
- selected_proposals:
- one: vybraný návrh
- few: vybraných návrhů
- many: vybraných návrhů
- other: vybraných návrhů
- view: Pohled
- sortition_author:
- deleted: Vymazaný uživatel
- sortition_cancel_author:
- deleted: Vymazaný uživatel
- sortitions_count:
- count:
- one: 1 sortie
- few: "%{count} sortitions"
- many: "%{count} sortitions"
- other: "%{count} sortitions"
diff --git a/decidim-sortitions/config/locales/cs.yml b/decidim-sortitions/config/locales/cs.yml
deleted file mode 100644
index ec5ea35c0348b..0000000000000
--- a/decidim-sortitions/config/locales/cs.yml
+++ /dev/null
@@ -1,155 +0,0 @@
-cs:
- activemodel:
- attributes:
- sortition:
- additional_info: Informace o volbě losem
- decidim_proposals_component_id: Návrhy jsou nastaveny
- dice: Výsledek hodu kostkou. Hoďte šestistrannou kostkou nebo najděte jiný náhodný způsob, jak získat číslo od 1 do 6, a výsledné číslo sem před svědky vložte. To přispěje ke kvalitě a zaručí nahodilost výsledku
- target_items: Počet návrhů, které mají být vybrány (udává počet návrhů, které chcete vybrat, čerpáním ze skupiny návrhů, které jste předtím vybrali)
- title: Titul
- witnesses: Svědkové
- models:
- decidim/sortitions/create_sortition_event: Losování
- activerecord:
- models:
- decidim/sortitions/sortition:
- one: Losování
- few: Losování
- many: Losování
- other: Losování
- decidim:
- components:
- sortitions:
- actions:
- comment: Komentář
- name: Losování
- settings:
- global:
- clear_all: Vymazat vše
- comments_enabled: Komentáře povoleny
- comments_max_length: Maximální délka komentáře (ponechte 0 pro výchozí hodnotu)
- define_taxonomy_filters: Před použitím tohoto nastavení prosím definujte některé filtry pro tento participační prostor.
- no_taxonomy_filters_found: Nebyly nalezeny žádné filtry taxonomie.
- taxonomy_filters: Vyberte filtry pro komponentu
- taxonomy_filters_add: Přidat filtr
- events:
- sortitions:
- sortition_created:
- email_intro: Losování "%{resource_title}" bylo přidáno k "%{participatory_space_title}", který sledujete.
- email_outro: Toto oznámení jste obdrželi, protože sledujete "%{participatory_space_title}". Můžete sledování odhlásit na předchozím odkazu.
- email_subject: Nové losování bylo přidáno k %{participatory_space_title}
- notification_title: Losování %{resource_title} bylo přidáno k %{participatory_space_title}
- sortitions:
- admin:
- actions:
- destroy: Zrušit losování
- edit: Upravit
- new_sortition: Nové losování
- show: Detaily losování
- title: Akce
- models:
- sortition:
- fields:
- created_at: Datum vytvoření
- decidim_proposals_component: Součást návrhů
- dice: Kostky
- reference: Odkaz
- request_timestamp: Čas vržení kostek
- seed: Založení
- target_items: Položky k výběru
- taxonomies: Taxonomie
- title: Název
- sortitions:
- confirm_destroy:
- confirm_destroy: Opravdu chcete zrušit toto losování?
- destroy: Zrušit losování
- title: Zrušení losování
- create:
- error: Při vytváření nového losování došlo k chybě.
- success: Losování bylo úspěšně vytvořeno.
- destroy:
- error: Nelze zrušit losování.
- success: Losování bylo úspěšně zrušeno.
- edit:
- title: Aktualizovat informace o volbě losem
- update: Aktualizace
- form:
- all_taxonomies: Všechny taxonomie
- select_proposal_component: Vyberte sadu návrhů
- select_taxonomies: Taxonomie sady návrhů, ve kterých chcete losování použít. Chcete-li použít losování na všechny návrhy v dané taxonomii, ponechte prázdné.
- index:
- title: Losování
- new:
- confirm: Stisknutím tlačítka Další bude platforma zaznamenávat datum a čas (s přesností sekund) společně s hodem kostkou, tyto informace budou použity k vytvoření náhodného výběru. Akce bude nevratná, po kliknutí na tlačítko bude výsledek tohoto losu publikován, spolu s údaji zadanými v tomto formuláři a nelze je změnit, pečlivě zkontrolujte obsah.
- create: Vytvořit
- title: Nové losování
- show:
- selected_proposals: Návrhy vybrané pro losování
- update:
- error: Při aktualizaci losování došlo k chybě.
- success: Losování úspěšně aktualizováno.
- admin_log:
- sortition:
- create: "%{user_name} vytvořil %{resource_name} losování v %{space_name}"
- delete: "%{user_name} zrušil losování %{resource_name} v %{space_name}"
- update: "%{user_name} aktualizoval losování %{resource_name} v %{space_name}"
- sortitions:
- count:
- proposals_count:
- one: návrh
- few: "%{count} návrhů"
- many: "%{count} návrhů"
- other: "%{count} návrhů"
- filters:
- active: Aktivní
- all: Vše
- cancelled: Zrušeno
- category: Kategorie
- state: Stav
- index:
- empty: Zatím zde nejsou žádné roztřídění.
- linked_sortitions:
- selected_proposals: Vybrané návrhy
- orders:
- label: 'Řazení losování podle:'
- random: Náhodně
- recent: Nedávné
- results_count:
- count:
- one: vybraný návrh
- few: vybrané návrhy
- many: vybrané návrhy
- other: vybrané návrhy
- show:
- algorithm: Kód algoritmu losování
- any_taxonomy: ze všech taxonomií
- cancelled: Zrušené losování
- candidate_proposal_ids: Pořadí a ID návrhů k losování
- candidate_proposals_info: 'Losování bylo provedeno mezi následujícími návrhy (%{taxonomy_labels}), s následujícími ID (označené tučně vybrané návrhy) '
- dice_result: (1) Výsledek hodu kostkou
- introduction: "Tato stránka obsahuje výsledky losování %{reference}. Prostřednictvím tohoto losování bylo vybráno %{target_items} výsledků náhodně a se stejným rozdělením pravděpodobnosti ze souboru návrhů zobrazených níže. \n\nSpolu s výsledky informace zobrazené na této stránce poskytují všechny informace potřebné pro maximalizaci záruk a reprodukci výsledků. Klíčem ke kvalitě tohoto losování je dvojitá náhodnost, kterou poskytuje hod kostkou (ověřený svědky) a přesný čas výběru, který poskytuje vstup pro algoritmus, který generuje náhodný výběr. \n\nČasový základ pro losování je tak přesný (na sekundy), že není možné ovládat lidi, a tak lze poskytnout dvojitý \"nekontrolovatelný\" vstup, který zaručí spravedlivý výsledek. "
- mathematical_result: Výsledek (1) x (2)
- proposals_selected_by_sortition: Návrhy vybrané losováním
- sortition_reproducibility_details: Detaily reprodukovatelnosti losování
- taxonomies: z taxonomií %{taxonomies}
- time_seed: (2) Časový základ
- witnesses: Svědci
- sortition:
- random_seed: Náhodný časový základ
- selected_proposals:
- one: vybraný návrh
- few: vybraných návrhů
- many: vybraných návrhů
- other: vybraných návrhů
- sortition_author:
- deleted: Odstraněný uživatel
- sortition_cancel_author:
- deleted: Odstraněný uživatel
- sortitions_count:
- count:
- one: 1 losování
- few: "%{count} losování"
- many: "%{count} losování"
- other: "%{count} losování"
- statistics:
- sortitions_count: Losování
diff --git a/decidim-sortitions/config/locales/da-DK.yml b/decidim-sortitions/config/locales/da-DK.yml
deleted file mode 100644
index 347c94d5e3836..0000000000000
--- a/decidim-sortitions/config/locales/da-DK.yml
+++ /dev/null
@@ -1 +0,0 @@
-da:
diff --git a/decidim-sortitions/config/locales/da.yml b/decidim-sortitions/config/locales/da.yml
deleted file mode 100644
index 347c94d5e3836..0000000000000
--- a/decidim-sortitions/config/locales/da.yml
+++ /dev/null
@@ -1 +0,0 @@
-da:
diff --git a/decidim-sortitions/config/locales/de.yml b/decidim-sortitions/config/locales/de.yml
deleted file mode 100644
index 364448a5f673a..0000000000000
--- a/decidim-sortitions/config/locales/de.yml
+++ /dev/null
@@ -1,145 +0,0 @@
-de:
- activemodel:
- attributes:
- sortition:
- additional_info: Sortierinformationen
- decidim_proposals_component_id: Vorschläge festgelegt
- dice: Ergebnis des Würfelwurfs. Wirf einen 6-seitigen Würfel oder suche nach einem anderen zufälligen Weg, um eine Zahl von 1 bis 6 zu erzeugen, und gib die resultierende Zahl vor einigen Zeugen ein. Dies trägt zur Qualität und zur Gewährleistung der Zufälligkeit des Ergebnisses bei
- target_items: Anzahl der auszuwählenden Vorschläge (gibt die Anzahl der Vorschläge an, die Sie auswählen möchten, indem Sie viele der Vorschläge auswählen, die Sie zuvor ausgewählt haben)
- title: Titel
- witnesses: Zeugen
- models:
- decidim/sortitions/create_sortition_event: Sortierung
- activerecord:
- models:
- decidim/sortitions/sortition:
- one: Sortierung
- other: Sortierungen
- decidim:
- components:
- sortitions:
- actions:
- comment: Kommentieren
- name: Sortierungen
- settings:
- global:
- clear_all: Alle löschen
- comments_enabled: Kommentare aktiviert
- comments_max_length: Maximale Länge der Kommentare (0 für Standardwert)
- define_taxonomy_filters: Bitte definieren Sie einige Filter für diesen partizipativen Bereich, bevor Sie diese Einstellung verwenden.
- no_taxonomy_filters_found: Keine Klassifizierungsfilter gefunden.
- taxonomy_filters: Filter für die Komponente auswählen
- taxonomy_filters_add: Filter hinzufügen
- events:
- sortitions:
- sortition_created:
- email_intro: Die Auslosung "%{resource_title}" wurde zu "%{participatory_space_title}" hinzugefügt, dem Sie folgen.
- email_outro: Sie haben diese Benachrichtigung erhalten, weil Sie "%{participatory_space_title}" folgen. Falls Sie keine solchen Benachrichtigungen mehr erhalten möchten, besuchen Sie den obigen Link.
- email_subject: Neue Sortierung wurde zu %{participatory_space_title}hinzugefügt
- notification_title: Die Auslosung %{resource_title} wurde zu %{participatory_space_title} hinzugefügt
- sortitions:
- admin:
- actions:
- destroy: Brechen Sie die Sortierung ab
- edit: Bearbeiten
- new_sortition: Neue Sortierung
- show: Sortierdetails
- title: Aktionen
- models:
- sortition:
- fields:
- created_at: Erstellungsdatum
- decidim_proposals_component: Vorschlagskomponente
- dice: Würfel
- reference: Referenz
- request_timestamp: Zeit zeichnen
- seed: Samen
- target_items: Zu wählende Elemente
- taxonomies: Klassifizierungen
- title: Titel
- sortitions:
- confirm_destroy:
- confirm_destroy: Möchten Sie diese Sortierung wirklich abbrechen?
- destroy: Sortierung abbrechen
- title: Stornierung der Sortierung
- create:
- error: Beim Erstellen einer neuen Datei ist ein Fehler aufgetreten.
- success: Die Sortierung wurde erfolgreich erstellt.
- destroy:
- error: Die Sortierung kann nicht abgebrochen werden.
- success: Die Sortierung wurde erfolgreich abgebrochen.
- edit:
- title: Informationen zur Sortierung aktualisieren
- update: Aktualisieren
- form:
- all_taxonomies: Alle Klassifizierungen
- select_proposal_component: Wählen Sie die Vorschläge aus
- select_taxonomies: Klassifizierungen der Vorschlagsauswahl, auf die die Auslosung angewendet wird. Lassen Sie das Feld leer, um die Ziehung auf alle Vorschläge dieser Klassifizierung anzuwenden.
- index:
- title: Sortierungen
- new:
- confirm: Durch Drücken des nächsten Knopfes zeichnet Decidim das Datum und die Zeit (mit der Genauigkeit von Sekunden) auf und zusammen mit dem Würfelwurf wird diese Information verwendet, um eine zufällige Auswahl zu erzeugen. Die Aktion ist unumkehrbar. Sobald die Schaltfläche angeklickt wird, wird das Ergebnis dieser Verlosung veröffentlicht, zusammen mit den in diesem Formular eingegebenen Daten und kann nicht geändert werden. Überprüfen Sie deshalb bitte den Inhalt sorgfältig.
- create: Erstellen
- title: Neue Sortierung
- show:
- selected_proposals: Vorschläge für die Auslosung ausgewählt
- update:
- error: Beim Aktualisieren der Sortierung ist ein Fehler aufgetreten.
- success: Die Sortierung wurde erfolgreich aktualisiert.
- admin_log:
- sortition:
- create: "%{user_name} erstellt die %{resource_name} Sortierung in %{space_name}"
- delete: "%{user_name} hat die %{resource_name} Sortierung in %{space_name}abgebrochen"
- update: "%{user_name} hat die %{resource_name} Sortierung in %{space_name}aktualisiert"
- sortitions:
- count:
- proposals_count:
- one: 1 Vorschlag
- other: "%{count} Vorschläge"
- filters:
- active: Aktiv
- all: Alle
- cancelled: Abgebrochen
- category: Kategorie
- state: Status
- index:
- empty: Es gibt noch keine Sortierungen.
- linked_sortitions:
- selected_proposals: Ausgewählte Vorschläge
- orders:
- label: 'Sortieren nach:'
- random: Zufällig
- recent: Kürzlich hinzugefügt
- results_count:
- count:
- one: ausgewählter Vorschlag
- other: ausgewählte Vorschläge
- show:
- algorithm: Sortieralgorithmuscode
- any_taxonomy: alle Klassifizierungen
- cancelled: Stornierte Sortierung
- candidate_proposal_ids: Reihenfolge der Sortierungsvorschläge und IDs
- candidate_proposals_info: 'Die Auslosung wurde unter den folgenden Vorschlägen (%{taxonomy_labels}) durchgeführt, mit den folgenden IDs (fett gedruckt sind die ausgewählten Vorschläge) '
- dice_result: (1) Würfelergebnis
- introduction: 'Diese Seite enthält die Ergebnisse der Sortierung %{reference}. Durch diese Sortierung wurde %{target_items} Anzahl von Ergebnissen zufällig und mit einer gleichen Wahrscheinlichkeitsverteilung aus dem unten angezeigten Satz von Vorschlägen ausgewählt. Zusammen mit den Ergebnissen bieten die auf dieser Seite angezeigten Informationen alle Informationen, die erforderlich sind, um die Garantien zu maximieren und die Ergebnisse zu reproduzieren. Der Schlüssel zur Qualität dieser Sortierung ist die doppelte Zufälligkeit, die durch das Rollen eines Würfels (verifiziert durch Zeugen) und den genauen Zeitpunkt der Sortierung bereitgestellt wird, der eine Eingabe für einen Algorithmus liefert, der eine zufällige Auswahl erzeugt. Der Zeitsaat für die Sortierung ist so genau (Sekunden), dass es unmöglich ist, von Menschen kontrolliert zu werden, wodurch eine doppelte "unkontrollierbare" Eingabe bereitgestellt wird, um ein faires Ergebnis zu garantieren. '
- mathematical_result: Ergebnis (1) x (2)
- proposals_selected_by_sortition: Vorschläge nach der Sortierung ausgewählt
- sortition_reproducibility_details: Einzelheiten der Sortierreproduzierbarkeit
- taxonomies: von den Klassifizierungen %{taxonomies}
- time_seed: (2) Zeit Samen
- witnesses: Zeugen
- sortition:
- random_seed: Zufallssamen
- selected_proposals:
- one: Vorschlag ausgewählt
- other: Vorschläge ausgewählt
- sortition_author:
- deleted: Gelöschter Benutzer
- sortition_cancel_author:
- deleted: Gelöschter Benutzer
- sortitions_count:
- count:
- one: 1 Sortierung
- other: "%{count} Sortierungen"
- statistics:
- sortitions_count: Sortierungen
diff --git a/decidim-sortitions/config/locales/el-GR.yml b/decidim-sortitions/config/locales/el-GR.yml
deleted file mode 100644
index 419ec705c3e6d..0000000000000
--- a/decidim-sortitions/config/locales/el-GR.yml
+++ /dev/null
@@ -1 +0,0 @@
-el:
diff --git a/decidim-sortitions/config/locales/el.yml b/decidim-sortitions/config/locales/el.yml
deleted file mode 100644
index 8c7f4fc58fcfa..0000000000000
--- a/decidim-sortitions/config/locales/el.yml
+++ /dev/null
@@ -1,130 +0,0 @@
-el:
- activemodel:
- attributes:
- sortition:
- additional_info: Πληροφορίες κλήρωσης
- decidim_proposals_component_id: Σύνολο προτάσεων
- dice: Αποτέλεσμα ζαριάς. Ρίξτε ένα ζάρι 6 πλευρών ή αναζητήστε έναν άλλο τυχαίο τρόπο για να δημιουργήσετε έναν αριθμό από το 1 έως το 6 και εισαγάγετε εδώ τον αριθμό που προκύπτει ενώπιον μερικών μαρτύρων. Αυτό συμβάλλει στην ποιότητα και εξασφαλίζει την τυχαιότητα του αποτελέσματος
- target_items: Αριθμός προτάσεων προς επιλογή (δηλώνει τον αριθμό των προτάσεων που θέλετε να επιλεγούν με κλήρωση της ομάδας προτάσεων που έχετε επιλέξει προηγουμένως)
- title: Τίτλος
- witnesses: Μάρτυρες
- models:
- decidim/sortitions/create_sortition_event: Κλήρωση
- activerecord:
- models:
- decidim/sortitions/sortition:
- one: Κλήρωση
- other: Κληρώσεις
- decidim:
- components:
- sortitions:
- actions:
- comment: Σχόλιο
- name: Κληρώσεις
- settings:
- global:
- comments_enabled: Τα σχόλια ενεργοποιήθηκαν
- comments_max_length: Μέγιστο μέγεθος σχολίων (Αφήστε το 0 για την προκαθορισμένη τιμή)
- events:
- sortitions:
- sortition_created:
- email_intro: Η κλήρωση «%{resource_title}» προστέθηκε στον χώρο συμμετοχής «%{participatory_space_title}» που ακολουθείτε.
- email_outro: Λάβατε αυτήν την ειδοποίηση επειδή ακολουθείτε τον χώρο συμμετοχής «%{participatory_space_title}». Μπορείτε να σταματήσετε να τον ακολουθείτε από τον προηγούμενο σύνδεσμο.
- email_subject: Προστέθηκε νέα κλήρωση στον χώρο συμμετοχής %{participatory_space_title}
- notification_title: Η κλήρωση %{resource_title} προστέθηκε στον χώρο συμμετοχής %{participatory_space_title}
- sortitions:
- admin:
- actions:
- destroy: Ακύρωση της κλήρωσης
- edit: Επεξεργασία
- show: Λεπτομέρειες κλήρωσης
- models:
- sortition:
- fields:
- created_at: Ημερομηνία δημιουργίας
- decidim_proposals_component: Στοιχείο προτάσεων
- dice: Ζάρι
- reference: Αναφορά
- request_timestamp: Ώρα κλήρωσης
- seed: Κατάταξη
- target_items: Στοιχεία προς επιλογή
- title: Τίτλος
- sortitions:
- confirm_destroy:
- confirm_destroy: Είστε βέβαιοι ότι θέλετε να ακυρώσετε αυτήν την κλήρωση;
- destroy: Ακύρωση κλήρωσης
- title: Ακύρωση της κλήρωσης
- create:
- error: Υπήρξε ένα πρόβλημα κατά τη δημιουργία μιας νέας κλήρωσης.
- success: Η κλήρωση δημιουργήθηκε με επιτυχία.
- destroy:
- error: Δεν είναι δυνατή η ακύρωση της κλήρωσης.
- success: Η κλήρωση ακυρώθηκε με επιτυχία.
- edit:
- title: Ενημερώστε τις πληροφορίες σχετικά με την κλήρωση
- update: Ενημέρωση
- form:
- select_proposal_component: Επιλέξτε το σύνολο προτάσεων
- index:
- title: Κληρώσεις
- new:
- confirm: Πατώντας το επόμενο κουμπί, το Decidim θα καταγράψει την ημερομηνία και την ώρα (με ακρίβεια δευτερολέπτων) και μαζί με τη ζαριά, αυτές οι πληροφορίες θα χρησιμοποιηθούν για τη δημιουργία μιας τυχαίας επιλογής. Η ενέργεια θα είναι μη αναστρέψιμη, μόλις πατήσετε το κουμπί, θα δημοσιευτεί το αποτέλεσμα αυτής της κλήρωσης, μαζί με τα δεδομένα που έχουν εισαχθεί σε αυτήν τη φόρμα και δεν μπορούν να τροποποιηθούν, ελέγξτε προσεκτικά το περιεχόμενο.
- create: Δημιουργία
- title: Νέα κλήρωση
- show:
- selected_proposals: Επιλέχθηκαν προτάσεις για κλήρωση
- update:
- error: Υπήρξε ένα πρόβλημα κατά την ενημέρωση της κλήρωσης.
- success: Η κλήρωση ενημερώθηκε με επιτυχία.
- admin_log:
- sortition:
- create: "Ο χρήστης %{user_name} δημιούργησε την κλήρωση %{resource_name} στον χώρο %{space_name}"
- delete: "Ο χρήστης %{user_name} ακύρωσε την κλήρωση %{resource_name} στον χώρο %{space_name}"
- update: "Ο χρήστης %{user_name} ενημέρωσε την κλήρωση %{resource_name} στον χώρο %{space_name}"
- sortitions:
- count:
- proposals_count:
- one: 1 πρόταση
- other: "%{count} προτάσεις"
- filters:
- active: Ενεργές
- all: Όλα
- cancelled: Ακυρώθηκε
- category: Κατηγορία
- state: Κατάσταση
- linked_sortitions:
- selected_proposals: Επιλεγμένες προτάσεις
- orders:
- label: 'Ταξινόμηση κληρώσεων κατά:'
- random: Τυχαία
- recent: Πρόσφατα
- results_count:
- count:
- one: επιλεγμένη πρόταση
- other: επιλεγμένες προτάσεις
- show:
- algorithm: Κωδικός αλγορίθμου κλήρωσης
- cancelled: Ακυρωμένη κλήρωση
- candidate_proposal_ids: Ταξινόμηση προτάσεων κληρώσεων και αναγνωριστικά
- dice_result: (1) Αποτέλεσμα ζαριάς
- introduction: 'Αυτή η σελίδα περιέχει τα αποτελέσματα της κλήρωσης %{reference}. Μέσω αυτής της κλήρωσης, ο αριθμός %{target_items} των αποτελεσμάτων επιλέχθηκε τυχαία και με ίση πιθανότητα κατανομής από το σύνολο των προτάσεων που εμφανίζονται παρακάτω. Μαζί με τα αποτελέσματα, οι πληροφορίες που εμφανίζονται σε αυτήν τη σελίδα παρέχουν όλες τις πληροφορίες που απαιτούνται για τη μεγιστοποίηση των εγγυήσεων και την αναπαραγωγή των αποτελεσμάτων. Το κλειδί για την ποιότητα αυτής της κλήρωσης είναι η διπλή τυχαιότητα που παρέχεται από το ρίξιμο του ζαριού (επαληθευμένο από μάρτυρες) και τον ακριβή χρόνο της κλήρωσης που παρέχει δεδομένα για έναν αλγόριθμο που δημιουργεί μια τυχαία επιλογή. Η χρονική κατάταξη για την κλήρωση είναι τόσο ακριβής (δευτερόλεπτα), που είναι αδύνατο να ελεγχθεί από ανθρώπους, παρέχοντας έτσι μια διπλή «μη ελεγχόμενη» εισαγωγή δεδομένων για να εξασφαλιστεί ένα δίκαιο αποτέλεσμα.'
- mathematical_result: Αποτέλεσμα (1) x (2)
- proposals_selected_by_sortition: Προτάσεις που επιλέχθηκαν βάσει κλήρωσης
- sortition_reproducibility_details: Λεπτομέρειες δυνατότητας αναπαραγωγής κλήρωσης
- time_seed: (2) Χρονική κατάταξη
- witnesses: Μάρτυρες
- sortition:
- random_seed: Τυχαία κατάταξη
- selected_proposals:
- one: επιλεγμένη πρόταση
- other: επιλεγμένες προτάσεις
- sortition_author:
- deleted: Διαγραμμένος συμμετέχων
- sortition_cancel_author:
- deleted: Διαγραμμένος συμμετέχων
- sortitions_count:
- count:
- one: 1 κλήρωση
- other: "%{count} κληρώσεις"
- statistics:
- sortitions_count: Κληρώσεις
diff --git a/decidim-sortitions/config/locales/en.yml b/decidim-sortitions/config/locales/en.yml
deleted file mode 100644
index a65bb38a15928..0000000000000
--- a/decidim-sortitions/config/locales/en.yml
+++ /dev/null
@@ -1,148 +0,0 @@
----
-en:
- activemodel:
- attributes:
- sortition:
- additional_info: Sortition information
- decidim_proposals_component_id: Proposals set
- dice: Result of die roll. Roll a 6-sided die, or look for another random way to generate a number from 1 to 6, and enter here the resulting number in front of some witnesses. This contributes to the quality and guarantees of the randomness of the result
- target_items: Number of proposals to be selected (indicates the number of proposals you want to be selected by drawing lots of the group of proposals you have previously chosen)
- title: Title
- witnesses: Witnesses
- models:
- decidim/sortitions/create_sortition_event: Sortition
- activerecord:
- models:
- decidim/sortitions/sortition:
- one: Sortition
- other: Sortitions
- decidim:
- components:
- sortitions:
- actions:
- comment: Comment
- name: Sortitions
- settings:
- global:
- clear_all: Clear all
- comments_enabled: Comments enabled
- comments_max_length: Comments max length (Leave 0 for default value)
- define_taxonomy_filters: Please define some filters for this participatory space before using this setting.
- no_taxonomy_filters_found: No taxonomy filters found.
- taxonomy_filters: Select filters for the component
- taxonomy_filters_add: Add filter
- events:
- sortitions:
- sortition_created:
- email_intro: The sortition "%{resource_title}" has been added to "%{participatory_space_title}" that you are following.
- email_outro: You have received this notification because you are following "%{participatory_space_title}". You can unfollow it from the previous link.
- email_subject: New sortition added to %{participatory_space_title}
- notification_title: The sortition %{resource_title} has been added to %{participatory_space_title}
- sortitions:
- admin:
- actions:
- destroy: Cancel the sortition
- edit: Edit
- new_sortition: New sortition
- show: Sortition details
- title: Actions
- deprecation_warning_html: "⚠️ Deprecation Notice. The Sortitions module will be removed in Decidim v0.32. Please plan accordingly and consider alternative solutions for participant or proposal selection."
- models:
- sortition:
- fields:
- created_at: Creation date
- decidim_proposals_component: Proposals component
- dice: Dice
- reference: Reference
- request_timestamp: Draw time
- seed: Seed
- target_items: Items to select
- taxonomies: Taxonomies
- title: Title
- sortitions:
- confirm_destroy:
- confirm_destroy: Are you sure you want to cancel this sortition?
- destroy: Cancel sortition
- title: Cancellation of the sortition
- create:
- error: There was a problem creating a new sortition.
- success: Sortition successfully created.
- destroy:
- error: Cannot cancel the sortition.
- success: Sortition successfully cancelled.
- edit:
- title: Update the information about the sortition
- update: Update
- form:
- all_taxonomies: All taxonomies
- select_proposal_component: Select the proposals set
- select_taxonomies: Taxonomies of the set of proposals in which you want to apply the draw. Leave empty to apply the draw to all proposals on that taxonomy.
- index:
- title: Sortitions
- new:
- confirm: By pressing the next button the platform will record the date and time (with precision of seconds) and together with the dice roll, this information will be used to generate a random selection. The action will be irreversible, once the button is clicked the result of this draw will be published, together with the data entered in this form and cannot be modified, please check the content carefully.
- create: Create
- title: New sortition
- show:
- selected_proposals: Proposals selected for draw
- update:
- error: There was a problem updating the sortition.
- success: Sortition successfully updated.
- admin_log:
- sortition:
- create: "%{user_name} created the %{resource_name} sortition in %{space_name}"
- delete: "%{user_name} cancelled the %{resource_name} sortition in %{space_name}"
- update: "%{user_name} updated the %{resource_name} sortition in %{space_name}"
- sortitions:
- count:
- proposals_count:
- one: 1 proposal
- other: "%{count} proposals"
- filters:
- active: Active
- all: All
- cancelled: Cancelled
- category: Category
- state: Status
- index:
- empty: There are no sortitions yet.
- linked_sortitions:
- selected_proposals: Selected proposals
- orders:
- label: 'Order sortitions by:'
- random: Random
- recent: Recent
- results_count:
- count:
- one: Selected proposal
- other: Selected proposals
- show:
- algorithm: Sortition's algorithm code
- any_taxonomy: from all taxonomies
- cancelled: Cancelled sortition
- candidate_proposal_ids: Sortition proposals order and IDs
- candidate_proposals_info: 'The sortition was carried out among the following proposals (%{taxonomy_labels}), with the following IDs (in bold the selected proposals) '
- dice_result: Dice result
- introduction: 'This page contains the results of the sortition %{reference}. By means of this sortition, %{target_items} number of results have been selected randomly and with an equal probability distribution from the set of proposals displayed bellow. Together with the results, the information displayed on this page provides all the information required to maximize guarantees and to reproduce the results. The key to the quality of this sortition is the double randomness provided by a the rolling of a dice(verified by witnesses) and the precise time of the sortition that provides input for an algorithm that generates a random selection. The time-seed for the sortition is so accurate (seconds) that it is impossible to control by humans thus providing a double "uncontrollable" input to guarantee a fair result. '
- mathematical_result: Result (Dice x Seed)
- proposals_selected_by_sortition: Proposals selected by sortition
- sortition_reproducibility_details: Sortition reproducibility
- taxonomies: from the %{taxonomies} taxonomies
- time_seed: Time seed
- witnesses: Witnesses
- sortition:
- random_seed: Random seed
- selected_proposals:
- one: proposal selected
- other: proposals selected
- sortition_author:
- deleted: Deleted participant
- sortition_cancel_author:
- deleted: Deleted participant
- sortitions_count:
- count:
- one: 1 sortition
- other: "%{count} sortitions"
- statistics:
- sortitions_count: Sortitions
- sortitions_count_tooltip: The number of random selections carried out for decision-making.
diff --git a/decidim-sortitions/config/locales/eo-UY.yml b/decidim-sortitions/config/locales/eo-UY.yml
deleted file mode 100644
index 7599814048735..0000000000000
--- a/decidim-sortitions/config/locales/eo-UY.yml
+++ /dev/null
@@ -1 +0,0 @@
-eo:
diff --git a/decidim-sortitions/config/locales/eo.yml b/decidim-sortitions/config/locales/eo.yml
deleted file mode 100644
index 7599814048735..0000000000000
--- a/decidim-sortitions/config/locales/eo.yml
+++ /dev/null
@@ -1 +0,0 @@
-eo:
diff --git a/decidim-sortitions/config/locales/es-MX.yml b/decidim-sortitions/config/locales/es-MX.yml
deleted file mode 100644
index 0cd9024d52751..0000000000000
--- a/decidim-sortitions/config/locales/es-MX.yml
+++ /dev/null
@@ -1,147 +0,0 @@
-es-MX:
- activemodel:
- attributes:
- sortition:
- additional_info: Información de clasificación
- decidim_proposals_component_id: Propuestas
- dice: Resultado de la tirada de dados. Tira un dado de 6 caras, o busca otra forma aleatoria de generar un número del 1 al 6, e ingresa aquí el número resultante delante de algunos testigos. Esto contribuye a la calidad y garantías de la aleatoriedad del resultado
- target_items: Número de propuestas que se seleccionarán (indica el número de propuestas que desea seleccionar dibujando un montón del grupo de propuestas que ha elegido previamente)
- title: Título
- witnesses: Testigos
- models:
- decidim/sortitions/create_sortition_event: Sorteo
- activerecord:
- models:
- decidim/sortitions/sortition:
- one: Sorteo
- other: Sorteos
- decidim:
- components:
- sortitions:
- actions:
- comment: Comentar
- name: Sorteos
- settings:
- global:
- clear_all: Limpiarlo todo
- comments_enabled: Comentarios habilitados
- comments_max_length: Longitud máxima de los comentarios (deja 0 si quieres mantener la configuración por defecto)
- define_taxonomy_filters: Por favor, define algunos filtros para este espacio de participación antes de utilizar esta configuración.
- no_taxonomy_filters_found: No se han encontrado filtros de taxonomía.
- taxonomy_filters: Seleccionar filtros para el componente
- taxonomy_filters_add: Añadir un filtro
- events:
- sortitions:
- sortition_created:
- email_intro: El sorteo "%{resource_title}" se ha agregado a "%{participatory_space_title}" que estás siguiendo.
- email_outro: Recibiste esta notificación porque estás siguiendo "%{participatory_space_title}". Puedes dejar de seguirlo desde el enlace anterior.
- email_subject: Nuevo sorteo añadida a %{participatory_space_title}
- notification_title: El sorteo %{resource_title} se ha agregado a %{participatory_space_title}
- sortitions:
- admin:
- actions:
- destroy: Cancelar el sorteo
- edit: Editar
- new_sortition: Añadir sorteo
- show: Detalles de la clasificación
- title: Acciones
- deprecation_warning_html: "⚠️ Aviso de Desuso/Obsolescencia. El módulo de sorteos se eliminará en Decidim v.0.32. Por favor planifica en consecuencia y considera soluciones alternativas para la selección de elementos al azar."
- models:
- sortition:
- fields:
- created_at: Fecha de creación
- decidim_proposals_component: Componente Propuestas
- dice: Dado
- reference: Referencia
- request_timestamp: Tiempo de dibujar
- seed: Semilla
- target_items: Artículos para seleccionar
- taxonomies: Taxonomías
- title: Título
- sortitions:
- confirm_destroy:
- confirm_destroy: '¿Seguro que quieres cancelar este sorteo?'
- destroy: Cancelar el sorteo
- title: Cancelar el sorteo
- create:
- error: Se produjo un error al crear un nuevo sorteo.
- success: Sorteo creado correctamente.
- destroy:
- error: No se puede cancelar el sorteo.
- success: Sorteo cancelado correctamente.
- edit:
- title: Actualiza la información sobre el sorteo
- update: Actualizar
- form:
- all_taxonomies: Todas las taxonomías
- select_proposal_component: Seleccione el conjunto de propuestas
- select_taxonomies: Taxonomías del conjunto de propuestas en las que se desea aplicar el sorteo. Dejar en blanco para aplicar el sorteo a todas las propuestas sobre esa taxonomía.
- index:
- title: Sorteos
- new:
- confirm: Al hacer clic en el siguiente botón, la plataforma registrará la fecha y hora (con una precisión de segundos) y el resultado del dado, esta información se utilizará para generar una selección aleatoria. Esta acción será irreversible y, una vez que hayas hecho clic en el botón, se publicará el resultado del sorteo junto con los datos facilitados en el presente formulario y no podrán modificarse. Te pedimos que revises el contenido cuidadosamente.
- create: Crear
- title: Nuevo sorteo
- show:
- selected_proposals: Propuestas seleccionadas para sorteo
- update:
- error: Se produjo un error al actualizar el sorteo.
- success: Sorteo actualizado correctamente.
- admin_log:
- sortition:
- create: "%{user_name} creó el sorteo %{resource_name} en %{space_name}"
- delete: "%{user_name} canceló el sorteo %{resource_name} en %{space_name}"
- update: "%{user_name} actualizó el sorteo %{resource_name} en %{space_name}"
- sortitions:
- count:
- proposals_count:
- one: 1 propuesta
- other: "%{count} propuestas"
- filters:
- active: Activo
- all: Todas
- cancelled: Cancelado
- category: Categoría
- state: Estado
- index:
- empty: Aún no hay ningún sorteo.
- linked_sortitions:
- selected_proposals: Propuestas seleccionadas
- orders:
- label: 'Ordena los sorteos por:'
- random: Aleatorio
- recent: Reciente
- results_count:
- count:
- one: propuesta seleccionada
- other: propuestas seleccionadas
- show:
- algorithm: Código de algoritmo del sorteo
- any_taxonomy: de todas las taxonomías
- cancelled: Cancelación de la clasificación
- candidate_proposal_ids: Orden de propuestas de clasificación e ID
- candidate_proposals_info: 'El sorteo se realizó entre las siguientes propuestas (%{taxonomy_labels}), con los siguientes ID (en negrita las propuestas seleccionadas) '
- dice_result: (1) resultado de los dados
- introduction: 'Esta página contiene los resultados del sorteo %{reference}. Mediante esta clasificación, %{target_items} número de resultados se han seleccionado al azar y con una distribución de probabilidad igual del conjunto de propuestas que se muestran a continuación. Junto con los resultados, la información que se muestra en esta página proporciona toda la información necesaria para maximizar las garantías y reproducir los resultados. La clave de la calidad de esta clasificación es la doble aleatoriedad proporcionada por el lanzamiento de un dado (verificado por testigos) y el momento preciso del sorteo que proporciona la entrada para un algoritmo que genera una selección aleatoria. La semilla de tiempo del sorteo es tan precisa (segundos) que es imposible de controlar por los seres humanos, proporcionando así una doble entrada "incontrolable" para garantizar un resultado justo. '
- mathematical_result: Resultado (1) x (2)
- proposals_selected_by_sortition: Propuestas seleccionadas por clasificación
- sortition_reproducibility_details: Detalles de reproducibilidad del sorteo
- taxonomies: de las taxonomías %{taxonomies}
- time_seed: (2) Tiempo de semilla
- witnesses: Testigos
- sortition:
- random_seed: Semilla aleatoria
- selected_proposals:
- one: 1 propuesta seleccionada
- other: '%{count} propuestas seleccionadas'
- sortition_author:
- deleted: Usuario eliminado
- sortition_cancel_author:
- deleted: Usuario eliminado
- sortitions_count:
- count:
- one: 1 sorteo
- other: "%{count} clasificaciones"
- statistics:
- sortitions_count: Sorteos
- sortitions_count_tooltip: El número de selecciones aleatorias realizadas para la toma de decisiones.
diff --git a/decidim-sortitions/config/locales/es-PY.yml b/decidim-sortitions/config/locales/es-PY.yml
deleted file mode 100644
index aad229f5a9e95..0000000000000
--- a/decidim-sortitions/config/locales/es-PY.yml
+++ /dev/null
@@ -1,147 +0,0 @@
-es-PY:
- activemodel:
- attributes:
- sortition:
- additional_info: Información de clasificación
- decidim_proposals_component_id: Propuestas
- dice: Resultado de la tirada de dados. Tira un dado de 6 caras, o busca otra forma aleatoria de generar un número del 1 al 6, e ingresa aquí el número resultante delante de algunos testigos. Esto contribuye a la calidad y garantías de la aleatoriedad del resultado
- target_items: Número de propuestas que se seleccionarán (indica el número de propuestas que desea seleccionar dibujando un montón del grupo de propuestas que ha elegido previamente)
- title: Título
- witnesses: Testigos
- models:
- decidim/sortitions/create_sortition_event: Sorteo
- activerecord:
- models:
- decidim/sortitions/sortition:
- one: Sorteo
- other: Sorteos
- decidim:
- components:
- sortitions:
- actions:
- comment: Comentar
- name: Sorteos
- settings:
- global:
- clear_all: Limpiarlo todo
- comments_enabled: Comentarios habilitados
- comments_max_length: Longitud máxima de los comentarios (deja 0 si quieres mantener la configuración por defecto)
- define_taxonomy_filters: Por favor, define algunos filtros para este espacio de participación antes de utilizar esta configuración.
- no_taxonomy_filters_found: No se han encontrado filtros de taxonomía.
- taxonomy_filters: Seleccionar filtros para el componente
- taxonomy_filters_add: Añadir un filtro
- events:
- sortitions:
- sortition_created:
- email_intro: El sorteo "%{resource_title}" se ha agregado a "%{participatory_space_title}" que estás siguiendo.
- email_outro: Recibiste esta notificación porque estás siguiendo "%{participatory_space_title}". Puedes dejar de seguirlo desde el enlace anterior.
- email_subject: Nuevo sorteo añadida a %{participatory_space_title}
- notification_title: El sorteo %{resource_title} se ha agregado a %{participatory_space_title}
- sortitions:
- admin:
- actions:
- destroy: Cancelar el sorteo
- edit: Editar
- new_sortition: Añadir sorteo
- show: Detalles de la clasificación
- title: Acciones
- deprecation_warning_html: "⚠️ Aviso de Desuso/Obsolescencia. El módulo de sorteos se eliminará en Decidim v.0.32. Por favor planifica en consecuencia y considera soluciones alternativas para la selección de elementos al azar."
- models:
- sortition:
- fields:
- created_at: Fecha de creación
- decidim_proposals_component: Componente Propuestas
- dice: Dado
- reference: Referencia
- request_timestamp: Tiempo de dibujar
- seed: Semilla
- target_items: Artículos para seleccionar
- taxonomies: Taxonomías
- title: Título
- sortitions:
- confirm_destroy:
- confirm_destroy: '¿Seguro que quieres cancelar este sorteo?'
- destroy: Cancelar el sorteo
- title: Cancelar el sorteo
- create:
- error: Se produjo un error al crear un nuevo sorteo.
- success: Sorteo creado correctamente.
- destroy:
- error: No se puede cancelar el sorteo.
- success: Sorteo cancelado correctamente.
- edit:
- title: Actualiza la información sobre el sorteo
- update: Actualizar
- form:
- all_taxonomies: Todas las taxonomías
- select_proposal_component: Seleccione el conjunto de propuestas
- select_taxonomies: Taxonomías del conjunto de propuestas en las que se desea aplicar el sorteo. Dejar en blanco para aplicar el sorteo a todas las propuestas sobre esa taxonomía.
- index:
- title: Sorteos
- new:
- confirm: Al hacer clic en el siguiente botón, la plataforma registrará la fecha y hora (con una precisión de segundos) y el resultado del dado, esta información se utilizará para generar una selección aleatoria. Esta acción será irreversible y, una vez que hayas hecho clic en el botón, se publicará el resultado del sorteo junto con los datos facilitados en el presente formulario y no podrán modificarse. Te pedimos que revises el contenido cuidadosamente.
- create: Crear
- title: Nuevo sorteo
- show:
- selected_proposals: Propuestas seleccionadas para sorteo
- update:
- error: Se produjo un error al actualizar el sorteo.
- success: Sorteo actualizado correctamente.
- admin_log:
- sortition:
- create: "%{user_name} creó el sorteo %{resource_name} en %{space_name}"
- delete: "%{user_name} canceló el sorteo %{resource_name} en %{space_name}"
- update: "%{user_name} actualizó el sorteo %{resource_name} en %{space_name}"
- sortitions:
- count:
- proposals_count:
- one: 1 propuesta
- other: "%{count} propuestas"
- filters:
- active: Activo
- all: Todas
- cancelled: Cancelado
- category: Categoría
- state: Estado
- index:
- empty: Aún no hay ningún sorteo.
- linked_sortitions:
- selected_proposals: Propuestas seleccionadas
- orders:
- label: 'Ordena los sorteos por:'
- random: Aleatorio
- recent: Reciente
- results_count:
- count:
- one: propuesta seleccionada
- other: propuestas seleccionadas
- show:
- algorithm: Código de algoritmo del sorteo
- any_taxonomy: de todas las taxonomías
- cancelled: Cancelación de la clasificación
- candidate_proposal_ids: Orden de propuestas de clasificación e ID
- candidate_proposals_info: 'El sorteo se realizó entre las siguientes propuestas (%{taxonomy_labels}), con los siguientes ID (en negrita las propuestas seleccionadas) '
- dice_result: (1) resultado de los dados
- introduction: 'Esta página contiene los resultados del sorteo %{reference}. Mediante esta clasificación, %{target_items} número de resultados se han seleccionado al azar y con una distribución de probabilidad igual del conjunto de propuestas que se muestran a continuación. Junto con los resultados, la información que se muestra en esta página proporciona toda la información necesaria para maximizar las garantías y reproducir los resultados. La clave de la calidad de esta clasificación es la doble aleatoriedad proporcionada por el lanzamiento de un dado (verificado por testigos) y el momento preciso del sorteo que proporciona la entrada para un algoritmo que genera una selección aleatoria. La semilla de tiempo del sorteo es tan precisa (segundos) que es imposible de controlar por los seres humanos, proporcionando así una doble entrada "incontrolable" para garantizar un resultado justo. '
- mathematical_result: Resultado (1) x (2)
- proposals_selected_by_sortition: Propuestas seleccionadas por clasificación
- sortition_reproducibility_details: Detalles de reproducibilidad del sorteo
- taxonomies: de las taxonomías %{taxonomies}
- time_seed: (2) Tiempo de semilla
- witnesses: Testigos
- sortition:
- random_seed: Semilla aleatoria
- selected_proposals:
- one: 1 propuesta seleccionada
- other: '%{count} propuestas seleccionadas'
- sortition_author:
- deleted: Usuario eliminado
- sortition_cancel_author:
- deleted: Usuario eliminado
- sortitions_count:
- count:
- one: 1 sorteo
- other: "%{count} clasificaciones"
- statistics:
- sortitions_count: Sorteos
- sortitions_count_tooltip: El número de selecciones aleatorias realizadas para la toma de decisiones.
diff --git a/decidim-sortitions/config/locales/es.yml b/decidim-sortitions/config/locales/es.yml
deleted file mode 100644
index 13aa0914368d4..0000000000000
--- a/decidim-sortitions/config/locales/es.yml
+++ /dev/null
@@ -1,147 +0,0 @@
-es:
- activemodel:
- attributes:
- sortition:
- additional_info: Información del sorteo
- decidim_proposals_component_id: Propuestas establecidas
- dice: Resultado de la tirada de dados. Tira un dado de seis caras, o busca otra forma aleatoria de generar un número del uno al 6, e ingresa aquí el número resultante delante de algunos testigos. Esto contribuye a la calidad y garantías de la aleatoriedad del resultado
- target_items: Número de propuestas a seleccionar (indica el número de propuestas que deseas seleccionar a través del sorteo del grupo de propuestas que hayas seleccionado previamente)
- title: Título
- witnesses: Testigos
- models:
- decidim/sortitions/create_sortition_event: Sorteo
- activerecord:
- models:
- decidim/sortitions/sortition:
- one: Sorteo
- other: Sorteos
- decidim:
- components:
- sortitions:
- actions:
- comment: Comentar
- name: Sorteos
- settings:
- global:
- clear_all: Limpiarlo todo
- comments_enabled: Comentarios habilitados
- comments_max_length: Longitud máxima de los comentarios (deja 0 si quieres mantener la configuración por defecto)
- define_taxonomy_filters: Por favor, define algunos filtros para este espacio de participación antes de utilizar esta configuración.
- no_taxonomy_filters_found: No se han encontrado filtros de taxonomía.
- taxonomy_filters: Seleccionar filtros para el componente
- taxonomy_filters_add: Añadir un filtro
- events:
- sortitions:
- sortition_created:
- email_intro: El sorteo "%{resource_title}" se ha agregado a "%{participatory_space_title}" que estás siguiendo.
- email_outro: Recibiste esta notificación porque estás siguiendo "%{participatory_space_title}". Puedes dejar de seguirlo desde el enlace anterior.
- email_subject: Nuevo sorteo añadida a %{participatory_space_title}
- notification_title: El sorteo %{resource_title} se ha agregado a %{participatory_space_title}
- sortitions:
- admin:
- actions:
- destroy: Cancela el sorteo
- edit: Editar
- new_sortition: Añadir sorteo
- show: Detalles del sorteo
- title: Acciones
- deprecation_warning_html: "⚠️ Aviso de Desuso/Obsolescencia. El módulo de sorteos se eliminará en Decidim v.0.32. Por favor planifica en consecuencia y considera soluciones alternativas para la selección de elementos al azar."
- models:
- sortition:
- fields:
- created_at: Fecha de creación
- decidim_proposals_component: Componente de Propuestas
- dice: Dado
- reference: Referencia
- request_timestamp: Tiempo de dibujar
- seed: Semilla
- target_items: Elementos a seleccionar
- taxonomies: Taxonomías
- title: Título
- sortitions:
- confirm_destroy:
- confirm_destroy: '¿Segura que quieres cancelar este sorteo?'
- destroy: Cancelar el sorteo
- title: Cancelación del sorteo
- create:
- error: Se ha producido un error al crear un nuevo sorteo.
- success: Sorteo creado correctamente.
- destroy:
- error: No se puede cancelar el sorteo.
- success: Sorteo cancelado correctamente.
- edit:
- title: Actualiza la información sobre el sorteo
- update: Actualizar
- form:
- all_taxonomies: Todas las taxonomías
- select_proposal_component: Selecciona el conjunto de propuestas
- select_taxonomies: Taxonomías del conjunto de propuestas en las que se desea aplicar el sorteo. Dejar en blanco para aplicar el sorteo a todas las propuestas sobre esa taxonomía.
- index:
- title: Sorteos
- new:
- confirm: Al hacer clic en el siguiente botón, la plataforma registrará la fecha y hora (con una precisión de segundos) y el resultado del dado, esta información se utilizará para generar una selección aleatoria. Esta acción será irreversible y, una vez que hayas hecho clic en el botón, se publicará el resultado del sorteo junto con los datos facilitados en el presente formulario y no podrán modificarse. Te pedimos que revises el contenido cuidadosamente.
- create: Crear
- title: Nuevo sorteo
- show:
- selected_proposals: Propuestas seleccionadas para sorteo
- update:
- error: Se ha producido un error al actualizar el sorteo.
- success: Sorteo actualizado correctamente.
- admin_log:
- sortition:
- create: "%{user_name} creó el sorteo %{resource_name} en %{space_name}"
- delete: "%{user_name} canceló el sorteo %{resource_name} en %{space_name}"
- update: "%{user_name} actualizó el sorteo %{resource_name} en %{space_name}"
- sortitions:
- count:
- proposals_count:
- one: 1 propuesta
- other: "%{count} propuestas"
- filters:
- active: Activo
- all: Todas
- cancelled: Cancelado
- category: Categoría
- state: Estado
- index:
- empty: Aún no hay ningún sorteo.
- linked_sortitions:
- selected_proposals: Propuestas seleccionadas
- orders:
- label: 'Ordena los sorteos por:'
- random: Aleatorio
- recent: Reciente
- results_count:
- count:
- one: Propuesta seleccionada
- other: Propuestas seleccionadas
- show:
- algorithm: Código de algoritmo del sorteo
- any_taxonomy: de todas las taxonomías
- cancelled: Sorteo cancelado
- candidate_proposal_ids: Orden e IDs de las propuestas del sorteo
- candidate_proposals_info: 'El sorteo se realizó entre las siguientes propuestas (%{taxonomy_labels}), con los siguientes ID (en negrita las propuestas seleccionadas) '
- dice_result: (1) resultado de los dados
- introduction: 'Esta página contiene los resultados del sorteo %{reference}. Mediante esta clasificación, %{target_items} número de resultados se han seleccionado al azar y con una distribución de probabilidad igual del conjunto de propuestas que se muestran a continuación. Junto con los resultados, la información que se muestra en esta página proporciona toda la información necesaria para maximizar las garantías y reproducir los resultados. La clave de la calidad de esta clasificación es la doble aleatoriedad proporcionada por el lanzamiento de un dado (verificado por testigos) y el momento preciso del sorteo que proporciona la entrada para un algoritmo que genera una selección aleatoria. La semilla de tiempo del sorteo es tan precisa (segundos) que es imposible de controlar por los seres humanos, proporcionando así una doble entrada "incontrolable" para garantizar un resultado justo. '
- mathematical_result: Resultado (1) x (2)
- proposals_selected_by_sortition: Propuestas seleccionadas por sorteo
- sortition_reproducibility_details: Detalles de reproducibilidad del sorteo
- taxonomies: de las taxonomías %{taxonomies}
- time_seed: (2) Semilla de tiempo
- witnesses: Testimonios
- sortition:
- random_seed: Semilla aleatoria
- selected_proposals:
- one: 1 propuesta seleccionada
- other: propuestas seleccionadas
- sortition_author:
- deleted: Participante eliminada
- sortition_cancel_author:
- deleted: Participante eliminada
- sortitions_count:
- count:
- one: 1 sorteo
- other: "%{count} clasificaciones"
- statistics:
- sortitions_count: Sorteos
- sortitions_count_tooltip: El número de selecciones aleatorias realizadas para la toma de decisiones.
diff --git a/decidim-sortitions/config/locales/et-EE.yml b/decidim-sortitions/config/locales/et-EE.yml
deleted file mode 100644
index e020c4ffc443d..0000000000000
--- a/decidim-sortitions/config/locales/et-EE.yml
+++ /dev/null
@@ -1 +0,0 @@
-et:
diff --git a/decidim-sortitions/config/locales/et.yml b/decidim-sortitions/config/locales/et.yml
deleted file mode 100644
index e020c4ffc443d..0000000000000
--- a/decidim-sortitions/config/locales/et.yml
+++ /dev/null
@@ -1 +0,0 @@
-et:
diff --git a/decidim-sortitions/config/locales/eu.yml b/decidim-sortitions/config/locales/eu.yml
deleted file mode 100644
index fbadd3cdf7009..0000000000000
--- a/decidim-sortitions/config/locales/eu.yml
+++ /dev/null
@@ -1,147 +0,0 @@
-eu:
- activemodel:
- attributes:
- sortition:
- additional_info: Zozketari buruzko informazioa
- decidim_proposals_component_id: Proposamen taldea
- dice: Dadoen emaitza. Bota 6 aldeko dado bat edo bilatu beste eraren bat 1etik 6ra bitarteko ausazko zenbaki bat sortzeko eta sartu hemen zenbaki hori hainbat lekukoren aurrean. Horrek emaitzen ausazkotasunaren kalitatea eta bermea lagunduko ditu
- target_items: Aukeratu nahi duzun proposamen kopurua (adierazitako proposamen taldetik zozketaren bidez aukeratu nahi duzun proposamen kopurua ezarri)
- title: Izenburua
- witnesses: Lekukoak
- models:
- decidim/sortitions/create_sortition_event: Zozketa
- activerecord:
- models:
- decidim/sortitions/sortition:
- one: Zozketa
- other: Zozketak
- decidim:
- components:
- sortitions:
- actions:
- comment: Egin iruzkina
- name: Zozketak
- settings:
- global:
- clear_all: Garbitu dena
- comments_enabled: Iruzkinak gaituta
- comments_max_length: Iruzkinen gehieneko luzera (utzi 0 lehenetsita konfigurazioa mantendu nahi baduzu)
- define_taxonomy_filters: Mesedez, zehaztu iragazki batzuk partaidetza-espazio honetarako eszenatoki hau erabili aurretik.
- no_taxonomy_filters_found: Ez da taxonomia-iragazkirik aurkitu.
- taxonomy_filters: Aukeratu iragazkiak osagairako
- taxonomy_filters_add: Erantsi iragazkia
- events:
- sortitions:
- sortition_created:
- email_intro: '"%{resource_title}" zozketa jarraitzen ari zaren "%{participatory_space_title}" espazioan gehitu da.'
- email_outro: Jakinarazpen hau jaso duzu "%{participatory_space_title}" jarraitzen ari zarelako. Aurreko estekan sartu jarraitzeari uzteko.
- email_subject: Beste zozketa bat gehitu da %{participatory_space_title} espaziora
- notification_title: %{resource_title} zozketa %{participatory_space_title} espaziora gehitu da
- sortitions:
- admin:
- actions:
- destroy: Zozketa bertan behera utzi
- edit: Editatu
- new_sortition: Beste zozketa bat
- show: Zozketaren xehetasunak
- title: Ekintzak
- deprecation_warning_html: "⚠️ Deprezazioaren Oharra. Zozketen modulua ezabatuko da Decidim v0.32an. Mesedez, planifikatu eta pentsatu irtenbide alternatiboak parte-hartzailearentzat edo proposamenak hautatzeko."
- models:
- sortition:
- fields:
- created_at: Sortze data
- decidim_proposals_component: Proposamenen osagaia
- dice: Dadoa
- reference: Erreferentzia
- request_timestamp: Zozketa-denbora
- seed: Hazia
- target_items: Aukeratzeko datu-eremuak
- taxonomies: Taxonomiak
- title: Izenburua
- sortitions:
- confirm_destroy:
- confirm_destroy: Ziur al zaude zozketa hau bertan behera utzi nahi duzula?
- destroy: Zozketa bertan behera utzi
- title: Zozketa bertan behera uztea
- create:
- error: Arazo bat gertatu da zozketa berri bat sortzean.
- success: Zozketa ondo sortu da.
- destroy:
- error: Zozketa ezin da bertan behera utzi.
- success: Zozketa bertan behera utzi da.
- edit:
- title: Eguneratu zozketari buruzko informazioa
- update: Eguneratu
- form:
- all_taxonomies: Taxonomia guztiak
- select_proposal_component: Aukeratu proposamenen multzoa
- select_taxonomies: Zozketa aplikatu nahi den proposamen multzoaren taxonomiak. Utzi hutsik zozketa taxonomia horri buruzko proposamen guztiei aplikatzeko.
- index:
- title: Zozketak
- new:
- confirm: Botoia sakatzean plataformak egun eta ordua (segundu gutxi batzuk gora behera) eta dadoak botatzean ateratako zenbakia gorde egingo ditu ausazko hautaketa bat egiteko. Botoia sakatu ondoren ez dago atzera egiterik eta zozketaren emaitzak zein txantiloi honetan sartutako datuak argitaratuko dira eta ezin izango dira aldatu. Beraz, mesedez, arretaz jarraitu.
- create: Sortu
- title: Zozketa berria
- show:
- selected_proposals: Zozketatzeko aukeratutako proposamenak
- update:
- error: Arazo bat sortu da zozketa eguneratzean.
- success: Zozketa zuzen eguneratu da.
- admin_log:
- sortition:
- create: "%{user_name} parte-hartzaileak %{resource_name} zozketa sortu du %{space_name} espazioan"
- delete: "%{user_name} parte-hartzaileak %{resource_name} zozketa bertan behera utzi du %{space_name} espazioan"
- update: "%{user_name} parte-hartzaileak %{resource_name} zozketa eguneratu du %{space_name} espazioan"
- sortitions:
- count:
- proposals_count:
- one: proposamen 1
- other: "Proposamen bat"
- filters:
- active: Aktiboak
- all: Guztiak
- cancelled: Bertan behera
- category: Kategoria
- state: Egoera
- index:
- empty: Oraindik ez dago sailkapenik.
- linked_sortitions:
- selected_proposals: Aukeratutako proposamenak
- orders:
- label: 'Zozketak honen arabera ordenatu:'
- random: Ausazko ordena
- recent: Berrienetatik zaharrenetara
- results_count:
- count:
- one: Hautatutako proposamena
- other: Hautatutako proposamenak
- show:
- algorithm: Zozketaren algoritmoaren kodea
- any_taxonomy: taxonomia guztietatik
- cancelled: Bertan behera utzitako zozketak
- candidate_proposal_ids: Zozketako proposamenen hurrenkera eta IDak
- candidate_proposals_info: 'Zozketa honako proposamenen artean egin zen (%{taxonomy_labels}), honako identifikazio-agiri hauekin (letra lodiz hautatutako proposamenak) '
- dice_result: Dadoen emaitza
- introduction: 'Orrialde honek %{reference} zozketaren emaitzak ditu. Zozketa honen bidez, %{target_items} emaitza kopurua ausaz eta banaketa probabilistiko berdinarekin aukeratu dira proposamen multzotik. Orri honek, emaitzak ezezik, berme guztiak izateko behar den informazioa ere jaso du. Zozketa honen kalitateak bi gako ditu. Alde batetik, dadoa hainbat lekukoren aurrean bota dela. Bestetik, zozketaren une zehatzean sortu den algoritmoak eman duen ausazko hautaketa. Sailkapenerako hazi-denbora hain da zehatza (segunduak) gizakiak ezin baitu hori kontrolatu. Honi esker, bidezko emaitza bermatzen duen sarrera bikoitz "kontrolaezina" sortzen da. '
- mathematical_result: Emaitza (Dadoa x Hazia)
- proposals_selected_by_sortition: Zozketa bidez aukeratutako proposamenak
- sortition_reproducibility_details: Zozketaren errepikagarritasuna
- taxonomies: '%{taxonomies} taxonomietatik'
- time_seed: Denbora hazia
- witnesses: Lekukoak
- sortition:
- random_seed: Ausazkotasun hazia
- selected_proposals:
- one: aukeratutako proposamena
- other: aukeratutako proposamenak
- sortition_author:
- deleted: Ezabatutako parte-hartailea
- sortition_cancel_author:
- deleted: Ezabatutako parte-hartzailea
- sortitions_count:
- count:
- one: Zozketa 1
- other: "%{count} zozketa"
- statistics:
- sortitions_count: Zozketak
- sortitions_count_tooltip: Erabakiak hartzeko egindako ausazko selekzioen kopurua.
diff --git a/decidim-sortitions/config/locales/fa-IR.yml b/decidim-sortitions/config/locales/fa-IR.yml
deleted file mode 100644
index 88215f82cbd5d..0000000000000
--- a/decidim-sortitions/config/locales/fa-IR.yml
+++ /dev/null
@@ -1 +0,0 @@
-fa:
diff --git a/decidim-sortitions/config/locales/fi-pl.yml b/decidim-sortitions/config/locales/fi-pl.yml
deleted file mode 100644
index 582c646ef1d0f..0000000000000
--- a/decidim-sortitions/config/locales/fi-pl.yml
+++ /dev/null
@@ -1,151 +0,0 @@
-fi-pl:
- activemodel:
- attributes:
- sortition:
- additional_info: Satunnaistamistiedot
- decidim_category_id: Ehdotettujen ehdotusten luokat, joissa haluat tehdä satunnaisvalinnan
- decidim_proposals_component_id: Ehdotukset asetettu
- dice: Noppaheiton tulos. Heitä kuusisivuista noppaa tai etsi toinen tapa luoda satunnaisesti numero 1-6, ja kirjoita tähän tuloksena saatu luku muutamien todistajien edessä. Tämä auttaa takamaan tuloksen satunnaisuuden
- target_items: Valittavien ehdotusten määrä (ilmoittaa niiden ehdotusten lukumäärän, jotka haluat valita arpomalla kustakin aiemmin valitsemastasi ehdotusryhmästä)
- title: Otsikko
- witnesses: Todistajat
- models:
- decidim/sortitions/create_sortition_event: Satunnaistaminen
- activerecord:
- models:
- decidim/sortitions/sortition:
- one: Satunnaistaminen
- other: Satunnaistamiset
- decidim:
- components:
- sortitions:
- name: Satunnaistamiset
- settings:
- global:
- comments_enabled: Kommentointi sallittu
- events:
- sortitions:
- sortition_created:
- email_intro: Satunnaisvalinta "%{resource_title}" on lisätty kohteeseen "%{participatory_space_title}" jota sinä seuraat.
- email_outro: Tämä ilmoitus on lähetetty sinulle, koska seuraat kohdetta "%{participatory_space_title}". Voit lopettaa seuraamisen edellä esitetyn linkin kautta.
- email_subject: Uusi satunnaistaminen lisättiin kohteeseen %{participatory_space_title}
- notification_title: Satunnaistaminen %{resource_title} on lisätty kohteeseen %{participatory_space_title}
- pages:
- home:
- statistics:
- sortitions_count: Satunnaistamiset
- participatory_processes:
- statistics:
- sortitions_count: Satunnaistamisia
- sortitions:
- admin:
- actions:
- destroy: Peruuta satunnaistaminen
- edit: Muokkaa
- new: Uusi satunnaistaminen
- show: Satunnaistamisen yksityiskohdat
- models:
- sortition:
- fields:
- category: Luokka
- created_at: Luomispäivä
- decidim_proposals_component: Ehdotusten osa
- dice: Noppa
- reference: Viite
- request_timestamp: Satunnaistamisen aika
- seed: Jako
- target_items: Valittavat kohteet
- title: Otsikko
- name:
- one: Satunnaistaminen
- other: Satunnaistamiset
- sortitions:
- confirm_destroy:
- confirm_destroy: Haluatko varmasti peruuttaa tämän satunnaistamisen?
- destroy: Peruuta satunnaistaminen
- title: Satunnaistamisen peruuttaminen
- create:
- error: Uuden satunnaisvalinnan luomisessa tapahtui virhe.
- success: Satunnaisvalinta onnistuneesti luotu
- destroy:
- error: Satunnaisvalintaa ei voi peruuttaa.
- success: Satunnaisvalinta onnistuneesti peruutettu
- edit:
- title: Päivitä satunnaisvalinnan tiedot
- update: Päivitä
- form:
- all_categories: Kaikki luokat
- select_proposal_component: Valitse asetetut ehdotukset
- title: Uusi satunnaisvalinta ehdotuksille
- index:
- title: Satunnaisvalinnat
- new:
- confirm: Painamalla seuraavaa painiketta Decidim tallentaa päivämäärän ja kellonajan (sekuntien tarkkuudella) ja yhdessä nopan heiton kanssa näitä tietoja käytetään satunnaisvalinnan luomiseen. Toimenpide on peruuttamaton, kun painiketta painetaan valinnan tulos julkaistaan yhdessä tämän lomakkeen tietojen kanssa eikä sitä voi muuttaa, tarkista sisältö huolellisesti
- create: Luo
- title: Uusi satunnaisvalinta
- show:
- selected_proposals: Valintaan valitut ehdotukset
- update:
- error: Satunnaisvalinnan päivittämisessä tapahtui virhe.
- success: Satunnaisvalinta onnistuneesti päivitetty
- admin_log:
- sortition:
- create: "%{user_name} loi satunnaisvalinnan %{resource_name} kohtaan %{space_name}"
- delete: "%{user_name} peruutti satunnaisvalinnan %{resource_name} kohdassa %{space_name}"
- update: "%{user_name} päivitti satunnaisvalinnan %{resource_name} kohdassa %{space_name}"
- sortitions:
- count:
- proposals_count:
- one: 1 ehdotus
- other: "%{count} ehdotusta"
- filters:
- active: Aktiivinen
- all: Kaikki
- cancelled: Peruttu
- category: Aihepiiri
- category_prompt: Valitse aihepiiri
- search: Hae
- state: Tila
- filters_small_view:
- close_modal: Sulje ikkuna
- filter: Rajaa
- filter_by: Rajaa hakua
- unfold: Avaa
- linked_sortitions:
- selected_proposals: Valitut ehdotukset
- orders:
- label: 'Järjestä satunnaisvalinnat:'
- random: Satunnainen
- recent: Viimeisimmät
- results_count:
- count:
- one: valittu ehdotus
- other: valitut ehdotukset
- show:
- algorithm: Satunnaisvalinnan algoritmikoodi
- any_category: kaikista aihepiireistä
- cancelled: Peruttu satunnaisvalinta
- candidate_proposal_ids: Satunnaisvalintaehdotusten järjestys ja tunnukset
- candidate_proposals_info: 'Satunnaisvalinta tehtiin seuraavien ehdotusten (%{category_label}) välillä, seuraavilla tunnuksilla (lihavoituna valitut ehdotukset) '
- category: aihepiiristä %{category}
- dice_result: "(1) Noppatulos"
- introduction: 'Tämä sivu sisältää satunnaisvalinnan tulokset %{reference}. Tämän satunnaisvalinnan avulla %{target_items} tulosten määrä on valittu satunnaisesti ja yhtäläisellä todennäköisyysjakaumalla alla esitetyistä ehdotuksista. Yhdessä tulosten kanssa tällä sivulla näkyvät tiedot tarjoavat kaikki tarvittavat tiedot takuiden maksimoimiseksi ja tulosten toisintamiseksi. Tämän järjestelyn laadun avain on kaksinkertainen satunnaisuus, jonka antaa noppan heitto (todistajien todistama) ja täsmällinen ajankohta, joka antaa syötteen algoritmille, joka tuottaa satunnaisen valinnan. Kokoonpanon aika-jako on niin tarkka (sekuntia), että ihmisten on mahdotonta hallita sitä, jolloin saadaan kaksinkertainen "hallitsematon" syöte oikeudenmukaisen tuloksen takaamiseksi. '
- mathematical_result: Tulos (1) x (2)
- proposals_selected_by_sortition: Ehdotukset, jotka on valittu satunnaisvalinnassa
- sortition_reproducibility_details: Satunnaisvalinnan toisinnettavuustiedot
- time_seed: "(2) Aikajako"
- witnesses: Todistajat
- sortition:
- random_seed: Satunnainen jako
- selected_proposals:
- one: ehdotus valittu
- other: '%{count} ehdotusta valittu'
- view: Näytä
- sortition_author:
- deleted: Poistettu käyttäjä
- sortition_cancel_author:
- deleted: Poistettu käyttäjä
- sortitions_count:
- count:
- one: 1 satunnaisvalinta
- other: "%{count} satunnaisvalintaa"
diff --git a/decidim-sortitions/config/locales/fi-plain.yml b/decidim-sortitions/config/locales/fi-plain.yml
deleted file mode 100644
index c47ccdc985d82..0000000000000
--- a/decidim-sortitions/config/locales/fi-plain.yml
+++ /dev/null
@@ -1,147 +0,0 @@
-fi-pl:
- activemodel:
- attributes:
- sortition:
- additional_info: Satunnaistamistiedot
- decidim_proposals_component_id: Ehdotukset asetettu
- dice: Noppaheiton tulos. Heitä kuusisivuista noppaa tai etsi toinen tapa luoda satunnaisesti numero 1-6, ja kirjoita tähän tuloksena saatu luku muutamien todistajien edessä. Tämä auttaa takamaan tuloksen satunnaisuuden
- target_items: Valittavien ehdotusten määrä (ilmoittaa niiden ehdotusten lukumäärän, jotka haluat valita arpomalla kustakin aiemmin valitsemastasi ehdotusryhmästä)
- title: Otsikko
- witnesses: Todistajat
- models:
- decidim/sortitions/create_sortition_event: Satunnaistaminen
- activerecord:
- models:
- decidim/sortitions/sortition:
- one: Satunnaistaminen
- other: Satunnaistamiset
- decidim:
- components:
- sortitions:
- actions:
- comment: Kommentoi
- name: Satunnaistamiset
- settings:
- global:
- clear_all: Tyhjennä kaikki
- comments_enabled: Kommentointi sallittu
- comments_max_length: Kommenttien maksimipituus (jätä arvoksi 0 käyttääksesi oletusarvoa)
- define_taxonomy_filters: Määritä osallistumistilalle suodattimia ennen kuin käytät tätä asetusta.
- no_taxonomy_filters_found: Luokittelusuodattimia ei löytynyt.
- taxonomy_filters: Valitse suodattimet komponentille
- taxonomy_filters_add: Lisää suodatin
- events:
- sortitions:
- sortition_created:
- email_intro: Satunnaisvalinta "%{resource_title}" on lisätty kohteeseen "%{participatory_space_title}" jota sinä seuraat.
- email_outro: Tämä ilmoitus on lähetetty sinulle, koska seuraat kohdetta "%{participatory_space_title}". Voit lopettaa seuraamisen edellä esitetyn linkin kautta.
- email_subject: Uusi satunnaistaminen lisättiin kohteeseen %{participatory_space_title}
- notification_title: Satunnaistaminen %{resource_title} on lisätty kohteeseen %{participatory_space_title}
- sortitions:
- admin:
- actions:
- destroy: Peruuta satunnaistaminen
- edit: Muokkaa
- new_sortition: Uusi satunnaisvalinta
- show: Satunnaistamisen yksityiskohdat
- title: Toiminnot
- deprecation_warning_html: "⚠️ Poistamisilmoitus Satunnaisvalinta-moduuli poistetaan Decidim-alustan versiossa 0.32. Suunnittele toimintatapasi tämän mukaisesti ja harkitse vaihtoehtoisia tapoja osallistujien tai ehdotusten valitsemiseksi."
- models:
- sortition:
- fields:
- created_at: Luomispäivä
- decidim_proposals_component: Ehdotusten osa
- dice: Noppa
- reference: Viite
- request_timestamp: Satunnaistamisen aika
- seed: Jako
- target_items: Valittavat kohteet
- taxonomies: Luokittelut
- title: Otsikko
- sortitions:
- confirm_destroy:
- confirm_destroy: Haluatko varmasti peruuttaa tämän satunnaistamisen?
- destroy: Peruuta satunnaistaminen
- title: Satunnaistamisen peruuttaminen
- create:
- error: Uuden satunnaisvalinnan luomisessa tapahtui virhe.
- success: Satunnaisvalinnan luonti onnistui.
- destroy:
- error: Satunnaisvalintaa ei voi peruuttaa.
- success: Satunnaisvalinnan peruuttaminen onnistui.
- edit:
- title: Päivitä satunnaisvalinnan tiedot
- update: Päivitä
- form:
- all_taxonomies: Kaikki luokittelut
- select_proposal_component: Valitse asetetut ehdotukset
- select_taxonomies: Luokittelut niille ehdotuksille, jotka haluat sisällyttää satunnaisvalintaan. Jätä tyhjäksi, mikäli haluat kaikki ehdotukset kullekin luokittelulle.
- index:
- title: Satunnaisvalinnat
- new:
- confirm: Kun painat painiketta, palvelin tallentaa päivämäärän ja kellonajan (sekunnin tarkkuudella) ja näitä tietoja käytetään yhdessä nopanheiton kanssa satunnaisen valinnan luomiseen. Toimintoa ei voi peruuttaa. Kun painiketta painetaan, arvonnan tulos julkaistaan tähän lomakkeeseen syötettyjen tietojen kanssa. Tietoja ei voi muuttaa jälkikäteen, joten tarkista sisältö huolellisesti.
- create: Luo
- title: Uusi satunnaisvalinta
- show:
- selected_proposals: Valintaan valitut ehdotukset
- update:
- error: Satunnaisvalinnan päivittämisessä tapahtui virhe.
- success: Satunnaisvalinnan päivitys onnistui.
- admin_log:
- sortition:
- create: "%{user_name} loi satunnaisvalinnan %{resource_name} kohtaan %{space_name}"
- delete: "%{user_name} peruutti satunnaisvalinnan %{resource_name} kohdassa %{space_name}"
- update: "%{user_name} päivitti satunnaisvalinnan %{resource_name} kohdassa %{space_name}"
- sortitions:
- count:
- proposals_count:
- one: 1 ehdotus
- other: "%{count} ehdotusta"
- filters:
- active: Aktiivinen
- all: Kaikki
- cancelled: Peruttu
- category: Aihepiiri
- state: Tila
- index:
- empty: Satunnaisvalintoja ei vielä ole.
- linked_sortitions:
- selected_proposals: Valitut ehdotukset
- orders:
- label: 'Järjestä satunnaisvalinnat:'
- random: Satunnainen
- recent: Viimeisimmät
- results_count:
- count:
- one: valittu ehdotus
- other: valitut ehdotukset
- show:
- algorithm: Satunnaisvalinnan algoritmikoodi
- any_taxonomy: kaikista luokitteluista
- cancelled: Peruttu satunnaisvalinta
- candidate_proposal_ids: Satunnaisvalintaehdotusten järjestys ja tunnukset
- candidate_proposals_info: 'Satunnaisvalinta tehtiin seuraavien ehdotusten (%{taxonomy_labels}) välillä, seuraavilla tunnisteilla (valitut ehdotukset lihavoituna) '
- dice_result: (1) Noppatulos
- introduction: 'Tämä sivu sisältää satunnaisvalinnan tulokset %{reference}. Tämän satunnaisvalinnan avulla %{target_items} tulosten määrä on valittu satunnaisesti ja yhtäläisellä todennäköisyysjakaumalla alla esitetyistä ehdotuksista. Yhdessä tulosten kanssa tällä sivulla näkyvät tiedot tarjoavat kaikki tarvittavat tiedot takuiden maksimoimiseksi ja tulosten toisintamiseksi. Tämän järjestelyn laadun avain on kaksinkertainen satunnaisuus, jonka antaa noppan heitto (todistajien todistama) ja täsmällinen ajankohta, joka antaa syötteen algoritmille, joka tuottaa satunnaisen valinnan. Kokoonpanon aika-jako on niin tarkka (sekuntia), että ihmisten on mahdotonta hallita sitä, jolloin saadaan kaksinkertainen "hallitsematon" syöte oikeudenmukaisen tuloksen takaamiseksi. '
- mathematical_result: Tulos (1) x (2)
- proposals_selected_by_sortition: Ehdotukset, jotka on valittu satunnaisvalinnassa
- sortition_reproducibility_details: Satunnaisvalinnan toisinnettavuustiedot
- taxonomies: luokitteluista %{taxonomies}
- time_seed: (2) Aikajako
- witnesses: Todistajat
- sortition:
- random_seed: Satunnainen jako
- selected_proposals:
- one: ehdotus valittu
- other: '%{count} ehdotusta valittu'
- sortition_author:
- deleted: Poistettu käyttäjä
- sortition_cancel_author:
- deleted: Poistettu käyttäjä
- sortitions_count:
- count:
- one: 1 satunnaisvalinta
- other: "%{count} satunnaisvalintaa"
- statistics:
- sortitions_count: Satunnaistamista
- sortitions_count_tooltip: Päätöksentekoa varten tehtyjen satunnaisvalintojen lukumäärä.
diff --git a/decidim-sortitions/config/locales/fi.yml b/decidim-sortitions/config/locales/fi.yml
deleted file mode 100644
index 9e010bc524dcf..0000000000000
--- a/decidim-sortitions/config/locales/fi.yml
+++ /dev/null
@@ -1,147 +0,0 @@
-fi:
- activemodel:
- attributes:
- sortition:
- additional_info: Satunnaisvalinnan tiedot
- decidim_proposals_component_id: Ehdotusten joukko
- dice: Noppaheiton tulos. Heitä kuusisivuista noppaa tai etsi toinen tapa luoda satunnaisesti numero 1-6, ja kirjoita tähän tuloksena saatu luku muutamien todistajien edessä. Tämä auttaa takamaan tuloksen satunnaisuuden
- target_items: Valittavien ehdotusten määrä (ilmoittaa niiden ehdotusten lukumäärän, jotka haluat valita arpomalla kustakin aiemmin valitsemastasi ehdotusjoukosta)
- title: Otsikko
- witnesses: Todistajat
- models:
- decidim/sortitions/create_sortition_event: Satunnaisvalinta
- activerecord:
- models:
- decidim/sortitions/sortition:
- one: Satunnaisvalinta
- other: Satunnaisvalinnat
- decidim:
- components:
- sortitions:
- actions:
- comment: Kommentoi
- name: Satunnaisvalinnat
- settings:
- global:
- clear_all: Tyhjennä kaikki
- comments_enabled: Kommentointi sallittu
- comments_max_length: Kommenttien maksimipituus (jätä arvoksi 0 käyttääksesi oletusarvoa)
- define_taxonomy_filters: Määritä osallistumistilalle suodattimia ennen kuin käytät tätä asetusta.
- no_taxonomy_filters_found: Luokittelusuodattimia ei löytynyt.
- taxonomy_filters: Valitse suodattimet komponentille
- taxonomy_filters_add: Lisää suodatin
- events:
- sortitions:
- sortition_created:
- email_intro: Satunnaisvalinta "%{resource_title}" on lisätty kohteeseen "%{participatory_space_title}" jota sinä seuraat.
- email_outro: Tämä ilmoitus on lähetetty sinulle, koska seuraat kohdetta "%{participatory_space_title}". Voit lopettaa seuraamisen edellä esitetyn linkin kautta.
- email_subject: Uusi satunnaisvalinta lisättiin kohteeseen %{participatory_space_title}
- notification_title: Satunnaisvalinta %{resource_title} on lisätty kohteeseen %{participatory_space_title}
- sortitions:
- admin:
- actions:
- destroy: Peru satunnaisvalinta
- edit: Muokkaa
- new_sortition: Uusi satunnaisvalinta
- show: Satunnaisvalinnan tarkemmat tiedot
- title: Toiminnot
- deprecation_warning_html: "⚠️ Poistamisilmoitus Satunnaisvalinta-moduuli poistetaan Decidim-alustan versiossa 0.32. Suunnittele toimintatapasi tämän mukaisesti ja harkitse vaihtoehtoisia tapoja osallistujien tai ehdotusten valitsemiseksi."
- models:
- sortition:
- fields:
- created_at: Luomispäivä
- decidim_proposals_component: Ehdotusten osa
- dice: Noppa
- reference: Viite
- request_timestamp: Satunnaistamisen aika
- seed: Jako
- target_items: Valittavat kohteet
- taxonomies: Luokittelut
- title: Otsikko
- sortitions:
- confirm_destroy:
- confirm_destroy: Haluatko varmasti perua tämän satunnaisvalinnan?
- destroy: Peru satunnaisvalinta
- title: Satunnaisvalinnan peruminen
- create:
- error: Uuden satunnaisvalinnan luonti epäonnistui.
- success: Satunnaisvalinnan luonti onnistui.
- destroy:
- error: Satunnaisvalintaa ei voi perua.
- success: Satunnaisvalinnan peruminen onnistui.
- edit:
- title: Päivitä satunnaisvalinnan tiedot
- update: Päivitä
- form:
- all_taxonomies: Kaikki luokittelut
- select_proposal_component: Valitse asetetut ehdotukset
- select_taxonomies: Luokittelut niille ehdotuksille, jotka haluat sisällyttää satunnaisvalintaan. Jätä tyhjäksi, mikäli haluat kaikki ehdotukset kullekin luokittelulle.
- index:
- title: Satunnaisvalinnat
- new:
- confirm: Kun painat painiketta, palvelin tallentaa päivämäärän ja kellonajan (sekunnin tarkkuudella) ja näitä tietoja käytetään yhdessä nopanheiton tuloksen kanssa satunnaisen valinnan luomiseen. Toimintoa ei voi perua. Kun painiketta painetaan, arvonnan tulos julkaistaan tähän lomakkeeseen syötettyjen tietojen kanssa. Tietoja ei voi muuttaa jälkikäteen, joten tarkista sisältö huolellisesti.
- create: Luo
- title: Uusi satunnaisvalinta
- show:
- selected_proposals: Valintaan valitut ehdotukset
- update:
- error: Satunnaisvalinnan päivitys epäonnistui.
- success: Satunnaisvalinnan päivitys onnistui.
- admin_log:
- sortition:
- create: "%{user_name} loi satunnaisvalinnan %{resource_name} kohtaan %{space_name}"
- delete: "%{user_name} perui satunnaisvalinnan %{resource_name} tilassa %{space_name}"
- update: "%{user_name} päivitti satunnaisvalinnan %{resource_name} kohdassa %{space_name}"
- sortitions:
- count:
- proposals_count:
- one: 1 ehdotus
- other: "%{count} ehdotusta"
- filters:
- active: Aktiivinen
- all: Kaikki
- cancelled: Peruttu
- category: Aihepiiri
- state: Tila
- index:
- empty: Satunnaisvalintoja ei vielä ole.
- linked_sortitions:
- selected_proposals: Valitut ehdotukset
- orders:
- label: 'Järjestä satunnaisvalinnat:'
- random: Satunnainen
- recent: Viimeisimmät
- results_count:
- count:
- one: Valittu ehdotus
- other: Valitut ehdotukset
- show:
- algorithm: Satunnaisvalinnan algoritmikoodi
- any_taxonomy: kaikista luokitteluista
- cancelled: Peruttu satunnaisvalinta
- candidate_proposal_ids: Satunnaisvalinnan ehdotusten järjestys ja tunnukset
- candidate_proposals_info: 'Satunnaisvalinta tehtiin seuraavien ehdotusten (%{taxonomy_labels}) välillä, seuraavilla tunnisteilla (valitut ehdotukset lihavoituna) '
- dice_result: Nopanheiton tulos
- introduction: 'Tämä sivu sisältää satunnaisvalinnan tulokset %{reference}. Tämän satunnaisvalinnan avulla %{target_items} tulosten määrä on valittu satunnaisesti ja yhtäläisellä todennäköisyysjakaumalla alla esitetyistä ehdotuksista. Yhdessä tulosten kanssa tällä sivulla näkyvät tiedot tarjoavat kaikki tarvittavat tiedot takuiden maksimoimiseksi ja tulosten toisintamiseksi. Tämän järjestelyn laadun avain on kaksinkertainen satunnaisuus, jonka antaa noppan heitto (todistajien todistama) ja täsmällinen ajankohta, joka antaa syötteen algoritmille, joka tuottaa satunnaisen valinnan. Kokoonpanon aika-jako on niin tarkka (sekuntia), että ihmisten on mahdotonta hallita sitä, jolloin saadaan kaksinkertainen "hallitsematon" syöte oikeudenmukaisen tuloksen takaamiseksi. '
- mathematical_result: Tulos (nopanheitto x satunnaisarvo)
- proposals_selected_by_sortition: Ehdotukset, jotka on valittu satunnaisvalinnassa
- sortition_reproducibility_details: Satunnaisvalinnan toisinnettavuustiedot
- taxonomies: luokitteluista %{taxonomies}
- time_seed: Aikasyöte
- witnesses: Todistajat
- sortition:
- random_seed: Satunnainen jako
- selected_proposals:
- one: ehdotus valittu
- other: ehdotuksia valittu
- sortition_author:
- deleted: Poistettu käyttäjä
- sortition_cancel_author:
- deleted: Poistettu käyttäjä
- sortitions_count:
- count:
- one: 1 satunnaisvalinta
- other: "%{count} satunnaisvalintaa"
- statistics:
- sortitions_count: Satunnaisvalintaa
- sortitions_count_tooltip: Päätöksentekoa varten tehtyjen satunnaisvalintojen lukumäärä.
diff --git a/decidim-sortitions/config/locales/fr-CA.yml b/decidim-sortitions/config/locales/fr-CA.yml
deleted file mode 100644
index 93c4b405e36df..0000000000000
--- a/decidim-sortitions/config/locales/fr-CA.yml
+++ /dev/null
@@ -1,139 +0,0 @@
-fr-CA:
- activemodel:
- attributes:
- sortition:
- additional_info: Information sur le tirage au sort
- decidim_proposals_component_id: Ensemble de propositions
- dice: Résultat de votre tirage au dé. Tirez au sort un nombre de 1 à 6, soit à l'aide d'un dé à 6 faces soit par tout autre moyen, et entrez ici le nombre obtenu devant témoin(s). Cette procédure contribue à garantir la sincérité et le caractère aléatoire du résultat.
- target_items: Nombre de propositions à sélectionner (indique le nombre de propositions que vous voulez tirer au sort parmi celles du groupe de propositions que vous avez choisi précédemment)
- title: Titre
- witnesses: Témoins
- models:
- decidim/sortitions/create_sortition_event: Tirage au sort
- activerecord:
- models:
- decidim/sortitions/sortition:
- one: Tirage au sort
- other: Tirages au sort
- decidim:
- components:
- sortitions:
- actions:
- comment: Commenter
- name: Tirages au sort
- settings:
- global:
- clear_all: Effacer tout
- comments_enabled: Commentaires activés
- comments_max_length: Longueur max des commentaires (laisser 0 pour la valeur par défaut)
- taxonomy_filters: Sélectionner les filtres pour le composant
- taxonomy_filters_add: Ajouter un filtre
- events:
- sortitions:
- sortition_created:
- email_intro: Le tirage au sort "%{resource_title}" a été ajouté à "%{participatory_space_title}" que vous suivez.
- email_outro: Vous avez reçu cette notification car vous suivez "%{participatory_space_title}". Vous pouvez à tout moment ne plus suivre cet espace participatif en cliquant sur le lien précédent.
- email_subject: Un nouveau tirage au sort vient d'être ajouté à %{participatory_space_title}
- notification_title: Le tirage au sort %{resource_title} a été ajouté à %{participatory_space_title}
- sortitions:
- admin:
- actions:
- destroy: Annuler le tirage au sort
- edit: Éditer
- new_sortition: Nouveau tirage au sort
- show: Détails du tirage au sort
- title: Actions
- deprecation_warning_html: "⚠️ Avis de dépréciation. Le module « Tirages au sort » sera supprimé dans Decidim v0.32. Veuillez planifier en conséquence et envisager des solutions alternatives pour la sélection des participants ou des propositions."
- models:
- sortition:
- fields:
- created_at: Date de création
- decidim_proposals_component: Module de propositions
- dice: Dé
- reference: Référence
- request_timestamp: Date et heure
- seed: Valeur aléatoire
- target_items: Éléments à sélectionner
- title: Titre
- sortitions:
- confirm_destroy:
- confirm_destroy: Êtes-vous sûr de vouloir annuler ce tirage au sort ?
- destroy: Annuler le tirage au sort
- title: Annulation du tirage au sort
- create:
- error: Une erreur s'est produite lors de la création d'un nouveau tirage au sort.
- success: Le tirage au sort a été créé avec succès.
- destroy:
- error: Impossible d'annuler le tirage au sort.
- success: Le tirage au sort a été annulé avec succès.
- edit:
- title: Mettre à jour les informations sur le tirage au sort
- update: Mettre à jour
- form:
- select_proposal_component: Sélectionnez un ensemble de propositions
- index:
- title: Tirages au sort
- new:
- confirm: En appuyant sur le bouton suivant, la plateforme enregistra la date et l'heure (à la seconde près) et, avec le résultat du dé, cette information sera utilisée pour générer une sélection aléatoire. L'action sera irréversible, une fois le bouton cliqué, le résultat de ce tirage sera publié, ainsi que les données saisies dans ce formulaire et ne pourront pas être modifiées, veuillez vérifier attentivement le contenu.
- create: Créer
- title: Nouveau tirage au sort
- show:
- selected_proposals: Propositions sélectionnées pour le tirage au sort
- update:
- error: Une erreur est survenue lors de la mise à jour du tirage au sort.
- success: Le tirage au sort a bien été mis à jour.
- admin_log:
- sortition:
- create: "%{user_name} a créé le tirage au sort %{resource_name} dans %{space_name}"
- delete: "%{user_name} a annulé le tirage au sort %{resource_name} dans %{space_name}"
- update: "%{user_name} a mis à jour le tirage au sort %{resource_name} dans %{space_name}"
- sortitions:
- count:
- proposals_count:
- one: 1 proposition
- other: "%{count} propositions"
- filters:
- active: Actif
- all: Tout
- cancelled: Annulé
- category: Catégorie
- state: État
- index:
- empty: Il n'y a pas encore de tirage au sort.
- linked_sortitions:
- selected_proposals: Propositions sélectionnées
- orders:
- label: 'Trier les tirages au sort par :'
- random: Aléatoire
- recent: Récent
- results_count:
- count:
- one: proposition sélectionnée
- other: propositions sélectionnées
- show:
- algorithm: Code de l'algorithme de tirage au sort
- cancelled: Tirage au sort annulé
- candidate_proposal_ids: Ordre des propositions du tirage au sort et identifiants
- dice_result: (1) Résultat du tirage de dé
- introduction: 'Cette page contient le résultat du tirage au sort %{reference}. Avec le tirage au sort, %{target_items} éléments ont été sélectionnés aléatoirement et avec une distribution de probabilité égale à partir de l''ensemble des propositions affichées ci-dessous. En plus du résultat, cette page fournit toutes les informations nécessaires pour maximiser les garanties et permettre de reproduire le résultat. Le tirage au sort résulte d''un double hasard fourni par le lancer d''un dé (vérifié par des témoins) et l''heure précise du tirage au sort, qui fournit l''entrée pour un algorithme qui génère une sélection aléatoire. La variable temporelle pour le tirage est si précise (de l''ordre de la seconde) qu''il est impossible de la contrôler par des humains fournissant ainsi une double entrée "infalsifiable" pour garantir un résultat juste. '
- mathematical_result: Résultat (1) x (2)
- proposals_selected_by_sortition: Propositions sélectionnées par tirage au sort
- sortition_reproducibility_details: Détails de reproductibilité du tirage au sort
- time_seed: (2) Date et Heure
- witnesses: Témoins
- sortition:
- random_seed: Valeur aléatoire
- selected_proposals:
- one: proposition sélectionnée
- other: '%{count} propositions sélectionnées'
- sortition_author:
- deleted: Utilisateur supprimé
- sortition_cancel_author:
- deleted: Utilisateur supprimé
- sortitions_count:
- count:
- one: 1 tirage au sort
- other: "%{count} tirages au sort"
- statistics:
- sortitions_count: Tirages au sort
- sortitions_count_tooltip: Le nombre de tirages au sort réalisés dans le cadre du processus décisionnel.
diff --git a/decidim-sortitions/config/locales/fr-LU.yml b/decidim-sortitions/config/locales/fr-LU.yml
deleted file mode 100644
index e9754d879f35c..0000000000000
--- a/decidim-sortitions/config/locales/fr-LU.yml
+++ /dev/null
@@ -1,146 +0,0 @@
-fr-LU:
- activemodel:
- attributes:
- sortition:
- additional_info: Information sur le tirage au sort
- decidim_category_id: Catégories des propositions sur lesquelles vous souhaitez appliquer le tirage au sort
- decidim_proposals_component_id: Ensemble de propositions
- dice: Résultat de votre tirage au dé. Tirez au sort un nombre de 1 à 6, soit à l'aide d'un dé à 6 faces soit par tout autre moyen, et entrez ici le nombre obtenu devant témoin(s). Cette procédure contribue à garantir la sincérité et le caractère aléatoire du résultat.
- target_items: Nombre de propositions à sélectionner (indique le nombre de propositions que vous voulez tirer au sort parmi celles du groupe de propositions que vous avez choisi précédemment)
- title: Titre
- witnesses: Témoins
- models:
- decidim/sortitions/create_sortition_event: Tirage au sort
- activerecord:
- models:
- decidim/sortitions/sortition:
- one: Tirage au sort
- other: Tirages au sort
- decidim:
- components:
- sortitions:
- name: Tirages au sort
- settings:
- global:
- comments_enabled: Commentaires activés
- comments_max_length: Longueur max des commentaires (laisser 0 pour la valeur par défaut)
- events:
- sortitions:
- sortition_created:
- email_intro: Le tirage au sort "%{resource_title}" a été ajouté à "%{participatory_space_title}" que vous suivez.
- email_outro: Vous avez reçu cette notification car vous suivez "%{participatory_space_title}". Vous pouvez à tout moment ne plus suivre cet espace participatif en cliquant sur le lien précédent.
- email_subject: Un nouveau tirage au sort vient d'être ajouté à %{participatory_space_title}
- notification_title: Le tirage au sort %{resource_title} a été ajouté à %{participatory_space_title}
- sortitions:
- admin:
- actions:
- destroy: Annuler le tirage au sort
- edit: Éditer
- new: Nouveau tirage au sort
- show: Détails du tirage au sort
- models:
- sortition:
- fields:
- category: Catégorie
- created_at: Date de création
- decidim_proposals_component: Module de propositions
- dice: Dé
- reference: Référence
- request_timestamp: Date et heure
- seed: Valeur aléatoire
- target_items: Éléments à sélectionner
- title: Titre
- name:
- one: Tirage au sort
- other: Tirages au sort
- sortitions:
- confirm_destroy:
- confirm_destroy: Êtes-vous sûr de vouloir annuler ce tirage au sort ?
- destroy: Annuler le tirage au sort
- title: Annulation du tirage au sort
- create:
- error: Une erreur s'est produite lors de la création d'un nouveau tirage au sort.
- success: Le tirage au sort a été créé avec succès
- destroy:
- error: Impossible d'annuler le tirage au sort.
- success: Le tirage au sort a été annulé avec succès
- edit:
- title: Mettre à jour les informations sur le tirage au sort
- update: Mettre à jour
- form:
- all_categories: Toutes les catégories
- select_proposal_component: Sélectionnez un ensemble de propositions
- title: Nouveau tirage au sort de propositions
- index:
- title: Tirages au sort
- new:
- confirm: 'En appuyant sur le bouton suivant, Decidim enregistrera la date et l''heure à la seconde près et, en association avec le résultat du tirage de dé, générera un choix aléatoire. Cette action est irréversible : une fois que vous aurez cliqué sur le bouton, le résultat du tirage ainsi que les données saisies dans le formulaire seront publiés et ne pourront pas être modifiés. Veillez donc bien à vérifier les informations renseignées en amont'
- create: Créer
- title: Nouveau tirage au sort
- show:
- selected_proposals: Propositions sélectionnées pour le tirage au sort
- update:
- error: Une erreur est survenue lors de la mise à jour du tirage au sort.
- success: Le tirage au sort a bien été mis à jour
- admin_log:
- sortition:
- create: "%{user_name} a créé le tirage au sort %{resource_name} dans %{space_name}"
- delete: "%{user_name} a annulé le tirage au sort %{resource_name} dans %{space_name}"
- update: "%{user_name} a mis à jour le tirage au sort %{resource_name} dans %{space_name}"
- sortitions:
- count:
- proposals_count:
- one: 1 proposition
- other: "%{count} propositions"
- filters:
- active: Actif
- all: Tout
- cancelled: Annulé
- category: Catégorie
- category_prompt: Sélectionner une catégorie
- search: Rechercher
- state: État
- filters_small_view:
- close_modal: Fermer la fenêtre de dialogue
- filter: Filtrer
- filter_by: Filtrer par
- unfold: Dérouler
- linked_sortitions:
- selected_proposals: Propositions sélectionnées
- orders:
- label: 'Trier les tirages au sort par :'
- random: Aléatoire
- recent: Récent
- results_count:
- count:
- one: proposition sélectionnée
- other: propositions sélectionnées
- show:
- algorithm: Code de l'algorithme de tirage au sort
- any_category: toutes les catégories
- back: Retour à la liste
- cancelled: Tirage au sort annulé
- candidate_proposal_ids: Ordre des propositions du tirage au sort et identifiants
- candidate_proposals_info: 'Le tirage au sort a été effectué parmi les propositions suivantes (%{category_label}), avec les identifiants suivants (en gras les propositions sélectionnées) '
- category: de la catégorie %{category}
- dice_result: "(1) Résultat du tirage de dé"
- introduction: 'Cette page contient le résultat du tirage au sort %{reference}. Avec le tirage au sort, %{target_items} éléments ont été sélectionnés aléatoirement et avec une distribution de probabilité égale à partir de l''ensemble des propositions affichées ci-dessous. En plus du résultat, cette page fournit toutes les informations nécessaires pour maximiser les garanties et permettre de reproduire le résultat. Le tirage au sort résulte d''un double hasard fourni par le lancer d''un dé (vérifié par des témoins) et l''heure précise du tirage au sort, qui fournit l''entrée pour un algorithme qui génère une sélection aléatoire. La variable temporelle pour le tirage est si précise (de l''ordre de la seconde) qu''il est impossible de la contrôler par des humains fournissant ainsi une double entrée "infalsifiable" pour garantir un résultat juste. '
- mathematical_result: Résultat (1) x (2)
- proposals_selected_by_sortition: Propositions sélectionnées par tirage au sort
- sortition_reproducibility_details: Détails de reproductibilité du tirage au sort
- time_seed: "(2) Date et Heure"
- witnesses: Témoins
- sortition:
- random_seed: Valeur aléatoire
- selected_proposals:
- one: proposition sélectionnée
- other: '%{count} propositions sélectionnées'
- view: Voir
- sortition_author:
- deleted: Utilisateur supprimé
- sortition_cancel_author:
- deleted: Utilisateur supprimé
- sortitions_count:
- count:
- one: 1 tirage au sort
- other: "%{count} tirages au sort"
diff --git a/decidim-sortitions/config/locales/fr.yml b/decidim-sortitions/config/locales/fr.yml
deleted file mode 100644
index 5a5ada6c73507..0000000000000
--- a/decidim-sortitions/config/locales/fr.yml
+++ /dev/null
@@ -1,139 +0,0 @@
-fr:
- activemodel:
- attributes:
- sortition:
- additional_info: Information sur le tirage au sort
- decidim_proposals_component_id: Ensemble de propositions
- dice: Résultat de votre tirage au dé. Tirez au sort un nombre de 1 à 6, soit à l'aide d'un dé à 6 faces soit par tout autre moyen, et entrez ici le nombre obtenu devant témoin(s). Cette procédure contribue à garantir la sincérité et le caractère aléatoire du résultat.
- target_items: Nombre de propositions à sélectionner (indique le nombre de propositions que vous voulez tirer au sort parmi celles du groupe de propositions que vous avez choisi précédemment)
- title: Titre
- witnesses: Témoins
- models:
- decidim/sortitions/create_sortition_event: Tirage au sort
- activerecord:
- models:
- decidim/sortitions/sortition:
- one: Tirage au sort
- other: Tirages au sort
- decidim:
- components:
- sortitions:
- actions:
- comment: Commenter
- name: Tirages au sort
- settings:
- global:
- clear_all: Effacer tout
- comments_enabled: Commentaires activés
- comments_max_length: Longueur max des commentaires (laisser 0 pour la valeur par défaut)
- taxonomy_filters: Sélectionner les filtres pour le composant
- taxonomy_filters_add: Ajouter un filtre
- events:
- sortitions:
- sortition_created:
- email_intro: Le tirage au sort "%{resource_title}" a été ajouté à "%{participatory_space_title}" que vous suivez.
- email_outro: Vous avez reçu cette notification car vous suivez "%{participatory_space_title}". Si vous souhaitez vous désabonner des notifications, connectez-vous à la plateforme, puis rendez-vous dans l'onglet “Mon compte” > “Paramètres des notifications”.
- email_subject: Un nouveau tirage au sort vient d'être ajouté à %{participatory_space_title}
- notification_title: Le tirage au sort %{resource_title} a été ajouté à %{participatory_space_title}
- sortitions:
- admin:
- actions:
- destroy: Annuler le tirage au sort
- edit: Éditer
- new_sortition: Nouveau tirage au sort
- show: Détails du tirage au sort
- title: Actions
- deprecation_warning_html: "⚠️ Avis de dépréciation. Le module « Tirages au sort » sera supprimé dans Decidim v0.32. Veuillez planifier en conséquence et envisager des solutions alternatives pour la sélection des participants ou des propositions."
- models:
- sortition:
- fields:
- created_at: Date de création
- decidim_proposals_component: Module de propositions
- dice: Dé
- reference: Référence
- request_timestamp: Date et heure
- seed: Valeur aléatoire
- target_items: Éléments à sélectionner
- title: Titre
- sortitions:
- confirm_destroy:
- confirm_destroy: Êtes-vous sûr de vouloir annuler ce tirage au sort ?
- destroy: Annuler le tirage au sort
- title: Annulation du tirage au sort
- create:
- error: Une erreur s'est produite lors de la création d'un nouveau tirage au sort.
- success: Le tirage au sort a été créé avec succès.
- destroy:
- error: Impossible d'annuler le tirage au sort.
- success: Le tirage au sort a été annulé avec succès.
- edit:
- title: Mettre à jour les informations sur le tirage au sort
- update: Mettre à jour
- form:
- select_proposal_component: Sélectionnez un ensemble de propositions
- index:
- title: Tirages au sort
- new:
- confirm: En appuyant sur le bouton suivant, la plateforme enregistra la date et l'heure (à la seconde près) et, avec le résultat du dé, cette information sera utilisée pour générer une sélection aléatoire. L'action sera irréversible, une fois le bouton cliqué, le résultat de ce tirage sera publié, ainsi que les données saisies dans ce formulaire et ne pourront pas être modifiées, veuillez vérifier attentivement le contenu.
- create: Créer
- title: Nouveau tirage au sort
- show:
- selected_proposals: Propositions sélectionnées pour le tirage au sort
- update:
- error: Une erreur est survenue lors de la mise à jour du tirage au sort.
- success: Le tirage au sort a bien été mis à jour.
- admin_log:
- sortition:
- create: "%{user_name} a créé le tirage au sort %{resource_name} dans %{space_name}"
- delete: "%{user_name} a annulé le tirage au sort %{resource_name} dans %{space_name}"
- update: "%{user_name} a mis à jour le tirage au sort %{resource_name} dans %{space_name}"
- sortitions:
- count:
- proposals_count:
- one: 1 proposition
- other: "%{count} propositions"
- filters:
- active: Actif
- all: Tout
- cancelled: Annulé
- category: Catégorie
- state: État
- index:
- empty: Il n'y a pas encore de tirage au sort.
- linked_sortitions:
- selected_proposals: Propositions sélectionnées
- orders:
- label: 'Trier les tirages au sort par :'
- random: Aléatoire
- recent: Récent
- results_count:
- count:
- one: proposition sélectionnée
- other: propositions sélectionnées
- show:
- algorithm: Code de l'algorithme de tirage au sort
- cancelled: Tirage au sort annulé
- candidate_proposal_ids: Ordre des propositions du tirage au sort et identifiants
- dice_result: Résultat des dés
- introduction: 'Cette page contient le résultat du tirage au sort %{reference}. Avec le tirage au sort, %{target_items} éléments ont été sélectionnés aléatoirement et avec une distribution de probabilité égale à partir de l''ensemble des propositions affichées ci-dessous. En plus du résultat, cette page fournit toutes les informations nécessaires pour maximiser les garanties et permettre de reproduire le résultat. Le tirage au sort résulte d''un double hasard fourni par le lancer d''un dé (vérifié par des témoins) et l''heure précise du tirage au sort, qui fournit l''entrée pour un algorithme qui génère une sélection aléatoire. La variable temporelle pour le tirage est si précise (de l''ordre de la seconde) qu''il est impossible de la contrôler par des humains fournissant ainsi une double entrée "infalsifiable" pour garantir un résultat juste. '
- mathematical_result: Résultat (Dé x Horodatage)
- proposals_selected_by_sortition: Propositions sélectionnées par tirage au sort
- sortition_reproducibility_details: Détails de reproductibilité du tirage au sort
- time_seed: Horodatage
- witnesses: Témoins
- sortition:
- random_seed: Valeur aléatoire
- selected_proposals:
- one: proposition sélectionnée
- other: '%{count} propositions sélectionnées'
- sortition_author:
- deleted: Utilisateur supprimé
- sortition_cancel_author:
- deleted: Utilisateur supprimé
- sortitions_count:
- count:
- one: 1 tirage au sort
- other: "%{count} tirages au sort"
- statistics:
- sortitions_count: Tirages au sort
- sortitions_count_tooltip: Le nombre de tirages au sort réalisés dans le cadre du processus décisionnel.
diff --git a/decidim-sortitions/config/locales/ga-IE.yml b/decidim-sortitions/config/locales/ga-IE.yml
deleted file mode 100644
index 058e4781ae365..0000000000000
--- a/decidim-sortitions/config/locales/ga-IE.yml
+++ /dev/null
@@ -1,34 +0,0 @@
-ga:
- activemodel:
- attributes:
- sortition:
- title: Teideal
- decidim:
- components:
- sortitions:
- actions:
- comment: Tabhair Trácht
- sortitions:
- admin:
- actions:
- edit: Eagar
- models:
- sortition:
- fields:
- dice: Dísle
- seed: Síol
- title: Teideal
- sortitions:
- edit:
- update: Nuashonraigh
- new:
- create: Cruthaigh
- sortitions:
- filters:
- active: Gníomhach
- all: Uile
- category: Catagóir
- state: Stádas
- orders:
- random: Randamach
- recent: Is Déanaí
diff --git a/decidim-sortitions/config/locales/gl.yml b/decidim-sortitions/config/locales/gl.yml
deleted file mode 100644
index 0a824730ec7cb..0000000000000
--- a/decidim-sortitions/config/locales/gl.yml
+++ /dev/null
@@ -1,124 +0,0 @@
-gl:
- activemodel:
- attributes:
- sortition:
- additional_info: Información de sorteo
- decidim_proposals_component_id: Propostas establecidas
- dice: Resultado da rolda. Move unha morea de 6 caras ou busque outra forma aleatoria de xerar un número do 1 ao 6 e insira aquí o número resultante diante dalgunhas testemuñas. Isto contribúe á calidade e garantías da aleatoriedade do resultado
- target_items: Número de propostas que se seleccionarán (indica a cantidade de propostas que desexa seleccionar trazando o grupo de propostas que escolleu previamente)
- title: Título
- witnesses: Testemuñas
- models:
- decidim/sortitions/create_sortition_event: Sortición
- activerecord:
- models:
- decidim/sortitions/sortition:
- one: Sortición
- other: Edicións
- decidim:
- components:
- sortitions:
- actions:
- comment: Comentario
- name: Edicións
- settings:
- global:
- comments_enabled: Comentarios habilitados
- comments_max_length: Lonxitude máxima dos comentarios (0 para valor predefinido)
- events:
- sortitions:
- sortition_created:
- email_intro: O sorteo "%{resource_title}" engadiuse a "%{participatory_space_title}" que estás seguindo.
- email_outro: Recibiches esta notificación porque estás seguindo "%{participatory_space_title}". Podes deixar de seguir desde a ligazón anterior.
- email_subject: Nova xeración engadida a %{participatory_space_title}
- notification_title: A clasificación %{resource_title} engadiuse a %{participatory_space_title}
- sortitions:
- admin:
- actions:
- destroy: Cancelar o sorteo
- edit: Editar
- show: Detalles de clasificación
- models:
- sortition:
- fields:
- created_at: Data de creación
- decidim_proposals_component: Componente de propostas
- dice: Dado
- reference: Referencia
- request_timestamp: Gravar tempo
- seed: Semente
- target_items: Elementos a seleccionar
- title: Título
- sortitions:
- confirm_destroy:
- confirm_destroy: Estás seguro de que queres cancelar este sortition?
- destroy: Cancelar sortition
- title: Cancelación do sortition
- create:
- error: Produciuse un erro ao crear unha nova xeración.
- edit:
- title: Actualiza a información sobre a clasificación
- update: Actualización
- form:
- select_proposal_component: Selecciona as propostas definidas
- index:
- title: Edicións
- new:
- create: Crear
- title: Nova xeración
- show:
- selected_proposals: Propostas seleccionadas para o sorteo
- update:
- error: Produciuse un erro ao actualizar o sorteo.
- admin_log:
- sortition:
- create: "%{user_name} creou o sorteo %{resource_name} en %{space_name}"
- delete: "%{user_name} cancelou o sorteo %{resource_name} en %{space_name}"
- update: "%{user_name} actualizou o sorteo %{resource_name} en %{space_name}"
- sortitions:
- count:
- proposals_count:
- one: 1 proposta
- other: "%{count} propostas"
- filters:
- active: Activo
- all: Todo
- cancelled: Cancelada
- category: Categoría
- state: Estado
- linked_sortitions:
- selected_proposals: Propostas seleccionadas
- orders:
- label: 'Solicitar sortións por:'
- random: Aleatorio
- recent: Recentes
- results_count:
- count:
- one: proposta seleccionada
- other: propostas seleccionadas
- show:
- algorithm: Codigo de algoritmo de Sortition
- cancelled: Cancelada sortition
- candidate_proposal_ids: Orde de propostas de clasificación e ID
- dice_result: (1) resultado de dados
- introduction: 'Esta páxina contén os resultados da clasificación %{reference}. Mediante esta clasificación, %{target_items} número de resultados foron seleccionados aleatoriamente e cunha distribución de probabilidade igual ao conxunto de propostas que se amosan debaixo. Xunto cos resultados, a información que se mostra nesta páxina proporciona toda a información necesaria para maximizar as garantías e reproducir os resultados. A clave para a calidade desta xeración é a aleatoriedade dobre proporcionada por un rolo dun dado (verificado por testemuñas) eo tempo preciso da xeración que proporciona entrada para un algoritmo que xera unha selección aleatoria. A semente de tempo para a xeración é tan precisa (segundos) que é imposible de controlar por parte dos seres humanos proporcionando así unha entrada dobre "incontrolable" para garantir un resultado xusto. '
- mathematical_result: Resultado (1) x (2)
- proposals_selected_by_sortition: Propostas seleccionadas por sortition
- sortition_reproducibility_details: Detalles de reproducibilidade de sorteo
- time_seed: (2) Semente de tempo
- witnesses: Testemuñas
- sortition:
- random_seed: Semente aleatoria
- selected_proposals:
- one: 1 proposta seleccionada
- other: '%{count} propostas seleccionadas'
- sortition_author:
- deleted: Usuario eliminado
- sortition_cancel_author:
- deleted: Usuario eliminado
- sortitions_count:
- count:
- one: 1 sortition
- other: "%{count} sortións"
- statistics:
- sortitions_count: Sorteos
diff --git a/decidim-sortitions/config/locales/gn-PY.yml b/decidim-sortitions/config/locales/gn-PY.yml
deleted file mode 100644
index bd442b0ad85de..0000000000000
--- a/decidim-sortitions/config/locales/gn-PY.yml
+++ /dev/null
@@ -1 +0,0 @@
-gn:
diff --git a/decidim-sortitions/config/locales/he-IL.yml b/decidim-sortitions/config/locales/he-IL.yml
deleted file mode 100644
index af6fa60a73f2c..0000000000000
--- a/decidim-sortitions/config/locales/he-IL.yml
+++ /dev/null
@@ -1 +0,0 @@
-he:
diff --git a/decidim-sortitions/config/locales/hr-HR.yml b/decidim-sortitions/config/locales/hr-HR.yml
deleted file mode 100644
index f67f33c7e0cfc..0000000000000
--- a/decidim-sortitions/config/locales/hr-HR.yml
+++ /dev/null
@@ -1 +0,0 @@
-hr:
diff --git a/decidim-sortitions/config/locales/hr.yml b/decidim-sortitions/config/locales/hr.yml
deleted file mode 100644
index f67f33c7e0cfc..0000000000000
--- a/decidim-sortitions/config/locales/hr.yml
+++ /dev/null
@@ -1 +0,0 @@
-hr:
diff --git a/decidim-sortitions/config/locales/hu.yml b/decidim-sortitions/config/locales/hu.yml
deleted file mode 100644
index 0cb03da01591f..0000000000000
--- a/decidim-sortitions/config/locales/hu.yml
+++ /dev/null
@@ -1,119 +0,0 @@
-hu:
- activemodel:
- attributes:
- sortition:
- additional_info: Sorsolás információk
- decidim_proposals_component_id: Beállított javaslatok
- dice: Dobókocka feldobása. Használj hat oldalú dobókockát vagy találj más megoldást arra, hogy egy véletlen számot produkálj 1 és 6 között. Szemtanúk előtt írd be ide a számot. Ez a módszer garantálja majd a kimenet tényleges véletlenszerűségét
- target_items: Kijelölni kívánt javaslatok száma (azt jelzi, hogy hány javaslatot szeretnél kiválasztani a már korábban kijelölt ajánlatok csoportja alapján)
- title: Cím
- witnesses: Tanúk
- models:
- decidim/sortitions/create_sortition_event: Sorsolás
- activerecord:
- models:
- decidim/sortitions/sortition:
- one: Sorsolás
- other: Sorsolások
- decidim:
- components:
- sortitions:
- name: Sorsolások
- settings:
- global:
- comments_enabled: Megjegyzések engedélyezve
- events:
- sortitions:
- sortition_created:
- email_intro: 'A(z) "%{resource_title}" sorsolást hozzáadtuk ehhez: "%{participatory_space_title}" (követed).'
- email_outro: 'Ezt az értesítést azért kaptad, mert ezt követed: "%{participatory_space_title}". Leiratkozás az előző link segítségével.'
- email_subject: 'Új sorsolás hozzáadva ehhez: %{participatory_space_title}'
- notification_title: 'A(z) %{resource_title} sorsolás hozzáadva ehhez: %{participatory_space_title}'
- sortitions:
- admin:
- actions:
- destroy: Sorsolás törlése
- edit: Szerkesztés
- show: Sorsolás részletei
- models:
- sortition:
- fields:
- created_at: Létrehozás dátuma
- decidim_proposals_component: Javaslatok elem
- dice: Dobókocka
- reference: Referencia
- request_timestamp: Időzítés
- seed: Kezdőérték
- target_items: Kijelölni kívánt elemek
- title: Cím
- sortitions:
- confirm_destroy:
- confirm_destroy: Biztosan törölni szeretnéd ezt a sorsolást?
- destroy: Sorsolás törlése
- title: Sorsolás törlése
- create:
- error: Hiba történt egy új sorsolás létrehozásakor.
- edit:
- title: Sorsolással kapcsolatos információk frissítése
- update: Frissítés
- form:
- select_proposal_component: Válassz beállított javaslatokat
- index:
- title: Sorsolások
- new:
- create: Létrehozás
- title: Új sorsolás
- show:
- selected_proposals: Sorsolásra kiválasztott javaslatok
- update:
- error: Hiba történt a sorsolás frissítése során.
- admin_log:
- sortition:
- create: "%{user_name} létrehozta a(z) %{resource_name} sorsolást itt: %{space_name}"
- delete: "%{user_name} törölte a(z) %{resource_name} sorsolást itt: %{space_name}"
- update: "%{user_name} frissítette a(z) %{resource_name} sorsolást itt: %{space_name}"
- sortitions:
- count:
- proposals_count:
- one: 1 javaslat
- other: "%{count} javaslat"
- filters:
- active: Aktív
- all: Összes
- cancelled: Törölve
- category: Kategória
- state: Állapot
- linked_sortitions:
- selected_proposals: Kiválasztott javaslatok
- orders:
- label: 'Sorsolások rendezése:'
- random: Véletlenszerű
- recent: Legutóbbi
- results_count:
- count:
- one: kiválasztott javaslat
- other: kiválasztott javaslatok
- show:
- algorithm: Sorsolás algoritmus kódja
- cancelled: Törölt sorsolás
- candidate_proposal_ids: Sorsolásos javaslatok sorrendje és azonosítói
- dice_result: (1) dobókocka eredmény
- introduction: 'Ez az oldal a következő sorsolás eredményeit tartalmazza: %{reference}. A módszer segítségével %{target_items} véletlenszerű eredményt kaptunk az alábbi javaslatokhoz, az egyenlő valószínűségi eloszlás elvét követve. Az oldalon található adatok - az eredményekkel együtt - minden olyan információt tartalmaznak, amelyek garantálják az eljárás megbízhatóságát és reprodukálhatóságát. Ennek a sorsolásos módszernek az egyik erőssége a kétlépcsős véletlenszerűségben rejlik, amelyet egyfelől a dobókocka feldobása, másfelől a sorsolás pontos időpontjának rögzítése biztosít. Ez utóbbiak ráadásul olyannyira pontosak, hogy azt emberek nem tudják ellenőrizni. Ez a dupla véletlenszerűség garantálja tehát a megbízható eredményeket. '
- mathematical_result: Eredmény (1) x (2)
- proposals_selected_by_sortition: Sorsolással kiválasztott javaslatok
- sortition_reproducibility_details: Sorsolás reprodukálhatósági részletek
- time_seed: (2) Időmag
- witnesses: Tanúk
- sortition:
- random_seed: Véletlen mag
- selected_proposals:
- one: kiválasztott javaslat
- other: kiválasztott javaslatok
- sortition_author:
- deleted: Törölt felhasználó
- sortition_cancel_author:
- deleted: Törölt felhasználó
- sortitions_count:
- count:
- one: 1 sorsolás
- other: "%{count} sorsolás"
diff --git a/decidim-sortitions/config/locales/id-ID.yml b/decidim-sortitions/config/locales/id-ID.yml
deleted file mode 100644
index dc503b3df844a..0000000000000
--- a/decidim-sortitions/config/locales/id-ID.yml
+++ /dev/null
@@ -1,114 +0,0 @@
-id:
- activemodel:
- attributes:
- sortition:
- additional_info: Informasi penyortiran
- decidim_proposals_component_id: Proposal ditetapkan
- dice: Hasil die roll. Gulung dadu 6 sisi, atau cari cara acak lain untuk menghasilkan angka dari 1 hingga 6, dan masukkan di sini angka yang dihasilkan di depan beberapa saksi. Ini berkontribusi pada kualitas dan jaminan keacakan hasil
- target_items: Jumlah proposal yang akan dipilih (menunjukkan jumlah proposal yang ingin Anda pilih dengan menggambar banyak kelompok proposal yang telah Anda pilih sebelumnya)
- title: Judul
- witnesses: Saksi
- models:
- decidim/sortitions/create_sortition_event: Undian
- activerecord:
- models:
- decidim/sortitions/sortition:
- other: Sortasi
- decidim:
- components:
- sortitions:
- name: Sortasi
- settings:
- global:
- comments_enabled: Komentar diaktifkan
- events:
- sortitions:
- sortition_created:
- email_intro: Sortasi "%{resource_title}" telah ditambahkan ke "%{participatory_space_title}" yang Anda ikuti.
- email_outro: Anda telah menerima pemberitahuan ini karena Anda mengikuti "%{participatory_space_title}". Anda dapat berhenti mengikutinya dari tautan sebelumnya.
- email_subject: Sortasi baru ditambahkan ke %{participatory_space_title}
- notification_title: Sortasi %{resource_title} telah ditambahkan ke %{participatory_space_title}
- sortitions:
- admin:
- actions:
- destroy: Batalkan penyortiran
- edit: Edit
- show: Detail penyortiran
- models:
- sortition:
- fields:
- created_at: Tanggal pembuatan
- decidim_proposals_component: Komponen proposal
- dice: Dadu
- reference: Referensi
- request_timestamp: Luangkan waktu
- seed: Benih
- target_items: Item untuk dipilih
- title: Judul
- sortitions:
- confirm_destroy:
- confirm_destroy: Apakah Anda yakin ingin membatalkan penyortiran ini?
- destroy: Batalkan penyortiran
- title: Pembatalan penyortiran
- create:
- error: Terjadi masalah saat membuat penyortiran baru.
- edit:
- title: Perbarui informasi tentang penyortiran
- update: Memperbarui
- form:
- select_proposal_component: Pilih set proposal
- index:
- title: Sortasi
- new:
- create: Membuat
- title: Pemilahan baru
- show:
- selected_proposals: Proposal dipilih untuk pengundian
- update:
- error: Terjadi masalah saat memperbarui penyortiran.
- admin_log:
- sortition:
- create: "%{user_name} menciptakan %{resource_name} sortasi dalam %{space_name}"
- delete: "%{user_name} membatalkan %{resource_name} penyortiran dalam %{space_name}"
- update: "%{user_name} memperbarui penyortiran %{resource_name} dalam %{space_name}"
- sortitions:
- count:
- proposals_count:
- other: "%{count} proposal"
- filters:
- active: Aktif
- all: Semua
- cancelled: Dibatalkan
- category: Kategori
- state: Status
- linked_sortitions:
- selected_proposals: Usulan yang dipilih
- orders:
- label: 'Urutkan penyortiran menurut:'
- random: Acak
- recent: Baru
- results_count:
- count:
- other: proposal yang dipilih
- show:
- algorithm: Kode algoritma penyortiran
- cancelled: Pengurutan yang dibatalkan
- candidate_proposal_ids: Urutan proposal pengurutan dan ID
- dice_result: (1) Hasil dadu
- introduction: 'Halaman ini berisi hasil sortasi %{reference}. Melalui penyortiran ini, %{target_items} jumlah hasil telah dipilih secara acak dan dengan distribusi probabilitas yang sama dari sekumpulan proposal yang ditampilkan di bawah. Bersama dengan hasilnya, informasi yang ditampilkan pada halaman ini memberikan semua informasi yang diperlukan untuk memaksimalkan jaminan dan mereproduksi hasil. Kunci kualitas penyortiran ini adalah keacakan ganda yang diberikan oleh pengguliran dadu (diverifikasi oleh saksi) dan waktu penyisihan yang tepat yang memberikan input untuk suatu algoritma yang menghasilkan seleksi acak. Benih waktu untuk penyortiran sangat akurat (detik) sehingga tidak mungkin dikendalikan oleh manusia sehingga memberikan input ganda "tidak terkendali" untuk menjamin hasil yang adil. '
- mathematical_result: Hasil (1) x (2)
- proposals_selected_by_sortition: Proposal dipilih berdasarkan penyortiran
- sortition_reproducibility_details: Rincian reproduksibilitas penyortiran
- time_seed: (2) Benih waktu
- witnesses: Saksi
- sortition:
- random_seed: Benih acak
- selected_proposals:
- other: proposal yang dipilih
- sortition_author:
- deleted: Peserta yang dihapus
- sortition_cancel_author:
- deleted: Peserta yang dihapus
- sortitions_count:
- count:
- other: "%{count} penyortiran"
diff --git a/decidim-sortitions/config/locales/is-IS.yml b/decidim-sortitions/config/locales/is-IS.yml
deleted file mode 100644
index a08fa4381e064..0000000000000
--- a/decidim-sortitions/config/locales/is-IS.yml
+++ /dev/null
@@ -1,96 +0,0 @@
-is-IS:
- activemodel:
- attributes:
- sortition:
- additional_info: Flokkunarupplýsingar
- decidim_proposals_component_id: Tillögur settar
- target_items: Fjöldi tillagna til að velja (gefur til kynna fjölda tillagna sem þú vilt velja með því að teikna mikið af þeim hópi tillagna sem þú hefur áður valið)
- title: Titill
- witnesses: Vottar
- decidim:
- components:
- sortitions:
- name: Flokkanir
- settings:
- global:
- comments_enabled: Athugasemdir virkt
- events:
- sortitions:
- sortition_created:
- email_intro: Flokkunin "%{resource_title}" hefur verið bætt við "%{participatory_space_title}" sem þú fylgist með.
- email_outro: Þú hefur fengið þessa tilkynningu vegna þess að þú fylgist með "%{participatory_space_title}". Þú getur sleppt því frá fyrri tengilinn.
- email_subject: Ný flokkun bætt við %{participatory_space_title}
- notification_title: Flokkunin %{resource_title} hefur verið bætt við %{participatory_space_title}
- sortitions:
- admin:
- actions:
- destroy: Hætta við flokkunina
- edit: Breyta
- show: Uppsetningarupplýsingar
- models:
- sortition:
- fields:
- created_at: Sköpunardegi
- decidim_proposals_component: Tillögur hluti
- dice: Dice
- reference: Tilvísun
- request_timestamp: Teikna tíma
- seed: Fræ
- target_items: Atriði til að velja
- title: Titill
- sortitions:
- confirm_destroy:
- confirm_destroy: Ertu viss um að þú viljir hætta við þessa flokkun?
- destroy: Hætta við flokkun
- title: Afpöntun á flokkuninni
- edit:
- title: Uppfærðu upplýsingar um flokkunina
- update: Uppfæra
- form:
- select_proposal_component: Veldu tillögur settar
- index:
- title: Flokkanir
- new:
- create: Búa til
- title: Ný flokkun
- show:
- selected_proposals: Tillögur valdar fyrir teikningu
- admin_log:
- sortition:
- create: "%{user_name} búið til %{resource_name} flokkun í %{space_name}"
- delete: "%{user_name} hætt %{resource_name} flokkun í %{space_name}"
- update: "%{user_name} uppfært %{resource_name} flokkun í %{space_name}"
- sortitions:
- count:
- proposals_count:
- one: 1 tillaga
- other: "%{count} tillögur"
- filters:
- active: Virkur
- all: Allt
- cancelled: Hætt við
- category: Flokkur
- linked_sortitions:
- selected_proposals: Valdar tillögur
- orders:
- label: 'Order flokkun eftir:'
- random: Handahófi
- recent: Nýleg
- results_count:
- count:
- one: valið tillaga
- other: valin tillögur
- show:
- cancelled: Hætt við flokkun
- candidate_proposal_ids: Flokkun tillögur röð og auðkenni
- dice_result: (1) Dice niðurstaða
- introduction: 'Þessi síða inniheldur niðurstöður flokkunarinnar %{reference}. Með þessari flokkun hafa %{target_items} fjöldi niðurstaðna verið valin af handahófi og með jöfn líkindadreifingu frá settum tillögum sem birtast á skjánum. Í sambandi við niðurstöðurnar eru upplýsingar sem birtar eru á þessari síðu allar nauðsynlegar upplýsingar til að hámarka ábyrgðir og endurskapa niðurstöðurnar. Lykillinn að gæðum þessa flokks er tvöfalt handahófi sem er gefin út af túlkun (staðfest af vitni) og nákvæman tíma flokkunarinnar sem gefur inntak fyrir reiknirit sem býr til handahófi val. Tímasæðið fyrir flokkunina er svo nákvæm (sekúndur) að það er ómögulegt að stjórna af mönnum og gefur þannig tvöfalt "óráðanlegt" inntak til að tryggja sanngjarna afleiðingu. '
- mathematical_result: Niðurstaða (1) x (2)
- proposals_selected_by_sortition: Tillögur valdar af flokkun
- sortition_reproducibility_details: Flokkunarleiðbeiningar upplýsingar
- time_seed: (2) Tími fræ
- witnesses: Vottar
- sortitions_count:
- count:
- one: 1 flokkun
- other: "%{count} flokkanir"
diff --git a/decidim-sortitions/config/locales/is.yml b/decidim-sortitions/config/locales/is.yml
deleted file mode 100644
index d922a52fe1510..0000000000000
--- a/decidim-sortitions/config/locales/is.yml
+++ /dev/null
@@ -1,122 +0,0 @@
-is:
- activemodel:
- attributes:
- sortition:
- additional_info: Flokkunarupplýsingar
- decidim_category_id: Flokkar af settum tillögum sem þú vilt sækja um teikninguna
- decidim_proposals_component_id: Tillögur settar
- target_items: Fjöldi tillagna til að velja (gefur til kynna fjölda tillagna sem þú vilt velja með því að teikna mikið af þeim hópi tillagna sem þú hefur áður valið)
- title: Titill
- witnesses: Vottar
- decidim:
- components:
- sortitions:
- name: Flokkanir
- settings:
- global:
- comments_enabled: Athugasemdir virkt
- events:
- sortitions:
- sortition_created:
- email_intro: Flokkunin "%{resource_title}" hefur verið bætt við "%{participatory_space_title}" sem þú fylgist með.
- email_outro: Þú hefur fengið þessa tilkynningu vegna þess að þú fylgist með "%{participatory_space_title}". Þú getur sleppt því frá fyrri tengilinn.
- email_subject: Ný flokkun bætt við %{participatory_space_title}
- notification_title: Flokkunin %{resource_title} hefur verið bætt við %{participatory_space_title}
- participatory_processes:
- statistics:
- sortitions_count: Flokkanir
- sortitions:
- admin:
- actions:
- destroy: Hætta við flokkunina
- edit: Breyta
- show: Uppsetningarupplýsingar
- models:
- sortition:
- fields:
- category: Flokkur
- created_at: Sköpunardegi
- decidim_proposals_component: Tillögur hluti
- dice: Dice
- reference: Tilvísun
- request_timestamp: Teikna tíma
- seed: Fræ
- target_items: Atriði til að velja
- title: Titill
- name:
- one: Flokkun
- other: Flokkanir
- sortitions:
- confirm_destroy:
- confirm_destroy: Ertu viss um að þú viljir hætta við þessa flokkun?
- destroy: Hætta við flokkun
- title: Afpöntun á flokkuninni
- create:
- success: Flokkun búin til
- destroy:
- error: Ekki er hægt að hætta við flokkunina.
- success: Flokkun tókst að hætta við
- edit:
- title: Uppfærðu upplýsingar um flokkunina
- update: Uppfæra
- form:
- all_categories: Allir flokkar
- select_proposal_component: Veldu tillögur settar
- title: Ný flokkun fyrir tillögur
- index:
- title: Flokkanir
- new:
- confirm: Með því að ýta á næstu hnappinn mun Decidim skrá dagsetningu og tíma (með nákvæmni sekúndna) og ásamt dice rúlla, verða þessar upplýsingar notaðar til að búa til handahófi val. Aðgerðin verður óafturkræf, þegar hnappurinn er smelltur verður niðurstaðan af þessari teikningu birt, ásamt þeim gögnum sem slegnar eru inn á þessu eyðublaði og ekki hægt að breyta, vinsamlegast athugaðu efnið vandlega
- create: Búa til
- title: Ný flokkun
- show:
- selected_proposals: Tillögur valdar fyrir teikningu
- admin_log:
- sortition:
- create: "%{user_name} búið til %{resource_name} flokkun í %{space_name}"
- delete: "%{user_name} hætt %{resource_name} flokkun í %{space_name}"
- update: "%{user_name} uppfært %{resource_name} flokkun í %{space_name}"
- sortitions:
- count:
- proposals_count:
- one: 1 tillaga
- other: "%{count} tillögur"
- filters:
- active: Virkur
- all: Allt
- cancelled: Hætt við
- category: Flokkur
- category_prompt: Veldu flokk
- search: Leita
- filters_small_view:
- close_modal: Loka mát
- filter: Sía
- filter_by: Sía eftir
- unfold: Fella út
- linked_sortitions:
- selected_proposals: Valdar tillögur
- orders:
- label: 'Order flokkun eftir:'
- random: Handahófi
- recent: Nýleg
- results_count:
- count:
- one: valið tillaga
- other: valin tillögur
- show:
- any_category: frá öllum flokkum
- cancelled: Hætt við flokkun
- candidate_proposal_ids: Flokkun tillögur röð og auðkenni
- candidate_proposals_info: 'Flokkunin var gerð meðal eftirfarandi tillagna (%{category_label}), með eftirfarandi auðkenni (með feitletruðu völdum tillögum) '
- category: frá %{category} flokki
- dice_result: "(1) Dice niðurstaða"
- introduction: 'Þessi síða inniheldur niðurstöður flokkunarinnar %{reference}. Með þessari flokkun hafa %{target_items} fjöldi niðurstaðna verið valin af handahófi og með jöfn líkindadreifingu frá settum tillögum sem birtast á skjánum. Í sambandi við niðurstöðurnar eru upplýsingar sem birtar eru á þessari síðu allar nauðsynlegar upplýsingar til að hámarka ábyrgðir og endurskapa niðurstöðurnar. Lykillinn að gæðum þessa flokks er tvöfalt handahófi sem er gefin út af túlkun (staðfest af vitni) og nákvæman tíma flokkunarinnar sem gefur inntak fyrir reiknirit sem býr til handahófi val. Tímasæðið fyrir flokkunina er svo nákvæm (sekúndur) að það er ómögulegt að stjórna af mönnum og gefur þannig tvöfalt "óráðanlegt" inntak til að tryggja sanngjarna afleiðingu. '
- mathematical_result: Niðurstaða (1) x (2)
- proposals_selected_by_sortition: Tillögur valdar af flokkun
- sortition_reproducibility_details: Flokkunarleiðbeiningar upplýsingar
- time_seed: "(2) Tími fræ"
- witnesses: Vottar
- sortitions_count:
- count:
- one: 1 flokkun
- other: "%{count} flokkanir"
diff --git a/decidim-sortitions/config/locales/it.yml b/decidim-sortitions/config/locales/it.yml
deleted file mode 100644
index 5d583cd998b1b..0000000000000
--- a/decidim-sortitions/config/locales/it.yml
+++ /dev/null
@@ -1,124 +0,0 @@
-it:
- activemodel:
- attributes:
- sortition:
- additional_info: Informazioni di ordinamento
- decidim_proposals_component_id: Proposte impostate
- dice: Risultato del tiro di dado. Tira un dado a 6 facce, o cerca un altro modo casuale per generare un numero da 1 a 6, e inserisci qui il numero risultante davanti ad alcuni testimoni. Ciò contribuisce alla qualità e alle garanzie della casualità del risultato
- target_items: Numero di proposte da selezionare (indica il numero di proposte che si desidera selezionare tracciando lotti del gruppo di proposte che si è scelto in precedenza)
- title: Titolo
- witnesses: Testimoni
- models:
- decidim/sortitions/create_sortition_event: sortition
- activerecord:
- models:
- decidim/sortitions/sortition:
- one: sortition
- other: Sorteggi
- decidim:
- components:
- sortitions:
- actions:
- comment: Commenta
- name: Sorteggi
- settings:
- global:
- comments_enabled: Commenti abilitati
- comments_max_length: Lunghezza massima dei commenti (Lasciare 0 per il valore predefinito)
- events:
- sortitions:
- sortition_created:
- email_intro: L'ordinamento "%{resource_title}" è stato aggiunto a "%{participatory_space_title}" che stai seguendo.
- email_outro: Hai ricevuto questa notifica perché stai seguendo "%{participatory_space_title}". Puoi smettere di seguirlo dal link precedente.
- email_subject: Nuova sortizione aggiunta a %{participatory_space_title}
- notification_title: Il sorteggio %{resource_title} è stato aggiunto a %{participatory_space_title}
- sortitions:
- admin:
- actions:
- destroy: Annulla la sortizione
- edit: Modifica
- show: Dettagli di ordinamento
- models:
- sortition:
- fields:
- created_at: Data di creazione
- decidim_proposals_component: Componente delle proposte
- dice: Dado
- reference: Riferimento
- request_timestamp: Disegna il tempo
- seed: seme
- target_items: Articoli da selezionare
- title: Titolo
- sortitions:
- confirm_destroy:
- confirm_destroy: Sei sicuro di voler cancellare questa selezione?
- destroy: Annulla la scelta
- title: Annullamento della sortizione
- create:
- error: Si è verificato un errore durante la creazione di una nuova sortizione.
- edit:
- title: Aggiorna le informazioni sulla sortizione
- update: Aggiornare
- form:
- select_proposal_component: Seleziona il set di proposte
- index:
- title: Sorteggi
- new:
- create: Creare
- title: Nuova sortizione
- show:
- selected_proposals: Proposte selezionate per l'estrazione
- update:
- error: Si è verificato un errore durante l'aggiornamento della sortizione.
- admin_log:
- sortition:
- create: "%{user_name} ha creato il sorteggio %{resource_name} in %{space_name}"
- delete: "%{user_name} ha annullato il sorteggio %{resource_name} in %{space_name}"
- update: "%{user_name} ha aggiornato il sorteggio %{resource_name} in %{space_name}"
- sortitions:
- count:
- proposals_count:
- one: 1 proposta
- other: "%{count} proposte"
- filters:
- active: Attivo
- all: Tutti
- cancelled: Annullato
- category: Categoria
- state: Stato
- linked_sortitions:
- selected_proposals: Proposte selezionate
- orders:
- label: 'Ordina i sorteggi per:'
- random: Casuale
- recent: Recente
- results_count:
- count:
- one: proposta selezionata
- other: proposte selezionate
- show:
- algorithm: Il codice dell'algoritmo di sorteggio
- cancelled: Ordinamento annullato
- candidate_proposal_ids: Ordine e ID delle proposte da sorteggiare
- dice_result: (1) Risultato dei dadi
- introduction: 'Questa pagina contiene i risultati del sorteggio %{reference}. Per mezzo di questo sorteggio, %{target_items} risultati sono stati selezionati casualmente e con una distribuzione di probabilità uguale dall''insieme di proposte visualizzate sotto. Insieme ai risultati, le informazioni visualizzate in questa pagina forniscono tutte le informazioni necessarie per massimizzare le garanzie e riprodurre i risultati. La chiave per la qualità di questo sorteggio è la doppia casualità fornita da un lancio di un dado (verificato da testimoni) e il tempo preciso del sorteggio, che fornisce l''input per un algoritmo che genera una selezione casuale. L''origine del tempo per il sorteggio è così preciso (secondi) che è impossibile controllarlo per gli umani, fornendo così un doppio input "incontrollabile" per garantire un risultato equo. '
- mathematical_result: Risultato (1) x (2)
- proposals_selected_by_sortition: Proposte selezionate per il sorteggio
- sortition_reproducibility_details: Dettagli di riproducibilità del sorteggio
- time_seed: (2) seme temporale
- witnesses: Testimoni
- sortition:
- random_seed: Seme casuale
- selected_proposals:
- one: 1 proposta selezionata
- other: '%{count} proposte selezionate'
- sortition_author:
- deleted: Utente eliminato
- sortition_cancel_author:
- deleted: Utente eliminato
- sortitions_count:
- count:
- one: 1 sorteggio
- other: "%{count} sorteggi"
- statistics:
- sortitions_count: Sorteggi
diff --git a/decidim-sortitions/config/locales/ja.yml b/decidim-sortitions/config/locales/ja.yml
deleted file mode 100644
index d0a12981aebe8..0000000000000
--- a/decidim-sortitions/config/locales/ja.yml
+++ /dev/null
@@ -1,142 +0,0 @@
-ja:
- activemodel:
- attributes:
- sortition:
- additional_info: 並べ替え情報
- decidim_proposals_component_id: 提案セット
- dice: ダイロールの結果。 6面ダイをロールするか、1から6まで数字を生成する別のランダムな方法を探します そして目撃者の前にナンバーを入力します。 これにより、品質と結果のランダム性を保証します
- target_items: 選択される提案の数 (選択した提案のグループをたくさん描画して選択したい提案の数を示します)
- title: タイトル
- witnesses: 目撃者
- models:
- decidim/sortitions/create_sortition_event: 並べ替え
- activerecord:
- models:
- decidim/sortitions/sortition:
- other: 並べ替え
- decidim:
- components:
- sortitions:
- actions:
- comment: コメント
- name: 並べ替え
- settings:
- global:
- clear_all: すべてクリア
- comments_enabled: コメントを有効にする
- comments_max_length: コメント最大長 (デフォルト値は 0 のまま)
- define_taxonomy_filters: この設定を使用する前に、参加型スペースのフィルターをいくつか定義してください。
- no_taxonomy_filters_found: タクソノミーフィルタが見つかりません。
- taxonomy_filters: コンポーネントのフィルタを選択
- taxonomy_filters_add: フィルターを追加
- events:
- sortitions:
- sortition_created:
- email_intro: あなたがフォローしている「%{resource_title}」にソート「%{participatory_space_title}」が追加されました。
- email_outro: '「%{participatory_space_title}」をフォローしているため、この通知を受け取りました。前のリンクからこの通知をアンフォローすることができます。'
- email_subject: '%{participatory_space_title} に新しいソートが追加されました'
- notification_title: ソート %{resource_title} が %{participatory_space_title} に追加されました
- sortitions:
- admin:
- actions:
- destroy: 並べ替えをキャンセル
- edit: 編集
- new_sortition: 新しいソート順
- show: 並べ替えの詳細
- title: アクション
- deprecation_warning_html: "⚠️ 非推奨通知。SortitionsモジュールはDecidim v0.32で削除される予定です。これに先立ち、適切な代替策を検討し、参加者や提案の選定方法について代替ソリューションを準備してください。"
- models:
- sortition:
- fields:
- created_at: 作成日
- decidim_proposals_component: 提案コンポーネント
- dice: ダイス
- reference: 参照
- request_timestamp: ドロー時間
- seed: Seed
- target_items: 選択するアイテム
- taxonomies: タクソノミー
- title: タイトル
- sortitions:
- confirm_destroy:
- confirm_destroy: この並べ替えをキャンセルしてもよろしいですか?
- destroy: 並べ替えをキャンセル
- title: 並べ替えのキャンセル
- create:
- error: 新しいソートの作成中に問題が発生しました。
- success: ソートは正常に作成されました。
- destroy:
- error: ソートをキャンセルできません。
- success: ソートは正常にキャンセルされました。
- edit:
- title: 並べ替えに関する情報を更新する
- update: 更新
- form:
- all_taxonomies: すべてのタクソノミー
- select_proposal_component: 提案セットを選択
- select_taxonomies: 抽選を適用したい提案のセットに関連するタクソノミー。空のままにすると、そのタクソノミー内のすべての提案に抽選が適用されます。
- index:
- title: 並べ替え
- new:
- confirm: 次のボタンを押すと、プラットフォームは日付と時刻(秒の精度で) を記録し、サイコロロールと一緒になります。 この情報はランダムな選択を生成するために使用されます。アクションは元に戻せません。ボタンをクリックすると、この描画の結果が公開されます。 このフォームに入力されたデータと一緒に変更することはできません。慎重に内容を確認してください。
- create: 作成
- title: 新しいソート順
- show:
- selected_proposals: ドローのために選択された提案
- update:
- error: ソートの更新に問題がありました。
- success: ソートが正常に更新されました。
- admin_log:
- sortition:
- create: "%{user_name} が %{resource_name} で %{space_name}ソートを作成しました"
- delete: "%{user_name} が %{resource_name} で %{space_name}ソートを取り消しました"
- update: "%{user_name} が %{resource_name} のソートを %{space_name}で更新しました"
- sortitions:
- count:
- proposals_count:
- other: "%{count} の提案"
- filters:
- active: アクティブ
- all: すべて
- cancelled: キャンセルしました
- category: カテゴリ
- state: ステータス
- index:
- empty: まだ並べ替えがありません。
- linked_sortitions:
- selected_proposals: 選択された提案
- orders:
- label: '並べ替え順:'
- random: ランダム
- recent: 最近のもの
- results_count:
- count:
- other: 選択された提案
- show:
- algorithm: 並べ替えのアルゴリズム コード
- any_taxonomy: すべてのタクソノミーから
- cancelled: キャンセルされた並べ替え
- candidate_proposal_ids: 並べ替え提案の順序とID
- candidate_proposals_info: '抽選は次の提案(%{taxonomy_labels})の中で実施され、以下の ID の提案が対象となりました(太字が選ばれた提案) '
- dice_result: (1)サイコロ結果
- introduction: 'このページには、ソート %{reference} の結果が含まれています。このソートにより、%{target_items} の数の結果が、以下に表示されている提案の集合から同確率でランダムに選択されています。結果とともにこのページに表示される情報は、保証を最大化し、結果を再現するために必要なすべての情報を提供します。このソートの品質の鍵となるのは、転がるサイコロ(目撃者による検証) による二重のランダム性と、ランダムな選択を生成するアルゴリズムの入力となるソートの正確な時間です。ソートのタイムシードは、人間がコントロールすることが不可能な正確さ(秒単位) を持っているため、公平な結果を保証するための二重の「コントロール不可能な」入力を提供しています。 '
- mathematical_result: 結果 (1) x (2)
- proposals_selected_by_sortition: 並べ替えによって選択された提案
- sortition_reproducibility_details: 並べ替え再現性の詳細
- taxonomies: '%{taxonomies} タクソノミーから'
- time_seed: (2) 時間の種
- witnesses: 目撃者
- sortition:
- random_seed: 乱数のシード
- selected_proposals:
- other: 提案を選択しました
- sortition_author:
- deleted: 退会者
- sortition_cancel_author:
- deleted: 退会者
- sortitions_count:
- count:
- other: "%{count} ソート数"
- statistics:
- sortitions_count: 並べ替え
- sortitions_count_tooltip: 意思決定のために実施されたランダム抽選の数です。
diff --git a/decidim-sortitions/config/locales/ka-GE.yml b/decidim-sortitions/config/locales/ka-GE.yml
deleted file mode 100644
index 57a95cb04703c..0000000000000
--- a/decidim-sortitions/config/locales/ka-GE.yml
+++ /dev/null
@@ -1 +0,0 @@
-ka:
diff --git a/decidim-sortitions/config/locales/kaa.yml b/decidim-sortitions/config/locales/kaa.yml
deleted file mode 100644
index 455cb565ea313..0000000000000
--- a/decidim-sortitions/config/locales/kaa.yml
+++ /dev/null
@@ -1 +0,0 @@
-kaa:
diff --git a/decidim-sortitions/config/locales/ko-KR.yml b/decidim-sortitions/config/locales/ko-KR.yml
deleted file mode 100644
index 8a7b3b861deda..0000000000000
--- a/decidim-sortitions/config/locales/ko-KR.yml
+++ /dev/null
@@ -1 +0,0 @@
-ko:
diff --git a/decidim-sortitions/config/locales/ko.yml b/decidim-sortitions/config/locales/ko.yml
deleted file mode 100644
index 8a7b3b861deda..0000000000000
--- a/decidim-sortitions/config/locales/ko.yml
+++ /dev/null
@@ -1 +0,0 @@
-ko:
diff --git a/decidim-sortitions/config/locales/lb-LU.yml b/decidim-sortitions/config/locales/lb-LU.yml
deleted file mode 100644
index 823df018114f4..0000000000000
--- a/decidim-sortitions/config/locales/lb-LU.yml
+++ /dev/null
@@ -1 +0,0 @@
-lb:
diff --git a/decidim-sortitions/config/locales/lb.yml b/decidim-sortitions/config/locales/lb.yml
deleted file mode 100644
index 823df018114f4..0000000000000
--- a/decidim-sortitions/config/locales/lb.yml
+++ /dev/null
@@ -1 +0,0 @@
-lb:
diff --git a/decidim-sortitions/config/locales/lo-LA.yml b/decidim-sortitions/config/locales/lo-LA.yml
deleted file mode 100644
index 27a02bfece429..0000000000000
--- a/decidim-sortitions/config/locales/lo-LA.yml
+++ /dev/null
@@ -1 +0,0 @@
-lo:
diff --git a/decidim-sortitions/config/locales/lt-LT.yml b/decidim-sortitions/config/locales/lt-LT.yml
deleted file mode 100644
index 6c5cb837ac8c1..0000000000000
--- a/decidim-sortitions/config/locales/lt-LT.yml
+++ /dev/null
@@ -1 +0,0 @@
-lt:
diff --git a/decidim-sortitions/config/locales/lt.yml b/decidim-sortitions/config/locales/lt.yml
deleted file mode 100644
index 12b73c8e5bb7a..0000000000000
--- a/decidim-sortitions/config/locales/lt.yml
+++ /dev/null
@@ -1,140 +0,0 @@
-lt:
- activemodel:
- attributes:
- sortition:
- additional_info: Informacija apie sprendimą burtų keliu
- decidim_proposals_component_id: Pasiūlymų rinkinys
- dice: Kauliukų ridenimo rezultatai. Riskite šešiasienį kauliuką arba raskite kitą būdą, kaip atsitiktinai išridenti skaičių nuo 1 iki 6. Gautą skaičių užrašykite prie liudytojų. Tai padeda kokybei ir užtikrina atsitiktinį rezultatą
- target_items: Pasirinktinų pasiūlymų skaičius (tai yra pasiūlymų, kuriuos norite atrinkti burtų keliu iš anksčiau pasirinktos pasiūlymų grupės, skaičius)
- title: Pavadinimas
- witnesses: Liudytojai
- models:
- decidim/sortitions/create_sortition_event: Sprendimas burtų keliu
- activerecord:
- models:
- decidim/sortitions/sortition:
- one: Sprendimas burtų keliu
- few: Sprendimai burtų keliu
- many: Sprendimai burtų keliu
- other: Sprendimai burtų keliu
- decidim:
- components:
- sortitions:
- actions:
- comment: Komentuoti
- name: Sprendimai burtų keliu
- settings:
- global:
- comments_enabled: Komentarai įjungti
- comments_max_length: Maksimalus komentarų ilgis (Palikite 0 kaip numatytą vertę)
- events:
- sortitions:
- sortition_created:
- email_intro: Erdvėje „%{participatory_space_title}“, kurią sekate, pridėta sprendimo burtų keliu funkcija „%{resource_title}“.
- email_outro: Gavote šį pranešimą nes sekate %{participatory_space_title}. Galite nebesekti paspaudę and ankstesnės nuorodos.
- email_subject: '%{participatory_space_title} pridėtas nauja sprendimo burtų keliu funkcija'
- notification_title: '%{participatory_space_title} pridėta %{resource_title} sprendimo burtų keliu funkcija'
- sortitions:
- admin:
- actions:
- destroy: Atšaukti sprendimą burtų keliu
- edit: Redaguoti
- show: Išsami informacija apie sprendimą burtų keliu
- models:
- sortition:
- fields:
- created_at: Sukūrimo data
- decidim_proposals_component: Pasiūlymų komponentas
- dice: Kauliukai
- reference: Nuoroda
- request_timestamp: Sprendimo burtų keliu laikas
- seed: Generavimo raktas
- target_items: Pasirinktini elementai
- title: Pavadinimas
- sortitions:
- confirm_destroy:
- confirm_destroy: Ar tikrai norite atšauti šį sprendimą burtų keliu?
- destroy: Atšaukti sprendimą burtų keliu
- title: Sprendimo burtų keliu atšaukimas
- create:
- error: Rengiant naują sprendimą burtų keliu iškilo problema.
- success: Sprendimas burtų keliu sukurtas.
- destroy:
- error: Negalima atšaukti sprendimo burtų keliu.
- success: Sprendimas burtų keliu atšauktas.
- edit:
- title: Atnaujinti informaciją apie sprendimo burtų keliu galimybę
- update: Atnaujinti
- form:
- select_proposal_component: Pasirinkti pasiūlymų rinkinį
- index:
- title: Sprendimai burtų keliu
- new:
- confirm: Spustelėjus mygtuką, data ir laikas bus užregistruoti (sekundžių tikslumu). Kartu su kauliuko metimu ši informacija bus naudojama atsitiktinei atrankai vykdyti. Spustelėjus mygtuką, veiksmas bus negrįžtamas, o jo rezultatas bus paskelbtas kartu su šioje formoje įrašytais duomenimis ir jų nebus galima keisti, taigi, atidžiai patikrinkite turinį.
- create: Sukurti
- title: Nauja galimybė spręsti burtų keliu
- show:
- selected_proposals: Pasirinkti pasiūlymai sprendimui burtų keliu priimti
- update:
- error: Atnaujinant galimybę spręsti burtų keliu iškilo problema.
- success: Galimybė spręsti burtų keliu atnaujinta.
- admin_log:
- sortition:
- create: "%{user_name} sukūrė %{resource_name} galimybę spręsti burtų keliu %{space_name} erdvėje"
- delete: "%{user_name} atšaukė %{resource_name} galimybę spręsti burtų keliu %{space_name} erdvėje"
- update: "%{user_name} atnaujino %{resource_name} galimybę spręsti burtų keliu %{space_name} erdvėje"
- sortitions:
- count:
- proposals_count:
- one: 1 pasiūlymas
- few: "%{count} pasiūlymai"
- many: "%{count} pasiūlymai"
- other: "%{count} pasiūlymai"
- filters:
- active: Aktyvūs
- all: Visos
- cancelled: Atšaukti
- category: Kategorija
- state: Būsena
- linked_sortitions:
- selected_proposals: Pasirinkti pasiūlymai
- orders:
- label: 'Galimybių spręsti burtų keliu rikiavimo kriterijai:'
- random: Atsitiktinai
- recent: Naujausi
- results_count:
- count:
- one: pasirinktas pasiūlymas
- few: pasirinkti pasiūlymai
- many: pasirinkti pasiūlymai
- other: pasirinkti pasiūlymai
- show:
- algorithm: Galimybės spręsti burtų keliu algoritmo kodas
- cancelled: Galimybė spręsti burtų keliu atšaukta
- candidate_proposal_ids: Pasiūlymų, dėl kurių sprendžiama burtų keliu, rikiavimo kriterijai ir ID
- dice_result: 1) Kauliuko metimo rezultatai
- introduction: 'Šiame puslapyje pateikiami sprendimo burtų keliu %{reference} rezultatai. Naudojantis šia galimybe spręsti burtų keliu, iš rodomų pasiūlymų rinkinio atsitiktine tvarka pasirenkamas rezultatų skaičius %{target_items}, esant vienodai pasiskirstymo tikimybei. Kartu su rezultatais šiame puslapyje pateikiamoje informacijoje nurodoma viskas, ko reikia siekiant kuo labiau padidinti garantijas ir atkurti rezultatus. Šios galimybės spręsti burtų keliu pagrindas – dvigubas atsitiktinumas, kurį užtikrina kauliuko ridenimas (jį patvirtina liudytojai) ir tikslus sprendimo burtų keliu laikas, – informacija, įvedama į atsitiktinės atrankos vykdymo algoritmą. Sprendimo burtų keliu pradžia yra tokia tiksli (sekundės), kad žmogus šio proceso kontroliuoti negali, taigi, tai dvigubas nekontroliuojamas veiksmas sąžiningam rezultatui užtikrinti. '
- mathematical_result: Rezultatas (1) x (2)
- proposals_selected_by_sortition: Pasiūlymai pasirinkti burtų keliu
- sortition_reproducibility_details: Rūšiavimo atkuriamumo detalės
- time_seed: (2) Time seed
- witnesses: Liudytojai
- sortition:
- random_seed: Atsitiktinė vertė
- selected_proposals:
- one: pasiūlymas pasirinktas
- few: pasiūlymai pasirinkti
- many: pasiūlymai pasirinkti
- other: pasiūlymai pasirinkti
- sortition_author:
- deleted: Ištrintas dalyvis
- sortition_cancel_author:
- deleted: Ištrintas dalyvis
- sortitions_count:
- count:
- one: 1 pasirinkimas burtų keliu
- few: "%{count} pasirinkimai burtų keliu"
- many: "%{count} pasirinkimų burtų keliu"
- other: "%{count} pasirinkimai burtų keliu"
- statistics:
- sortitions_count: Pasirinkimai burtų keliu
diff --git a/decidim-sortitions/config/locales/lv.yml b/decidim-sortitions/config/locales/lv.yml
deleted file mode 100644
index 3a0e204747106..0000000000000
--- a/decidim-sortitions/config/locales/lv.yml
+++ /dev/null
@@ -1,124 +0,0 @@
-lv:
- activemodel:
- attributes:
- sortition:
- additional_info: Izlozes informācija
- decidim_proposals_component_id: Priekšlikumu kopas
- dice: Kauliņa metiena rezultāts. Metiet kauliņu kuba formā ar sešām skaldnēm vai meklējiet citu veidu, kā iegūt nejauši izvēlētu skaitli no 1 līdz 6, un ievadiet iegūto skaitli dažu liecinieku klātbūtnē. Šādi tiek uzlabota procesa kvalitāte un garantēta rezultāta nejaušība.
- target_items: Atlasāmo priekšlikumu skaits (norāda priekšlikumu skaitu, kuru vēlaties atlasīt, izlozējot no iepriekš izvēlēto priekšlikumu kopas)
- title: Nosaukums
- witnesses: Liecinieki
- models:
- decidim/sortitions/create_sortition_event: Izloze
- activerecord:
- models:
- decidim/sortitions/sortition:
- zero: Izlozes
- one: Izloze
- other: Izlozes
- decidim:
- components:
- sortitions:
- name: Izlozes
- settings:
- global:
- comments_enabled: Komentāri ir iespējoti
- events:
- sortitions:
- sortition_created:
- email_intro: Izloze "%{resource_title}" ir pievienota telpai "%{participatory_space_title}", kam jūs sekojat.
- email_outro: Jūs saņēmāt šo paziņojumu, jo sekojat "%{participatory_space_title}". Jūs varat atsekot tai no iepriekšējās saites.
- email_subject: Jauna izloze pievienota telpai %{participatory_space_title}
- notification_title: Izloze %{resource_title} ir pievienota telpai%{participatory_space_title}
- sortitions:
- admin:
- actions:
- destroy: Atcelt izlozi
- edit: Labot
- show: Izlozes detaļas
- models:
- sortition:
- fields:
- created_at: Izveides datums
- decidim_proposals_component: Priekšlikumu komponents
- dice: Metamais kauliņš
- reference: Atsauce
- request_timestamp: Mešanas laiks
- seed: Sēkla
- target_items: Elementi, ko izvēlēties
- title: Nosaukums
- sortitions:
- confirm_destroy:
- confirm_destroy: Vai tiešām vēlaties atcelt šo izlozi?
- destroy: Atcelt izlozi
- title: Izlozes atcelšana
- create:
- error: Jaunas izlozes izveides laikā radās problēma.
- edit:
- title: Atjaunināt informāciju par izlozi
- update: Atjaunināt
- form:
- select_proposal_component: Atlasiet piedāvājumu kopu
- index:
- title: Izlozes
- new:
- create: Izveidot
- title: Jauna izloze
- show:
- selected_proposals: Priekšlikumi, kas atlasīti izlozei
- update:
- error: Izlozes atjaunināšanas laikā radās problēma.
- admin_log:
- sortition:
- create: "%{user_name} izveidoja %{resource_name} izlozi telpā %{space_name}."
- delete: "%{user_name} atcēla %{resource_name} izlozi telpā %{space_name}."
- update: "%{user_name} atjaunināja %{resource_name} izlozi telpā %{space_name}."
- sortitions:
- count:
- proposals_count:
- zero: "%{count} priekšlikumi"
- one: 1 priekšlikums
- other: "%{count} priekšlikumi"
- filters:
- active: Aktīvas
- all: Visi
- cancelled: Atcelts
- category: Kategorija
- state: Statuss
- linked_sortitions:
- selected_proposals: Atlasītie priekšlikumi
- orders:
- label: 'Šķirot izlozes pēc:'
- random: Nejauši
- recent: Nesenie
- results_count:
- count:
- zero: atlasītie priekšlikumi
- one: atlasītā priekšlikuma
- other: atlasītie priekšlikumi
- show:
- algorithm: Izlozes algoritma kods
- cancelled: Atcelta izloze
- candidate_proposal_ids: Izlozes priekšlikumu secība un ID
- dice_result: (1.) Rezultāts, metot kauliņu
- introduction: 'Šajā lapā ir izlozes %{reference} rezultāti. Izmantojot šo izlozi %{target_items}, rezultātu skaits ir izvēlēts nejauši un ar vienādu varbūtības sadalījumu starp turpmāk esošajām priekšlikumu kopām. Kopā ar rezultātiem šajā lapā esošā informācija sniedz visus datus, lai nodrošinātu maksimālas garantijas un iespējamību atkārtot rezultātus. Izlozes kvalitātes atslēga ir dubultā nejaušība, ko rada metamā kauliņa izmantošana (liecinieku klātbūtnē) un precīzā izlozes laika ievade algoritmā, kas veic nejaušo izvēli. Laika vērtība izlozē ir tik precīza (sekundes), ka to nevar kontrolēt cilvēki, tādējādi divreiz sniedzot „nekontrolējamu” ievades informāciju, kas garantē taisnīgu rezultātu.'
- mathematical_result: Rezultāts (1) x (2)
- proposals_selected_by_sortition: Izlozes atlasītie priekšlikumi
- sortition_reproducibility_details: Izlozes reproducējamības informācija
- time_seed: (2) Laika vērtība
- witnesses: Liecinieki
- sortition:
- random_seed: Nejaušā vērtība
- selected_proposals:
- zero: atlasītie priekšlikumi
- one: atlasītais priekšlikums
- other: atlasītie priekšlikumi
- sortition_author:
- deleted: Dzēsts dalībnieks
- sortition_cancel_author:
- deleted: Dzēsts dalībnieks
- sortitions_count:
- count:
- zero: "%{count} izlozes"
- one: 1 izloze
- other: "%{count} izlozes"
diff --git a/decidim-sortitions/config/locales/mt-MT.yml b/decidim-sortitions/config/locales/mt-MT.yml
deleted file mode 100644
index f7aabc7149a9b..0000000000000
--- a/decidim-sortitions/config/locales/mt-MT.yml
+++ /dev/null
@@ -1 +0,0 @@
-mt:
diff --git a/decidim-sortitions/config/locales/mt.yml b/decidim-sortitions/config/locales/mt.yml
deleted file mode 100644
index f7aabc7149a9b..0000000000000
--- a/decidim-sortitions/config/locales/mt.yml
+++ /dev/null
@@ -1 +0,0 @@
-mt:
diff --git a/decidim-sortitions/config/locales/nl.yml b/decidim-sortitions/config/locales/nl.yml
deleted file mode 100644
index 454bbe35c9bb3..0000000000000
--- a/decidim-sortitions/config/locales/nl.yml
+++ /dev/null
@@ -1,124 +0,0 @@
-nl:
- activemodel:
- attributes:
- sortition:
- additional_info: Informatie over de loting
- decidim_proposals_component_id: Voorstellen geplaatst
- dice: Resultaat van de worp. Rol een 6-zijdige dobbelsteen uit, of zoek naar een andere willekeurige manier om een getal van 1 tot 6 te genereren, en voer hier het resulterende getal in voor sommige getuigen. Dit draagt bij aan de kwaliteit en garanties van de willekeurigheid van het resultaat
- target_items: Aantal voorstellen dat moet worden geselecteerd (geeft het aantal voorstellen aan dat je wil selecteren door groepsvoorstellen te selecteren die je eerder hebt gekozen)
- title: Titel
- witnesses: getuigen
- models:
- decidim/sortitions/create_sortition_event: toss
- activerecord:
- models:
- decidim/sortitions/sortition:
- one: toss
- other: Sortitions
- decidim:
- components:
- sortitions:
- actions:
- comment: Reactie
- name: Loting
- settings:
- global:
- comments_enabled: Reacties ingeschakeld
- comments_max_length: Commentaar maximale lengte (laat 0 voor standaard waarde)
- events:
- sortitions:
- sortition_created:
- email_intro: De loting "%{resource_title}" is toegevoegd aan "%{participatory_space_title}" dat je volgt.
- email_outro: Je hebt deze melding ontvangen omdat je "%{participatory_space_title}" volgt. Ontvolgen kan door te klikken op de voorgaande link.
- email_subject: Nieuwe loting toegevoegd aan %{participatory_space_title}
- notification_title: De loting %{resource_title} is toegevoegd aan %{participatory_space_title}
- sortitions:
- admin:
- actions:
- destroy: Annuleer de loting
- edit: Bewerk
- show: Details van de loting
- models:
- sortition:
- fields:
- created_at: Aangemaakt op
- decidim_proposals_component: Voorstellen component
- dice: Dobbelsteen
- reference: Referentie
- request_timestamp: Tekentijd
- seed: Zaad
- target_items: Te selecteren items
- title: Titel
- sortitions:
- confirm_destroy:
- confirm_destroy: Weet je zeker dat je deze loting wilt annuleren?
- destroy: Annuleer de loting
- title: Annulatie van de loting
- create:
- error: Er is een fout opgetreden bij het maken van een nieuwe loting.
- edit:
- title: Update de informatie over de loting
- update: Bijwerken
- form:
- select_proposal_component: Selecteer de voorgestelde set
- index:
- title: Lotingen
- new:
- create: Aanmaken
- title: Nieuwe loting
- show:
- selected_proposals: Voorstellen geselecteerd voor trekking
- update:
- error: Er is een fout opgetreden bij het bijwerken van de loting.
- admin_log:
- sortition:
- create: "%{user_name} heeft de %{resource_name} loting gemaakt in %{space_name}"
- delete: "%{user_name} heeft de %{resource_name} loting geannuleerd in %{space_name}"
- update: "%{user_name} heeft de %{resource_name} loting bijgewerkt in %{space_name}"
- sortitions:
- count:
- proposals_count:
- one: 1 voorstel
- other: "%{count} voorstellen"
- filters:
- active: Actief
- all: Alle
- cancelled: Geannuleerd
- category: Categorie
- state: Staat
- linked_sortitions:
- selected_proposals: Geselecteerde voorstellen
- orders:
- label: 'Lotingen ordenen op:'
- random: Willekeurig
- recent: recent
- results_count:
- count:
- one: geselecteerd voorstel
- other: geselecteerde voorstellen
- show:
- algorithm: De algoritme-code van de loting
- cancelled: Geannuleerde loting
- candidate_proposal_ids: Sorteervolgorde orders en ID's
- dice_result: (1) Resultaat dobbelsteen
- introduction: 'Deze pagina bevat de resultaten van de loting %{reference}. Door middel van deze loting is het %{target_items} aantal resultaten willekeurig geselecteerd en met een gelijke kansverdeling uit de set weergegeven voorstellen. Samen met de resultaten biedt de informatie die op deze pagina wordt weergegeven alle informatie die nodig is om garanties te maximaliseren en de resultaten te reproduceren. De sleutel tot de kwaliteit van deze loting is de dubbele willekeurigheid die wordt geboden door het rollen van een dobbelsteen (geverifieerd door getuigen) en de precieze tijd van de loting die input levert voor een algoritme dat een willekeurige selectie genereert. Het tijdsbestek voor de loting is zo nauwkeurig (seconden) dat het onmogelijk is om door mensen te controleren en biedt dus een dubbele "oncontroleerbare" invoer om een rechtvaardig resultaat te garanderen. '
- mathematical_result: Resultaat (1) x (2)
- proposals_selected_by_sortition: Voorstellen geselecteerd door loting
- sortition_reproducibility_details: Loting reproduceerbaarheidsdetails
- time_seed: (2) Tijdzaad
- witnesses: getuigen
- sortition:
- random_seed: Willekeurig zaad
- selected_proposals:
- one: 1 voorstel geselecteerd
- other: '%{count} voorstellen geselecteerd'
- sortition_author:
- deleted: Verwijder gebruiker
- sortition_cancel_author:
- deleted: Verwijderde gebruiker
- sortitions_count:
- count:
- one: 1 loting
- other: "%{count} lotingen"
- statistics:
- sortitions_count: Lotingen
diff --git a/decidim-sortitions/config/locales/no.yml b/decidim-sortitions/config/locales/no.yml
deleted file mode 100644
index 8368c6ef646dc..0000000000000
--- a/decidim-sortitions/config/locales/no.yml
+++ /dev/null
@@ -1,124 +0,0 @@
-"no":
- activemodel:
- attributes:
- sortition:
- additional_info: Sorterings informasjon
- decidim_proposals_component_id: Forslag satt
- dice: Resultat av terningkast. Rull en 6-sidet terning, eller finn en annen tilfeldig måte å generere et tall fra 1 til 6, og legg inn det resulterende tallet foran noen vitner. Dette bidrar til kvaliteten og garanterer tilfeldigheten til resultatet
- target_items: Antall forslag som skal velges (indikerer antall forslag du vil skal bli valgt ved å trekke mange av gruppen av forslag du har valgt tidligere)
- title: Tittel
- witnesses: Tilbaketrukket
- models:
- decidim/sortitions/create_sortition_event: Sortering
- activerecord:
- models:
- decidim/sortitions/sortition:
- one: Sortering
- other: Sorteringer
- decidim:
- components:
- sortitions:
- actions:
- comment: Kommenter
- name: Sorteringer
- settings:
- global:
- comments_enabled: Kommentarer aktivert
- comments_max_length: Maks lengde på kommentarer (Sett 0 for standardverdi)
- events:
- sortitions:
- sortition_created:
- email_intro: Sorteringen "%{resource_title}" er blitt lagt til "%{participatory_space_title}" som du følger.
- email_outro: Du har mottatt denne varslingen fordi du følger "%{participatory_space_title}". Du kan slutte å følge den fra den forrige lenken.
- email_subject: Ny sortering lagt til %{participatory_space_title}
- notification_title: Sorteringen %{resource_title} har blitt lagt til %{participatory_space_title}
- sortitions:
- admin:
- actions:
- destroy: Avbryt sorteringen
- edit: Editar
- show: Sorterings detaljer
- models:
- sortition:
- fields:
- created_at: Opprettelsesdato
- decidim_proposals_component: Forslags komponent
- dice: Terning
- reference: Referanse
- request_timestamp: Uavgjort tid
- seed: Seed
- target_items: Gjenstander å velge
- title: Tittel
- sortitions:
- confirm_destroy:
- confirm_destroy: Er du sikker på at du vil avbryte denne sorteringen?
- destroy: Avbryt sortering
- title: Avbryting av sorteringen
- create:
- error: Det oppstod et problem med å lage en ny sortering.
- edit:
- title: Oppdater informasjonen om sorteringen
- update: Oppdater
- form:
- select_proposal_component: Velg forslagets set
- index:
- title: Sorteringer
- new:
- create: Opprett
- title: Ny sortering
- show:
- selected_proposals: Forslag valgt for trekning
- update:
- error: Det oppstod et problem med å oppdatere sorteringen.
- admin_log:
- sortition:
- create: "%{user_name} opprettet %{resource_name} sorteringen i %{space_name}"
- delete: "%{user_name} kansellerte %{resource_name} sorteringen i %{space_name}"
- update: "%{user_name} oppdaterte %{resource_name} sorteringen i %{space_name}"
- sortitions:
- count:
- proposals_count:
- one: 1 forslag
- other: "%{count} forslag"
- filters:
- active: Aktiv
- all: Alle
- cancelled: Avbrutt
- category: Kategori
- state: Status
- linked_sortitions:
- selected_proposals: Utvalgte forslag
- orders:
- label: 'Sorter sorteringer etter:'
- random: Tilfeldig
- recent: Nylig
- results_count:
- count:
- one: valgt forslag
- other: utvalgte forslag
- show:
- algorithm: Sorterings algoritmekode
- cancelled: Avbrutt sortering
- candidate_proposal_ids: Sorterings forslags ordre og IDer
- dice_result: (1) Terning resultat
- introduction: 'Denne siden inneholder resultatene av sorteringen %{reference}. Ved hjelp av denne sorteringen er %{target_items} antall resultater valgt tilfeldig og med en lik sannsynlighetsfordeling fra settet av forslag som blir vist nedenfor. Sammen med resultatene gir informasjonen som vises på denne siden all nødvendig informasjon for å maksimere garantier og for å reprodusere resultatene. Nøkkelen til kvaliteten på denne sorteringen er dobbelt tilfeldighet gitt ved rulling av terninger (bekreftet av vitner) og den nøyaktige tiden for sorteringen som gir input til en algoritme som genererer et tilfeldig utvalg. Tids-seedet for sorteringen er så nøyaktig (sekunder) at det er umulig å kontrollere av mennesker og gir dermed et dobbelt "ukontrollerbart" input for å garantere et rettferdig resultat. '
- mathematical_result: Resultat (1) x (2)
- proposals_selected_by_sortition: Forslag valgt etter sortering
- sortition_reproducibility_details: Detaljer for sorterings reproduksjonbarhet
- time_seed: (2) Tids seed
- witnesses: Tilbaketrukket
- sortition:
- random_seed: Tilfeldig seed
- selected_proposals:
- one: forslag valgt
- other: forslag valgt
- sortition_author:
- deleted: Slettet deltaker
- sortition_cancel_author:
- deleted: Slettet deltaker
- sortitions_count:
- count:
- one: 1 sortering
- other: "%{count} sorteringer"
- statistics:
- sortitions_count: Sorteringer
diff --git a/decidim-sortitions/config/locales/oc-FR.yml b/decidim-sortitions/config/locales/oc-FR.yml
deleted file mode 100644
index 325b348894124..0000000000000
--- a/decidim-sortitions/config/locales/oc-FR.yml
+++ /dev/null
@@ -1 +0,0 @@
-oc:
diff --git a/decidim-sortitions/config/locales/om-ET.yml b/decidim-sortitions/config/locales/om-ET.yml
deleted file mode 100644
index 05e2e89c3a879..0000000000000
--- a/decidim-sortitions/config/locales/om-ET.yml
+++ /dev/null
@@ -1 +0,0 @@
-om:
diff --git a/decidim-sortitions/config/locales/pl.yml b/decidim-sortitions/config/locales/pl.yml
deleted file mode 100644
index dad0ac6e8a001..0000000000000
--- a/decidim-sortitions/config/locales/pl.yml
+++ /dev/null
@@ -1,143 +0,0 @@
-pl:
- activemodel:
- attributes:
- sortition:
- additional_info: Informacje o wyborze losowym
- decidim_proposals_component_id: Zestaw propozycji
- dice: Wynik rzutu kostką. Rzuć kostką 6-ścienną lub poszukaj innego losowego sposobu na wygenerowanie liczby od 1 do 6, a następnie wprowadź liczbę, która była wynikiem losowania w obecności świadków. Daje to gwarancję jakości i bezstronności wyniku losowości
- target_items: Liczba wniosków, które mają zostać wybrane (wskazuje liczbę propozycji, które mają zostać wybrane spośród wskazanych wcześniej propozycji)
- title: Tytuł
- witnesses: Świadkowie
- models:
- decidim/sortitions/create_sortition_event: Wybór losowy
- activerecord:
- models:
- decidim/sortitions/sortition:
- one: Wybór losowy
- few: Wyborów losowych
- many: Wybory losowe
- other: Wybory losowe
- decidim:
- components:
- sortitions:
- actions:
- comment: Skomentuj
- name: Wybory losowe
- settings:
- global:
- comments_enabled: Komentarze włączone
- comments_max_length: Maksymalna długość komentarzy (Pozostaw 0 dla wartości domyślnej)
- events:
- sortitions:
- sortition_created:
- email_intro: Wybór losowy "%{resource_title}" został dodany do "%{participatory_space_title}", którą obserwujesz.
- email_outro: Otrzymałeś to powiadomienie, ponieważ obserwujesz "%{participatory_space_title}". Możesz przestać ją obserwować po kliknięciu w poprzedni link.
- email_subject: Dodano nowy wybór losowy do %{participatory_space_title}
- notification_title: Wybór losowy %{resource_title} został dodany do %{participatory_space_title}
- sortitions:
- admin:
- actions:
- destroy: Anuluj wybór losowy
- edit: Edytuj
- new_sortition: Nowy wybór przez losowanie
- show: Szczegóły dotyczące wyboru losowego
- models:
- sortition:
- fields:
- created_at: Data utworzenia
- decidim_proposals_component: Komponent propozycji
- dice: Kostka do gry
- reference: Odniesienie
- request_timestamp: Czas losowania
- seed: Ziarno
- target_items: Elementy wyboru
- title: Tytuł
- sortitions:
- confirm_destroy:
- confirm_destroy: Czy na pewno chcesz anulować ten wybór losowy?
- destroy: Anuluj wybór losowy
- title: Anulowanie wyboru losowego
- create:
- error: Wystąpił błąd podczas tworzenia nowego wyboru losowego.
- success: Wybór losowy został utworzony.
- destroy:
- error: Nie można anulować wyboru przez losowanie.
- success: Wybór losowy został anulowany.
- edit:
- title: Zaktualizuj informacje o wyborze losowym
- update: Aktualizuj
- form:
- select_proposal_component: Wybierz zestaw propozycji
- index:
- title: Wybór losowy
- new:
- confirm: Naciśnięcie przycisku dalej sprawi, że platforma zapisze datę i godzinę (z dokładnością do sekund) wraz z wynikiem rzutu kostką. Informacje te zostaną wykorzystane do dokonania losowego wyboru. Nie można cofnąć tej operacji; po kliknięciu przycisku wynik losowania zostanie opublikowany wraz z danymi wpisanymi w formularzu i nie będzie można modyfikować jego treści. Prosimy o uważne sprawdzenie jego treści.
- create: Utwórz
- title: Nowy wybór losowy
- show:
- selected_proposals: Propozycje wskazane do losowania
- update:
- error: Wystąpił błąd podczas aktualizacji wyboru losowego.
- success: Wybór losowy został zaktualizowany.
- admin_log:
- sortition:
- create: "%{user_name} utworzył(a) wybór losowy %{resource_name} w %{space_name}"
- delete: "%{user_name} anulował(a) wybór losowy %{resource_name} w %{space_name}"
- update: "%{user_name} zaktualizował(a) wybór losowy %{resource_name} w %{space_name}"
- sortitions:
- count:
- proposals_count:
- one: 1 propozycja
- few: "%{count} propozycji"
- many: "%{count} propozycji"
- other: "%{count} propozycji"
- filters:
- active: Aktualne
- all: Wszystko
- cancelled: Anulowane
- category: Kategoria
- state: Status
- index:
- empty: Nie ma jeszcze żadnych wyborów przez losowanie.
- linked_sortitions:
- selected_proposals: Wybrane propozycje
- orders:
- label: 'Sortuj według:'
- random: Losowo
- recent: Najnowsze
- results_count:
- count:
- one: wybrana propozycja
- few: wybrane propozycje
- many: wybranych propozycji
- other: wybranych propozycji
- show:
- algorithm: Kod algorytmu wyboru losowego
- cancelled: Anulowane wybory losowe
- candidate_proposal_ids: Kolejność i identyfikatory propozycji wyboru losowego
- dice_result: (1) Wynik rzutu kością
- introduction: 'Ta strona zawiera %{reference} wyniki wyboru losowego. Za pomocą tego losowania wybrano %{target_items} wyników w sposób losowy i z równym prawdopodobieństwem spośród propozycji przedstawionych poniżej. Wraz z wynikami, informacje wyświetlane na tej stronie stanowią zestaw kompletnych informacji wymagane do zmaksymalizowania gwarancji losowości i możliwości odtworzenia wyników. Kluczem do jakości tego wyboru losowego jest podwójna losowość zapewniona przez rzut kością (zweryfikowany przez świadków) i dokładny czas utworzenia wyboru losowego, który zapewnia dane wejściowe dla algorytmu generującego losowy selekcję. Ziarno czasu wyboru losowego jest tak dokładne (sekundy), że jego wygenerowanie nie podlega kontroli człowieka, zapewniając w ten sposób podwójne "niekontrolowane" dane wejściowe w celu zagwarantowania sprawiedliwego wyniku. '
- mathematical_result: Wynik (1) x (2)
- proposals_selected_by_sortition: Propozycje wybrane w ramach wyboru losowego
- sortition_reproducibility_details: Szczegóły odtwarzalności wyboru losowego
- time_seed: (2) Ziarno czasu
- witnesses: Świadkowie
- sortition:
- random_seed: Losowe ziarno
- selected_proposals:
- one: wybrana propozycja
- few: wybrane propozycje
- many: wybranych propozycji
- other: wybranych propozycji
- sortition_author:
- deleted: Usunięty użytkownik
- sortition_cancel_author:
- deleted: Usunięty użytkownik
- sortitions_count:
- count:
- one: 1 wybór losowy
- few: "%{count} wyborów losowych"
- many: "%{count} wybory losowe"
- other: "%{count} wybory losowe"
- statistics:
- sortitions_count: Wybory przez losowanie
diff --git a/decidim-sortitions/config/locales/pt-BR.yml b/decidim-sortitions/config/locales/pt-BR.yml
deleted file mode 100644
index 08a14ece60484..0000000000000
--- a/decidim-sortitions/config/locales/pt-BR.yml
+++ /dev/null
@@ -1,133 +0,0 @@
-pt-BR:
- activemodel:
- attributes:
- sortition:
- additional_info: Informação de classificação
- decidim_proposals_component_id: Conjunto de propostas
- dice: Resultado do rolo de matriz Role um dado de 6 lados, ou procure outro modo aleatório de gerar um número de 1 a 6, e insira aqui o número resultante na frente de algumas testemunhas. Isto contribui para a qualidade e garantias da aleatoriedade do resultado
- target_items: Número de propostas a serem selecionadas (indica o número de propostas que você deseja selecionar sorteando o grupo de propostas que você escolheu anteriormente)
- title: Título
- witnesses: Testemunhas
- models:
- decidim/sortitions/create_sortition_event: Classificação
- activerecord:
- models:
- decidim/sortitions/sortition:
- one: Sorteio
- other: Sorteios
- decidim:
- components:
- sortitions:
- actions:
- comment: Comentário
- name: Sorteios
- settings:
- global:
- comments_enabled: Comentários ativados
- comments_max_length: Tamanho máximo de comentários (deixe 0 para o valor padrão)
- events:
- sortitions:
- sortition_created:
- email_intro: A classificação "%{resource_title}" foi adicionada a "%{participatory_space_title}" que você está seguindo.
- email_outro: Você recebeu esta notificação porque está seguindo "%{participatory_space_title}". Você pode deixar de segui-lo no link anterior.
- email_subject: Nova classificação adicionada a %{participatory_space_title}
- notification_title: A classificação %{resource_title} foi adicionada a %{participatory_space_title}
- sortitions:
- admin:
- actions:
- destroy: Cancelar a classificação
- edit: Editar
- new_sortition: Novo Sorteio
- show: Detalhes da classificação
- models:
- sortition:
- fields:
- created_at: Data de criação
- decidim_proposals_component: Componente de propostas
- dice: Dados
- reference: Referência
- request_timestamp: Tempo de sorteio
- seed: Semente
- target_items: Itens para selecionar
- title: Título
- sortitions:
- confirm_destroy:
- confirm_destroy: Deseja mesmo cancelar este sorteio?
- destroy: Cancelar ordenação
- title: Cancelamento da classificação
- create:
- error: Ocorreu um erro ao criar uma nova classificação.
- success: Sorteio criado com sucesso.
- destroy:
- error: Não é possível cancelar o sorteio.
- success: Sorteio cancelado com sucesso.
- edit:
- title: Atualizar as informações sobre a classificação
- update: Atualizar
- form:
- select_proposal_component: Selecione o conjunto de propostas
- index:
- title: Sorteios
- new:
- confirm: Pressionando o botão de seguinte, a plataforma registrará a data e a hora (com precisão de segundos) e junto com os dados rolados, esta informação será usada para gerar uma seleção aleatória. A ação será irreversível, uma vez que o botão for clicado o resultado desse sorteio será publicado, juntamente com os dados inseridos neste formulário e não podem ser modificados, por favor, verifique o conteúdo com cuidado.
- create: Criar
- title: Nova classificação
- show:
- selected_proposals: Propostas selecionadas para sorteio
- update:
- error: Houve um erro ao atualizar a classificação.
- success: Sorteio atualizado com sucesso.
- admin_log:
- sortition:
- create: "%{user_name} criou a classificação %{resource_name} em %{space_name}"
- delete: "%{user_name} cancelou a classificação %{resource_name} em %{space_name}"
- update: "%{user_name} atualizou a classificação %{resource_name} em %{space_name}"
- sortitions:
- count:
- proposals_count:
- one: 1 proposta
- other: "%{count} propostas"
- filters:
- active: Ativo
- all: Todos
- cancelled: Cancelado
- category: Categoria
- state: Estado
- index:
- empty: Ainda não há sorteios ainda.
- linked_sortitions:
- selected_proposals: Propostas selecionadas
- orders:
- label: 'Ordenar ordenações por:'
- random: Aleatório
- recent: Recente
- results_count:
- count:
- one: proposta selecionada
- other: propostas selecionadas
- show:
- algorithm: Código de Algoritmo da Classificação
- cancelled: Sortição cancelada
- candidate_proposal_ids: Ordem de propostas de classificação e IDs
- dice_result: (1) resultado dado
- introduction: 'Esta página contém os resultados da ordenação %{reference}. Por meio dessa classificação, %{target_items} número de resultados foram selecionados aleatoriamente e com uma distribuição de probabilidade igual ao conjunto de propostas exibidas abaixo. Juntamente com os resultados, as informações exibidas nesta página fornecem todas as informações necessárias para maximizar as garantias e reproduzir os resultados. A chave para a qualidade dessa classificação é a dupla aleatoriedade fornecida pela rolagem de dados (verificada por testemunhas) e o tempo preciso da classificação que fornece dados para um algoritmo que gera uma seleção aleatória. A semente do tempo para a classificação é tão precisa (segundos) que é impossível controlar pelos humanos, fornecendo assim uma entrada dupla "incontrolável" para garantir um resultado justo. '
- mathematical_result: Resultado (1) x (2)
- proposals_selected_by_sortition: Propostas selecionadas por classificação
- sortition_reproducibility_details: Detalhes de reprodutibilidade de ordenação
- time_seed: (2) semente do tempo
- witnesses: Testemunhas
- sortition:
- random_seed: Semente aleatória
- selected_proposals:
- one: 1 proposta selecionada
- other: '%{count} propostas selecionadas'
- sortition_author:
- deleted: Usuário excluído
- sortition_cancel_author:
- deleted: Usuário excluído
- sortitions_count:
- count:
- one: 1 ordenação
- other: "%{count} ordenações"
- statistics:
- sortitions_count: Sorteios
diff --git a/decidim-sortitions/config/locales/pt.yml b/decidim-sortitions/config/locales/pt.yml
deleted file mode 100644
index 7753d692afe48..0000000000000
--- a/decidim-sortitions/config/locales/pt.yml
+++ /dev/null
@@ -1,124 +0,0 @@
-pt:
- activemodel:
- attributes:
- sortition:
- additional_info: Informação de sorteio
- decidim_proposals_component_id: Conjunto de propostas
- dice: Resultado do jogo de dados. Lance um dado de 6 lados, ou procure outro modo aleatório de gerar um número de 1 a 6, e insira aqui o número resultante, em frente a algumas testemunhas. Isto contribui para a qualidade e garantias da aleatoriedade do resultado
- target_items: Número de propostas a serem selecionadas (indica o número de propostas que pretende selecionar sorteando o grupo de propostas que escolheu anteriormente)
- title: Título
- witnesses: Testemunhas
- models:
- decidim/sortitions/create_sortition_event: Sorteio
- activerecord:
- models:
- decidim/sortitions/sortition:
- one: Sorteio
- other: Sorteios
- decidim:
- components:
- sortitions:
- actions:
- comment: Comentários
- name: Sorteios
- settings:
- global:
- comments_enabled: Comentários ativados
- comments_max_length: Comprimento máximo dos comentários (Deixar 0 para o valor predefinido)
- events:
- sortitions:
- sortition_created:
- email_intro: A classificação "%{resource_title}" foi adicionada a "%{participatory_space_title}" que você segue.
- email_outro: Recebeu esta notificação porque segue "%{participatory_space_title}". Pode deixar de segui-lo a partir da hiperligação anterior.
- email_subject: Novo sorteio adicionado a %{participatory_space_title}
- notification_title: A classificação %{resource_title} foi adicionada a %{participatory_space_title}
- sortitions:
- admin:
- actions:
- destroy: Cancelar o sorteio
- edit: Editar
- show: Detalhes do sorteio
- models:
- sortition:
- fields:
- created_at: Data de criação
- decidim_proposals_component: Componente de propostas
- dice: Dados
- reference: Referência
- request_timestamp: Data do sorteio
- seed: Semente
- target_items: Itens para selecionar
- title: Título
- sortitions:
- confirm_destroy:
- confirm_destroy: Tem a certeza de que pretende cancelar este sorteio?
- destroy: Cancelar sorteio
- title: Cancelamento do sorteio
- create:
- error: Ocorreu um problema ao criar um novo sorteio.
- edit:
- title: Atualizar as informações sobre o sorteio
- update: Atualizar
- form:
- select_proposal_component: Selecionar o conjunto de propostas
- index:
- title: Sorteios
- new:
- create: Criar
- title: Novo sorteio
- show:
- selected_proposals: Propostas selecionadas para sorteio
- update:
- error: Ocorreu um problema ao atualizar o sorteio.
- admin_log:
- sortition:
- create: "%{user_name} criou o sorteio %{resource_name} em %{space_name}"
- delete: "%{user_name} cancelou o sorteio %{resource_name} em %{space_name}"
- update: "%{user_name} atualizou o sorteio %{resource_name} em %{space_name}"
- sortitions:
- count:
- proposals_count:
- one: 1 proposta
- other: "%{count} propostas"
- filters:
- active: Ativo
- all: Todos
- cancelled: Cancelado
- category: Categoria
- state: Estado
- linked_sortitions:
- selected_proposals: Propostas selecionadas
- orders:
- label: 'Ordenar sorteios por:'
- random: Aleatória
- recent: Recente
- results_count:
- count:
- one: proposta selecionada
- other: propostas selecionadas
- show:
- algorithm: Código de algoritmo do sorteio
- cancelled: Sorteio cancelado
- candidate_proposal_ids: IDs e ordem dos sorteios de propostas
- dice_result: (1) resultado dos dados
- introduction: 'Esta página contém os resultados da ordenação %{reference}. Por meio dessa classificação, %{target_items} número de resultados foram selecionados aleatoriamente e com uma distribuição de probabilidade igual ao conjunto de propostas exibidas abaixo. Juntamente com os resultados, as informações exibidas nesta página fornecem todas as informações necessárias para maximizar as garantias e reproduzir os resultados. A chave para a qualidade dessa classificação é a dupla aleatoriedade fornecida pela rolagem de dados (verificada por testemunhas) e o tempo preciso da classificação que fornece dados para um algoritmo que gera uma seleção aleatória. A semente do tempo para a classificação é tão precisa (segundos) que é impossível controlar pelos humanos, fornecendo assim uma entrada dupla "incontrolável" para garantir um resultado justo. '
- mathematical_result: Resultado (1) x (2)
- proposals_selected_by_sortition: Propostas selecionadas por sorteio
- sortition_reproducibility_details: Detalhes da reprodutibilidade do sorteio
- time_seed: (2) Semente do tempo
- witnesses: Testemunhas
- sortition:
- random_seed: Semente aleatória
- selected_proposals:
- one: proposta selecionada
- other: propostas selecionadas
- sortition_author:
- deleted: Participante eliminado
- sortition_cancel_author:
- deleted: Participante eliminado
- sortitions_count:
- count:
- one: 1 sorteio
- other: "%{count} sorteios"
- statistics:
- sortitions_count: Sorteios
diff --git a/decidim-sortitions/config/locales/ro-RO.yml b/decidim-sortitions/config/locales/ro-RO.yml
deleted file mode 100644
index 06aa972a115bf..0000000000000
--- a/decidim-sortitions/config/locales/ro-RO.yml
+++ /dev/null
@@ -1,146 +0,0 @@
-ro:
- activemodel:
- attributes:
- sortition:
- additional_info: Informații privind tragerea la sorți
- decidim_proposals_component_id: Set de propuneri
- dice: Rezultat pe baza aruncării cu zarul. Folosește un zar cu 6 fețe sau caută o altă modalitate aleatorie de a genera un număr de la 1 la 6 și introdu aici numărul rezultat în fața unor martori. Acest lucru contribuie la calitatea și garanția unui rezultat aleatoriu
- target_items: Numărul de propuneri de selectat (indică numărul de propuneri pe care dorești să fie selectat prin tragere la sorți a grupului de propuneri pe care le-ai ales anterior)
- title: Titlu
- witnesses: Martori
- models:
- decidim/sortitions/create_sortition_event: Tragere la sorți
- activerecord:
- models:
- decidim/sortitions/sortition:
- one: Tragere la sorți
- few: Trageri la sorți
- other: Trageri la sorți
- decidim:
- components:
- sortitions:
- actions:
- comment: Comentează
- name: Trageri la sorți
- settings:
- global:
- clear_all: Ștergeți toate
- comments_enabled: Comentarii activate
- comments_max_length: Lungimea maximă a comentariilor (Lasă 0 pentru valoarea implicită)
- define_taxonomy_filters: Vă rugăm să definiți niște filtre pentru acest spațiu participativ înainte de a utiliza această setare.
- no_taxonomy_filters_found: Nici un filtru de taxonomie găsit.
- taxonomy_filters: Selectați filtrele pentru componentă
- taxonomy_filters_add: Adaugați filtru
- events:
- sortitions:
- sortition_created:
- email_intro: Tragerea la sorți "%{resource_title}" a fost adăugată la "%{participatory_space_title}”, spațiu pe care îl urmărești.
- email_outro: Ai primit această notificare deoarece urmărești „%{participatory_space_title}”. Poți anula abonarea de la link-ul anterior.
- email_subject: O nouă tragere la sorți a fost adăugată la %{participatory_space_title}
- notification_title: Tragerea la sorți %{resource_title} a fost adăugată la %{participatory_space_title}
- sortitions:
- admin:
- actions:
- destroy: Anulează tragerea la sorți
- edit: Editează
- show: Detalii privind tragerea la sorți
- title: Acțiuni
- models:
- sortition:
- fields:
- created_at: Data creării
- decidim_proposals_component: Componenta propuneri
- dice: Zar
- reference: Referință
- request_timestamp: Ora tragerii la sorți
- seed: Valoare aleatorie
- target_items: Articole de selectat
- taxonomies: Taxonomii
- title: Titlu
- sortitions:
- confirm_destroy:
- confirm_destroy: Sigur dorești să anulezi această tragere la sorți?
- destroy: Anulează tragerea la sorți
- title: Anularea tragerii la sorți
- create:
- error: A apărut o problemă la crearea unei noi trageri la sorți.
- success: Tragerea la sorți a fost creată cu succes.
- destroy:
- error: Nu se poate anula tragerea la sorți.
- success: Tragerea la sorți a fost anulată cu succes.
- edit:
- title: Actualizează informațiile despre tragerea la sorți
- update: Actualizează
- form:
- all_taxonomies: Toate taxonomiile
- select_proposal_component: Selectează setul de propuneri
- select_taxonomies: Taxonomii ale setului de propuneri în care doriți să aplicați extragerea. Lăsați gol pentru a aplica tragerea la toate propunerile privind taxonomia respectivă.
- index:
- title: Trageri la sorți
- new:
- create: Creează
- title: Tragere la sorți nouă
- show:
- selected_proposals: Propuneri selectate pentru tragerea la sorți
- update:
- error: A apărut o eroare la actualizarea tragerii la sorți.
- success: Tragerea la sorți a fost actualizată cu succes.
- admin_log:
- sortition:
- create: "%{user_name} a creat tragerea la sorți %{resource_name} în %{space_name}"
- delete: "%{user_name} a anulat tragerea la sorți %{resource_name} în %{space_name}"
- update: "%{user_name} a actualizat tragerea la sorți %{resource_name} în %{space_name}"
- sortitions:
- count:
- proposals_count:
- one: 1 propunere
- few: "%{count} propuneri"
- other: "%{count} propuneri"
- filters:
- active: Active
- all: Toate
- cancelled: Anulate
- category: Categorie
- state: Stadiu
- linked_sortitions:
- selected_proposals: Propuneri selectate
- orders:
- label: 'Ordonează tragerile la sorți după:'
- random: Aleator
- recent: Recente
- results_count:
- count:
- one: propunere selectată
- few: propuneri selectate
- other: propuneri selectate
- show:
- algorithm: Codul algoritmului tragerii la sorți
- any_taxonomy: din toate taxonomiile
- cancelled: Tragere la sorți anulată
- candidate_proposal_ids: Ordinea și ID-ul propunerilor din tragerea la sorți
- dice_result: (1) Rezultatul aruncării zarului
- introduction: 'Această pagină conține rezultatele tragerii la sorți %{reference}. Prin intermediul acestei trageri la sorți, un număr de %{target_items} rezultate au fost selectate în mod aleatoriu și cu o distribuție egală a probabilității, din setul de propuneri afișate mai jos. Împreună cu rezultatele, informațiile afișate pe această pagină oferă toate informațiile necesare pentru o garanție maximă și pentru a reproduce rezultatele. Cheia pentru calitatea acestei trageri la sorți este caracterul aleatoriu dublu asigurat de aruncarea zarului (verificată de martori) și de ora exactă a tragerii la sorți, care oferă input pentru un algoritm care generează o selecție aleatorie. Valoarea inițială a timpului pentru tragerea la sorți este atât de precisă (secunde) încât este imposibil de controlat de către om, asigurându-se astfel un dublu input „incontrolabil” pentru a se garanta un rezultat echitabil. '
- mathematical_result: Rezultatul (1) x (2)
- proposals_selected_by_sortition: Propuneri selectate prin tragere la sorți
- sortition_reproducibility_details: Detalii privind replicarea tragerii la sorți
- taxonomies: din %{taxonomies} taxonomii
- time_seed: (2) Data și ora
- witnesses: Martori
- sortition:
- random_seed: Valoare inițială aleatorie
- selected_proposals:
- one: propunere selectată
- few: propuneri selectate
- other: propuneri selectate
- sortition_author:
- deleted: Participant șters
- sortition_cancel_author:
- deleted: Participant șters
- sortitions_count:
- count:
- one: 1 tragere la sorți
- few: "%{count} trageri la sorți"
- other: "%{count} trageri la sorți"
- statistics:
- sortitions_count: Trageri la sorți
- sortitions_count_tooltip: Numărul de selecții aleatorii efectuate pentru luarea deciziilor.
diff --git a/decidim-sortitions/config/locales/ru.yml b/decidim-sortitions/config/locales/ru.yml
deleted file mode 100644
index 1b0eba6ad4c00..0000000000000
--- a/decidim-sortitions/config/locales/ru.yml
+++ /dev/null
@@ -1,129 +0,0 @@
-ru:
- activemodel:
- attributes:
- sortition:
- additional_info: Сведения о жеребьевке
- decidim_proposals_component_id: Набор предложений
- dice: Результат броска кубика. В присутствии свидетелей бросьте шестигранный кубик, или найдите еще какой-нибудь способ получить случайное число от 1 до 6, и введите его здесь. Это способствует качеству и гарантирует случайность результата
- target_items: Количество предложений, которые нужно выбрать (указывает количество предложений, которые вы хотите выбрать жеребьевкой из набора предложений, который вы отобрали до этого)
- title: Название
- witnesses: Свидетели
- models:
- decidim/sortitions/create_sortition_event: Жеребьевка
- activerecord:
- models:
- decidim/sortitions/sortition:
- one: Жеребьевка
- few: Жеребьевки
- many: Жеребьевок
- other: Жеребьевок
- decidim:
- components:
- sortitions:
- name: Жеребьевки
- settings:
- global:
- comments_enabled: Комментарии включены
- events:
- sortitions:
- sortition_created:
- email_intro: В "%{participatory_space_title}", за которым вы следите, добавлена жеребьевка "%{resource_title}".
- email_outro: Вы получили это уведомление, потому что вы следите за «%{participatory_space_title}». Вы можете перестать за ним следить, перейдя по приведенной выше ссылке.
- email_subject: В %{participatory_space_title} добавлена новая жеребьевка
- notification_title: В %{participatory_space_title} была добавлена жеребьевка %{resource_title}
- sortitions:
- admin:
- actions:
- destroy: Отменить жеребьевку
- edit: Редактировать
- show: Подробности жеребьевки
- models:
- sortition:
- fields:
- created_at: Дата создания
- decidim_proposals_component: Составляющая предложений
- dice: Игральный кубик
- reference: Ссылка на источник
- request_timestamp: Время жеребьевки
- seed: Начальное число
- target_items: Элементы для выбора
- title: Название
- sortitions:
- confirm_destroy:
- confirm_destroy: Вы действительно хотите отменить эту жеребьевку?
- destroy: Отменить жеребьевку
- title: Отмена жеребьевки
- create:
- error: При попытке создать новую жеребьевку произошла ошибка.
- edit:
- title: Обновить сведения о жеребьевке
- update: Обновить
- form:
- select_proposal_component: Выберите набор предложений
- index:
- title: Жеребьевки
- new:
- create: Создать
- title: Добавить жеребьевку
- show:
- selected_proposals: Предложения, выбранные для жеребьевки
- update:
- error: При попытке обновить эту жеребьевку произошла ошибка.
- admin_log:
- sortition:
- create: "%{user_name} создал жеребьевку %{resource_name} в %{space_name}"
- delete: "%{user_name} отменил жеребьевку %{resource_name} в %{space_name}"
- update: "%{user_name} обновил жеребьевку %{resource_name} в %{space_name}"
- sortitions:
- count:
- proposals_count:
- one: 1 предложение
- few: "%{count} предложения"
- many: "%{count} предложений"
- other: "%{count} предложений"
- filters:
- active: Действующие
- all: Все
- cancelled: Отмененные
- category: Категория
- state: Cостояние
- linked_sortitions:
- selected_proposals: Выбранные предложения
- orders:
- label: 'Упорядочить жеребьевки по:'
- random: Произвольно
- recent: Недавние
- results_count:
- count:
- one: выбранное предложение
- few: выбранных предложения
- many: выбранных предложений
- other: выбранных предложений
- show:
- algorithm: Код алгоритма жеребьевки
- cancelled: Отмененная жеребьевка
- candidate_proposal_ids: Порядок и названия предложений для жеребьевки
- dice_result: (1) Результат броска кубика
- introduction: 'На этой странице показан итог жеребьевки %{reference}. С помощью этой жеребьевки было выбрано случайным образом %{target_items} предложений с равным распределением вероятности из числа предложений, перечисленных ниже. Вместе с итогом, сведения, которые отражены на этой странице, содержат все, что необходимо для наибольших гарантий и для воспроизведения итога. Ключ к качеству этой жеребьевки - это двойная случайность, обеспеченная путем бросания игрального кубика (проверенного свидетелями) и точного времени жеребьевки, введенного в алгоритм, который производит случайную подборку. Задействованное в качестве начального числа жеребьевки время настолько точно (секунды), что люди его не способны контролировать. Таким образом благодаря двойному "неконтролируемому" введениюу данных обеспечивается справедливый итог. '
- mathematical_result: Произведение (1) x (2)
- proposals_selected_by_sortition: Предложения, отобранные жеребьевкой
- sortition_reproducibility_details: Сведения о воспроизводимости жеребьевки
- time_seed: (2) Время как начальное число
- witnesses: Свидетели
- sortition:
- random_seed: Случайное начальное число
- selected_proposals:
- one: предложение выбрано
- few: предложения выбрано
- many: предложений выбрано
- other: предложений выбрано
- sortition_author:
- deleted: Удаленный участник
- sortition_cancel_author:
- deleted: Удаленный участник
- sortitions_count:
- count:
- one: 1 жеребьевка
- few: "%{count} жеребьевки"
- many: "%{count} жеребьевок"
- other: "%{count} жеребьевок"
diff --git a/decidim-sortitions/config/locales/si-LK.yml b/decidim-sortitions/config/locales/si-LK.yml
deleted file mode 100644
index b0b50956edd26..0000000000000
--- a/decidim-sortitions/config/locales/si-LK.yml
+++ /dev/null
@@ -1 +0,0 @@
-si:
diff --git a/decidim-sortitions/config/locales/sk-SK.yml b/decidim-sortitions/config/locales/sk-SK.yml
deleted file mode 100644
index 48cd011d56e4e..0000000000000
--- a/decidim-sortitions/config/locales/sk-SK.yml
+++ /dev/null
@@ -1,164 +0,0 @@
-sk:
- activemodel:
- attributes:
- sortition:
- additional_info: Informácie o voľbe losovaním
- decidim_category_id: Kategórie sady návrhov, v ktorých chcete použiť remízu
- decidim_proposals_component_id: Návrhy sú nastavené
- dice: Výsledok hodu kockou. Hoďte 6-strananou kockou alebo vyhľadajte iný náhodný spôsob, ako vygenerovať číslo od 1 do 6, a zadajte tu výsledné číslo pred niekoľkými svedkami. To prispieva ku kvalite a záruke náhodnosti výsledku.
- target_items: Počet návrhov, ktoré majú byť vybrané (udáva počet návrhov, ktoré chcete vybrať zo skupiny návrhov, ktoré ste predtým vybrali)
- title: Názov
- witnesses: Svedkovia
- models:
- decidim/sortitions/create_sortition_event: Voľba losovaním
- activerecord:
- models:
- decidim/sortitions/sortition:
- one: Voľba losovaním
- few: Voľby losovaním
- many: Voľby losovaním
- other: Voľby losovaním
- decidim:
- components:
- sortitions:
- name: Voľby losovaním
- settings:
- global:
- comments_enabled: Komentáre povolené
- events:
- sortitions:
- sortition_created:
- email_intro: Vvoľba losovaním "%{resource_title}" bola pridaná ku "%{participatory_space_title}", ktorý sledujete.
- email_outro: Toto oznámenie ste dostali, pretože sledujete "%{participatory_space_title}". Môžete ho odhlásiť od predchádzajúceho odkazu.
- email_subject: Nová voľba losovaním bola pridaná ku %{participatory_space_title}
- notification_title: Vvoľba losovaním %{resource_title} bola pridaná ku %{participatory_space_title}
- pages:
- home:
- statistics:
- sortitions_count: Voľby losovaním
- participatory_processes:
- statistics:
- sortitions_count: Voľby losovaním
- sortitions:
- admin:
- actions:
- destroy: Zrušiť voľbu losovaním
- edit: Upraviť
- new: Nová voľba losovaním
- show: Podrobnosti o voľbe losovaním
- models:
- sortition:
- fields:
- category: Kategória
- created_at: Dátum vzniku
- decidim_proposals_component: Súčasť návrhov
- dice: Kocky
- reference: Odkazy
- request_timestamp: Doba kreslenie
- seed: Semienko
- target_items: Položky, ktoré chcete vybrať
- title: Titul
- name:
- one: Voľba losovaním
- few: Voľby losovaním
- many: Voľby losovaním
- other: Voľby losovaním
- sortitions:
- confirm_destroy:
- confirm_destroy: Naozaj chcete túto voľbu zrušiť?
- destroy: Zrušiť voľbu
- title: Zrušenie voľby losovaním
- create:
- error: Pri vytváraní novej voľby došlo k chybe.
- success: Voľba losovaním bola úspešne vytvorená
- destroy:
- error: Voľbu nemožno zrušiť.
- success: Voľba bola úspešne zrušená
- edit:
- title: Aktualizujte informácie o voľbe losovaním
- update: Aktualizácia
- form:
- all_categories: Všetky kategórie
- select_proposal_component: Vyberte sadu návrhov
- title: Nové návrhy na návrhy
- index:
- title: Voľby losovaním
- new:
- confirm: Stlačením ďalšieho tlačidla Decidim zaznamená dátum a čas (s presnosťou na sekundy) a spoločne s hodom kockami budú tieto informácie použité pre generovanie náhodného výberu. Akcia bude nevratná, po kliknutí na tlačidlo sa výsledky tejto kresby uverejní s údajmi uvedenými v tomto formulári a nemožno ich zmeniť, skontrolujte prosím pozorne obsah
- create: Vytvoriť
- title: Nové rozvrhnutie
- show:
- selected_proposals: Návrhy vybrané pre kreslenie
- update:
- error: Pri aktualizácii výberu došlo k chybe.
- success: Sortifikace bola úspešne aktualizovaná
- admin_log:
- sortition:
- create: "%{user_name} vytvoril %{resource_name} voľbu v priestore %{space_name}"
- delete: "%{user_name} zrušil %{resource_name} voľbu v priestore %{space_name}"
- update: "%{user_name} aktualizoval %{resource_name} voľbu v priestore %{space_name}"
- sortitions:
- count:
- proposals_count:
- one: 1 návrh
- few: "%{count} návrhov"
- many: "%{count} návrhov"
- other: "%{count} návrhov"
- filters:
- active: Aktívne
- all: Všetko
- cancelled: Zrušil
- category: Kategória
- category_prompt: Vyberte kategóriu
- search: Vyhľadávanie
- state: Štát
- filters_small_view:
- close_modal: Zatvoriť modálne
- filter: Filtrovať
- filter_by: Filtrovať podľa
- unfold: Rozbaliť
- linked_sortitions:
- selected_proposals: Vybrané návrhy
- orders:
- label: 'Objednať sortitions podľa:'
- random: Náhodný
- recent: Nedávno
- results_count:
- count:
- one: vybraný návrh
- few: vybrané návrhy
- many: vybrané návrhy
- other: vybrané návrhy
- show:
- algorithm: Kód algoritmu Sortition
- any_category: zo všetkých kategórií
- back: Späť na zoznam
- cancelled: Zrušené výber
- candidate_proposal_ids: žrebovacie volbaní objednávky a ID
- candidate_proposals_info: 'Rozbor bol vykonaný medzi nasledujúcimi návrhmi (%{category_label}), s nasledujúcimi ID (označené tučne vybranými návrhy)'
- category: z kategórie %{category}
- dice_result: "(1) Výsledok hodu kockou"
- introduction: 'Táto stránka obsahuje výsledky voľby losovaním %{referencie}. Prostredníctvom tohto výberu bolo vybratých %{target_items} výsledkov náhodne a s rovnakým rozložením pravdepodobnosti zo súboru návrhov zobrazených nižšie. Spolu s výsledkami informácie zobrazenými na tejto stránke poskytujú všetky informácie potrebné pre maximalizáciu záruk a reprodukciu výsledkov. Kľúčom ku kvalite tejto voľby je dvojitá náhodnosť, ktorú poskytuje hod kockou (overený svedkami) a presný čas výberu, ktorý poskytuje vstup pre algoritmus, ktorý generuje náhodný výber. Časový údaj pre voľbu je tak presný (sekundy), že nie je možné ovládať ho ľudsky, a tak poskytuje dvojitý, "nekontrolovateľný" vstup, ktorý zaručí spravodlivý výsledok. '
- mathematical_result: Výsledok (1) x (2)
- proposals_selected_by_sortition: Návrhy vybrané výberom
- sortition_reproducibility_details: Detaily reprodukcie voľby losovaním
- time_seed: "(2) Časový údaj"
- witnesses: Svedkovia
- sortition:
- random_seed: Náhodne generovaný prvok
- selected_proposals:
- one: vybraný návrh
- few: vybraných návrhov
- many: vybraných návrhov
- other: vybraných návrhov
- view: Pohľad
- sortition_author:
- deleted: Vymazaný užívateľ
- sortition_cancel_author:
- deleted: Vymazaný užívateľ
- sortitions_count:
- count:
- one: 1 sortie
- few: "%{count} sortitions"
- many: "%{count} sortitions"
- other: "%{count} sortitions"
diff --git a/decidim-sortitions/config/locales/sk.yml b/decidim-sortitions/config/locales/sk.yml
deleted file mode 100644
index e231a5d7a4752..0000000000000
--- a/decidim-sortitions/config/locales/sk.yml
+++ /dev/null
@@ -1,129 +0,0 @@
-sk:
- activemodel:
- attributes:
- sortition:
- additional_info: Informácie o voľbe losovaním
- decidim_proposals_component_id: Návrhy sú nastavené
- dice: Výsledok hodu kockou. Hoďte 6-strananou kockou alebo vyhľadajte iný náhodný spôsob, ako vygenerovať číslo od 1 do 6, a zadajte tu výsledné číslo pred niekoľkými svedkami. To prispieva ku kvalite a záruke náhodnosti výsledku.
- target_items: Počet návrhov, ktoré majú byť vybrané (udáva počet návrhov, ktoré chcete vybrať zo skupiny návrhov, ktoré ste predtým vybrali)
- title: Názov
- witnesses: Svedkovia
- models:
- decidim/sortitions/create_sortition_event: Voľba losovaním
- activerecord:
- models:
- decidim/sortitions/sortition:
- one: Voľba losovaním
- few: Voľby losovaním
- many: Voľby losovaním
- other: Voľby losovaním
- decidim:
- components:
- sortitions:
- name: Voľby losovaním
- settings:
- global:
- comments_enabled: Komentáre povolené
- events:
- sortitions:
- sortition_created:
- email_intro: Vvoľba losovaním "%{resource_title}" bola pridaná ku "%{participatory_space_title}", ktorý sledujete.
- email_outro: Toto oznámenie ste dostali, pretože sledujete "%{participatory_space_title}". Môžete ho odhlásiť od predchádzajúceho odkazu.
- email_subject: Nová voľba losovaním bola pridaná ku %{participatory_space_title}
- notification_title: Vvoľba losovaním %{resource_title} bola pridaná ku %{participatory_space_title}
- sortitions:
- admin:
- actions:
- destroy: Zrušiť voľbu losovaním
- edit: Upraviť
- show: Podrobnosti o voľbe losovaním
- models:
- sortition:
- fields:
- created_at: Dátum vzniku
- decidim_proposals_component: Súčasť návrhov
- dice: Kocky
- reference: Odkazy
- request_timestamp: Doba kreslenie
- seed: Semienko
- target_items: Položky, ktoré chcete vybrať
- title: Titul
- sortitions:
- confirm_destroy:
- confirm_destroy: Naozaj chcete túto voľbu zrušiť?
- destroy: Zrušiť voľbu
- title: Zrušenie voľby losovaním
- create:
- error: Pri vytváraní novej voľby došlo k chybe.
- edit:
- title: Aktualizujte informácie o voľbe losovaním
- update: Aktualizácia
- form:
- select_proposal_component: Vyberte sadu návrhov
- index:
- title: Voľby losovaním
- new:
- create: Vytvoriť
- title: Nové rozvrhnutie
- show:
- selected_proposals: Návrhy vybrané pre kreslenie
- update:
- error: Pri aktualizácii výberu došlo k chybe.
- admin_log:
- sortition:
- create: "%{user_name} vytvoril %{resource_name} voľbu v priestore %{space_name}"
- delete: "%{user_name} zrušil %{resource_name} voľbu v priestore %{space_name}"
- update: "%{user_name} aktualizoval %{resource_name} voľbu v priestore %{space_name}"
- sortitions:
- count:
- proposals_count:
- one: 1 návrh
- few: "%{count} návrhov"
- many: "%{count} návrhov"
- other: "%{count} návrhov"
- filters:
- active: Aktívne
- all: Všetko
- cancelled: Zrušil
- category: Kategória
- state: Štát
- linked_sortitions:
- selected_proposals: Vybrané návrhy
- orders:
- label: 'Objednať sortitions podľa:'
- random: Náhodný
- recent: Nedávno
- results_count:
- count:
- one: vybraný návrh
- few: vybrané návrhy
- many: vybrané návrhy
- other: vybrané návrhy
- show:
- algorithm: Kód algoritmu Sortition
- cancelled: Zrušené výber
- candidate_proposal_ids: žrebovacie volbaní objednávky a ID
- dice_result: (1) Výsledok hodu kockou
- introduction: 'Táto stránka obsahuje výsledky voľby losovaním %{referencie}. Prostredníctvom tohto výberu bolo vybratých %{target_items} výsledkov náhodne a s rovnakým rozložením pravdepodobnosti zo súboru návrhov zobrazených nižšie. Spolu s výsledkami informácie zobrazenými na tejto stránke poskytujú všetky informácie potrebné pre maximalizáciu záruk a reprodukciu výsledkov. Kľúčom ku kvalite tejto voľby je dvojitá náhodnosť, ktorú poskytuje hod kockou (overený svedkami) a presný čas výberu, ktorý poskytuje vstup pre algoritmus, ktorý generuje náhodný výber. Časový údaj pre voľbu je tak presný (sekundy), že nie je možné ovládať ho ľudsky, a tak poskytuje dvojitý, "nekontrolovateľný" vstup, ktorý zaručí spravodlivý výsledok. '
- mathematical_result: Výsledok (1) x (2)
- proposals_selected_by_sortition: Návrhy vybrané výberom
- sortition_reproducibility_details: Detaily reprodukcie voľby losovaním
- time_seed: (2) Časový údaj
- witnesses: Svedkovia
- sortition:
- random_seed: Náhodne generovaný prvok
- selected_proposals:
- one: vybraný návrh
- few: vybraných návrhov
- many: vybraných návrhov
- other: vybraných návrhov
- sortition_author:
- deleted: Vymazaný užívateľ
- sortition_cancel_author:
- deleted: Vymazaný užívateľ
- sortitions_count:
- count:
- one: 1 sortie
- few: "%{count} sortitions"
- many: "%{count} sortitions"
- other: "%{count} sortitions"
diff --git a/decidim-sortitions/config/locales/sl.yml b/decidim-sortitions/config/locales/sl.yml
deleted file mode 100644
index 34b3a4a594c92..0000000000000
--- a/decidim-sortitions/config/locales/sl.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-sl:
- activemodel:
- attributes:
- sortition:
- title: Naziv
diff --git a/decidim-sortitions/config/locales/so-SO.yml b/decidim-sortitions/config/locales/so-SO.yml
deleted file mode 100644
index 11720879bac3d..0000000000000
--- a/decidim-sortitions/config/locales/so-SO.yml
+++ /dev/null
@@ -1 +0,0 @@
-so:
diff --git a/decidim-sortitions/config/locales/sq-AL.yml b/decidim-sortitions/config/locales/sq-AL.yml
deleted file mode 100644
index 44ddadc95a8f3..0000000000000
--- a/decidim-sortitions/config/locales/sq-AL.yml
+++ /dev/null
@@ -1 +0,0 @@
-sq:
diff --git a/decidim-sortitions/config/locales/sr-CS.yml b/decidim-sortitions/config/locales/sr-CS.yml
deleted file mode 100644
index 9e26af81914fc..0000000000000
--- a/decidim-sortitions/config/locales/sr-CS.yml
+++ /dev/null
@@ -1 +0,0 @@
-sr:
diff --git a/decidim-sortitions/config/locales/sv.yml b/decidim-sortitions/config/locales/sv.yml
deleted file mode 100644
index d8cb4c51d4430..0000000000000
--- a/decidim-sortitions/config/locales/sv.yml
+++ /dev/null
@@ -1,135 +0,0 @@
-sv:
- activemodel:
- attributes:
- sortition:
- additional_info: Information om lottningen
- decidim_proposals_component_id: Förslagen
- dice: Tärningskast. Slå en sexsidig tärning inför vittnen, eller använd ett annat sätt att slumpmässigt skapa ett tal från 1 till 6, och skriv in resultatet. Detta bidrar till kvalitén och garanterar resultatets slumpmässighet
- target_items: Antal förslag som ska väljas (anger hur många förslag som ska väljas genom lottdragning från den utvalda gruppen av förslag)
- title: Titel
- witnesses: Vittnen
- models:
- decidim/sortitions/create_sortition_event: Lottning
- activerecord:
- models:
- decidim/sortitions/sortition:
- one: Lottning
- other: Lottningar
- decidim:
- components:
- sortitions:
- actions:
- comment: Kommentera
- name: Lottningar
- settings:
- global:
- comments_enabled: Aktivera kommentarer
- comments_max_length: Maximal kommentarslängd (ange 0 för att använda standardvärdet)
- events:
- sortitions:
- sortition_created:
- email_intro: Tilldelningen "%{resource_title}" har lagts till i "%{participatory_space_title}" som du följer.
- email_outro: Du har fått det här meddelandet eftersom du följer "%{participatory_space_title}". Du kan sluta att följa det via föregående länk.
- email_subject: Ny tilldelning har lagts till i %{participatory_space_title}
- notification_title: Tilldelningen %{resource_title} har lagts till i %{participatory_space_title}
- sortitions:
- admin:
- actions:
- destroy: Avbryt tilldelningen
- edit: Redigera
- new_sortition: Ny lottning
- show: Detaljer om tilldelningen
- title: Handlingar
- models:
- sortition:
- fields:
- created_at: Skapelsedatum
- decidim_proposals_component: Förslagskomponent
- dice: Tärningar
- reference: Referens
- request_timestamp: Lottningstid
- seed: Frö
- target_items: Objekt att välja
- title: Titel
- sortitions:
- confirm_destroy:
- confirm_destroy: Vill du avbryta tilldelningen?
- destroy: Avbryt tilldelningen
- title: Avbryta tilldelningen
- create:
- error: Det gick inte att skapa en ny tilldelning.
- success: Lottningen har skapats.
- destroy:
- error: Det går inte att avbryta lottningen.
- success: Lottningen har avbrutits.
- edit:
- title: Uppdatera informationen om tilldelningen
- update: Uppdatera
- form:
- select_proposal_component: Välj förslagen som ska behandlas
- index:
- title: Lottningar
- new:
- confirm: När du trycker på knappen Nästa registrerar Decidim datum och tid (till och med sekunder) och tillsammans med tärningskastet används denna information för att generera ett slumpmässigt val. Åtgärden är oåterkallelig. När du har tryckt på knappen publiceras resultatet av dragningen tillsammans med de uppgifter som angetts i detta formulär och kan inte ändras. Gå igenom innehållet noggrant.
- create: Skapa
- title: Ny tilldelning
- show:
- selected_proposals: Förslag som valts för lottning
- update:
- error: Det gick inte att uppdatera tilldelningen.
- success: Lottningen har uppdaterats.
- admin_log:
- sortition:
- create: "%{user_name} skapade tilldelningen %{resource_name} i %{space_name}"
- delete: "%{user_name} avbröt tilldelningen %{resource_name} i %{space_name}"
- update: "%{user_name} uppdaterade tilldelningen %{resource_name} i %{space_name}"
- sortitions:
- count:
- proposals_count:
- one: 1 förslag
- other: "%{count} förslag"
- filters:
- active: Pågående
- all: Alla
- cancelled: Avbrutna
- category: Kategori
- state: Status
- index:
- empty: Det finns inga lottningar än.
- linked_sortitions:
- selected_proposals: Utvalda förslag
- orders:
- label: 'Sortera tilldelningar efter:'
- random: Slumpmässigt
- recent: Senaste
- results_count:
- count:
- one: Valt förslaget
- other: Valda förslag
- show:
- algorithm: Tilldelningens algoritmkod
- cancelled: Avbruten tilldelning
- candidate_proposal_ids: Förslagens ordning och ID i tilldelningen
- dice_result: Tärningsresultat
- introduction: 'Den här sidan innehåller resultaten från tilldelningen %{reference}. Med hjälp av tilldelningen har %{target_items} resultat valts ut slumpmässigt och med lika stor sannolikhet från listan med förslag nedan. Tillsammans med resultaten, innehåller informationen på denna sida allt som krävs för att garantera och återskapa resultaten. Nyckeln till kvalitén på tilldelningen är den dubblerade slumpmässigheten från ett bevittnat tärningskast samt den exakta tiden för tilldelningen, som matas in i en algoritm som genererar det slumpmässiga urvalet. Tidsfröet för tilldelningen är så exakt (sekunder) att den är omöjlig att styras av människor, vilket ger en dubblerad "okontrollerad" indata, i syfte att att garantera ett rättvist resultat. '
- mathematical_result: Resultat (tärning x dragning)
- proposals_selected_by_sortition: Förslag valda genom tilldelning
- sortition_reproducibility_details: Detaljer för att reproducera lottningens resultat
- time_seed: (2) Tidsfrö
- witnesses: Vittnen
- sortition:
- random_seed: Slumpmässigt frö
- selected_proposals:
- one: 1 valt förslag
- other: '%{count} utvalda förslag'
- sortition_author:
- deleted: Raderad deltagare
- sortition_cancel_author:
- deleted: Raderad deltagare
- sortitions_count:
- count:
- one: 1 tilldelning
- other: "%{count} tilldelningar"
- statistics:
- sortitions_count: Lottningar
- sortitions_count_tooltip: Antalet slumpmässiga val som görs för beslutsfattandet.
diff --git a/decidim-sortitions/config/locales/sw-KE.yml b/decidim-sortitions/config/locales/sw-KE.yml
deleted file mode 100644
index 7bf73465b1380..0000000000000
--- a/decidim-sortitions/config/locales/sw-KE.yml
+++ /dev/null
@@ -1 +0,0 @@
-sw:
diff --git a/decidim-sortitions/config/locales/th-TH.yml b/decidim-sortitions/config/locales/th-TH.yml
deleted file mode 100644
index a4431912a8299..0000000000000
--- a/decidim-sortitions/config/locales/th-TH.yml
+++ /dev/null
@@ -1 +0,0 @@
-th:
diff --git a/decidim-sortitions/config/locales/ti-ER.yml b/decidim-sortitions/config/locales/ti-ER.yml
deleted file mode 100644
index 39bcd22920e44..0000000000000
--- a/decidim-sortitions/config/locales/ti-ER.yml
+++ /dev/null
@@ -1 +0,0 @@
-ti:
diff --git a/decidim-sortitions/config/locales/tr-TR.yml b/decidim-sortitions/config/locales/tr-TR.yml
deleted file mode 100644
index d047cbed91ccb..0000000000000
--- a/decidim-sortitions/config/locales/tr-TR.yml
+++ /dev/null
@@ -1,123 +0,0 @@
-tr:
- activemodel:
- attributes:
- sortition:
- additional_info: Sıralama bilgileri
- decidim_proposals_component_id: Teklif seti
- dice: Kalıp rulosunun sonucu. 6 kenarlı bir zarı yuvarlayın veya 1'den 6'ya kadar bir sayı oluşturmak için başka bir rastgele yol arayın ve sonuçta elde edilen sayıyı bazı tanıkların önüne girin. Bu, sonucun rasgeleliğinin kalitesine ve garantilerine katkıda bulunur
- target_items: Seçilecek teklif sayısı (daha önce seçmiş olduğunuz teklif grubunun çoğunu çizerek, seçmek istediğiniz teklif sayısını gösterir)
- title: Başlık
- witnesses: Tanıklar
- models:
- decidim/sortitions/create_sortition_event: Sıralama
- activerecord:
- models:
- decidim/sortitions/sortition:
- one: Sıralama
- other: Sıralama
- decidim:
- components:
- sortitions:
- name: Sıralama
- settings:
- global:
- comments_enabled: Yorumlar etkin
- comments_max_length: Maksimum yorum uzunluğu (Varsayılan değer için 0 bırakın)
- events:
- sortitions:
- sortition_created:
- email_intro: '"%{resource_title}" sıralaması takip ettiğiniz "%{participatory_space_title}" listesine eklendi.'
- email_outro: Bu bildirimi, "%{participatory_space_title}" adlı kişiyi takip ettiğiniz için aldınız. Önceki bağlantıdan takibini bırakabilirsiniz.
- email_subject: '%{participatory_space_title} alanına yeni sıralama eklendi'
- notification_title: %{resource_title} sıralaması %{participatory_space_title} alanına eklendi
- sortitions:
- admin:
- actions:
- destroy: Sıralamayı iptal et
- edit: Düzenle
- new_sortition: Yeni Sıralama
- show: Sıralama detayları
- models:
- sortition:
- fields:
- created_at: Oluşturulma tarihi
- decidim_proposals_component: Teklifler bileşeni
- dice: Zar
- reference: Referans
- request_timestamp: Beraberlik süresi
- seed: Çekirdek
- target_items: Seçilecek öğeler
- title: Başlık
- sortitions:
- confirm_destroy:
- confirm_destroy: Bu sıralamayı iptal etmek istediğinize emin misiniz?
- destroy: Sıralamayı iptal et
- title: Sıralamanın iptali
- create:
- error: Yeni bir sıralama oluştururken bir sorun oluştu.
- edit:
- title: Sıralama hakkındaki bilgileri güncelleyin
- update: Güncelle
- form:
- select_proposal_component: Teklif kümesini seçin
- index:
- title: Sıralama
- new:
- create: Oluştur
- title: Yeni sıralama
- show:
- selected_proposals: Çekiliş için seçilen teklifler
- update:
- error: Sıralama güncellenirken bir sorun oluştu.
- admin_log:
- sortition:
- create: "%{user_name}, %{space_name} %{resource_name} sıralamayı yarattı"
- delete: "%{user_name}, %{space_name} %{resource_name} sıralamayı iptal etti"
- update: "%{user_name}, %{space_name} içindeki %{resource_name} sıralamasını güncelledi"
- sortitions:
- count:
- proposals_count:
- one: 1 teklif
- other: "%{count} teklif"
- filters:
- active: Aktif
- all: Tümü
- cancelled: İptal edildi
- category: Kategori
- state: Statü
- index:
- empty: Henüz bir sıralama yok.
- linked_sortitions:
- selected_proposals: Seçili teklifler
- orders:
- label: 'Sıralama ölçütü:'
- random: Rastgele
- recent: En son
- results_count:
- count:
- one: seçilen teklif
- other: seçilen teklifler
- show:
- algorithm: Sıralamanın algoritma kodu
- cancelled: İptal edilen sıralama
- candidate_proposal_ids: Sıralama tekliflerinin sırası ve ID'si
- dice_result: (1) Zar sonucu
- introduction: 'Bu sayfa, %{reference} sıralamasının sonuçlarını içerir. Bu sıralama sayesinde, %{target_items} sonuç sayısı rasgele ve aşağıda gösterilen teklif kümesinden eşit olasılık dağılımıyla seçilmiştir. Sonuçlarla birlikte, bu sayfada görüntülenen bilgiler, garantileri en üst düzeye çıkarmak ve sonuçları yeniden üretmek için gereken tüm bilgileri sağlar. Bu sınıflandırmanın kalitesinin anahtarı, bir zarın yuvarlanmasıyla sağlanan (tanıklar tarafından doğrulanan) çift rastlantısallık ve rasgele bir seçim oluşturan bir algoritma için girdi sağlayan sıralamanın kesin zamanıdır. Ayırma için zaman-tohum o kadar doğrudur (saniye) ki, insanlar tarafından kontrol edilmesi imkansızdır, böylece adil bir sonucu garantilemek için çift "kontrol edilemez" bir girdi sağlar. '
- mathematical_result: Sonuç (1) x (2)
- proposals_selected_by_sortition: Sıralamaya göre seçilen teklifler
- sortition_reproducibility_details: Sıralama yeniden üretilebilirlik ayrıntıları
- time_seed: (2) Zaman tohumu
- witnesses: Tanıklar
- sortition:
- random_seed: Rastgele tohum
- selected_proposals:
- one: teklif seçildi
- other: teklif seçildi
- sortition_author:
- deleted: Silinmiş katılımcı
- sortition_cancel_author:
- deleted: Silinmiş katılımcı
- sortitions_count:
- count:
- one: 1 sıralama
- other: "%{count} sıralama"
diff --git a/decidim-sortitions/config/locales/uk.yml b/decidim-sortitions/config/locales/uk.yml
deleted file mode 100644
index 32863b696edf0..0000000000000
--- a/decidim-sortitions/config/locales/uk.yml
+++ /dev/null
@@ -1,129 +0,0 @@
-uk:
- activemodel:
- attributes:
- sortition:
- additional_info: Жеребкування відомостей
- decidim_proposals_component_id: Набір пропозицій
- dice: Вислід жеребкування. У присутності свідків киньте шостигранну гральну кістку, або знайдіть якийсь інший спосіб одержати випадкове число від 1 до 6, і введіть тут. Це сприяє якості та гарантує випадковість висліду
- target_items: Кількість пропозицій, що підлягають відбору (вказує кількість пропозицій, які потрібно обрати, кинувши жереб по тій сукупності пропозицій, яку ви обрали раніше)
- title: Назва
- witnesses: Свідки
- models:
- decidim/sortitions/create_sortition_event: Жеребкування
- activerecord:
- models:
- decidim/sortitions/sortition:
- one: Жеребкування
- few: Жеребкування
- many: Жеребкувань
- other: Жеребкувань
- decidim:
- components:
- sortitions:
- name: Жеребкування
- settings:
- global:
- comments_enabled: Коментарі увімкнено
- events:
- sortitions:
- sortition_created:
- email_intro: До "%{participatory_space_title}", за яким ви стежите, було додане жеребкування "%{resource_title}".
- email_outro: Ви отримали це сповіщення, тому що ви стежите за "%{participatory_space_title}". Ви можете припинити стежити за ним, перейшовши за наведеним вище посиланням.
- email_subject: До %{participatory_space_title} додано нове жеребкування
- notification_title: До %{participatory_space_title} була додано жеребкування %{resource_title}
- sortitions:
- admin:
- actions:
- destroy: Скасувати жеребкування
- edit: Редагувати
- show: Подробиці жеребкування
- models:
- sortition:
- fields:
- created_at: Дата створення
- decidim_proposals_component: Складова пропозицій
- dice: Гральна кістка
- reference: Посилання на джерело
- request_timestamp: Час кидання жеребу
- seed: Початкове число
- target_items: Наймення до вибору
- title: Назва
- sortitions:
- confirm_destroy:
- confirm_destroy: Ви дійсно бажаєте скасувати це жеребкування?
- destroy: Скасувати жеребкування
- title: Скасування жеребкування
- create:
- error: При спробі створити нове жеребкування сталася помилка.
- edit:
- title: Оновити відомості про жеребкування
- update: Оновити
- form:
- select_proposal_component: Оберіть набір пропозицій
- index:
- title: Жеребкування
- new:
- create: Створити
- title: Додати жеребкування
- show:
- selected_proposals: Пропозиції, відібрані для жеребкування
- update:
- error: При спробі оновити жеребкування сталася помилка.
- admin_log:
- sortition:
- create: "%{user_name} створив жеребкування %{resource_name} у %{space_name}"
- delete: "%{user_name} скасував жеребкування %{resource_name} у %{space_name}"
- update: "%{user_name} оновив жеребкування %{resource_name} у %{space_name}"
- sortitions:
- count:
- proposals_count:
- one: 1 пропозиція
- few: "%{count} пропозиції"
- many: "%{count} пропозицій"
- other: "%{count} пропозицій"
- filters:
- active: Діючі
- all: Усі
- cancelled: Скасовані
- category: Категорія
- state: Стан
- linked_sortitions:
- selected_proposals: Вибрані пропозиції
- orders:
- label: 'Впорядкувати жеребкування за ознакою:'
- random: Довільно
- recent: Нещодавні
- results_count:
- count:
- one: вибрана пропозиція
- few: вибрані пропозиції
- many: вибраних пропозицій
- other: вибраних пропозицій
- show:
- algorithm: Код алгоритму жеребкування
- cancelled: Скасоване жеребкування
- candidate_proposal_ids: Порядок та назви жеребкованих пропозицій
- dice_result: (1) Вислід кидання гральної кістки
- introduction: 'На цій сторінці показані висліди жеребкування %{reference}. За допомогою цього жеребкування було обрано випадковим чином %{target_items} пропозицій з рівним розподілом імовірності з числа пропозицій, перелічених нижче. Разом з вислідами, відомості, які відображені на цій сторінці, містять все, що необхідно для щонайбільших гарантій та для відтворення вислідів. Ключ до якості цього жеребкування - це подвійна випадковість, забезпечена шляхом кидання гральної кістки (засвідченого свідками) і точного часу жеребкування, введеного до алгоритму, який виробляє випадкову добірку. Задіяний як початкове число час жеребкування настільки точний (секунди), що люди нездатні його контролювати. Таким чином завдяки подвійним "неконтрольованим" входовим даним забезпечується справедливий вислід. '
- mathematical_result: Добуток (1) x (2)
- proposals_selected_by_sortition: Пропозиції, обрані киданням жеребу
- sortition_reproducibility_details: Подробиці щодо відтворюваності жеребкування
- time_seed: (2) Час як початкове число
- witnesses: Свідки
- sortition:
- random_seed: Випадкове початкове число
- selected_proposals:
- one: обрана пропозиція
- few: обрані пропозиції
- many: обраних пропозицій
- other: обраних пропозицій
- sortition_author:
- deleted: Видалений учасник
- sortition_cancel_author:
- deleted: Видалений учасник
- sortitions_count:
- count:
- one: 1 жеребкування
- few: "%{count} жеребкування"
- many: "%{count} жеребкувань"
- other: "%{count} жеребкувань"
diff --git a/decidim-sortitions/config/locales/val-ES.yml b/decidim-sortitions/config/locales/val-ES.yml
deleted file mode 100644
index fa70518d04b9b..0000000000000
--- a/decidim-sortitions/config/locales/val-ES.yml
+++ /dev/null
@@ -1 +0,0 @@
-val:
diff --git a/decidim-sortitions/config/locales/vi-VN.yml b/decidim-sortitions/config/locales/vi-VN.yml
deleted file mode 100644
index 326506f0b1a36..0000000000000
--- a/decidim-sortitions/config/locales/vi-VN.yml
+++ /dev/null
@@ -1 +0,0 @@
-vi:
diff --git a/decidim-sortitions/config/locales/vi.yml b/decidim-sortitions/config/locales/vi.yml
deleted file mode 100644
index 326506f0b1a36..0000000000000
--- a/decidim-sortitions/config/locales/vi.yml
+++ /dev/null
@@ -1 +0,0 @@
-vi:
diff --git a/decidim-sortitions/config/locales/zh-CN.yml b/decidim-sortitions/config/locales/zh-CN.yml
deleted file mode 100644
index bf8b2e6fd03e9..0000000000000
--- a/decidim-sortitions/config/locales/zh-CN.yml
+++ /dev/null
@@ -1,115 +0,0 @@
-zh-CN:
- activemodel:
- attributes:
- sortition:
- additional_info: 排序信息
- decidim_proposals_component_id: 提案集
- dice: 死亡登记的结果。 旋转一个6边的死亡或寻找另一个随机的方法生成一个从1到6之间的数字。 然后在这里当着一些证人的面输入由此产生的号码。 这有助于提高结果的质量并保证结果的随机性
- target_items: 要选择的建议数量 (表示您想要选择的建议的数量,您先前选择的建议群组)
- title: 标题
- witnesses: 证人
- models:
- decidim/sortitions/create_sortition_event: 排序方式
- activerecord:
- models:
- decidim/sortitions/sortition:
- other: 联谊会
- decidim:
- components:
- sortitions:
- name: 联谊会
- settings:
- global:
- comments_enabled: 评论已启用
- comments_max_length: 评论最大长度 (默认值留0)
- events:
- sortitions:
- sortition_created:
- email_intro: 对不起,%{resource_title}" 已添加到您关注的"%{participatory_space_title}"。
- email_outro: 您收到此通知是因为您正在关注 "%{participatory_space_title}"。您可以从上一个链接取消关注它。
- email_subject: 新的排序添加到 %{participatory_space_title}
- notification_title: 吸附 %{resource_title} 已被添加到 %{participatory_space_title}
- sortitions:
- admin:
- actions:
- destroy: 取消排序方式
- edit: 编辑
- show: 排序详情
- models:
- sortition:
- fields:
- created_at: 创建日期
- decidim_proposals_component: 二. 提议的构成部分
- dice: 爱好
- reference: 参考
- request_timestamp: 绘制时间
- seed: 种子
- target_items: 要选择的项目
- title: 标题
- sortitions:
- confirm_destroy:
- confirm_destroy: 您确定要取消这个分类吗?
- destroy: 取消排序方式
- title: 取消吸附性
- create:
- error: 出现了一个问题,造成了新的怨恨。
- edit:
- title: 更新有关分类的信息
- update: 更新
- form:
- select_proposal_component: 选择提案集
- index:
- title: 联谊会
- new:
- create: 创建
- title: 新的排序方式
- show:
- selected_proposals: 选择绘图提案
- update:
- error: 有一个问题是更新厌恶。
- admin_log:
- sortition:
- create: "%{user_name} 在 %{resource_name} 中创建了 %{space_name} 个排序。"
- delete: "%{user_name} 取消了 %{resource_name} 在 %{space_name} 中的排序。"
- update: "%{user_name} 更新了 %{resource_name} 个排序在 %{space_name}"
- sortitions:
- count:
- proposals_count:
- other: "%{count} 个提议"
- filters:
- active: 已启用
- all: 所有的
- cancelled: 已取消
- category: 类别
- state: 状态
- linked_sortitions:
- selected_proposals: 选定的建议
- orders:
- label: '排序方式:'
- random: 随机播放
- recent: 最近的
- results_count:
- count:
- other: 选定的建议
- show:
- algorithm: 排序算法
- cancelled: 取消排序方式
- candidate_proposal_ids: 排序建议订单和 ID
- dice_result: (1) 致残结果
- introduction: '此页面包含排序 %{reference}的结果。 通过这种道歉, 已经随机选择了 %{target_items} 个结果,并且显示在下面的一组建议中同样的概率分布。 本页所显示的信息连同结果,提供了最大限度保证和复制结果所需的所有信息。 这种区分的质量的关键是由证人核实的法官滚动所提供的双倍随机性和为产生随机选择的算法提供输入的吸附确切时间。 难度的时间种子非常精确(秒),人类无法控制,因此提供了双个“无法控制的”输入以保证结果的公允。 '
- mathematical_result: 结果(1) x (2)
- proposals_selected_by_sortition: 按排序选择的提议
- sortition_reproducibility_details: 排序详细信息
- time_seed: (2) 时间种子
- witnesses: 证人
- sortition:
- random_seed: 随机种子
- selected_proposals:
- other: 建议已选择
- sortition_author:
- deleted: 删除参与者
- sortition_cancel_author:
- deleted: 删除参与者
- sortitions_count:
- count:
- other: "%{count} 排序方式"
diff --git a/decidim-sortitions/config/locales/zh-TW.yml b/decidim-sortitions/config/locales/zh-TW.yml
deleted file mode 100644
index de4108f11eacf..0000000000000
--- a/decidim-sortitions/config/locales/zh-TW.yml
+++ /dev/null
@@ -1,125 +0,0 @@
-zh-TW:
- activemodel:
- attributes:
- sortition:
- additional_info: 隨機抽籤資訊
- decidim_proposals_component_id: 提案集合
- dice: 擲骰子的結果。擲一顆六面骰子,或尋找其他隨機產生1到6之間的數字的方法,然後在一些證人面前輸入結果的數字。這有助於確保結果的品質和隨機性的保證。
- target_items: 被選出提案的數量(表示您希望在您之前選擇的提案組中通過抽籤選出的提案數量)
- title: 標題
- witnesses: 見證人
- models:
- decidim/sortitions/create_sortition_event: 抽籤
- activerecord:
- models:
- decidim/sortitions/sortition:
- other: 抽籤
- decidim:
- components:
- sortitions:
- actions:
- comment: 留言
- name: 抽籤
- settings:
- global:
- comments_enabled: 啟用評論功能
- comments_max_length: 評論字數最大長度(若要使用預設值請輸入0)
- events:
- sortitions:
- sortition_created:
- email_intro: 您正在關注的 "%{participatory_space_title}" 中新增了抽籤 "%{resource_title}"
- email_outro: 您收到了此通知,是因為您正在關注 "%{participatory_space_title}"。您可以通過前面的鏈接取消關注它。
- email_subject: '%{participatory_space_title}" 中新增了一個新的抽籤。'
- notification_title: '%{participatory_space_title}」中已新增了%{resource_title}的抽籤。'
- sortitions:
- admin:
- actions:
- destroy: 取消選民隨機抽籤
- edit: 編輯
- show: 抽籤詳細資料
- models:
- sortition:
- fields:
- created_at: 創建日期
- decidim_proposals_component: 提案組成
- dice: 骰子
- reference: 參考
- request_timestamp: 抽籤時間
- seed: 種子碼
- target_items: 選擇項目
- title: 標題
- sortitions:
- confirm_destroy:
- confirm_destroy: 您確定要取消此選項嗎?
- destroy: 取消抽籤
- title: 取消抽籤
- create:
- error: 建立新抽籤時出現問題。
- success: 抽籤已成功建立。
- destroy:
- error: 無法取消抽籤。
- success: 抽籤取消成功。
- edit:
- title: 更新抽籤資訊
- update: 更新
- form:
- select_proposal_component: 選擇提案集
- index:
- title: 抽籤
- new:
- confirm: 當您按下「下一步」按鈕時,平台將會記錄日期和時間(秒級精度),並與擲骰子結果一起使用以生成隨機選擇。此操作是不可逆轉的,一旦按下按鈕,抽籤結果將會與此表單中輸入的資料一起發佈,並且無法更改,請仔細檢查內容。
- create: 建立
- title: 新的抽籤
- show:
- selected_proposals: 已選擇的提案以進行抽籤
- update:
- error: 更新抽籤時發生問題。
- success: 抽籤成功更新.
- admin_log:
- sortition:
- create: "%{user_name} 在 %{space_name} 中創建了 %{resource_name} 抽籤"
- delete: "%{user_name} 在 %{space_name} 中取消了 %{resource_name} 抽籤"
- update: "%{user_name} 在 %{space_name} 中更新了 %{resource_name} 抽籤"
- sortitions:
- count:
- proposals_count:
- other: "%{count} 個提案"
- filters:
- active: 啟用中
- all: 全部
- cancelled: 已取消
- category: 類別
- state: 狀態
- linked_sortitions:
- selected_proposals: 選擇的提案
- orders:
- label: '抽籤排序方式:'
- random: 隨機
- recent: 最近
- results_count:
- count:
- other: 選擇的提案
- show:
- algorithm: 抽籤排序算法
- cancelled: 取消的抽籤
- candidate_proposal_ids: 隨機抽籤提案的順序和 ID
- dice_result: (1) 骰子結果
- introduction: '本頁面包含了抽籤 %{reference} 的結果。透過這個抽籤,從下面顯示的提案集合中隨機且以等機率隨機選出了 %{target_items} 個結果。除了顯示的結果外,此頁面的資訊提供了最大化保證並重現結果所需的所有資訊。此抽籤質量的關鍵在於雙重隨機性,一方面是由證人驗證的擲骰子結果,另一方面是精確的抽籤時間提供的算法輸入以產生隨機選擇。抽籤的時間種子如此精確(秒級),以至於人類無法控制,從而提供雙重「不可控制」輸入,以保證公平結果。 '
- mathematical_result: 結果 (1) x (2)
- proposals_selected_by_sortition: 通過抽籤選中的提案
- sortition_reproducibility_details: 抽籤可重複性詳情
- time_seed: (2) 時間種子
- witnesses: 見證人
- sortition:
- random_seed: 隨機種子
- selected_proposals:
- other: 選中的提案
- sortition_author:
- deleted: 已刪除的參與者
- sortition_cancel_author:
- deleted: 已刪除的參與者
- sortitions_count:
- count:
- other: "%{count} 個抽籤"
- statistics:
- sortitions_count: 抽籤
diff --git a/decidim-sortitions/db/migrate/20171215161358_create_decidim_module_sortitions_sortitions.rb b/decidim-sortitions/db/migrate/20171215161358_create_decidim_module_sortitions_sortitions.rb
deleted file mode 100644
index 19bfe2db8d705..0000000000000
--- a/decidim-sortitions/db/migrate/20171215161358_create_decidim_module_sortitions_sortitions.rb
+++ /dev/null
@@ -1,23 +0,0 @@
-# frozen_string_literal: true
-
-class CreateDecidimModuleSortitionsSortitions < ActiveRecord::Migration[5.1]
- def change
- create_table :decidim_module_sortitions_sortitions do |t|
- t.references :decidim_feature, index: { name: "index_sortitions__on_feature" }
-
- t.references :decidim_category,
- foreign_key: true,
- index: { name: "index_sortitions__on_category" }
-
- t.integer :decidim_proposals_feature_id,
- index: { name: "index_sortitions__on_proposals_feature" }
-
- t.integer :dice, null: false
- t.integer :target_items, null: false
- t.timestamp :request_timestamp, null: false
- t.jsonb :selected_proposals
-
- t.timestamps
- end
- end
-end
diff --git a/decidim-sortitions/db/migrate/20171220164658_add_witnesses_to_sortitions.rb b/decidim-sortitions/db/migrate/20171220164658_add_witnesses_to_sortitions.rb
deleted file mode 100644
index a3b2ef7f7812c..0000000000000
--- a/decidim-sortitions/db/migrate/20171220164658_add_witnesses_to_sortitions.rb
+++ /dev/null
@@ -1,7 +0,0 @@
-# frozen_string_literal: true
-
-class AddWitnessesToSortitions < ActiveRecord::Migration[5.1]
- def change
- add_column :decidim_module_sortitions_sortitions, :witnesses, :jsonb
- end
-end
diff --git a/decidim-sortitions/db/migrate/20171220164744_add_additional_info_to_sortitions.rb b/decidim-sortitions/db/migrate/20171220164744_add_additional_info_to_sortitions.rb
deleted file mode 100644
index 0aee60a72aa23..0000000000000
--- a/decidim-sortitions/db/migrate/20171220164744_add_additional_info_to_sortitions.rb
+++ /dev/null
@@ -1,7 +0,0 @@
-# frozen_string_literal: true
-
-class AddAdditionalInfoToSortitions < ActiveRecord::Migration[5.1]
- def change
- add_column :decidim_module_sortitions_sortitions, :additional_info, :jsonb
- end
-end
diff --git a/decidim-sortitions/db/migrate/20180102100101_add_author_to_sortitions.rb b/decidim-sortitions/db/migrate/20180102100101_add_author_to_sortitions.rb
deleted file mode 100644
index ffc972f9fe03e..0000000000000
--- a/decidim-sortitions/db/migrate/20180102100101_add_author_to_sortitions.rb
+++ /dev/null
@@ -1,7 +0,0 @@
-# frozen_string_literal: true
-
-class AddAuthorToSortitions < ActiveRecord::Migration[5.1]
- def change
- add_reference :decidim_module_sortitions_sortitions, :decidim_author, index: true
- end
-end
diff --git a/decidim-sortitions/db/migrate/20180102101128_add_reference_to_sortitions.rb b/decidim-sortitions/db/migrate/20180102101128_add_reference_to_sortitions.rb
deleted file mode 100644
index b29b2d4d41208..0000000000000
--- a/decidim-sortitions/db/migrate/20180102101128_add_reference_to_sortitions.rb
+++ /dev/null
@@ -1,8 +0,0 @@
-# frozen_string_literal: true
-
-class AddReferenceToSortitions < ActiveRecord::Migration[5.1]
- def change
- add_column :decidim_module_sortitions_sortitions, :reference, :string
- change_column_null :decidim_module_sortitions_sortitions, :reference, false
- end
-end
diff --git a/decidim-sortitions/db/migrate/20180103082645_add_title_to_sortition.rb b/decidim-sortitions/db/migrate/20180103082645_add_title_to_sortition.rb
deleted file mode 100644
index 299fd504769ed..0000000000000
--- a/decidim-sortitions/db/migrate/20180103082645_add_title_to_sortition.rb
+++ /dev/null
@@ -1,7 +0,0 @@
-# frozen_string_literal: true
-
-class AddTitleToSortition < ActiveRecord::Migration[5.1]
- def change
- add_column :decidim_module_sortitions_sortitions, :title, :jsonb
- end
-end
diff --git a/decidim-sortitions/db/migrate/20180103123055_drop_decidim_category_id_from_sortitions.rb b/decidim-sortitions/db/migrate/20180103123055_drop_decidim_category_id_from_sortitions.rb
deleted file mode 100644
index 8cbfc6316752c..0000000000000
--- a/decidim-sortitions/db/migrate/20180103123055_drop_decidim_category_id_from_sortitions.rb
+++ /dev/null
@@ -1,13 +0,0 @@
-# frozen_string_literal: true
-
-class DropDecidimCategoryIdFromSortitions < ActiveRecord::Migration[5.1]
- def up
- remove_column :decidim_module_sortitions_sortitions, :decidim_category_id
- end
-
- def down
- add_reference :decidim_module_sortitions_sortitions, :decidim_category,
- foreign_key: true,
- index: { name: "index_sortitions__on_category" }
- end
-end
diff --git a/decidim-sortitions/db/migrate/20180103160301_add_cancel_data_to_sortition.rb b/decidim-sortitions/db/migrate/20180103160301_add_cancel_data_to_sortition.rb
deleted file mode 100644
index bccf74556c2a4..0000000000000
--- a/decidim-sortitions/db/migrate/20180103160301_add_cancel_data_to_sortition.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-
-class AddCancelDataToSortition < ActiveRecord::Migration[5.1]
- def change
- add_column :decidim_module_sortitions_sortitions, :cancel_reason, :jsonb
- add_column :decidim_module_sortitions_sortitions, :cancelled_on, :datetime
- add_column :decidim_module_sortitions_sortitions, :cancelled_by_user_id, :integer, index: true
- end
-end
diff --git a/decidim-sortitions/db/migrate/20180104143054_make_sortition_reference_nullable.rb b/decidim-sortitions/db/migrate/20180104143054_make_sortition_reference_nullable.rb
deleted file mode 100644
index b5bf9cc595ca5..0000000000000
--- a/decidim-sortitions/db/migrate/20180104143054_make_sortition_reference_nullable.rb
+++ /dev/null
@@ -1,7 +0,0 @@
-# frozen_string_literal: true
-
-class MakeSortitionReferenceNullable < ActiveRecord::Migration[5.1]
- def change
- change_column_null :decidim_module_sortitions_sortitions, :reference, true
- end
-end
diff --git a/decidim-sortitions/db/migrate/20180104145344_add_candidate_proposals_to_sortitions.rb b/decidim-sortitions/db/migrate/20180104145344_add_candidate_proposals_to_sortitions.rb
deleted file mode 100644
index fd0aaf9325262..0000000000000
--- a/decidim-sortitions/db/migrate/20180104145344_add_candidate_proposals_to_sortitions.rb
+++ /dev/null
@@ -1,7 +0,0 @@
-# frozen_string_literal: true
-
-class AddCandidateProposalsToSortitions < ActiveRecord::Migration[5.1]
- def change
- add_column :decidim_module_sortitions_sortitions, :candidate_proposals, :jsonb
- end
-end
diff --git a/decidim-sortitions/db/migrate/20180108132729_rename_sortitions_table.rb b/decidim-sortitions/db/migrate/20180108132729_rename_sortitions_table.rb
deleted file mode 100644
index c7fa2e7681c89..0000000000000
--- a/decidim-sortitions/db/migrate/20180108132729_rename_sortitions_table.rb
+++ /dev/null
@@ -1,7 +0,0 @@
-# frozen_string_literal: true
-
-class RenameSortitionsTable < ActiveRecord::Migration[5.1]
- def change
- rename_table :decidim_module_sortitions_sortitions, :decidim_sortitions_sortitions
- end
-end
diff --git a/decidim-sortitions/db/migrate/20180322082150_fix_sortitions_feature.rb b/decidim-sortitions/db/migrate/20180322082150_fix_sortitions_feature.rb
deleted file mode 100644
index 2e04a85ac829a..0000000000000
--- a/decidim-sortitions/db/migrate/20180322082150_fix_sortitions_feature.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-# frozen_string_literal: true
-
-class FixSortitionsFeature < ActiveRecord::Migration[5.1]
- def up
- rename_column :decidim_sortitions_sortitions, :decidim_feature_id, :decidim_component_id
- end
-
- def down
- rename_column :decidim_sortitions_sortitions, :decidim_component_id, :decidim_feature_id
- end
-end
diff --git a/decidim-sortitions/db/migrate/20180322085145_fix_sortitions_proposal_feature.rb b/decidim-sortitions/db/migrate/20180322085145_fix_sortitions_proposal_feature.rb
deleted file mode 100644
index b621e817d193b..0000000000000
--- a/decidim-sortitions/db/migrate/20180322085145_fix_sortitions_proposal_feature.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-# frozen_string_literal: true
-
-class FixSortitionsProposalFeature < ActiveRecord::Migration[5.1]
- def up
- rename_column :decidim_sortitions_sortitions, :decidim_proposals_feature_id, :decidim_proposals_component_id
- end
-
- def down
- rename_column :decidim_sortitions_sortitions, :decidim_proposals_component_id, :decidim_proposals_feature_id
- end
-end
diff --git a/decidim-sortitions/db/migrate/20181017110803_make_sortitions_authors_polymorphic.rb b/decidim-sortitions/db/migrate/20181017110803_make_sortitions_authors_polymorphic.rb
deleted file mode 100644
index 927c2a20e2e07..0000000000000
--- a/decidim-sortitions/db/migrate/20181017110803_make_sortitions_authors_polymorphic.rb
+++ /dev/null
@@ -1,35 +0,0 @@
-# frozen_string_literal: true
-
-class MakeSortitionsAuthorsPolymorphic < ActiveRecord::Migration[5.2]
- class User < ApplicationRecord
- self.table_name = :decidim_users
- self.inheritance_column = nil # disable the default inheritance
-
- default_scope { where(type: "Decidim::User") }
- end
-
- class Sortition < ApplicationRecord
- include Decidim::HasComponent
-
- self.table_name = :decidim_sortitions_sortitions
- end
-
- def change
- add_column :decidim_sortitions_sortitions, :decidim_author_type, :string
-
- Sortition.find_each do |sortition|
- author = User.find_by(id: sortition.decidim_author_id) if sortition.decidim_author_id.present?
- author ||= sortition.organization
- sortition.update!(
- decidim_author_type: author.is_a?(User) ? author.type : "Decidim::Organization",
- decidim_author_id: author.id
- )
- end
-
- add_index :decidim_sortitions_sortitions,
- [:decidim_author_id, :decidim_author_type],
- name: "index_decidim_sortitions_sortitions_on_decidim_author"
- change_column_null :decidim_sortitions_sortitions, :decidim_author_id, false
- change_column_null :decidim_sortitions_sortitions, :decidim_author_type, false
- end
-end
diff --git a/decidim-sortitions/db/migrate/20200320105926_index_foreign_keys_in_decidim_sortitions_sortitions.rb b/decidim-sortitions/db/migrate/20200320105926_index_foreign_keys_in_decidim_sortitions_sortitions.rb
deleted file mode 100644
index dceeb5ba0c384..0000000000000
--- a/decidim-sortitions/db/migrate/20200320105926_index_foreign_keys_in_decidim_sortitions_sortitions.rb
+++ /dev/null
@@ -1,7 +0,0 @@
-# frozen_string_literal: true
-
-class IndexForeignKeysInDecidimSortitionsSortitions < ActiveRecord::Migration[5.2]
- def change
- add_index :decidim_sortitions_sortitions, :cancelled_by_user_id
- end
-end
diff --git a/decidim-sortitions/db/migrate/20200827154036_add_commentable_counter_cache_to_sortitions.rb b/decidim-sortitions/db/migrate/20200827154036_add_commentable_counter_cache_to_sortitions.rb
deleted file mode 100644
index ca601d76a19d4..0000000000000
--- a/decidim-sortitions/db/migrate/20200827154036_add_commentable_counter_cache_to_sortitions.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-
-class AddCommentableCounterCacheToSortitions < ActiveRecord::Migration[5.2]
- def change
- add_column :decidim_sortitions_sortitions, :comments_count, :integer, null: false, default: 0, index: true
- Decidim::Sortitions::Sortition.reset_column_information
- Decidim::Sortitions::Sortition.find_each(&:update_comments_count)
- end
-end
diff --git a/decidim-sortitions/db/migrate/20240828103823_add_deleted_at_to_decidim_sortitions_sortitions.rb b/decidim-sortitions/db/migrate/20240828103823_add_deleted_at_to_decidim_sortitions_sortitions.rb
deleted file mode 100644
index 575349c071f1c..0000000000000
--- a/decidim-sortitions/db/migrate/20240828103823_add_deleted_at_to_decidim_sortitions_sortitions.rb
+++ /dev/null
@@ -1,8 +0,0 @@
-# frozen_string_literal: true
-
-class AddDeletedAtToDecidimSortitionsSortitions < ActiveRecord::Migration[7.0]
- def change
- add_column :decidim_sortitions_sortitions, :deleted_at, :datetime
- add_index :decidim_sortitions_sortitions, :deleted_at
- end
-end
diff --git a/decidim-sortitions/decidim-sortitions.gemspec b/decidim-sortitions/decidim-sortitions.gemspec
deleted file mode 100644
index c2e128382a621..0000000000000
--- a/decidim-sortitions/decidim-sortitions.gemspec
+++ /dev/null
@@ -1,41 +0,0 @@
-# frozen_string_literal: true
-
-$LOAD_PATH.push File.expand_path("lib", __dir__)
-
-require "decidim/sortitions/version"
-
-Gem::Specification.new do |s|
- s.version = Decidim::Sortitions.version
- s.authors = ["Juan Salvador Perez Garcia"]
- s.email = ["jsperezg@gmail.com"]
- s.license = "AGPL-3.0-or-later"
- s.homepage = "https://decidim.org"
- s.metadata = {
- "bug_tracker_uri" => "https://github.com/decidim/decidim/issues",
- "documentation_uri" => "https://docs.decidim.org/",
- "funding_uri" => "https://opencollective.com/decidim",
- "homepage_uri" => "https://decidim.org",
- "source_code_uri" => "https://github.com/decidim/decidim"
- }
- s.required_ruby_version = "~> 3.3.0"
-
- s.name = "decidim-sortitions"
- s.summary = "Decidim sortitions module"
- s.description = "This module makes possible to select amount a set of proposal by sortition"
-
- s.files = Dir.chdir(__dir__) do
- `git ls-files -z`.split("\x0").select do |f|
- (File.expand_path(f) == __FILE__) ||
- f.start_with?(*%w(app/ config/ db/ lib/ Rakefile README.md))
- end
- end
-
- s.add_dependency "decidim-admin", Decidim::Sortitions.version
- s.add_dependency "decidim-comments", Decidim::Sortitions.version
- s.add_dependency "decidim-core", Decidim::Sortitions.version
- s.add_dependency "decidim-proposals", Decidim::Sortitions.version
-
- s.add_development_dependency "decidim-assemblies", Decidim::Sortitions.version
- s.add_development_dependency "decidim-dev", Decidim::Sortitions.version
- s.add_development_dependency "decidim-participatory_processes", Decidim::Sortitions.version
-end
diff --git a/decidim-sortitions/lib/decidim/api/sortition_type.rb b/decidim-sortitions/lib/decidim/api/sortition_type.rb
deleted file mode 100644
index d6a8513a627bf..0000000000000
--- a/decidim-sortitions/lib/decidim/api/sortition_type.rb
+++ /dev/null
@@ -1,40 +0,0 @@
-# frozen_string_literal: true
-
-module Decidim
- module Sortitions
- class SortitionType < Decidim::Api::Types::BaseObject
- implements Decidim::Core::AuthorableInterface
- implements Decidim::Comments::CommentableInterface
- implements Decidim::Core::TaxonomizableInterface
- implements Decidim::Core::TimestampsInterface
- implements Decidim::Core::ReferableInterface
-
- description "A sortition"
-
- field :additional_info, Decidim::Core::TranslatedFieldType, "The additional info for this sortition", null: true
- field :cancel_reason, Decidim::Core::TranslatedFieldType, "The cancel reason for this sortition", null: true
- field :cancelled_by_user, Decidim::Core::UserType, "Who cancelled this sortition", null: true
- field :cancelled_on, Decidim::Core::DateType, "When this sortition was cancelled", null: true
- field :candidate_proposals, [GraphQL::Types::Int, { null: true }], "The candidate proposal for this sortition", null: true
- field :dice, GraphQL::Types::Int, "The dice for this sortition", null: true
- field :id, GraphQL::Types::ID, "The internal ID for this sortition", null: false
- field :proposals, [Decidim::Proposals::ProposalType, { null: true }], "The selected proposal for this sortition", null: true
- field :request_timestamp, Decidim::Core::DateTimeType, "The request time stamp for this request", null: true
- field :selected_proposals, [GraphQL::Types::Int, { null: true }], "The selected proposal ids for this sortition", null: true
- field :target_items, GraphQL::Types::Int, "The target items for this sortition", null: true
- field :title, Decidim::Core::TranslatedFieldType, "The title for this sortition", null: true
- field :url, GraphQL::Types::String, "The URL for this sortition", null: false
- field :witnesses, Decidim::Core::TranslatedFieldType, "The witnesses for this sortition", null: true
-
- def url
- Decidim::ResourceLocatorPresenter.new(object).url
- end
-
- def self.authorized?(object, context)
- context[:sortition] = object
-
- super
- end
- end
- end
-end
diff --git a/decidim-sortitions/lib/decidim/api/sortitions_type.rb b/decidim-sortitions/lib/decidim/api/sortitions_type.rb
deleted file mode 100644
index 450588da45040..0000000000000
--- a/decidim-sortitions/lib/decidim/api/sortitions_type.rb
+++ /dev/null
@@ -1,23 +0,0 @@
-# frozen_string_literal: true
-
-module Decidim
- module Sortitions
- class SortitionsType < Decidim::Core::ComponentType
- graphql_name "Sortitions"
- description "A sortition component of a participatory space."
-
- field :sortition, Decidim::Sortitions::SortitionType, "A single Sortition object", null: true do
- argument :id, GraphQL::Types::ID, "The id of the Sortition requested", required: true
- end
- field :sortitions, Decidim::Sortitions::SortitionType.connection_type, "A collection of Sortitions", null: true, connection: true
-
- def sortitions
- Sortition.where(component: object).includes(:component)
- end
-
- def sortition(**args)
- Sortition.where(component: object).find_by(id: args[:id])
- end
- end
- end
-end
diff --git a/decidim-sortitions/lib/decidim/sortitions.rb b/decidim-sortitions/lib/decidim/sortitions.rb
deleted file mode 100644
index ca4becd39833c..0000000000000
--- a/decidim-sortitions/lib/decidim/sortitions.rb
+++ /dev/null
@@ -1,25 +0,0 @@
-# frozen_string_literal: true
-
-require "decidim/sortitions/admin"
-require "decidim/sortitions/api"
-require "decidim/sortitions/engine"
-require "decidim/sortitions/admin_engine"
-require "decidim/sortitions/component"
-
-module Decidim
- # Base module for this engine.
- module Sortitions
- include ActiveSupport::Configurable
-
- # Public setting that defines how many elements will be shown
- # per page inside the administration view.
- config_accessor :items_per_page do
- 15
- end
-
- # Link to algorithm used for the sortition
- config_accessor :sortition_algorithm do
- "https://ruby-doc.org/core-2.4.0/Random.html"
- end
- end
-end
diff --git a/decidim-sortitions/lib/decidim/sortitions/admin.rb b/decidim-sortitions/lib/decidim/sortitions/admin.rb
deleted file mode 100644
index 3f72eb81dc3c4..0000000000000
--- a/decidim-sortitions/lib/decidim/sortitions/admin.rb
+++ /dev/null
@@ -1,10 +0,0 @@
-# frozen_string_literal: true
-
-module Decidim
- module Sortitions
- # This module contains all the domain logic associated to Decidim's Sortitions
- # component admin panel.
- module Admin
- end
- end
-end
diff --git a/decidim-sortitions/lib/decidim/sortitions/admin_engine.rb b/decidim-sortitions/lib/decidim/sortitions/admin_engine.rb
deleted file mode 100644
index 8fc2fa2d055a8..0000000000000
--- a/decidim-sortitions/lib/decidim/sortitions/admin_engine.rb
+++ /dev/null
@@ -1,27 +0,0 @@
-# frozen_string_literal: true
-
-module Decidim
- module Sortitions
- # This is the engine that runs on the administration interface of `decidim_sortitions`.
- # It mostly handles rendering the created projects associated to a participatory
- # process.
- class AdminEngine < ::Rails::Engine
- isolate_namespace Decidim::Sortitions::Admin
-
- paths["db/migrate"] = nil
- paths["lib/tasks"] = nil
-
- routes do
- resources :sortitions do
- get "confirm_destroy", on: :member
- end
-
- root to: "sortitions#index"
- end
-
- def load_seed
- nil
- end
- end
- end
-end
diff --git a/decidim-sortitions/lib/decidim/sortitions/api.rb b/decidim-sortitions/lib/decidim/sortitions/api.rb
deleted file mode 100644
index b00b54dd2cfe3..0000000000000
--- a/decidim-sortitions/lib/decidim/sortitions/api.rb
+++ /dev/null
@@ -1,8 +0,0 @@
-# frozen_string_literal: true
-
-module Decidim
- module Sortitions
- autoload :SortitionType, "decidim/api/sortition_type"
- autoload :SortitionsType, "decidim/api/sortitions_type"
- end
-end
diff --git a/decidim-sortitions/lib/decidim/sortitions/component.rb b/decidim-sortitions/lib/decidim/sortitions/component.rb
deleted file mode 100644
index b3ac3f74ae08b..0000000000000
--- a/decidim-sortitions/lib/decidim/sortitions/component.rb
+++ /dev/null
@@ -1,46 +0,0 @@
-# frozen_string_literal: true
-
-Decidim.register_component(:sortitions) do |component|
- component.engine = Decidim::Sortitions::Engine
- component.admin_engine = Decidim::Sortitions::AdminEngine
- component.icon = "media/images/decidim_sortitions.svg"
- component.icon_key = "billiards-line"
- # component.stylesheet = "decidim/sortitions/sortitions"
- component.permissions_class_name = "Decidim::Sortitions::Permissions"
- component.query_type = "Decidim::Sortitions::SortitionsType"
-
- component.on(:before_destroy) do |instance|
- raise StandardError, "Cannot remove this component" if Decidim::Sortitions::Sortition.where(component: instance).any?
- end
-
- # These actions permissions can be configured in the admin panel
- component.actions = %w(comment)
-
- component.settings(:global) do |settings|
- settings.attribute :taxonomy_filters, type: :taxonomy_filters
- settings.attribute :comments_enabled, type: :boolean, default: true
- settings.attribute :comments_max_length, type: :integer, required: true
- end
-
- # Register an optional resource that can be referenced from other resources.
- component.register_resource(:sortition) do |resource|
- resource.model_class_name = "Decidim::Sortitions::Sortition"
- resource.template = "decidim/sortitions/sortitions/linked_sortitions"
- resource.card = "decidim/sortitions/sortition"
- resource.actions = %w(comment)
- end
-
- component.register_stat :sortitions_count,
- primary: true,
- priority: Decidim::StatsRegistry::MEDIUM_PRIORITY,
- icon_name: "team-line",
- tooltip_key: "sortitions_count_tooltip" do |components, start_at, end_at|
- Decidim::Sortitions::FilteredSortitions.for(components, start_at, end_at).count
- end
-
- component.seeds do |participatory_space|
- require "decidim/sortitions/seeds"
-
- Decidim::Sortitions::Seeds.new(participatory_space:).call
- end
-end
diff --git a/decidim-sortitions/lib/decidim/sortitions/engine.rb b/decidim-sortitions/lib/decidim/sortitions/engine.rb
deleted file mode 100644
index dca924120facc..0000000000000
--- a/decidim-sortitions/lib/decidim/sortitions/engine.rb
+++ /dev/null
@@ -1,42 +0,0 @@
-# frozen_string_literal: true
-
-require "rails"
-require "active_support/all"
-
-require "decidim/core"
-
-module Decidim
- module Sortitions
- # Decidim's Sortitions Rails Engine.
- class Engine < ::Rails::Engine
- isolate_namespace Decidim::Sortitions
-
- routes do
- resources :sortitions, only: [:index, :show]
- scope "/sortitions" do
- root to: "sortitions#index"
- end
- get "/", to: redirect("sortitions", status: 301)
- end
-
- initializer "decidim_sortitions.register_icons" do
- Decidim.icons.register(name: "seedling-line", icon: "seedling-line", category: "system", description: "", engine: :sortitions)
- end
-
- initializer "decidim_sortitions.data_migrate", after: "decidim_core.data_migrate" do
- DataMigrate.configure do |config|
- config.data_migrations_path << root.join("db/data").to_s
- end
- end
-
- initializer "decidim_sortitions.add_cells_view_paths" do
- Cell::ViewModel.view_paths << File.expand_path("#{Decidim::Sortitions::Engine.root}/app/cells")
- Cell::ViewModel.view_paths << File.expand_path("#{Decidim::Sortitions::Engine.root}/app/views") # for proposal partials
- end
-
- initializer "decidim_sortitions.shakapacker.assets_path" do
- Decidim.register_assets_path File.expand_path("app/packs", root)
- end
- end
- end
-end
diff --git a/decidim-sortitions/lib/decidim/sortitions/seeds.rb b/decidim-sortitions/lib/decidim/sortitions/seeds.rb
deleted file mode 100644
index 036ecac4f0bad..0000000000000
--- a/decidim-sortitions/lib/decidim/sortitions/seeds.rb
+++ /dev/null
@@ -1,24 +0,0 @@
-# frozen_string_literal: true
-
-require "decidim/components/namer"
-
-module Decidim
- module Sortitions
- class Seeds
- attr_reader :participatory_space
-
- def initialize(participatory_space:)
- @participatory_space = participatory_space
- end
-
- def call
- Decidim::Component.create!(
- name: Decidim::Components::Namer.new(participatory_space.organization.available_locales, :sortitions).i18n_name,
- manifest_name: :sortitions,
- published_at: Time.current,
- participatory_space:
- )
- end
- end
- end
-end
diff --git a/decidim-sortitions/lib/decidim/sortitions/test/factories.rb b/decidim-sortitions/lib/decidim/sortitions/test/factories.rb
deleted file mode 100644
index fc73f0e329651..0000000000000
--- a/decidim-sortitions/lib/decidim/sortitions/test/factories.rb
+++ /dev/null
@@ -1,44 +0,0 @@
-# frozen_string_literal: true
-
-require "decidim/components/namer"
-require "decidim/faker/localized"
-require "decidim/core/test/factories"
-require "decidim/participatory_processes/test/factories"
-
-FactoryBot.define do
- factory :sortition_component, parent: :component do
- transient do
- skip_injection { false }
- end
- name { generate_component_name(participatory_space.organization.available_locales, :sortitions, skip_injection:) }
- manifest_name { :sortitions }
- participatory_space { create(:participatory_process, :with_steps, organization:, skip_injection:) }
- end
-
- factory :sortition, class: "Decidim::Sortitions::Sortition" do
- transient do
- skip_injection { false }
- end
- component { create(:sortition_component, skip_injection:) }
- decidim_proposals_component { create(:proposal_component, organization: component.organization, skip_injection:) }
-
- title { generate_localized_title(:sortition_title, skip_injection:) }
- author do
- create(:user, :admin, organization: component.organization) if component
- end
-
- dice { Faker::Number.between(from: 1, to: 6).to_i }
- target_items { Faker::Number.between(from: 1, to: 5).to_i }
- request_timestamp { Time.now.utc }
- witnesses { generate_localized_description(:sortition_witnesses, skip_injection:) }
- additional_info { generate_localized_description(:sortition_additional_info, skip_injection:) }
- selected_proposals { create_list(:proposal, target_items, component: decidim_proposals_component, skip_injection:).pluck(:id) }
- candidate_proposals { selected_proposals }
-
- trait :cancelled do
- cancelled_on { Time.now.utc }
- cancel_reason { generate_localized_description(:sortition_cancel_reason, skip_injection:) }
- cancelled_by_user { create(:user, :admin, organization: component.organization, skip_injection:) if component }
- end
- end
-end
diff --git a/decidim-sortitions/lib/decidim/sortitions/version.rb b/decidim-sortitions/lib/decidim/sortitions/version.rb
deleted file mode 100644
index 519a8ac06de96..0000000000000
--- a/decidim-sortitions/lib/decidim/sortitions/version.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-
-module Decidim
- module Sortitions
- def self.version
- "0.32.0.dev"
- end
- end
-end
diff --git a/decidim-sortitions/lib/tasks/decidim/.keep b/decidim-sortitions/lib/tasks/decidim/.keep
deleted file mode 100644
index e69de29bb2d1d..0000000000000
diff --git a/decidim-sortitions/spec/commands/decidim/sortitions/admin/create_sortition_spec.rb b/decidim-sortitions/spec/commands/decidim/sortitions/admin/create_sortition_spec.rb
deleted file mode 100644
index 771472961c67a..0000000000000
--- a/decidim-sortitions/spec/commands/decidim/sortitions/admin/create_sortition_spec.rb
+++ /dev/null
@@ -1,288 +0,0 @@
-# frozen_string_literal: true
-
-require "spec_helper"
-
-module Decidim
- module Sortitions
- module Admin
- describe CreateSortition do
- let(:organization) { create(:organization) }
- let(:author) { create(:user, :admin, organization:) }
- let(:participatory_process) { create(:participatory_process, organization:) }
- let(:proposal_component) { create(:proposal_component, participatory_space: participatory_process) }
- let(:dice) { ::Faker::Number.between(from: 1, to: 6) }
- let(:target_items) { ::Faker::Number.number(digits: 2) }
- let(:witnesses) { Decidim::Faker::Localized.wrapped("
") { Decidim::Faker::Localized.sentence(word_count: 4) } }
- let(:title) { Decidim::Faker::Localized.sentence(word_count: 3) }
- let(:taxonomy) { create(:taxonomy, :with_parent, organization:) }
- let(:taxonomies) { [] }
- let(:params) do
- {
- decidim_proposals_component_id: proposal_component.id,
- taxonomies:,
- dice:,
- title:,
- target_items:,
- witnesses:,
- additional_info:
- }
- end
-
- let(:sortition_component) { create(:sortition_component, participatory_space: participatory_process) }
-
- let(:context) do
- {
- current_component: sortition_component,
- current_user: author
- }
- end
-
- let(:form) { SortitionForm.from_params(sortition: params).with_context(context) }
- let(:command) { described_class.new(form) }
-
- describe "when the form is not valid" do
- before do
- allow(form).to receive(:invalid?).and_return(true)
- end
-
- it "broadcasts invalid" do
- expect { command.call }.to broadcast(:invalid)
- end
-
- it "does not create the sortition" do
- expect do
- command.call
- end.not_to(change { Sortition.where(component: sortition_component).count })
- end
- end
-
- describe "when the form is valid" do
- let!(:proposals) do
- create_list(:proposal, target_items.to_i,
- component: proposal_component,
- created_at: Time.now.utc - 1.day)
- end
-
- before do
- allow(form).to receive(:invalid?).and_return(false)
- end
-
- it "broadcasts ok" do
- expect { command.call }.to broadcast(:ok)
- end
-
- it "creates a sortition" do
- expect do
- command.call
- end.to change { Sortition.where(component: sortition_component).count }.by(1)
- end
-
- it "traces the action", versioning: true do
- expect(Decidim.traceability)
- .to receive(:create!)
- .with(Sortition, author, kind_of(Hash))
- .and_call_original
-
- expect { command.call }.to change(Decidim::ActionLog, :count)
- action_log = Decidim::ActionLog.last
- expect(action_log.version).to be_present
- end
-
- it "the created sortition contains a list of selected proposals" do
- command.call
- sortition = Sortition.where(component: sortition_component).last
- expect(sortition.selected_proposals).not_to be_empty
- end
-
- it "the created sortition contains a list of candidate proposals" do
- command.call
- sortition = Sortition.where(component: sortition_component).last
-
- expect(sortition.candidate_proposals).not_to be_empty
- end
-
- it "has no taxonomies" do
- command.call
- sortition = Sortition.where(component: sortition_component).last
- expect(sortition.taxonomies).to be_blank
- end
-
- context "when restricted to a taxonomy without proposals" do
- let!(:taxonomies) { [taxonomy.id] }
-
- it "has taxonomies" do
- command.call
- sortition = Sortition.where(component: sortition_component).last
- expect(sortition.taxonomies).to eq([taxonomy])
- end
-
- it "the created sortition has not proposals" do
- command.call
- sortition = Sortition.where(component: sortition_component).last
- expect(sortition.selected_proposals).to be_empty
- end
- end
-
- context "when proposals has been moderated" do
- let!(:proposals) do
- create_list(:proposal, target_items.to_i,
- :hidden,
- component: proposal_component,
- created_at: Time.now.utc - 1.day)
- end
-
- it "returns empty" do
- command.call
- sortition = Sortition.where(component: sortition_component).last
- expect(sortition.selected_proposals).to be_empty
- end
- end
-
- context "when proposals are rejected" do
- let!(:proposals) do
- create_list(:proposal, target_items.to_i,
- :rejected,
- component: proposal_component,
- created_at: Time.now.utc - 1.day)
- end
-
- it "returns empty" do
- command.call
- sortition = Sortition.where(component: sortition_component).last
- expect(sortition.selected_proposals).to be_empty
- end
- end
-
- context "when proposals are withdrawn" do
- let!(:proposals) do
- create_list(:proposal, target_items.to_i,
- :withdrawn,
- component: proposal_component,
- created_at: Time.now.utc - 1.day)
- end
-
- it "returns empty" do
- command.call
- sortition = Sortition.where(component: sortition_component).last
- expect(sortition.selected_proposals).to be_empty
- end
- end
-
- context "when proposals are draft" do
- let!(:proposals) do
- create_list(:proposal, target_items.to_i,
- :draft,
- component: proposal_component,
- created_at: Time.now.utc - 1.day)
- end
-
- it "returns empty" do
- command.call
- sortition = Sortition.where(component: sortition_component).last
- expect(sortition.selected_proposals).to be_empty
- end
- end
-
- context "when restricted to taxonomies with proposals" do
- let!(:taxonomies) { [taxonomy.id] }
- let!(:proposal) { create(:proposal, component: proposal_component, taxonomies: [taxonomy]) }
-
- it "the created sortition contains proposals" do
- command.call
- sortition = Sortition.where(component: sortition_component).last
- expect(sortition.selected_proposals).not_to be_empty
- expect(sortition.selected_proposals.first).to eq(proposal.id)
- end
-
- context "when proposals has been moderated" do
- let!(:proposals) do
- create_list(:proposal, target_items.to_i,
- :hidden,
- taxonomies: [taxonomy],
- component: proposal_component,
- created_at: Time.now.utc - 1.day)
- end
-
- it "returns empty" do
- command.call
- sortition = Sortition.where(component: sortition_component).last
- expect(sortition.selected_proposals).to eq([proposal.id])
- end
- end
-
- context "when proposals are rejected" do
- let!(:proposals) do
- create_list(:proposal, target_items.to_i,
- :rejected,
- taxonomies: [taxonomy],
- component: proposal_component,
- created_at: Time.now.utc - 1.day)
- end
-
- it "returns empty" do
- command.call
- sortition = Sortition.where(component: sortition_component).last
- expect(sortition.selected_proposals).to eq([proposal.id])
- end
- end
-
- context "when proposals are withdrawn" do
- let!(:proposals) do
- create_list(:proposal, target_items.to_i,
- :withdrawn,
- taxonomies: [taxonomy],
- component: proposal_component,
- created_at: Time.now.utc - 1.day)
- end
-
- it "returns empty" do
- command.call
- sortition = Sortition.where(component: sortition_component).last
- expect(sortition.selected_proposals).to eq([proposal.id])
- end
- end
-
- context "when proposals are draft" do
- let!(:proposals) do
- create_list(:proposal, target_items.to_i,
- :draft,
- taxonomies: [taxonomy],
- component: proposal_component,
- created_at: Time.now.utc - 1.day)
- end
-
- it "returns empty" do
- command.call
- sortition = Sortition.where(component: sortition_component).last
- expect(sortition.selected_proposals).to eq([proposal.id])
- end
- end
- end
-
- it "has a reference" do
- command.call
- sortition = Sortition.where(component: sortition_component).last
- expect(sortition.reference).not_to be_blank
- end
-
- it "sends a notification to the participatory space followers" do
- follower = create(:user, organization:)
- create(:follow, followable: participatory_process, user: follower)
-
- expect(Decidim::EventsManager)
- .to receive(:publish)
- .with(
- event: "decidim.events.sortitions.sortition_created",
- event_class: Decidim::Sortitions::CreateSortitionEvent,
- resource: kind_of(Sortition),
- followers: [follower]
- )
-
- command.call
- end
- end
- end
- end
- end
-end
diff --git a/decidim-sortitions/spec/commands/decidim/sortitions/admin/destroy_sortition_spec.rb b/decidim-sortitions/spec/commands/decidim/sortitions/admin/destroy_sortition_spec.rb
deleted file mode 100644
index e90f6dc58dd8a..0000000000000
--- a/decidim-sortitions/spec/commands/decidim/sortitions/admin/destroy_sortition_spec.rb
+++ /dev/null
@@ -1,88 +0,0 @@
-# frozen_string_literal: true
-
-require "spec_helper"
-
-module Decidim
- module Sortitions
- module Admin
- describe DestroySortition do
- let(:organization) { create(:organization) }
- let(:admin) { create(:user, :admin, organization:) }
- let(:participatory_process) { create(:participatory_process, organization:) }
- let(:sortition_component) { create(:sortition_component, participatory_space: participatory_process) }
- let(:sortition) { create(:sortition, component: sortition_component) }
- let(:cancel_reason) do
- Decidim::Faker::Localized.wrapped("
", "
") { Decidim::Faker::Localized.sentence(word_count: 4) }
- end
-
- let(:params) do
- {
- id: sortition.id,
- sortition: {
- cancel_reason:
- }
- }
- end
-
- let(:context) do
- {
- current_component: sortition_component,
- current_user: admin
- }
- end
-
- let(:form) { DestroySortitionForm.from_params(sortition: params).with_context(context) }
- let(:command) { described_class.new(form) }
-
- describe "when the form is not valid" do
- before do
- allow(form).to receive(:invalid?).and_return(true)
- end
-
- it "broadcasts invalid" do
- expect { command.call }.to broadcast(:invalid)
- end
-
- it "does not cancel the sortition" do
- command.call
- sortition.reload
- expect(sortition).not_to be_cancelled
- end
- end
-
- describe "when the form is valid" do
- before do
- allow(form).to receive(:invalid?).and_return(false)
- end
-
- it "broadcasts ok" do
- expect { command.call }.to broadcast(:ok)
- end
-
- it "Cancels the sortition" do
- command.call
- sortition.reload
- expect(sortition).to be_cancelled
- end
-
- it "traces the action", versioning: true do
- expect(Decidim.traceability)
- .to receive(:perform_action!)
- .with(:delete, sortition, admin)
- .and_call_original
-
- expect { command.call }.to change(Decidim::ActionLog, :count)
- action_log = Decidim::ActionLog.last
- expect(action_log.version).to be_present
- end
-
- it "Data from the user who cancelled the sortition is stored" do
- command.call
- sortition.reload
- expect(sortition.cancelled_by_user).to eq(admin)
- end
- end
- end
- end
- end
-end
diff --git a/decidim-sortitions/spec/commands/decidim/sortitions/admin/update_sortition_spec.rb b/decidim-sortitions/spec/commands/decidim/sortitions/admin/update_sortition_spec.rb
deleted file mode 100644
index bb19188fcb37a..0000000000000
--- a/decidim-sortitions/spec/commands/decidim/sortitions/admin/update_sortition_spec.rb
+++ /dev/null
@@ -1,78 +0,0 @@
-# frozen_string_literal: true
-
-require "spec_helper"
-
-module Decidim
- module Sortitions
- module Admin
- describe UpdateSortition do
- let(:additional_info) { Decidim::Faker::Localized.wrapped("
", "
") { Decidim::Faker::Localized.sentence(word_count: 4) }.except("machine_translations") }
- let(:title) { Decidim::Faker::Localized.sentence(word_count: 3).except(:machine_translations) }
- let(:sortition) { create(:sortition) }
- let(:user) { create(:user, :admin, :confirmed) }
- let(:params) do
- {
- id: sortition.id,
- sortition: {
- title:,
- additional_info:
- }
- }
- end
-
- let(:context) do
- {
- current_user: user,
- current_component: sortition.component
- }
- end
-
- let(:form) { EditSortitionForm.from_params(params).with_context(context) }
- let(:command) { described_class.new(form) }
-
- describe "when the form is not valid" do
- before do
- allow(form).to receive(:invalid?).and_return(true)
- end
-
- it "broadcasts invalid" do
- expect { command.call }.to broadcast(:invalid)
- end
- end
-
- describe "when the form is valid" do
- before do
- allow(form).to receive(:invalid?).and_return(false)
- end
-
- it "broadcasts ok" do
- expect { command.call }.to broadcast(:ok)
- end
-
- it "Updates the title" do
- command.call
- sortition.reload
- expect(sortition.title.except("machine_translations")).to eq(title)
- end
-
- it "Updates the additional info" do
- command.call
- sortition.reload
- expect(sortition.additional_info.except("machine_translations")).to eq(additional_info)
- end
-
- it "traces the action", versioning: true do
- expect(Decidim.traceability)
- .to receive(:update!)
- .with(sortition, user, kind_of(Hash))
- .and_call_original
-
- expect { command.call }.to change(Decidim::ActionLog, :count)
- action_log = Decidim::ActionLog.last
- expect(action_log.version).to be_present
- end
- end
- end
- end
- end
-end
diff --git a/decidim-sortitions/spec/controllers/decidim/sortitions/admin/sortitions_controller_spec.rb b/decidim-sortitions/spec/controllers/decidim/sortitions/admin/sortitions_controller_spec.rb
deleted file mode 100644
index 28b3d418177bd..0000000000000
--- a/decidim-sortitions/spec/controllers/decidim/sortitions/admin/sortitions_controller_spec.rb
+++ /dev/null
@@ -1,235 +0,0 @@
-# frozen_string_literal: true
-
-require "spec_helper"
-
-module Decidim
- module Sortitions
- module Admin
- describe SortitionsController do
- let(:component) { sortition.component }
- let(:sortition) { create(:sortition) }
- let(:user) { create(:user, :confirmed, :admin, organization: component.organization) }
-
- before do
- request.env["decidim.current_organization"] = component.organization
- request.env["decidim.current_component"] = component
- sign_in user, scope: :user
- end
-
- describe "show" do
- let(:sortition) { create(:sortition) }
- let(:params) do
- {
- component_id: sortition.component.id,
- participatory_process_slug: sortition.component.participatory_space.slug,
- id: sortition.id
- }
- end
-
- it "renders the show template" do
- get(:show, params:)
- expect(response).to render_template(:show)
- end
- end
-
- describe "new" do
- let(:params) do
- { participatory_process_slug: component.participatory_space.slug }
- end
-
- it "renders the new template" do
- get(:new, params:)
- expect(response).to render_template(:new)
- end
- end
-
- describe "create" do
- let(:decidim_taxonomy_ids) { nil }
- let(:dice) { ::Faker::Number.between(from: 1, to: 6) }
- let(:target_items) { ::Faker::Number.between(from: 1, to: 10) }
- let(:params) do
- {
- participatory_process_slug: sortition.component.participatory_space.slug,
- sortition: {
- decidim_proposals_component_id:,
- decidim_taxonomy_ids:,
- dice:,
- target_items:,
- title: {
- en: "Title",
- es: "Título",
- ca: "Títol"
- },
- witnesses: {
- en: "Witnesses",
- es: "Testigos",
- ca: "Testimonis"
- },
- additional_info: {
- en: "Additional information",
- es: "Información adicional",
- ca: "Informació adicional"
- }
- }
- }
- end
-
- context "with invalid params" do
- let(:decidim_proposals_component_id) { nil }
-
- it "renders the new template" do
- post(:create, params:)
- expect(response).to render_template(:new)
- end
- end
-
- context "with valid params" do
- let(:proposal_component) { create(:proposal_component, participatory_space: component.participatory_space) }
- let(:decidim_proposals_component_id) { proposal_component.id }
-
- it "redirects to show newly created sortition" do
- expect(controller).to receive(:redirect_to) do |params|
- expect(params).to eq(action: :show, id: Sortition.last.id)
- end
-
- post :create, params:
- end
-
- it "Sortition author is the current user" do
- expect(controller).to receive(:redirect_to) do |params|
- expect(params).to eq(action: :show, id: Sortition.last.id)
- end
-
- post(:create, params:)
- expect(Sortition.last.author).to eq(user)
- end
- end
- end
-
- describe "confirm_destroy" do
- let(:sortition) { create(:sortition) }
- let(:params) do
- {
- component_id: sortition.component.id,
- participatory_process_slug: sortition.component.participatory_space.slug,
- id: sortition.id
- }
- end
-
- it "renders the confirm_destroy template" do
- get(:confirm_destroy, params:)
- expect(response).to render_template(:confirm_destroy)
- end
- end
-
- describe "destroy" do
- let(:cancel_reason) do
- {
- en: "Cancel reason",
- es: "Motivo de la cancelación",
- ca: "Motiu de la cancelació"
- }
- end
- let(:params) do
- {
- participatory_process_slug: component.participatory_space.slug,
- id: sortition.id,
- sortition: {
- cancel_reason:
- }
- }
- end
-
- context "with invalid params" do
- let(:cancel_reason) do
- {
- en: "",
- es: "",
- ca: ""
- }
- end
-
- it "renders the confirm_destroy template" do
- delete(:destroy, params:)
- expect(response).to render_template(:confirm_destroy)
- end
- end
-
- context "with valid params" do
- it "redirects to sortitions list newly created sortition" do
- expect(controller).to receive(:redirect_to).with(action: :index)
-
- delete :destroy, params:
- end
- end
- end
-
- describe "edit" do
- let(:sortition) { create(:sortition) }
- let(:params) do
- {
- participatory_process_slug: component.participatory_space.slug,
- component_id: sortition.component.id,
- id: sortition.id
- }
- end
-
- it "renders the edit template" do
- get(:edit, params:)
- expect(response).to render_template(:edit)
- end
- end
-
- describe "update" do
- let(:title) do
- {
- en: "Title",
- es: "Título",
- ca: "Títol"
- }
- end
- let(:additional_info) do
- {
- en: "Additional info",
- es: "Información adicional",
- ca: "Informació adicional"
- }
- end
- let(:params) do
- {
- participatory_process_slug: component.participatory_space.slug,
- id: sortition.id,
- sortition: {
- title:,
- additional_info:
- }
- }
- end
-
- context "with invalid params" do
- let(:title) do
- {
- en: "",
- es: "",
- ca: ""
- }
- end
-
- it "renders the edit template" do
- patch(:update, params:)
- expect(response).to render_template(:edit)
- end
- end
-
- context "with valid params" do
- it "redirects to sortitions list newly created sortition" do
- expect(controller).to receive(:redirect_to).with(action: :index)
-
- patch :update, params:
- end
- end
- end
- end
- end
- end
-end
diff --git a/decidim-sortitions/spec/events/decidim/sortitions/create_sortition_event_spec.rb b/decidim-sortitions/spec/events/decidim/sortitions/create_sortition_event_spec.rb
deleted file mode 100644
index baaf06426e70b..0000000000000
--- a/decidim-sortitions/spec/events/decidim/sortitions/create_sortition_event_spec.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-require "spec_helper"
-
-describe Decidim::Sortitions::CreateSortitionEvent do
- let(:resource) { create(:sortition) }
- let(:notification_title) { "The sortition #{resource_title} has been added to #{participatory_space_title}" }
- let(:email_outro) { "You have received this notification because you are following \"#{participatory_space_title}\". You can unfollow it from the previous link." }
- let(:email_intro) { "The sortition \"#{resource_title}\" has been added to \"#{participatory_space_title}\" that you are following." }
- let(:email_subject) { "New sortition added to #{decidim_sanitize_translated(participatory_space.title)}" }
- let(:event_name) { "decidim.events.sortitions.sortition_created" }
-
- include_context "when a simple event"
- it_behaves_like "a simple event"
- it_behaves_like "a simple event email"
- it_behaves_like "a simple event notification"
-end
diff --git a/decidim-sortitions/spec/factories.rb b/decidim-sortitions/spec/factories.rb
deleted file mode 100644
index c6e793fb624ce..0000000000000
--- a/decidim-sortitions/spec/factories.rb
+++ /dev/null
@@ -1,6 +0,0 @@
-# frozen_string_literal: true
-
-require "decidim/core/test/factories"
-require "decidim/proposals/test/factories"
-require "decidim/sortitions/test/factories"
-require "decidim/comments/test/factories"
diff --git a/decidim-sortitions/spec/forms/decidim/sortitions/admin/destroy_sortition_form_spec.rb b/decidim-sortitions/spec/forms/decidim/sortitions/admin/destroy_sortition_form_spec.rb
deleted file mode 100644
index 1bd768281fd1a..0000000000000
--- a/decidim-sortitions/spec/forms/decidim/sortitions/admin/destroy_sortition_form_spec.rb
+++ /dev/null
@@ -1,44 +0,0 @@
-# frozen_string_literal: true
-
-require "spec_helper"
-
-module Decidim
- module Sortitions
- module Admin
- describe DestroySortitionForm do
- subject { form }
-
- let(:organization) { build(:organization) }
-
- let(:cancel_reason) do
- {
- en: "Cancel reason",
- es: "Motivo de la cancelación",
- ca: "Motiu de la cancelació"
- }
- end
- let(:params) do
- {
- sortition: {
- cancel_reason_en: cancel_reason[:en],
- cancel_reason_es: cancel_reason[:es],
- cancel_reason_ca: cancel_reason[:ca]
- }
- }
- end
-
- let(:form) { described_class.from_params(params).with_context(current_organization: organization) }
-
- context "when everything is OK" do
- it { is_expected.to be_valid }
- end
-
- context "when no cancel_reason" do
- let(:cancel_reason) { { es: "", en: "", ca: "" } }
-
- it { is_expected.to be_invalid }
- end
- end
- end
- end
-end
diff --git a/decidim-sortitions/spec/forms/decidim/sortitions/admin/edit_sortition_form_spec.rb b/decidim-sortitions/spec/forms/decidim/sortitions/admin/edit_sortition_form_spec.rb
deleted file mode 100644
index 25f8beb8e9926..0000000000000
--- a/decidim-sortitions/spec/forms/decidim/sortitions/admin/edit_sortition_form_spec.rb
+++ /dev/null
@@ -1,60 +0,0 @@
-# frozen_string_literal: true
-
-require "spec_helper"
-
-module Decidim
- module Sortitions
- module Admin
- describe EditSortitionForm do
- subject { form }
-
- let(:organization) { build(:organization) }
-
- let(:title) do
- {
- en: "Title",
- es: "Título",
- ca: "Títol"
- }
- end
- let(:additional_info) do
- {
- en: "Additional info",
- es: "Información adicional",
- ca: "Informació adicional"
- }
- end
- let(:params) do
- {
- sortition: {
- title_en: title[:en],
- title_es: title[:es],
- title_ca: title[:ca],
- additional_info_en: additional_info[:en],
- additional_info_es: additional_info[:es],
- additional_info_ca: additional_info[:ca]
- }
- }
- end
-
- let(:form) { described_class.from_params(params).with_context(current_organization: organization) }
-
- context "when everything is OK" do
- it { is_expected.to be_valid }
- end
-
- context "when no title" do
- let(:title) { { es: "", en: "", ca: "" } }
-
- it { is_expected.to be_invalid }
- end
-
- context "when no additional info" do
- let(:additional_info) { { es: "", en: "", ca: "" } }
-
- it { is_expected.to be_invalid }
- end
- end
- end
- end
-end
diff --git a/decidim-sortitions/spec/forms/decidim/sortitions/admin/sortition_form_spec.rb b/decidim-sortitions/spec/forms/decidim/sortitions/admin/sortition_form_spec.rb
deleted file mode 100644
index 8106681245c44..0000000000000
--- a/decidim-sortitions/spec/forms/decidim/sortitions/admin/sortition_form_spec.rb
+++ /dev/null
@@ -1,128 +0,0 @@
-# frozen_string_literal: true
-
-require "spec_helper"
-
-module Decidim
- module Sortitions
- module Admin
- describe SortitionForm do
- subject(:form) { described_class.from_params(params).with_context(context) }
-
- let(:organization) { create(:organization) }
- let(:context) do
- {
- current_organization: organization,
- current_component:,
- current_participatory_space: participatory_process
- }
- end
- let(:participatory_process) { create(:participatory_process, organization:) }
- let(:current_component) { create(:component, participatory_space: participatory_process, manifest_name: "sortitions") }
-
- let(:decidim_proposals_component_id) { ::Faker::Number.number(digits: 10) }
- let(:dice) { ::Faker::Number.between(from: 1, to: 6) }
- let(:target_items) { ::Faker::Number.number(digits: 2) }
- let(:taxonomies) { [] }
- let(:title) do
- {
- en: "Title",
- es: "Título",
- ca: "Títol"
- }
- end
- let(:witnesses) do
- {
- en: "Witnesses",
- es: "Testigos",
- ca: "Testimonis"
- }
- end
- let(:additional_info) do
- {
- en: "Additional info",
- es: "Información adicional",
- ca: "Informació adicional"
- }
- end
- let(:params) do
- {
- sortition: {
- decidim_proposals_component_id:,
- taxonomies:,
- dice:,
- target_items:,
- title_en: title[:en],
- title_es: title[:es],
- title_ca: title[:ca],
- witnesses_en: witnesses[:en],
- witnesses_es: witnesses[:es],
- witnesses_ca: witnesses[:ca],
- additional_info_en: additional_info[:en],
- additional_info_es: additional_info[:es],
- additional_info_ca: additional_info[:ca]
- }
- }
- end
-
- context "when everything is OK" do
- it { is_expected.to be_valid }
- end
-
- context "when there is no proposals component selected" do
- let(:decidim_proposals_component_id) { nil }
-
- it { is_expected.to be_invalid }
- end
-
- describe "taxonomies" do
- let(:component) { current_component }
- let(:participatory_space) { participatory_process }
-
- it_behaves_like "a taxonomizable resource"
- end
-
- context "when there is no dice value selected" do
- let(:dice) { nil }
-
- it { is_expected.to be_invalid }
- end
-
- context "when dice value is invalid" do
- let(:dice) { "7" }
-
- it { is_expected.to be_invalid }
- end
-
- context "when there is no target items value selected" do
- let(:target_items) { nil }
-
- it { is_expected.to be_invalid }
- end
-
- context "when target items value is invalid" do
- let(:target_items) { "0" }
-
- it { is_expected.to be_invalid }
- end
-
- context "when no title" do
- let(:title) { { es: "", en: "", ca: "" } }
-
- it { is_expected.to be_invalid }
- end
-
- context "when no witnesses" do
- let(:witnesses) { { es: "", en: "", ca: "" } }
-
- it { is_expected.to be_invalid }
- end
-
- context "when no additional info" do
- let(:additional_info) { { es: "", en: "", ca: "" } }
-
- it { is_expected.to be_invalid }
- end
- end
- end
- end
-end
diff --git a/decidim-sortitions/spec/helpers/decidim/sortitions/admin/sortitions_helper_spec.rb b/decidim-sortitions/spec/helpers/decidim/sortitions/admin/sortitions_helper_spec.rb
deleted file mode 100644
index ff32439242d9e..0000000000000
--- a/decidim-sortitions/spec/helpers/decidim/sortitions/admin/sortitions_helper_spec.rb
+++ /dev/null
@@ -1,39 +0,0 @@
-# frozen_string_literal: true
-
-require "spec_helper"
-
-module Decidim
- module Sortitions
- module Admin
- describe SortitionsHelper do
- describe "components_options" do
- let(:components) { [double(id: 1, name: { "en" => "Component name" })] }
-
- it "Returns a list of selectable components" do
- expect(helper.components_options(components)).to include(["Component name", 1])
- end
- end
-
- describe "sortition_taxonomies" do
- let(:sortition) { double(taxonomies:) }
-
- context "when taxonomy is null" do
- let(:taxonomies) { [] }
-
- it "Returns all taxonomies" do
- expect(helper.sortition_taxonomies(sortition)).to eq("All taxonomies")
- end
- end
-
- context "when taxonomy is not null" do
- let(:taxonomies) { [double(name: { "en" => "Taxonomy name" })] }
-
- it "Returns the taxonomy name" do
- expect(helper.sortition_taxonomies(sortition)).to eq("Taxonomy name")
- end
- end
- end
- end
- end
- end
-end
diff --git a/decidim-sortitions/spec/helpers/decidim/sortitions/sortitions_helper_spec.rb b/decidim-sortitions/spec/helpers/decidim/sortitions/sortitions_helper_spec.rb
deleted file mode 100644
index 99cdf686d3463..0000000000000
--- a/decidim-sortitions/spec/helpers/decidim/sortitions/sortitions_helper_spec.rb
+++ /dev/null
@@ -1,56 +0,0 @@
-# frozen_string_literal: true
-
-require "spec_helper"
-
-module Decidim
- module Sortitions
- describe SortitionsHelper do
- describe "proposal_path" do
- let(:proposal) { create(:proposal) }
-
- it "Returns a path for a proposal" do
- expect(helper.proposal_path(proposal)).not_to be_blank
- end
- end
-
- describe "sortition_taxonomy_labels" do
- let(:sortition) { create(:sortition) }
-
- context "when sortition has no taxonomies" do
- it "returns from all taxonomies" do
- expect(helper.sortition_taxonomy_labels(sortition)).to eq("from all taxonomies")
- end
- end
-
- context "when sortition has taxonomies" do
- let(:taxonomy) { create(:taxonomy, :with_parent, skip_injection: true, organization: sortition.organization) }
-
- before do
- sortition.taxonomies << taxonomy
- end
-
- it "returns from the given taxonomy" do
- expect(helper.sortition_taxonomy_labels(sortition)).to eq("from the #{taxonomy.name["en"]} taxonomies")
- end
- end
- end
-
- describe "sortition_proposal_candidate_ids" do
- let(:sortition) { create(:sortition) }
- let!(:label) { helper.sortition_proposal_candidate_ids(sortition) }
-
- it "Contains all candidate proposal ids" do
- sortition.candidate_proposals.each do |proposal_id|
- expect(label).to include proposal_id.to_s
- end
- end
-
- it "Selected proposal ids appear in bold" do
- sortition.selected_proposals.each do |proposal_id|
- expect(label).to include "#{proposal_id}"
- end
- end
- end
- end
- end
-end
diff --git a/decidim-sortitions/spec/lib/decidim/sortitions/component_spec.rb b/decidim-sortitions/spec/lib/decidim/sortitions/component_spec.rb
deleted file mode 100644
index 7e27bec7f31df..0000000000000
--- a/decidim-sortitions/spec/lib/decidim/sortitions/component_spec.rb
+++ /dev/null
@@ -1,24 +0,0 @@
-# frozen_string_literal: true
-
-require "spec_helper"
-
-describe "Accountability component" do # rubocop:disable RSpec/DescribeClass
- let!(:component) { create(:sortition_component) }
- let(:organization) { component.organization }
- let!(:current_user) { create(:user, :confirmed, :admin, organization:) }
-
- describe "on edit", type: :system do
- let(:edit_component_path) do
- Decidim::EngineRouter.admin_proxy(component.participatory_space).edit_component_path(component.id)
- end
-
- before do
- switch_to_host(organization.host)
- login_as current_user, scope: :user
- end
-
- context "when comments_max_length is empty" do
- it_behaves_like "has mandatory config setting", :comments_max_length
- end
- end
-end
diff --git a/decidim-sortitions/spec/lib/decidim/sortitions/engine_spec.rb b/decidim-sortitions/spec/lib/decidim/sortitions/engine_spec.rb
deleted file mode 100644
index b5f633d0e84e4..0000000000000
--- a/decidim-sortitions/spec/lib/decidim/sortitions/engine_spec.rb
+++ /dev/null
@@ -1,7 +0,0 @@
-# frozen_string_literal: true
-
-require "spec_helper"
-
-describe Decidim::Sortitions::Engine do
- it_behaves_like "clean engine"
-end
diff --git a/decidim-sortitions/spec/models/decidim/module/sortitions/sortition_spec.rb b/decidim-sortitions/spec/models/decidim/module/sortitions/sortition_spec.rb
deleted file mode 100644
index 9e7bf151bc9a2..0000000000000
--- a/decidim-sortitions/spec/models/decidim/module/sortitions/sortition_spec.rb
+++ /dev/null
@@ -1,81 +0,0 @@
-# frozen_string_literal: true
-
-require "spec_helper"
-
-module Decidim
- module Sortitions
- describe Sortition do
- subject { sortition }
-
- let(:sortition) { build(:sortition) }
-
- it { is_expected.to be_valid }
- it { is_expected.to be_versioned }
-
- include_examples "has taxonomies"
-
- describe "seed" do
- it "is the multiplication of timestamp per dice value" do
- expect(sortition.seed).to eq(sortition.request_timestamp.to_i * sortition.dice)
- end
- end
-
- describe "similar_count" do
- let(:sortition) { create(:sortition) }
- let(:taxonomy1) { create(:taxonomy, :with_parent, organization: sortition.organization) }
- let(:taxonomy2) { create(:taxonomy, :with_parent, organization: sortition.organization) }
-
- before do
- sortition.taxonomies = [taxonomy1, taxonomy2]
- sortition.reload
- end
-
- context "when first sortition" do
- it "is one" do
- expect(sortition.similar_count).to eq(1)
- end
- end
-
- context "when following sortitions" do
- let(:repetitions) { 2 }
-
- before do
- create_list(:sortition, repetitions,
- component: sortition.component,
- decidim_proposals_component: sortition.decidim_proposals_component,
- target_items: sortition.target_items).each do |sortition|
- Decidim::Taxonomization.create!(taxonomy_id: taxonomy1.id, taxonomizable: sortition)
- end
-
- create_list(:sortition, repetitions,
- component: sortition.component,
- decidim_proposals_component: sortition.decidim_proposals_component,
- target_items: sortition.target_items)
- end
-
- it "Counts similar sortitions" do
- expect(sortition.similar_count).to eq(1 + repetitions)
- end
- end
- end
-
- describe "proposals" do
- it "returns a list of selected proposals" do
- expect(sortition.proposals).to eq(Decidim::Proposals::Proposal.where(id: sortition.selected_proposals))
- end
- end
-
- describe "cancelled" do
- it "is true when cancelled_on has value" do
- sortition = build(:sortition, cancelled_on: Time.now.utc)
- expect(sortition).to be_cancelled
- end
-
- it "is false when cancelled_on is nil" do
- sortition = build(:sortition, cancelled_on: nil)
- expect(sortition).not_to be_cancelled
- end
- end
- end
- end
-end
diff --git a/decidim-sortitions/spec/permissions/decidim/sortitions/admin/permissions_spec.rb b/decidim-sortitions/spec/permissions/decidim/sortitions/admin/permissions_spec.rb
deleted file mode 100644
index 96fab5d3945d0..0000000000000
--- a/decidim-sortitions/spec/permissions/decidim/sortitions/admin/permissions_spec.rb
+++ /dev/null
@@ -1,93 +0,0 @@
-# frozen_string_literal: true
-
-require "spec_helper"
-
-describe Decidim::Sortitions::Admin::Permissions do
- subject { described_class.new(user, permission_action, context).permissions.allowed? }
-
- let(:user) { create(:user, organization: sortition_component.organization) }
- let(:context) do
- {
- current_component: sortition_component,
- sortition:
- }
- end
- let(:sortition_component) { create(:sortition_component) }
- let(:sortition) { create(:sortition, component: sortition_component) }
- let(:permission_action) { Decidim::PermissionAction.new(**action) }
- let(:registrations_enabled) { true }
- let(:action) do
- { scope: :admin, action: action_name, subject: :sortition }
- end
- let(:action_name) { :foo }
-
- context "when scope is not admin" do
- let(:action) do
- { scope: :foo, action: :vote, subject: :sortition }
- end
-
- it_behaves_like "permission is not set"
- end
-
- context "when subject is not a sortition" do
- let(:action) do
- { scope: :admin, action: :vote, subject: :foo }
- end
-
- it_behaves_like "permission is not set"
- end
-
- context "when action is a random one" do
- let(:action_name) { :foo }
-
- it_behaves_like "permission is not set"
- end
-
- context "when reading a sortition" do
- let(:action_name) { :read }
-
- it { is_expected.to be true }
- end
-
- context "when creating a sortition" do
- let(:action_name) { :create }
-
- it { is_expected.to be true }
- end
-
- context "when destroying a sortition" do
- let(:action_name) { :destroy }
-
- context "when sortition is present" do
- context "when sortition is not cancelled" do
- it { is_expected.to be true }
- end
-
- context "when sortition is cancelled" do
- let(:sortition) { create(:sortition, :cancelled, component: sortition_component) }
-
- it_behaves_like "permission is not set"
- end
- end
-
- context "when sortition is missing" do
- let(:sortition) { nil }
-
- it_behaves_like "permission is not set"
- end
- end
-
- context "when updating a sortition" do
- let(:action_name) { :update }
-
- context "when sortition is present" do
- it { is_expected.to be true }
- end
-
- context "when sortition is missing" do
- let(:sortition) { nil }
-
- it_behaves_like "permission is not set"
- end
- end
-end
diff --git a/decidim-sortitions/spec/permissions/decidim/sortitions/permissions_spec.rb b/decidim-sortitions/spec/permissions/decidim/sortitions/permissions_spec.rb
deleted file mode 100644
index 05be490cec42d..0000000000000
--- a/decidim-sortitions/spec/permissions/decidim/sortitions/permissions_spec.rb
+++ /dev/null
@@ -1,35 +0,0 @@
-# frozen_string_literal: true
-
-require "spec_helper"
-
-describe Decidim::Sortitions::Permissions do
- subject { described_class.new(user, permission_action, context).permissions.allowed? }
-
- let(:user) { create(:user, organization: sortition_component.organization) }
- let(:context) do
- {
- current_component: sortition_component,
- sortition:
- }
- end
- let(:sortition_component) { create(:sortition_component) }
- let(:sortition) { create(:sortition, component: sortition_component) }
- let(:permission_action) { Decidim::PermissionAction.new(**action) }
- let(:registrations_enabled) { true }
-
- context "when scope is admin" do
- let(:action) do
- { scope: :admin, action: :vote, subject: :sortition }
- end
-
- it_behaves_like "delegates permissions to", Decidim::Sortitions::Admin::Permissions
- end
-
- context "when any other condition" do
- let(:action) do
- { scope: :foo, action: :blah, subject: :sortition }
- end
-
- it_behaves_like "permission is not set"
- end
-end
diff --git a/decidim-sortitions/spec/presenters/decidim/sortitions/admin_log/sortition_presenter_spec.rb b/decidim-sortitions/spec/presenters/decidim/sortitions/admin_log/sortition_presenter_spec.rb
deleted file mode 100644
index 0a76a638d9050..0000000000000
--- a/decidim-sortitions/spec/presenters/decidim/sortitions/admin_log/sortition_presenter_spec.rb
+++ /dev/null
@@ -1,12 +0,0 @@
-# frozen_string_literal: true
-
-require "spec_helper"
-
-describe Decidim::Sortitions::AdminLog::SortitionPresenter, type: :helper do
- include_examples "present admin log entry" do
- let(:participatory_space) { create(:participatory_process, organization:) }
- let(:component) { create(:sortition_component, participatory_space:) }
- let(:admin_log_resource) { create(:sortition, component:) }
- let(:action) { "delete" }
- end
-end
diff --git a/decidim-sortitions/spec/queries/decidim/sortitions/admin/participatory_space_proposal_components_spec.rb b/decidim-sortitions/spec/queries/decidim/sortitions/admin/participatory_space_proposal_components_spec.rb
deleted file mode 100644
index e92f58a9860e0..0000000000000
--- a/decidim-sortitions/spec/queries/decidim/sortitions/admin/participatory_space_proposal_components_spec.rb
+++ /dev/null
@@ -1,29 +0,0 @@
-# frozen_string_literal: true
-
-require "spec_helper"
-
-module Decidim
- module Sortitions
- module Admin
- describe ParticipatorySpaceProposalComponents do
- let(:organization) { create(:organization) }
- let(:participatory_process) { create(:participatory_process, organization:) }
- let(:proposal_components) { create_list(:proposal_component, 10, participatory_space: participatory_process) }
- let(:unpublished_proposal_components) { create_list(:proposal_component, 10, participatory_space: participatory_process, published_at: nil) }
- let(:sortition_components) { create_list(:sortition_component, 10, participatory_space: participatory_process) }
-
- it "returns proposal components in the participatory space" do
- expect(described_class.for(participatory_process)).to include(*proposal_components)
- end
-
- it "Do not include unpublished proposal components" do
- expect(described_class.for(participatory_process)).not_to include(*unpublished_proposal_components)
- end
-
- it "do not return other components in participatory space" do
- expect(described_class.for(participatory_process)).not_to include(*sortition_components)
- end
- end
- end
- end
-end
diff --git a/decidim-sortitions/spec/queries/decidim/sortitions/admin/participatory_space_proposals_spec.rb b/decidim-sortitions/spec/queries/decidim/sortitions/admin/participatory_space_proposals_spec.rb
deleted file mode 100644
index e6c557b22d54e..0000000000000
--- a/decidim-sortitions/spec/queries/decidim/sortitions/admin/participatory_space_proposals_spec.rb
+++ /dev/null
@@ -1,123 +0,0 @@
-# frozen_string_literal: true
-
-require "spec_helper"
-
-module Decidim
- module Sortitions
- module Admin
- describe ParticipatorySpaceProposals do
- let(:organization) { create(:organization) }
- let(:participatory_process) { create(:participatory_process, organization:) }
- let(:proposal_component) { create(:proposal_component, participatory_space: participatory_process) }
- let(:another_proposal_component) { create(:proposal_component, participatory_space: participatory_process) }
- let(:proposals) { create_list(:proposal, 10, component: proposal_component, created_at: request_timestamp - 10.days) }
- let(:request_timestamp) { Time.now.utc }
- let(:taxonomies) { [] }
- let(:decidim_proposals_component) { proposal_component }
- let(:sortition) do
- double(
- request_timestamp:,
- taxonomies:,
- decidim_proposals_component:
- )
- end
-
- context "when filtering by component" do
- let(:other_component_proposals) { create_list(:proposal, 10, component: another_proposal_component) }
-
- it "Includes only proposals in this component" do
- expect(described_class.for(sortition)).to include(*proposals)
- end
-
- it "Do not includes proposals in other components" do
- expect(described_class.for(sortition)).not_to include(*other_component_proposals)
- end
- end
-
- context "when filtering by creation date" do
- let(:recent_proposals) { create_list(:proposal, 10, component: proposal_component, created_at: Time.now.utc) }
- let(:request_timestamp) { Time.now.utc - 1.day }
-
- it "Includes proposals created before the sortition date" do
- expect(described_class.for(sortition)).to include(*proposals)
- end
-
- it "Do not includes proposals created after the sortition date" do
- expect(described_class.for(sortition)).not_to include(*recent_proposals)
- end
- end
-
- context "when filtering by taxonomy" do
- let(:taxonomy) { create(:taxonomy, :with_parent, organization:) }
- let(:sub_taxonomy) { create(:taxonomy, parent: taxonomy, organization:) }
- let(:taxonomy_proposals) do
- create_list(:proposal, 10,
- component: proposal_component,
- taxonomies: [taxonomy],
- created_at: request_timestamp - 10.days)
- end
- let(:sub_taxonomy_proposals) do
- create_list(:proposal, 10,
- component: proposal_component,
- taxonomies: [sub_taxonomy],
- created_at: request_timestamp - 10.days)
- end
-
- context "and no taxonomies" do
- it "Contains all proposals" do
- expect(described_class.for(sortition)).to include(*proposals)
- expect(described_class.for(sortition)).to include(*taxonomy_proposals)
- expect(described_class.for(sortition)).to include(*sub_taxonomy_proposals)
- end
- end
-
- context "and taxonomy is passed" do
- let(:taxonomies) { [taxonomy] }
-
- it "Contains proposals of the taxonomy and sub_taxonomies" do
- expect(described_class.for(sortition)).to include(*taxonomy_proposals)
- expect(described_class.for(sortition)).to include(*sub_taxonomy_proposals)
- end
-
- it "Do not contains proposals of the taxonomy" do
- expect(described_class.for(sortition)).not_to include(*proposals)
- end
- end
-
- context "and sub_taxonomy is passed" do
- let(:taxonomies) { [sub_taxonomy] }
-
- it "Contains proposals of the sub_taxonomy" do
- expect(described_class.for(sortition)).to include(*sub_taxonomy_proposals)
- end
-
- it "Do not contains proposals of the taxonomy" do
- expect(described_class.for(sortition)).not_to include(*proposals)
- expect(described_class.for(sortition)).not_to include(*taxonomy_proposals)
- end
- end
- end
-
- context "when filtering withdrawn proposals" do
- let(:proposals) do
- create_list(:proposal, 10, :withdrawn, component: proposal_component, created_at: request_timestamp - 10.days)
- end
-
- it "do not return withdrawn proposals" do
- expect(described_class.for(sortition)).not_to include(*proposals)
- end
- end
-
- context "when filtering drafts proposals" do
- let(:proposals) do
- create_list(:proposal, 10, :draft, component: proposal_component, created_at: request_timestamp - 10.days)
- end
-
- it "do not return draft proposals" do
- expect(described_class.for(sortition)).not_to include(*proposals)
- end
- end
- end
- end
- end
-end
diff --git a/decidim-sortitions/spec/queries/decidim/sortitions/filtered_sortitions_spec.rb b/decidim-sortitions/spec/queries/decidim/sortitions/filtered_sortitions_spec.rb
deleted file mode 100644
index 0492069e925ae..0000000000000
--- a/decidim-sortitions/spec/queries/decidim/sortitions/filtered_sortitions_spec.rb
+++ /dev/null
@@ -1,22 +0,0 @@
-# frozen_string_literal: true
-
-require "spec_helper"
-
-module Decidim
- module Sortitions
- describe FilteredSortitions do
- let(:organization) { create(:organization) }
- let(:component) { create(:sortition_component, organization:) }
- let(:other_component) { create(:sortition_component) }
- let!(:sortitions) { create_list(:sortition, 10, component:) }
-
- it "Includes all sortitions for the given component" do
- expect(described_class.for(component)).to include(*sortitions)
- end
-
- it "Do not includes sortitions from other components" do
- expect(described_class.for(other_component)).not_to include(*sortitions)
- end
- end
- end
-end
diff --git a/decidim-sortitions/spec/requests/sortition_search_spec.rb b/decidim-sortitions/spec/requests/sortition_search_spec.rb
deleted file mode 100644
index ac19427e8881e..0000000000000
--- a/decidim-sortitions/spec/requests/sortition_search_spec.rb
+++ /dev/null
@@ -1,114 +0,0 @@
-# frozen_string_literal: true
-
-require "spec_helper"
-
-RSpec.describe "Sortition search" do
- include Decidim::ComponentPathHelper
-
- subject { response.body }
-
- let(:component) { create(:sortition_component) }
- let(:participatory_space) { component.participatory_space }
- let(:organization) { participatory_space.organization }
- let(:filter_params) { {} }
-
- let!(:sortition1) { create(:sortition, title: { en: "A doggo" }, component:) }
- let!(:sortition2) { create(:sortition, additional_info: { en: "There is a doggo in the office" }, component:) }
- let!(:sortition3) { create(:sortition, witnesses: { en: "My doggo was there" }, component:) }
- let!(:sortition4) { create(:sortition, component:) }
- let!(:sortition5) { create(:sortition, :cancelled, component:) }
-
- let(:request_path) { Decidim::EngineRouter.main_proxy(component).sortitions_path }
-
- before do
- get(
- request_path,
- params: { filter: filter_params },
- headers: { "HOST" => component.organization.host }
- )
- end
-
- it_behaves_like "a resource search", :sortition
- it_behaves_like "a resource search with taxonomies", :sortition
-
- it "displays all non-cancelled sortitions without any filters" do
- expect(subject).to include(decidim_escape_translated(sortition1.title))
- expect(subject).to include(decidim_escape_translated(sortition2.title))
- expect(subject).to include(decidim_escape_translated(sortition3.title))
- expect(subject).to include(decidim_escape_translated(sortition4.title))
- expect(subject).not_to include(decidim_escape_translated(sortition5.title))
- end
-
- context "when searching by text" do
- let(:filter_params) { { search_text_cont: "doggo" } }
-
- it "displays only the sortitions containing the search_text" do
- expect(subject).to include(decidim_escape_translated(sortition1.title))
- expect(subject).to include(decidim_escape_translated(sortition2.title))
- expect(subject).to include(decidim_escape_translated(sortition3.title))
- expect(subject).not_to include(decidim_escape_translated(sortition4.title))
- expect(subject).not_to include(decidim_escape_translated(sortition5.title))
- end
- end
-
- context "when searching by state" do
- let(:filter_params) { { with_any_state: state } }
-
- context "and the state is active" do
- let(:state) { "active" }
-
- it "displays the active sortitions" do
- expect(subject).to include(decidim_escape_translated(sortition1.title))
- expect(subject).to include(decidim_escape_translated(sortition2.title))
- expect(subject).to include(decidim_escape_translated(sortition3.title))
- expect(subject).to include(decidim_escape_translated(sortition4.title))
- expect(subject).not_to include(decidim_escape_translated(sortition5.title))
- end
- end
-
- context "and the state is cancelled" do
- let(:state) { "cancelled" }
-
- it "displays only the cancelled sortition" do
- expect(subject).not_to include(decidim_escape_translated(sortition1.title))
- expect(subject).not_to include(decidim_escape_translated(sortition2.title))
- expect(subject).not_to include(decidim_escape_translated(sortition3.title))
- expect(subject).not_to include(decidim_escape_translated(sortition4.title))
- expect(subject).to include(decidim_escape_translated(sortition5.title))
- end
- end
-
- context "and the state is all" do
- let(:state) { "all" }
-
- it "displays all the sortitions" do
- expect(subject).to include(decidim_escape_translated(sortition1.title))
- expect(subject).to include(decidim_escape_translated(sortition2.title))
- expect(subject).to include(decidim_escape_translated(sortition3.title))
- expect(subject).to include(decidim_escape_translated(sortition4.title))
- expect(subject).to include(decidim_escape_translated(sortition5.title))
- end
- end
- end
-
- describe "#index" do
- let(:url) { "http://#{component.organization.host + request_path}" }
-
- it "redirects to the index page" do
- get(
- url_to_root(request_path),
- params: {},
- headers: { "HOST" => component.organization.host }
- )
- expect(response["Location"]).to eq(url)
- expect(response).to have_http_status(:moved_permanently)
- end
- end
-
- private
-
- def url_to_root(url)
- parts = url.split("/")
- parts[0..-2].join("/")
- end
-end
diff --git a/decidim-sortitions/spec/services/decidim/sortitions/admin/draw_spec.rb b/decidim-sortitions/spec/services/decidim/sortitions/admin/draw_spec.rb
deleted file mode 100644
index 651206d610dbc..0000000000000
--- a/decidim-sortitions/spec/services/decidim/sortitions/admin/draw_spec.rb
+++ /dev/null
@@ -1,36 +0,0 @@
-# frozen_string_literal: true
-
-require "spec_helper"
-
-module Decidim
- module Sortitions
- module Admin
- describe Draw do
- let(:organization) { create(:organization) }
- let(:participatory_process) { create(:participatory_process, organization:) }
- let(:proposal_component) { create(:proposal_component, participatory_space: participatory_process) }
- let(:target_items) { ::Faker::Number.number(digits: 2).to_i }
- let(:seed) { Time.now.utc.to_i * ::Faker::Number.between(from: 1, to: 6).to_i }
- let!(:proposals) do
- create_list(:proposal, target_items * 2,
- component: proposal_component,
- created_at: Time.now.utc - 1.day)
- end
- let(:sortition) do
- double(
- target_items:,
- seed:,
- taxonomies: [],
- request_timestamp: Time.now.utc,
- decidim_proposals_component: proposal_component
- )
- end
- let(:initial_draw) { Draw.for(sortition) }
-
- it "Draw can be reproduced several times" do
- expect(Draw.for(sortition)).to eq(initial_draw)
- end
- end
- end
- end
-end
diff --git a/decidim-sortitions/spec/shared/cancel_sortitions_examples.rb b/decidim-sortitions/spec/shared/cancel_sortitions_examples.rb
deleted file mode 100644
index c6e10488d9b7d..0000000000000
--- a/decidim-sortitions/spec/shared/cancel_sortitions_examples.rb
+++ /dev/null
@@ -1,41 +0,0 @@
-# frozen_string_literal: true
-
-shared_examples "cancel sortitions" do
- describe "cancellation" do
- let!(:sortition) { create(:sortition, component: current_component) }
-
- before do
- visit_component_admin
- within "tr", text: decidim_escape_translated(sortition.title) do
- find("button[data-controller='dropdown']").click
- click_on "Cancel the sortition"
- end
- end
-
- it "requires cancellation reason" do
- within "form" do
- expect(page).to have_content(/Cancel reason/i)
- end
- end
-
- it_behaves_like "having a rich text editor for field", ".tabs-content[data-tabs-content='sortition-cancel_reason-tabs']", "content"
-
- context "when cancels a sortition" do
- it "Redirects to sortitions view" do
- within ".confirm_destroy_sortition" do
- fill_in_i18n_editor(
- :sortition_cancel_reason,
- "#sortition-cancel_reason-tabs",
- en: "Cancel reason",
- es: "Mótivo de cancelación",
- ca: "Motiu de cancelació"
- )
-
- accept_confirm { find("*[type=submit]").click }
- end
-
- expect(page).to have_admin_callout("successfully")
- end
- end
- end
-end
diff --git a/decidim-sortitions/spec/shared/manage_sortitions_examples.rb b/decidim-sortitions/spec/shared/manage_sortitions_examples.rb
deleted file mode 100644
index 750f9aed80246..0000000000000
--- a/decidim-sortitions/spec/shared/manage_sortitions_examples.rb
+++ /dev/null
@@ -1,110 +0,0 @@
-# frozen_string_literal: true
-
-shared_examples "manage sortitions" do
- describe "creation" do
- let(:taxonomy) { create(:taxonomy, :with_parent, organization: current_component.organization) }
- let(:taxonomy_filter) { create(:taxonomy_filter, root_taxonomy: taxonomy.parent, participatory_space_manifests: [current_component.participatory_space.manifest.name]) }
- let!(:taxonomy_filter_item) { create(:taxonomy_filter_item, taxonomy_filter:, taxonomy_item: taxonomy) }
- let!(:proposal_component) do
- create(:proposal_component, :published, participatory_space: current_component.participatory_space)
- end
-
- before do
- current_component.update!(settings: { taxonomy_filters: [taxonomy_filter.id] })
- click_on "New sortition"
- end
-
- it "Requires a title" do
- within "form" do
- expect(page).to have_content(/Title/i)
- end
- end
-
- it "can be related to taxonomies" do
- within "form" do
- expect(page).to have_content(/Taxonomies of the set of proposals in which you want to apply the draw/i)
- end
- end
-
- it "Requires a random number" do
- within "form" do
- expect(page).to have_content(/Result of die roll/i)
- end
- end
-
- it "Requires the number of proposals to select" do
- within "form" do
- expect(page).to have_content(/Number of proposals to be selected/i)
- end
- end
-
- it "Requires the proposals component" do
- within "form" do
- expect(page).to have_content(/Proposals set/i)
- end
- end
-
- it "Requires the witnesses" do
- within "form" do
- expect(page).to have_content(/Witnesses/i)
- end
- end
-
- it "Requires additional information" do
- within "form" do
- expect(page).to have_content(/Sortition information/i)
- end
- end
-
- context "when creates a sortition" do
- let(:sortition_dice) { Faker::Number.between(from: 1, to: 6) }
- let(:sortition_target_items) { Faker::Number.between(from: 1, to: 10) }
- let!(:proposal) { create(:proposal, component: proposal_component) }
- let(:attributes) { attributes_for(:sortition, component: current_component) }
-
- it_behaves_like "having a rich text editor for field", ".tabs-content[data-tabs-content='sortition-additional_info-tabs']", "full"
- it_behaves_like "having a rich text editor for field", ".tabs-content[data-tabs-content='sortition-witnesses-tabs']", "content"
-
- it "shows the sortition details", versioning: true do
- within ".new_sortition" do
- fill_in :sortition_dice, with: sortition_dice
- fill_in :sortition_target_items, with: sortition_target_items
- select translated(proposal_component.name), from: :sortition_decidim_proposals_component_id
-
- fill_in_i18n_editor(:sortition_witnesses, "#sortition-witnesses-tabs", **attributes[:witnesses].except("machine_translations"))
- fill_in_i18n_editor(:sortition_additional_info, "#sortition-additional_info-tabs", **attributes[:additional_info].except("machine_translations"))
- fill_in_i18n(:sortition_title, "#sortition-title-tabs", **attributes[:title].except("machine_translations"))
-
- accept_confirm { find("*[type=submit]").click }
- end
-
- expect(page).to have_admin_callout("successfully")
- expect(page).to have_content(/Title/i)
-
- sortition = Decidim::Sortitions::Sortition.last
- within ".sortition" do
- expect(page).to have_content(/Draw time/i)
- expect(page).to have_content(/Dice/i)
- expect(page).to have_content(/Items to select/i)
- expect(page).to have_content(/Taxonomies/i)
- expect(page).to have_content(/All taxonomies/i)
- expect(page).to have_content(/Proposals component/i)
- expect(page).to have_content(translated(proposal_component.name))
- expect(page).to have_content(/Seed/i)
- expect(page).to have_content(sortition.seed)
- end
-
- within ".proposals" do
- expect(page).to have_content(/Proposals selected for draw/i)
- expect(sortition.proposals).not_to be_empty
- sortition.proposals.each do |p|
- expect(page).to have_content(translated(p.title))
- end
- end
-
- visit decidim_admin.root_path
- expect(page).to have_content("created the #{translated(attributes[:title])} sortition")
- end
- end
- end
-end
diff --git a/decidim-sortitions/spec/shared/update_sortitions_examples.rb b/decidim-sortitions/spec/shared/update_sortitions_examples.rb
deleted file mode 100644
index aa5796cfc3633..0000000000000
--- a/decidim-sortitions/spec/shared/update_sortitions_examples.rb
+++ /dev/null
@@ -1,46 +0,0 @@
-# frozen_string_literal: true
-
-shared_examples "update sortitions" do
- describe "update sortition data" do
- let!(:sortition) { create(:sortition, component: current_component) }
- let(:attributes) { attributes_for(:sortition, component: current_component) }
-
- before do
- visit_component_admin
- within "tr", text: decidim_escape_translated(sortition.title) do
- find("button[data-controller='dropdown']").click
- click_on "Edit"
- end
- end
-
- it_behaves_like "having a rich text editor for field", ".tabs-content[data-tabs-content='sortition-additional_info-tabs']", "full"
-
- it "requires title" do
- within "form" do
- expect(page).to have_content(/Title/i)
- end
- end
-
- it "requires additional information" do
- within "form" do
- expect(page).to have_content(/Sortition information/i)
- end
- end
-
- context "when updates a sortition" do
- it "Redirects to sortitions view", versioning: true do
- within ".edit_sortition" do
- fill_in_i18n_editor(:sortition_additional_info, "#sortition-additional_info-tabs", **attributes[:additional_info].except("machine_translations"))
- fill_in_i18n(:sortition_title, "#sortition-title-tabs", **attributes[:title].except("machine_translations"))
-
- find("*[type=submit]").click
- end
-
- expect(page).to have_admin_callout("successfully")
-
- visit decidim_admin.root_path
- expect(page).to have_content("updated the #{translated(attributes[:title])} sortition")
- end
- end
- end
-end
diff --git a/decidim-sortitions/spec/spec_helper.rb b/decidim-sortitions/spec/spec_helper.rb
deleted file mode 100644
index db3a51cf80ab9..0000000000000
--- a/decidim-sortitions/spec/spec_helper.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-
-require "decidim/dev"
-
-ENV["ENGINE_ROOT"] = File.dirname(__dir__)
-
-Decidim::Dev.dummy_app_path = File.expand_path(File.join("..", "spec", "decidim_dummy_app"))
-
-require "decidim/dev/test/base_spec_helper"
diff --git a/decidim-sortitions/spec/system/decidim/sortitions/admin/admin_manages_sortitions_spec.rb b/decidim-sortitions/spec/system/decidim/sortitions/admin/admin_manages_sortitions_spec.rb
deleted file mode 100644
index dc8b60220c29d..0000000000000
--- a/decidim-sortitions/spec/system/decidim/sortitions/admin/admin_manages_sortitions_spec.rb
+++ /dev/null
@@ -1,38 +0,0 @@
-# frozen_string_literal: true
-
-require "spec_helper"
-
-describe "Admin manages sortitions" do
- let(:manifest_name) { "sortitions" }
-
- include_context "when managing a component as an admin"
-
- it_behaves_like "manage sortitions"
- it_behaves_like "cancel sortitions"
- it_behaves_like "update sortitions"
- it_behaves_like "manage taxonomy filters in settings"
-
- context "when adding a new sortitions module" do
- let(:component_name) { "My super new sortitions component" }
-
- it "is added" do
- visit current_path
- within_admin_sidebar_menu do
- click_on "Components"
- end
- click_on "Add component"
- click_on "Sortitions"
-
- fill_in_i18n(
- :component_name,
- "#component-name-tabs",
- en: component_name
- )
-
- click_on "Add component"
-
- expect(page).to have_content("Component created successfully")
- expect(page).to have_content(component_name)
- end
- end
-end
diff --git a/decidim-sortitions/spec/system/decidim/sortitions/admin/index_spec.rb b/decidim-sortitions/spec/system/decidim/sortitions/admin/index_spec.rb
deleted file mode 100644
index b844fd352b1a7..0000000000000
--- a/decidim-sortitions/spec/system/decidim/sortitions/admin/index_spec.rb
+++ /dev/null
@@ -1,31 +0,0 @@
-# frozen_string_literal: true
-
-require "spec_helper"
-
-describe "index" do
- include_context "when managing a component as an admin"
- let!(:sortition) { create(:sortition, component: current_component) }
- let(:manifest_name) { "sortitions" }
-
- before do
- visit_component_admin
- end
-
- it_behaves_like "access component permissions form"
-
- it "Contains a new button" do
- expect(page).to have_link("New")
- end
-
- it "Contains a button that shows sortition details" do
- within "tr", text: decidim_escape_translated(sortition.title) do
- find("button[data-controller='dropdown']").click
- expect(page).to have_link("Sortition details")
- end
- end
-
- it "Contains the sortitions data" do
- expect(page).to have_content(sortition.title[:en])
- expect(page).to have_content(sortition.reference)
- end
-end
diff --git a/decidim-sortitions/spec/system/decidim/sortitions/preview_sortitions_with_share_token_spec.rb b/decidim-sortitions/spec/system/decidim/sortitions/preview_sortitions_with_share_token_spec.rb
deleted file mode 100644
index cdf94b1a9d781..0000000000000
--- a/decidim-sortitions/spec/system/decidim/sortitions/preview_sortitions_with_share_token_spec.rb
+++ /dev/null
@@ -1,10 +0,0 @@
-# frozen_string_literal: true
-
-require "spec_helper"
-
-describe "preview sortitions with a share token" do
- let(:manifest_name) { "sortitions" }
-
- include_context "with a component"
- it_behaves_like "preview component with a share_token"
-end
diff --git a/decidim-sortitions/spec/system/decidim/sortitions/show_spec.rb b/decidim-sortitions/spec/system/decidim/sortitions/show_spec.rb
deleted file mode 100644
index 3065b2baca900..0000000000000
--- a/decidim-sortitions/spec/system/decidim/sortitions/show_spec.rb
+++ /dev/null
@@ -1,92 +0,0 @@
-# frozen_string_literal: true
-
-require "spec_helper"
-
-describe "show" do
- include_context "with a component"
- let(:manifest_name) { "sortitions" }
-
- context "when shows the sortition component" do
- let!(:sortition) { create(:sortition, component:) }
-
- before do
- visit_component
- find("#sortitions .card__list").click
- end
-
- it "shows the sortition additional info" do
- expect(page).to have_content(sortition.additional_info[:en])
- end
-
- it "shows the sortition witnesses" do
- expect(page).to have_content(sortition.witnesses[:en])
- end
- end
-
- context "when sortition result" do
- let(:sortition) { create(:sortition, component:) }
- let!(:proposals) do
- create_list(:proposal, 10,
- component: sortition.decidim_proposals_component,
- created_at: sortition.request_timestamp - 1.day,
- skip_injection: true)
- end
-
- before do
- sortition.update(selected_proposals: Decidim::Sortitions::Admin::Draw.for(sortition))
- visit_component
- find("#sortitions .card__list").click
- end
-
- context "when votes are enabled" do
- let!(:decidim_proposals_component) { create(:proposal_component, :with_votes_enabled, organization: component.organization) }
- let!(:sortition) { create(:sortition, component:, decidim_proposals_component:) }
-
- it "shows all selected proposals" do
- sortition.proposals.each do |p|
- expect(page).to have_content(translated(p.title))
- end
- end
- end
-
- it "there are selected proposals" do
- expect(sortition.selected_proposals).not_to be_empty
- end
-
- it "shows all selected proposals" do
- sortition.proposals.each do |p|
- expect(page).to have_content(translated(p.title))
- end
- end
-
- it "shows a banner links back to the result" do
- proposal = sortition.proposals.last
-
- within "#proposals" do
- click_on translated(proposal.title)
- end
-
- expect(page).to have_content("Included in #{translated(sortition.title)}")
- end
- end
-
- context "when cancelled sortition" do
- let(:witnesses) { Decidim::Faker::Localized.wrapped("
") { generate_localized_title } }
- let!(:sortition) { create(:sortition, :cancelled, component:, witnesses:, additional_info:, cancel_reason:) }
-
- before do
- page.visit "#{main_component_path(component)}?filter[with_any_state]=cancelled"
- find("#sortitions .card__list").click
- end
-
- context "when the field is additional_info" do
- it_behaves_like "has embedded video in description", :additional_info
- end
-
- it "shows the cancel reasons" do
- expect(page).to have_content(sortition.cancel_reason[:en])
- end
- end
-end
diff --git a/decidim-sortitions/spec/system/decidim/sortitions/sortitions_social_share_spec.rb b/decidim-sortitions/spec/system/decidim/sortitions/sortitions_social_share_spec.rb
deleted file mode 100644
index 89c3484181b06..0000000000000
--- a/decidim-sortitions/spec/system/decidim/sortitions/sortitions_social_share_spec.rb
+++ /dev/null
@@ -1,49 +0,0 @@
-# frozen_string_literal: true
-
-require "spec_helper"
-require "decidim/core/test/shared_examples/social_share_examples"
-
-describe "Social shares" do
- let(:organization) { create(:organization) }
- let(:participatory_process) { create(:participatory_process, hero_image:, organization:) }
- let(:hero_image) { Decidim::Dev.test_file("city2.jpeg", "image/jpeg") }
- let(:component) { create(:sortition_component, participatory_space: participatory_process) }
- let(:sortition) { create(:sortition, component:, additional_info:) }
- let(:content_block) { create(:content_block, organization:, manifest_name: :hero, scope_name: :homepage) }
- let(:additional_info) { { en: "Description
" } }
- let(:description_image_path) { Rails.application.routes.url_helpers.rails_blob_path(description_image, only_path: true) }
- let(:description_image) do
- ActiveStorage::Blob.create_and_upload!(
- io: File.open(Decidim::Dev.asset("city.jpeg")),
- filename: "description_image.jpg",
- content_type: "image/jpeg"
- )
- end
- let(:block_attachment_file) { Decidim::Dev.test_file("icon.png", "image/png") }
- let(:resource) { sortition }
-
- before do
- if content_block
- content_block.images_container.background_image = block_attachment_file
- content_block.save!
- end
- switch_to_host(organization.host)
- end
-
- it_behaves_like "a social share meta tag", "description_image.jpg"
- it_behaves_like "a social share widget"
- it_behaves_like "a social share via QR code"
-
- context "when no description image" do
- let(:additional_info) { nil }
- let(:description_image_path) { "" }
-
- it_behaves_like "a social share meta tag", "city2.jpeg"
- end
-
- context "when listing all sortitions" do
- let(:resource) { main_component_path(component) }
-
- it_behaves_like "a social share meta tag", "city2.jpeg"
- end
-end
diff --git a/decidim-sortitions/spec/system/decidim/sortitions/sortitions_spec.rb b/decidim-sortitions/spec/system/decidim/sortitions/sortitions_spec.rb
deleted file mode 100644
index 6e92751a705f0..0000000000000
--- a/decidim-sortitions/spec/system/decidim/sortitions/sortitions_spec.rb
+++ /dev/null
@@ -1,83 +0,0 @@
-# frozen_string_literal: true
-
-require "spec_helper"
-
-describe "sortitions" do
- include_context "with a component"
-
- let(:manifest_name) { "sortitions" }
- let!(:user) { create(:user, :confirmed, organization: participatory_process.organization) }
-
- context "when there are no sortitions" do
- it "shows an empty page with a message" do
- visit_component
-
- within "main" do
- expect(page).to have_content("There are no sortitions yet.")
- end
- end
- end
-
- context "when listing sortitions in a participatory process" do
- it "lists all the sortitions" do
- create_list(:sortition, 3, component:)
- visit_component
- expect(page).to have_css(".card__list", count: 3)
- end
-
- context "when order by 'random'" do
- let!(:lucky_sortition) { create(:sortition, component:) }
- let!(:unlucky_sortition) { create(:sortition, component:) }
-
- it "lists the sortitions ordered randomly" do
- page.visit "#{main_component_path(component)}?order=random"
-
- expect(page).to have_css(".card__list", count: 2)
- expect(page).to have_css(".card__list", text: lucky_sortition.title[:en])
- expect(page).to have_css(".card__list", text: unlucky_sortition.title[:en])
- end
- end
-
- context "when ordering by 'recent'" do
- it "lists the sortitions ordered by created at" do
- older = create(:sortition, component:, created_at: 1.month.ago)
- recent = create(:sortition, component:)
-
- visit_component
-
- expect(page).to have_css(".order-by .button:first-child", text: recent.title[:en])
- expect(page).to have_css(".order-by .button:last-child", text: older.title[:en])
- end
- end
-
- context "when paginating" do
- let!(:collection) { create_list(:sortition, collection_size, component:) }
- let!(:resource_selector) { ".card__list" }
-
- it_behaves_like "a paginated resource"
- end
- end
-
- describe "filters" do
- context "when filtering by text" do
- it "updates the current URL" do
- create(:sortition, component:, title: { en: "Foobar sortition" })
- create(:sortition, component:, title: { en: "Another sortition" })
- visit_component
-
- within "form.new_filter" do
- fill_in("filter[search_text_cont]", with: "foobar")
- within "div.filter-search" do
- click_on
- end
- end
-
- expect(page).to have_no_content("Another sortition")
- expect(page).to have_content("Foobar sortition")
-
- filter_params = CGI.parse(URI.parse(page.current_url).query)
- expect(filter_params["filter[search_text_cont]"]).to eq(["foobar"])
- end
- end
- end
-end
diff --git a/decidim-sortitions/spec/types/integration_schema_spec.rb b/decidim-sortitions/spec/types/integration_schema_spec.rb
deleted file mode 100644
index 9806240409abf..0000000000000
--- a/decidim-sortitions/spec/types/integration_schema_spec.rb
+++ /dev/null
@@ -1,186 +0,0 @@
-# frozen_string_literal: true
-
-require "spec_helper"
-require "decidim/api/test"
-require "decidim/sortitions/test/factories"
-
-describe "Decidim::Api::QueryType" do
- include_context "with a graphql decidim component" do
- let(:component_fragment) do
- %(
- fragment fooComponent on Sortitions {
- sortition(id: #{sortition.id}){
- acceptsNewComments
- additionalInfo { translation(locale: "#{locale}") }
- author { id }
- cancelReason { translation(locale: "#{locale}") }
- cancelledByUser { id }
- cancelledOn
- candidateProposals
- taxonomies { id }
- comments { id }
- commentsHaveAlignment
- commentsHaveVotes
- createdAt
- dice
- hasComments
- id
- proposals {
- id
- title { translation(locale: "#{locale}") }
- }
- reference
- requestTimestamp
- selectedProposals
- targetItems
- title { translation(locale: "#{locale}") }
- totalCommentsCount
- type
- updatedAt
- url
- userAllowedToComment
- witnesses { translation(locale: "#{locale}") }
- }
- }
- )
- end
- end
- let(:component_type) { "Sortitions" }
- let!(:current_component) { create(:sortition_component, participatory_space: participatory_process) }
- let(:author) { create(:user, :confirmed, :admin, organization: current_component.organization) }
- let!(:sortition) { create(:sortition, component: current_component, taxonomies:, author:) }
-
- let(:sortition_single_result) do
- sortition.reload
- {
- "acceptsNewComments" => sortition.accepts_new_comments?,
- "additionalInfo" => { "translation" => sortition.additional_info[locale] },
- "author" => { "id" => sortition.author.id.to_s },
- "cancelReason" => sortition.cancel_reason,
- "cancelledByUser" => sortition.cancelled_by_user,
- "cancelledOn" => sortition.cancelled_on,
- "candidateProposals" => sortition.candidate_proposals,
- "taxonomies" => [{ "id" => sortition.taxonomies.first.id.to_s }],
- "comments" => [],
- "commentsHaveAlignment" => sortition.comments_have_alignment?,
- "commentsHaveVotes" => sortition.comments_have_votes?,
- "createdAt" => sortition.created_at.to_time.iso8601,
- "dice" => sortition.dice,
- "hasComments" => sortition.comment_threads.size.positive?,
- "id" => sortition.id.to_s,
- "proposals" => sortition.proposals.map { |proposal| { "id" => proposal.id.to_s, "title" => { "translation" => translated(proposal.title) } } },
- "reference" => sortition.reference,
- "requestTimestamp" => sortition.request_timestamp.to_time.iso8601,
- "selectedProposals" => sortition.selected_proposals,
- "targetItems" => sortition.target_items,
- "title" => { "translation" => sortition.title[locale] },
- "totalCommentsCount" => sortition.comments_count,
- "type" => "Decidim::Sortitions::Sortition",
- "updatedAt" => sortition.updated_at.to_time.iso8601,
- "url" => Decidim::ResourceLocatorPresenter.new(sortition).url,
- "userAllowedToComment" => sortition.user_allowed_to_comment?(current_user),
- "witnesses" => { "translation" => sortition.witnesses[locale] }
- }
- end
-
- let(:sortition_data) do
- {
- "__typename" => "Sortitions",
- "id" => current_component.id.to_s,
- "name" => { "translation" => translated(current_component.name) },
- "sortitions" => {
- "edges" => [
- {
- "node" => sortition_single_result
- }
- ]
- },
- "url" => Decidim::EngineRouter.main_proxy(current_component).root_url,
- "weight" => 0
- }
- end
-
- describe "commentable" do
- let(:component_fragment) { nil }
- let(:participatory_process_query) do
- %(
- commentable(id: "#{sortition.id}", type: "Decidim::Sortitions::Sortition", locale: "en", toggleTranslations: false) {
- __typename
- }
- )
- end
-
- it "executes successfully" do
- expect { response }.not_to raise_error
- end
-
- it do
- expect(response).to eq({ "commentable" => { "__typename" => "Sortition" } })
- end
- end
-
- describe "valid connection query" do
- let(:component_fragment) do
- %(
- fragment fooComponent on Sortitions {
- sortitions {
- edges{
- node{
- acceptsNewComments
- additionalInfo { translation(locale: "#{locale}") }
- author { id }
- cancelReason { translation(locale: "#{locale}") }
- cancelledByUser { id }
- cancelledOn
- candidateProposals
- taxonomies { id }
- comments { id }
- commentsHaveAlignment
- commentsHaveVotes
- createdAt
- dice
- hasComments
- id
- proposals {
- id
- title { translation(locale: "#{locale}") }
- }
- reference
- requestTimestamp
- selectedProposals
- targetItems
- title { translation(locale: "#{locale}") }
- totalCommentsCount
- type
- updatedAt
- url
- userAllowedToComment
- witnesses { translation(locale: "#{locale}") }
- }
- }
- }
- }
- )
- end
-
- it "executes successfully" do
- expect { response }.not_to raise_error
- end
-
- it { expect(response["participatoryProcess"]["components"].first).to eq(sortition_data) }
- end
-
- describe "valid query" do
- it "executes successfully" do
- expect { response }.not_to raise_error
- end
-
- it { expect(response["participatoryProcess"]["components"].first["sortition"]).to eq(sortition_single_result) }
- end
-
- include_examples "with resource visibility" do
- let(:component_factory) { :sortition_component }
- let(:lookout_key) { "sortition" }
- let(:query_result) { sortition_single_result }
- end
-end
diff --git a/decidim-sortitions/spec/types/sortition_type_spec.rb b/decidim-sortitions/spec/types/sortition_type_spec.rb
deleted file mode 100644
index 1d3956a84ad7a..0000000000000
--- a/decidim-sortitions/spec/types/sortition_type_spec.rb
+++ /dev/null
@@ -1,203 +0,0 @@
-# frozen_string_literal: true
-
-require "spec_helper"
-require "decidim/api/test"
-
-module Decidim
- module Sortitions
- describe SortitionType, type: :graphql do
- include_context "with a graphql class type"
-
- let(:model) { create(:sortition) }
- let(:organization) { model.organization }
-
- include_examples "taxonomizable interface"
- describe "id" do
- let(:query) { "{ id }" }
-
- it "returns all the required fields" do
- expect(response).to include("id" => model.id.to_s)
- end
- end
-
- describe "dice" do
- let(:query) { "{ dice }" }
-
- it "returns the dice field" do
- expect(response["dice"]).to eq(model.dice)
- end
- end
-
- describe "targetItems" do
- let(:query) { "{ targetItems }" }
-
- it "returns the targetItems field" do
- expect(response["targetItems"]).to eq(model.target_items)
- end
- end
-
- describe "requestTimestamp" do
- let(:query) { "{ requestTimestamp }" }
-
- it "returns when the sortition was created" do
- expect(response["requestTimestamp"]).to eq(model.request_timestamp.to_time.iso8601)
- end
- end
-
- describe "proposals" do
- let(:query) { "{ proposals { id } }" }
-
- it "returns all the required fields" do
- response_ids = response["proposals"].map { |selected_proposal| selected_proposal }
- expect(response_ids).to eq(model.proposals.map { |s| { "id" => s.id.to_s } })
- end
- end
-
- describe "selectedProposals" do
- let(:query) { "{ selectedProposals }" }
-
- it "returns all the required fields" do
- response_ids = response["selectedProposals"].map { |selected_proposal| selected_proposal }
- expect(response_ids).to eq(model.selected_proposals)
- end
- end
-
- describe "witnesses" do
- let(:query) { '{ witnesses { translation(locale: "en")}}' }
-
- it "returns all the required fields" do
- expect(response["witnesses"]["translation"]).to eq(model.witnesses["en"])
- end
- end
-
- describe "reference" do
- let(:query) { "{ reference }" }
-
- it "returns the reference field" do
- expect(response["reference"]).to eq(model.reference)
- end
- end
-
- describe "additionalInfo" do
- let(:query) { '{ additionalInfo { translation(locale: "en")}}' }
-
- it "returns all the required fields" do
- expect(response["additionalInfo"]["translation"]).to eq(model.additional_info["en"])
- end
- end
-
- describe "title" do
- let(:query) { '{ title { translation(locale: "en")}}' }
-
- it "returns all the required fields" do
- expect(response["title"]["translation"]).to eq(model.title["en"])
- end
- end
-
- describe "createdAt" do
- let(:query) { "{ createdAt }" }
-
- it "returns when the sortition was created" do
- expect(response["createdAt"]).to eq(model.created_at.to_time.iso8601)
- end
- end
-
- describe "updatedAt" do
- let(:query) { "{ updatedAt }" }
-
- it "returns when the sortition was updated" do
- expect(response["updatedAt"]).to eq(model.updated_at.to_time.iso8601)
- end
- end
-
- describe "url" do
- let(:query) { "{ url }" }
-
- it "returns all the required fields" do
- expect(response["url"]).to eq(Decidim::ResourceLocatorPresenter.new(model).url)
- end
- end
-
- describe "candidateProposals" do
- let(:query) { "{ candidateProposals }" }
-
- it "returns the candidateProposals field" do
- expect(response["candidateProposals"]).to eq(model.candidate_proposals)
- end
- end
-
- context "when the sortition is cancelled" do
- let(:component) { create(:sortition_component) }
- let(:author) { create(:user, :confirmed, :admin, organization: component.organization) }
- let(:model) { create(:sortition, :cancelled, component:, author:, cancelled_by_user: author) }
-
- describe "cancelReason" do
- let(:query) { '{ cancelReason { translation(locale: "en")}}' }
-
- it "returns all the required fields" do
- expect(response["cancelReason"]["translation"]).to eq(model.cancel_reason["en"])
- end
- end
-
- describe "cancelledOn" do
- let(:query) { "{ cancelledOn }" }
-
- it "returns when the sortition was cancelled" do
- expect(response["cancelledOn"]).to eq(model.cancelled_on.to_date.iso8601)
- end
- end
-
- describe "cancelledByUser" do
- let(:query) { "{ cancelledByUser { name }}" }
-
- it "returns the user that cancelled the sortition" do
- expect(response["cancelledByUser"]["name"]).to eq(model.cancelled_by_user.name)
- end
- end
-
- context "when participatory space is private" do
- let(:participatory_space) { create(:participatory_process, :with_steps, :private, organization: current_organization) }
- let(:current_component) { create(:sortition_component, participatory_space:) }
- let(:model) { create(:sortition, component: current_component) }
- let(:query) { "{ id }" }
-
- it "returns nothing" do
- expect(response).to be_nil
- end
- end
-
- context "when participatory space is private but transparent" do
- let(:participatory_space) { create(:assembly, :private, :transparent, organization: current_organization) }
- let(:current_component) { create(:sortition_component, :published, participatory_space:) }
- let(:model) { create(:sortition, component: current_component) }
- let(:query) { "{ id }" }
-
- it "returns the object" do
- expect(response).to include("id" => model.id.to_s)
- end
- end
-
- context "when participatory space is not published" do
- let(:participatory_space) { create(:participatory_process, :with_steps, :unpublished, organization: current_organization) }
- let(:current_component) { create(:sortition_component, participatory_space:) }
- let(:model) { create(:sortition, component: current_component) }
- let(:query) { "{ id }" }
-
- it "returns nothing" do
- expect(response).to be_nil
- end
- end
-
- context "when component is not published" do
- let(:current_component) { create(:sortition_component, :unpublished, organization: current_organization) }
- let(:model) { create(:sortition, component: current_component) }
- let(:query) { "{ id }" }
-
- it "returns nothing" do
- expect(response).to be_nil
- end
- end
- end
- end
- end
-end
diff --git a/decidim-sortitions/spec/types/sortitions_type_spec.rb b/decidim-sortitions/spec/types/sortitions_type_spec.rb
deleted file mode 100644
index 1955a846753f4..0000000000000
--- a/decidim-sortitions/spec/types/sortitions_type_spec.rb
+++ /dev/null
@@ -1,49 +0,0 @@
-# frozen_string_literal: true
-
-require "spec_helper"
-require "decidim/api/test"
-
-module Decidim
- module Sortitions
- describe SortitionsType, type: :graphql do
- include_context "with a graphql class type"
- let(:model) { create(:sortition_component) }
-
- it_behaves_like "a component query type"
-
- describe "sortitions" do
- let!(:component_sortitions) { create_list(:sortition, 2, component: model) }
- let!(:other_sortitions) { create_list(:sortition, 2) }
-
- let(:query) { "{ sortitions { edges { node { id } } } }" }
-
- it "returns the published sortitions" do
- ids = response["sortitions"]["edges"].map { |edge| edge["node"]["id"] }
- expect(ids).to include(*component_sortitions.map(&:id).map(&:to_s))
- expect(ids).not_to include(*other_sortitions.map(&:id).map(&:to_s))
- end
- end
-
- describe "sortition" do
- let(:query) { "query sortition($id: ID!){ sortition(id: $id) { id } }" }
- let(:variables) { { id: sortition.id.to_s } }
-
- context "when the sortition belongs to the component" do
- let!(:sortition) { create(:sortition, component: model) }
-
- it "finds the sortition" do
- expect(response["sortition"]["id"]).to eq(sortition.id.to_s)
- end
- end
-
- context "when the sortition does not belong to the component" do
- let!(:sortition) { create(:sortition, component: create(:sortition_component)) }
-
- it "returns null" do
- expect(response["sortition"]).to be_nil
- end
- end
- end
- end
- end
-end
diff --git a/decidim-surveys/app/controllers/decidim/surveys/surveys_controller.rb b/decidim-surveys/app/controllers/decidim/surveys/surveys_controller.rb
index 0b1a83ad175e6..a0c164cb0d556 100644
--- a/decidim-surveys/app/controllers/decidim/surveys/surveys_controller.rb
+++ b/decidim-surveys/app/controllers/decidim/surveys/surveys_controller.rb
@@ -89,6 +89,16 @@ def default_filter_params
with_any_state: %w(open)
}
end
+
+ def add_breadcrumb_item
+ return {} if survey.blank?
+
+ {
+ label: translated_attribute(survey.title),
+ url: Decidim::EngineRouter.main_proxy(current_component).survey_path(survey),
+ active: false
+ }
+ end
end
end
end
diff --git a/decidim-surveys/config/locales/ca-IT.yml b/decidim-surveys/config/locales/ca-IT.yml
index 74e983f20084a..47e021e9f06c7 100644
--- a/decidim-surveys/config/locales/ca-IT.yml
+++ b/decidim-surveys/config/locales/ca-IT.yml
@@ -48,6 +48,17 @@ ca-IT:
email_outro: Has rebut aquesta notificació perquè estàs seguint l'espai "%{participatory_space_title}". Pots deixar de rebre notificacions seguint l'enllaç anterior.
email_subject: Una nova enquesta a %{participatory_space_title}
notification_title: L'enquesta %{resource_title} en %{participatory_space_title} ja està oberta.
+ open_data:
+ help:
+ published_survey_user_responses:
+ body: El contingut de la resposta
+ created_at: La data en què es va crear aquesta resposta
+ id: Identificador únic per la resposta a l'enquesta
+ ip_hash: Adreça IP de la enquestada, codificada (hash) per privacitat
+ question: La pregunta que es va respondre
+ registered: Participant registrada
+ unregistered: Participant no registrada
+ user_status: Estat de la usuària que va enviar la resposta
statistics:
responses: 'Respostes:'
responses_count: Respostes
diff --git a/decidim-surveys/config/locales/ca.yml b/decidim-surveys/config/locales/ca.yml
index ee57591b1fb77..511dc34128dbe 100644
--- a/decidim-surveys/config/locales/ca.yml
+++ b/decidim-surveys/config/locales/ca.yml
@@ -48,6 +48,17 @@ ca:
email_outro: Has rebut aquesta notificació perquè estàs seguint l'espai "%{participatory_space_title}". Pots deixar de rebre notificacions seguint l'enllaç anterior.
email_subject: Una nova enquesta a %{participatory_space_title}
notification_title: L'enquesta %{resource_title} en %{participatory_space_title} ja està oberta.
+ open_data:
+ help:
+ published_survey_user_responses:
+ body: El contingut de la resposta
+ created_at: La data en què es va crear aquesta resposta
+ id: Identificador únic per la resposta a l'enquesta
+ ip_hash: Adreça IP de la enquestada, codificada (hash) per privacitat
+ question: La pregunta que es va respondre
+ registered: Participant registrada
+ unregistered: Participant no registrada
+ user_status: Estat de la usuària que va enviar la resposta
statistics:
responses: 'Respostes:'
responses_count: Respostes
diff --git a/decidim-surveys/config/locales/en.yml b/decidim-surveys/config/locales/en.yml
index 24f8c163c55d2..4e92e4b9352df 100644
--- a/decidim-surveys/config/locales/en.yml
+++ b/decidim-surveys/config/locales/en.yml
@@ -49,6 +49,17 @@ en:
email_outro: You have received this notification because you are following %{participatory_space_title}. You can stop receiving notifications following the previous link.
email_subject: A new survey in %{participatory_space_title}
notification_title: The survey %{resource_title} in %{participatory_space_title} is now open.
+ open_data:
+ help:
+ published_survey_user_responses:
+ body: The content of the response
+ created_at: Timestamp when the response was created
+ id: Unique identifier for the survey response
+ ip_hash: Hashed IP address of the respondent for privacy
+ question: The question that was Responded
+ registered: Registered participant
+ unregistered: Unregistered participant
+ user_status: Status of the user who submitted the response
statistics:
responses: 'Responses:'
responses_count: Responses
diff --git a/decidim-surveys/config/locales/es-MX.yml b/decidim-surveys/config/locales/es-MX.yml
index 49e2c7dc1c905..f376da438495a 100644
--- a/decidim-surveys/config/locales/es-MX.yml
+++ b/decidim-surveys/config/locales/es-MX.yml
@@ -48,6 +48,17 @@ es-MX:
email_outro: Has recibido esta notificación porque estás siguiendo %{participatory_space_title}. Puedes dejar de recibir notificaciones siguiendo el enlace anterior.
email_subject: Nueva encuesta en %{participatory_space_title}
notification_title: Ya está abierta la encuesta %{resource_title} en %{participatory_space_title}.
+ open_data:
+ help:
+ published_survey_user_responses:
+ body: El contenido de la respuesta
+ created_at: La fecha en la que se creó esta respuesta
+ id: Identificador único para la respuesta a la encuesta
+ ip_hash: Dirección IP de la encuestada, codificada (hash) por privacidad
+ question: La pregunta que se respondió
+ registered: Participante registrada
+ unregistered: Participante no registrada
+ user_status: Estado de la usuaria que envió la respuesta
statistics:
responses: 'Respuestas:'
responses_count: Respuestas
diff --git a/decidim-surveys/config/locales/es-PY.yml b/decidim-surveys/config/locales/es-PY.yml
index c386715f3b78e..5c77b85e08657 100644
--- a/decidim-surveys/config/locales/es-PY.yml
+++ b/decidim-surveys/config/locales/es-PY.yml
@@ -48,6 +48,17 @@ es-PY:
email_outro: Has recibido esta notificación porque estás siguiendo %{participatory_space_title}. Puedes dejar de recibir notificaciones siguiendo el enlace anterior.
email_subject: Nueva encuesta en %{participatory_space_title}
notification_title: Ya está abierta la encuesta %{resource_title} en %{participatory_space_title}.
+ open_data:
+ help:
+ published_survey_user_responses:
+ body: El contenido de la respuesta
+ created_at: La fecha en la que se creó esta respuesta
+ id: Identificador único para la respuesta a la encuesta
+ ip_hash: Dirección IP de la encuestada, codificada (hash) por privacidad
+ question: La pregunta que se respondió
+ registered: Participante registrada
+ unregistered: Participante no registrada
+ user_status: Estado de la usuaria que envió la respuesta
statistics:
responses: 'Respuestas:'
responses_count: Respuestas
diff --git a/decidim-surveys/config/locales/es.yml b/decidim-surveys/config/locales/es.yml
index b793537792096..71b369fb78bf7 100644
--- a/decidim-surveys/config/locales/es.yml
+++ b/decidim-surveys/config/locales/es.yml
@@ -48,6 +48,17 @@ es:
email_outro: Has recibido esta notificación porque estás siguiendo el espacio "%{participatory_space_title}". Puedes dejar de recibir notificaciones siguiendo el enlace anterior.
email_subject: Nueva encuesta en %{participatory_space_title}
notification_title: Ya está abierta la encuesta %{resource_title} en %{participatory_space_title}.
+ open_data:
+ help:
+ published_survey_user_responses:
+ body: El contenido de la respuesta
+ created_at: La fecha en la que se creó esta respuesta
+ id: Identificador único para la respuesta a la encuesta
+ ip_hash: Dirección IP de la encuestada, codificada (hash) por privacidad
+ question: La pregunta que se respondió
+ registered: Participante registrada
+ unregistered: Participante no registrada
+ user_status: Estado de la usuaria que envió la respuesta
statistics:
responses: 'Respuestas:'
responses_count: Respuestas
diff --git a/decidim-surveys/config/locales/fr-CA.yml b/decidim-surveys/config/locales/fr-CA.yml
index 9e5c5a0ad1283..af24af25cc2f7 100644
--- a/decidim-surveys/config/locales/fr-CA.yml
+++ b/decidim-surveys/config/locales/fr-CA.yml
@@ -48,6 +48,17 @@ fr-CA:
email_outro: Vous avez reçu cette notification car vous suivez l'espace participatif %{participatory_space_title}. Vous pouvez arrêter de recevoir ces notifications à partir du lien précédent.
email_subject: Une nouvelle enquête a été créée dans %{participatory_space_title}
notification_title: 'L''enquête %{resource_title} est ouverte. Vous pouvez y participer en vous rendant sur le lien suivant : %{participatory_space_title}.'
+ open_data:
+ help:
+ published_survey_user_responses:
+ body: Le contenu de la réponse
+ created_at: Horodatage de création de la réponse
+ id: Identifiant unique pour la réponse à l'enquête
+ ip_hash: Adresse IP du répondant pour confidentialité
+ question: La question à laquelle on a répondu
+ registered: Participant inscrit
+ unregistered: Participant non inscrit
+ user_status: Statut de l'utilisateur qui a soumis la réponse
statistics:
responses: 'Réponses:'
responses_count: Réponses
diff --git a/decidim-surveys/config/locales/fr.yml b/decidim-surveys/config/locales/fr.yml
index e484ac36a4385..9709ab79d256a 100644
--- a/decidim-surveys/config/locales/fr.yml
+++ b/decidim-surveys/config/locales/fr.yml
@@ -48,6 +48,17 @@ fr:
email_outro: Vous avez reçu cette notification car vous suivez la concertation %{participatory_space_title}. Si vous souhaitez vous désabonner des notifications, connectez-vous à la plateforme, puis rendez-vous dans l'onglet “Mon compte” > “Paramètres des notifications”.
email_subject: Une nouvelle enquête a été créée dans %{participatory_space_title}
notification_title: 'L''enquête %{resource_title} est ouverte. Vous pouvez y participer en vous rendant sur le lien suivant : %{participatory_space_title}.'
+ open_data:
+ help:
+ published_survey_user_responses:
+ body: Le contenu de la réponse
+ created_at: Horodatage de création de la réponse
+ id: Identifiant unique pour la réponse à l'enquête
+ ip_hash: Adresse IP du répondant pour confidentialité
+ question: La question à laquelle on a répondu
+ registered: Participant inscrit
+ unregistered: Participant non inscrit
+ user_status: Statut de l'utilisateur qui a soumis la réponse
statistics:
responses: 'Réponses:'
responses_count: Réponses
diff --git a/decidim-surveys/config/locales/sv.yml b/decidim-surveys/config/locales/sv.yml
index cd7f0fb2e6633..519d2753591b3 100644
--- a/decidim-surveys/config/locales/sv.yml
+++ b/decidim-surveys/config/locales/sv.yml
@@ -34,6 +34,17 @@ sv:
email_outro: Du har fått det här meddelandet eftersom du följer %{participatory_space_title}. Du kan sluta att ta emot meddelanden via föregående länk.
email_subject: En ny enkät i %{participatory_space_title}
notification_title: Enkäten %{resource_title} i %{participatory_space_title} är nu öppen.
+ open_data:
+ help:
+ published_survey_user_responses:
+ body:
+ created_at: Datum då resultatet skapades
+ id: Unik identifierare för enkätsvar
+ ip_hash: Hashad IP-adress åt respondenten för sekretess
+ question: Frågan som besvarades
+ registered: Registrerad deltagare
+ unregistered: Oregistrerad deltagare
+ user_status: Status för användaren som skickade svaret
statistics:
responses: 'Svar:'
surveys_count_tooltip: Antalet tillgängliga undersökningar och svar som samlats in.
diff --git a/decidim-surveys/decidim-surveys.gemspec b/decidim-surveys/decidim-surveys.gemspec
index 5bc7942a1d34c..d748461a209ce 100644
--- a/decidim-surveys/decidim-surveys.gemspec
+++ b/decidim-surveys/decidim-surveys.gemspec
@@ -19,7 +19,7 @@ Gem::Specification.new do |s|
"homepage_uri" => "https://decidim.org",
"source_code_uri" => "https://github.com/decidim/decidim"
}
- s.required_ruby_version = "~> 3.3.0"
+ s.required_ruby_version = "~> 3.4.0"
s.name = "decidim-surveys"
s.summary = "Decidim surveys module"
diff --git a/decidim-surveys/lib/decidim/surveys.rb b/decidim-surveys/lib/decidim/surveys.rb
index d49ea6def2b56..6de3029433cee 100644
--- a/decidim-surveys/lib/decidim/surveys.rb
+++ b/decidim-surveys/lib/decidim/surveys.rb
@@ -10,5 +10,6 @@ module Decidim
# This namespace holds the logic of the `Surveys` component. This component
# allows users to create surveys in a participatory process.
module Surveys
+ autoload :UserResponsesSerializer, "decidim/surveys/user_responses_serializer"
end
end
diff --git a/decidim-surveys/lib/decidim/surveys/component.rb b/decidim-surveys/lib/decidim/surveys/component.rb
index ce93db5c6ba1e..f2f89ea4ae30a 100644
--- a/decidim-surveys/lib/decidim/surveys/component.rb
+++ b/decidim-surveys/lib/decidim/surveys/component.rb
@@ -71,6 +71,23 @@
exports.serializer Decidim::Forms::UserResponsesSerializer
end
+ component.exports :published_survey_user_responses do |exports|
+ exports.collection do |component|
+ survey = Decidim::Surveys::Survey.find_by(component: component)
+
+ Decidim::Forms::Response
+ .joins(:question)
+ .where(questionnaire: survey.questionnaire)
+ .where.not(decidim_forms_questions: { question_type: %w(separator title_and_description) })
+ .where.not(decidim_forms_questions: { survey_responses_published_at: nil })
+ .includes(:question, :choices, :user)
+ end
+
+ exports.formats []
+ exports.include_in_open_data = true
+ exports.serializer Decidim::Surveys::UserResponsesSerializer
+ end
+
component.seeds do |participatory_space|
require "decidim/surveys/seeds"
diff --git a/decidim-surveys/lib/decidim/surveys/seeds.rb b/decidim-surveys/lib/decidim/surveys/seeds.rb
index 4ffd0647cd5ac..8f67ae902d6e5 100644
--- a/decidim-surveys/lib/decidim/surveys/seeds.rb
+++ b/decidim-surveys/lib/decidim/surveys/seeds.rb
@@ -96,7 +96,7 @@ def create_questions!(questionnaire:)
# Files type questions do not support being conditionals for another questions
files_question = questionnaire.questions.where(question_type: "files")
- possible_condition_questions = questionnaire.questions.excluding(files_question)
+ possible_condition_questions = questionnaire.questions.excluding(question, files_question)
question.display_conditions.create!(
condition_question: possible_condition_questions.sample,
diff --git a/decidim-surveys/lib/decidim/surveys/test/factories.rb b/decidim-surveys/lib/decidim/surveys/test/factories.rb
index b1f590ee43784..f4222633dddb5 100644
--- a/decidim-surveys/lib/decidim/surveys/test/factories.rb
+++ b/decidim-surveys/lib/decidim/surveys/test/factories.rb
@@ -19,7 +19,7 @@
transient do
skip_injection { false }
end
- questionnaire { build(:questionnaire, :with_questions, skip_injection:) }
+ questionnaire { build(:questionnaire, :with_questions, questionnaire_for: component.try(:participatory_space), skip_injection:) }
component { build(:surveys_component, skip_injection:) }
trait :published do
diff --git a/decidim-surveys/lib/decidim/surveys/user_responses_serializer.rb b/decidim-surveys/lib/decidim/surveys/user_responses_serializer.rb
new file mode 100644
index 0000000000000..4ea43a1b082d6
--- /dev/null
+++ b/decidim-surveys/lib/decidim/surveys/user_responses_serializer.rb
@@ -0,0 +1,55 @@
+# frozen_string_literal: true
+
+module Decidim
+ module Surveys
+ class UserResponsesSerializer < Decidim::Exporters::Serializer
+ include Decidim::TranslationsHelper
+
+ # Public: Exports a hash with the serialized data for the user response.
+ def serialize
+ # Returns a csv export of surveys responses only if they have been published.
+ response = resource
+ {
+ id: response.session_token,
+ created_at: response.created_at,
+ ip_hash: response.ip_hash,
+ user_status: I18n.t(response.decidim_user_id.present? ? "registered" : "unregistered", scope: "decidim.open_data.help.published_survey_user_responses"),
+ question: question_text(response),
+ body: normalize_body(response)
+ }
+ end
+
+ private
+
+ def question_text(response)
+ if response.question.present?
+ "#{response.question.position}. #{translated_attribute(response.question.body)}"
+ else
+ ""
+ end
+ end
+
+ def normalize_body(response)
+ return response.body if response.body.present?
+
+ normalize_choices(response.choices)
+ end
+
+ def normalize_choices(choices)
+ choices.map { |choice| translated_attribute(choice.try(:body)) }.compact.join(", ")
+ end
+
+ def translated_attribute(attribute)
+ if attribute.is_a?(Hash)
+ attribute[I18n.locale.to_s] || attribute[organization.default_locale] || attribute.values.first
+ else
+ attribute.to_s
+ end
+ end
+
+ def organization
+ resource.questionnaire.questionnaire_for.organization
+ end
+ end
+ end
+end
diff --git a/decidim-surveys/spec/services/open_data_exporter_spec.rb b/decidim-surveys/spec/services/open_data_exporter_spec.rb
new file mode 100644
index 0000000000000..e46feb2c6244a
--- /dev/null
+++ b/decidim-surveys/spec/services/open_data_exporter_spec.rb
@@ -0,0 +1,45 @@
+# frozen_string_literal: true
+
+require "spec_helper"
+
+describe Decidim::OpenDataExporter do # rubocop:disable RSpec/SpecFilePathFormat
+ subject { described_class.new(organization, path) }
+
+ let(:organization) { create(:organization) }
+ let(:path) { Rails.root.join("tmp/open-data-export") }
+
+ describe "published survey user responses" do
+ let(:component) { create(:surveys_component, organization:, published_at: Time.current) }
+ let(:questionnaire) { create(:questionnaire) }
+ let(:questions) { create(:questionnaire_question, survey_responses_published_at: Time.current) }
+
+ context "when no responses are published" do
+ before do
+ questions.update(survey_responses_published_at: nil)
+ end
+
+ it "does not export unpublished responses" do
+ subject.export
+
+ csv_file = Dir.glob(path.join("*published-survey-user-responses*.csv")).first
+
+ expect(CSV.read(csv_file, headers: true).count).to eq(0) if csv_file
+ end
+ end
+
+ context "when survey component is unpublished" do
+ before do
+ component.update(published_at: nil)
+ questions.update(survey_responses_published_at: nil)
+ end
+
+ it "does not export responses from unpublished responses" do
+ subject.export
+
+ csv_file = Dir.glob(path.join("*published-survey-user-responses*.csv")).first
+
+ expect(CSV.read(csv_file, headers: true).count).to eq(0) if csv_file
+ end
+ end
+ end
+end
diff --git a/decidim-surveys/spec/shared/export_survey_user_responses_examples.rb b/decidim-surveys/spec/shared/export_survey_user_responses_examples.rb
index 8901ba7259097..a6fffec05c08b 100644
--- a/decidim-surveys/spec/shared/export_survey_user_responses_examples.rb
+++ b/decidim-surveys/spec/shared/export_survey_user_responses_examples.rb
@@ -96,13 +96,13 @@
# There is a chance of a flaky spec here, as sometimes the jobs are not enqueued in the correct order
# causing user's confirmations to be sent after the export is ready
- def perform_and_wait_for_enqueued_jobs(only: nil, except: nil, queue: nil, at: nil, &block)
+ def perform_and_wait_for_enqueued_jobs(only: nil, except: nil, queue: nil, at: nil, &)
while enqueued_jobs.size.positive?
perform_enqueued_jobs
sleep 0.5
end
- perform_enqueued_jobs(only:, except:, queue:, at:, &block)
+ perform_enqueued_jobs(only:, except:, queue:, at:, &)
while enqueued_jobs.size.positive?
perform_enqueued_jobs
diff --git a/decidim-surveys/spec/system/admin_access_spec.rb b/decidim-surveys/spec/system/admin_access_spec.rb
new file mode 100644
index 0000000000000..194786c6e3cb0
--- /dev/null
+++ b/decidim-surveys/spec/system/admin_access_spec.rb
@@ -0,0 +1,14 @@
+# frozen_string_literal: true
+
+require "spec_helper"
+
+require "decidim/admin/test/admin_participatory_space_component_access_examples"
+
+describe "AdminAccess" do
+ let(:manifest_name) { "surveys" }
+ let!(:survey) { create(:survey, :published, :clean_after_publish, component:) }
+ let(:title) { "Surveys" }
+
+ include_context "when managing a component as an admin"
+ include_examples "accessing the component in a participatory space"
+end
diff --git a/decidim-surveys/spec/system/private_space_survey_spec.rb b/decidim-surveys/spec/system/private_space_survey_spec.rb
index 90d36521bdfee..4e8ddd8b7978e 100644
--- a/decidim-surveys/spec/system/private_space_survey_spec.rb
+++ b/decidim-surveys/spec/system/private_space_survey_spec.rb
@@ -57,7 +57,7 @@ def visit_component
expect(page).to have_no_css(".form.response-questionnaire")
- within "[data-question-readonly]" do
+ within ".response-questionnaire__step" do
expect(page).to have_i18n_content(question.body)
expect(page).not_to have_i18n_content(question_conditioned.body)
end
diff --git a/decidim-surveys/spec/system/survey_spec.rb b/decidim-surveys/spec/system/survey_spec.rb
index a4e2f14d90a61..30039b8d83f7d 100644
--- a/decidim-surveys/spec/system/survey_spec.rb
+++ b/decidim-surveys/spec/system/survey_spec.rb
@@ -39,6 +39,10 @@
it "does not allow responding the survey" do
visit_component
+ within(".menu-bar") do
+ expect(page).to have_content(translated(component.name))
+ end
+
choose "All"
expect(page).to have_i18n_content(questionnaire.title)
@@ -100,6 +104,11 @@
choose "All"
click_on translated_attribute(questionnaire.title)
+ within(".menu-bar") do
+ expect(page).to have_content(translated(component.name))
+ expect(page).to have_content(translated(questionnaire.title))
+ end
+
# does not show the charts if not published
expect(page.html).not_to include('new Chartkick["ColumnChart"]("chart-1"')
expect(page.html).not_to include('new Chartkick["ColumnChart"]("chart-2"')
diff --git a/decidim-system/config/locales/ca-IT.yml b/decidim-system/config/locales/ca-IT.yml
index 0e335127c78aa..8467cdf931bd1 100644
--- a/decidim-system/config/locales/ca-IT.yml
+++ b/decidim-system/config/locales/ca-IT.yml
@@ -283,7 +283,7 @@ ca-IT:
intro: |
Si us plau, vés en compte en considerar canviar aquests ajustos. Com menys opcions permetis, millor.
Permetre extensions d'arxius específiques o tipus MIME pot exposar a les usuàries del sistema a riscos de seguretat i també pot afectar l'accessibilitat del lloc web.
- header_snippets_help_html: Fes servir aquest camp per afegir coses a la capçalera HTML. Lús més comú és integrar serveis de tercers que requereixen JavaScript o CSS addicionals. També, pots fer-lo servir per afegir meta-etiquetes extra a l'HTML. Tingues en compte que això només serà renderitzat a pàgines públiques, no a la secció d'administració. Si el codi interactua amb APIs externes o no compleix les pautes de seguretat de l'aplicació, cal canviar la Política de Seguretat del Contingut. Llegiu més sobre al lloc de documentació.
+ header_snippets_help_html: Fes servir aquest camp per afegir coses a la capçalera HTML. Lús més comú és integrar serveis de tercers que requereixen JavaScript o CSS addicionals. També, pots fer-lo servir per afegir meta-etiquetes extra a l'HTML. Tingues en compte que això només serà renderitzat a pàgines públiques, no a la secció d'administració. Si el codi interactua amb APIs externes o no compleix les pautes de seguretat de l'aplicació, cal canviar la Política de Seguretat del Contingut. Llegiu més sobre a l'espai de documentació.
index:
title: Organitzacions
new:
diff --git a/decidim-system/config/locales/ca.yml b/decidim-system/config/locales/ca.yml
index 3e8fce1344782..59b11b0dc8263 100644
--- a/decidim-system/config/locales/ca.yml
+++ b/decidim-system/config/locales/ca.yml
@@ -283,7 +283,7 @@ ca:
intro: |
Si us plau, vés en compte en considerar canviar aquests ajustos. Com menys opcions permetis, millor.
Permetre extensions d'arxius específiques o tipus MIME pot exposar a les usuàries del sistema a riscos de seguretat i també pot afectar l'accessibilitat del lloc web.
- header_snippets_help_html: Fes servir aquest camp per afegir coses a la capçalera HTML. Lús més comú és integrar serveis de tercers que requereixen JavaScript o CSS addicionals. També, pots fer-lo servir per afegir meta-etiquetes extra a l'HTML. Tingues en compte que això només serà renderitzat a pàgines públiques, no a la secció d'administració. Si el codi interactua amb APIs externes o no compleix les pautes de seguretat de l'aplicació, cal canviar la Política de Seguretat del Contingut. Llegiu més sobre al lloc de documentació.
+ header_snippets_help_html: Fes servir aquest camp per afegir coses a la capçalera HTML. Lús més comú és integrar serveis de tercers que requereixen JavaScript o CSS addicionals. També, pots fer-lo servir per afegir meta-etiquetes extra a l'HTML. Tingues en compte que això només serà renderitzat a pàgines públiques, no a la secció d'administració. Si el codi interactua amb APIs externes o no compleix les pautes de seguretat de l'aplicació, cal canviar la Política de Seguretat del Contingut. Llegiu més sobre a l'espai de documentació.
index:
title: Organitzacions
new:
diff --git a/decidim-system/config/locales/es-MX.yml b/decidim-system/config/locales/es-MX.yml
index ca628cc53421d..6c1f704353185 100644
--- a/decidim-system/config/locales/es-MX.yml
+++ b/decidim-system/config/locales/es-MX.yml
@@ -284,7 +284,7 @@ es-MX:
intro: |
Por favor, sé muy cautelosa al considerar cambiar estos ajustes. Cuanto menos opciones permitas, mejor.
Permitir extensiones de archivos específicas o tipos MIME puede exponer a las usuarias del sistema a riesgos de seguridad y también puede afectar a la accesibilidad del sitio web.
- header_snippets_help_html: Utiliza este campo para añadir cosas a la cabecera HTML. El uso más común es integrar servicios de terceros que requieren JavaScript o CSS adicionales. También, puedes usarlo para añadir meta-etiquetas extra al HTML. Ten en cuenta que esto sólo será renderizado en páginas públicas, no en la sección de administración. Si el código interactúa con APIs externas o no cumple con las pautas de seguridad de la aplicación, será necesario cambiar la Política de Seguridad del Contenido. Lea más sobre en el sitio de documentación.
+ header_snippets_help_html: Utiliza este campo para añadir cosas a la cabecera HTML. El uso más común es integrar servicios de terceros que requieren JavaScript o CSS adicionales. También, puedes usarlo para añadir meta-etiquetas extra al HTML. Ten en cuenta que esto sólo será renderizado en páginas públicas, no en la sección de administración. Si el código interactúa con APIs externas o no cumple con las pautas de seguridad de la aplicación, será necesario cambiar la Política de Seguridad del Contenido. Lea más sobre en el espacio de documentación.
index:
title: Organizaciones
new:
diff --git a/decidim-system/config/locales/es-PY.yml b/decidim-system/config/locales/es-PY.yml
index 19d205996871c..1e6676bccba3a 100644
--- a/decidim-system/config/locales/es-PY.yml
+++ b/decidim-system/config/locales/es-PY.yml
@@ -284,7 +284,7 @@ es-PY:
intro: |
Por favor, sé muy cautelosa al considerar cambiar estos ajustes. Cuanto menos opciones permitas, mejor.
Permitir extensiones de archivos específicas o tipos MIME puede exponer a las usuarias del sistema a riesgos de seguridad y también puede afectar a la accesibilidad del sitio web.
- header_snippets_help_html: Utiliza este campo para añadir cosas a la cabecera HTML. El uso más común es integrar servicios de terceros que requieren JavaScript o CSS adicionales. También, puedes usarlo para añadir meta-etiquetas extra al HTML. Ten en cuenta que esto sólo será renderizado en páginas públicas, no en la sección de administración. Si el código interactúa con APIs externas o no cumple con las pautas de seguridad de la aplicación, será necesario cambiar la Política de Seguridad del Contenido. Lea más sobre en el sitio de documentación.
+ header_snippets_help_html: Utiliza este campo para añadir cosas a la cabecera HTML. El uso más común es integrar servicios de terceros que requieren JavaScript o CSS adicionales. También, puedes usarlo para añadir meta-etiquetas extra al HTML. Ten en cuenta que esto sólo será renderizado en páginas públicas, no en la sección de administración. Si el código interactúa con APIs externas o no cumple con las pautas de seguridad de la aplicación, será necesario cambiar la Política de Seguridad del Contenido. Lea más sobre en el espacio de documentación.
index:
title: Organizaciones
new:
diff --git a/decidim-system/config/locales/es.yml b/decidim-system/config/locales/es.yml
index a988fdac1799b..4a12d6cc4cb1d 100644
--- a/decidim-system/config/locales/es.yml
+++ b/decidim-system/config/locales/es.yml
@@ -284,7 +284,7 @@ es:
intro: |
Por favor, sé muy cautelosa al considerar cambiar estos ajustes. Cuanto menos opciones permitas, mejor.
Permitir extensiones de archivos específicas o tipos MIME puede exponer a las usuarias del sistema a riesgos de seguridad y también puede afectar a la accesibilidad del sitio web.
- header_snippets_help_html: Utiliza este campo para añadir cosas a la cabecera HTML. El uso más común es integrar servicios de terceros que requieren JavaScript o CSS adicionales. También, puedes usarlo para añadir meta-etiquetas extra al HTML. Ten en cuenta que esto sólo será renderizado en páginas públicas, no en la sección de administración. Si el código interactúa con APIs externas o no cumple con las pautas de seguridad de la aplicación, será necesario cambiar la Política de Seguridad del Contenido. Lea más sobre en el sitio de documentación.
+ header_snippets_help_html: Utiliza este campo para añadir cosas a la cabecera HTML. El uso más común es integrar servicios de terceros que requieren JavaScript o CSS adicionales. También, puedes usarlo para añadir meta-etiquetas extra al HTML. Ten en cuenta que esto sólo será renderizado en páginas públicas, no en la sección de administración. Si el código interactúa con APIs externas o no cumple con las pautas de seguridad de la aplicación, será necesario cambiar la Política de Seguridad del Contenido. Lea más sobre en el espacio de documentación.
index:
title: Organizaciones
new:
diff --git a/decidim-system/config/locales/eu.yml b/decidim-system/config/locales/eu.yml
index 2acbf065b73c7..7d014fb663578 100644
--- a/decidim-system/config/locales/eu.yml
+++ b/decidim-system/config/locales/eu.yml
@@ -285,7 +285,7 @@ eu:
Mesedez, kontuz ibili doikuntza horiek aldatzean.
Zenbat eta aukera gutxiago, hobe.
Fitxategi espezifikoen luzapenak edo MIME motakoak baimentzeak segurtasun-arriskuen eraginpean jar ditzake sistemaren parte-hartzaileak, eta webgunearen irisgarritasunari ere eragin diezaioke.
- header_snippets_help_html: Erabili eremu hau HTML goiburuari gauzak gehitzeko. Erabilera ohikoena da JavaScript edo CSS osagarriak behar dituzten hirugarrenen zerbitzuak integratzea. HTMLri meta-etiketa gehigarriak gehitzeko ere erabil dezakezu. Kontuan izan hori orrialde publikoetan soilik renderizatuko dela, ez administrazio-atalean. Kodeak kanpoko APIekin elkarreragiten badu edo aplikazioaren segurtasun-jarraibideak betetzen ez baditu, Edukiaren Segurtasun Politika aldatu beharko da. Irakurri gehiago honi buruz dokumentazioaren kokalekuan.
+ header_snippets_help_html: Erabili eremu hau HTML goiburuari gauzak gehitzeko. Erabilera ohikoena da JavaScript edo CSS osagarriak behar dituzten hirugarrenen zerbitzuak integratzea. HTMLri meta-etiketa gehigarriak gehitzeko ere erabil dezakezu. Kontuan izan hori orrialde publikoetan soilik renderizatuko dela, ez administrazio-atalean. Kodeak kanpoko APIekin elkarreragiten badu edo aplikazioaren segurtasun-jarraibideak betetzen ez baditu, Edukiaren Segurtasun Politika aldatu beharko da. Irakurri gehiago honi buruz dokumentazioaren kokalekuan.
index:
title: Erakundeak
new:
diff --git a/decidim-system/config/locales/fi-plain.yml b/decidim-system/config/locales/fi-plain.yml
index 927d5a287dcc5..9cde4529a5dda 100644
--- a/decidim-system/config/locales/fi-plain.yml
+++ b/decidim-system/config/locales/fi-plain.yml
@@ -283,7 +283,7 @@ fi-pl:
intro: |
Ole erityisen varovainen harkitessasi näiden asetusten muuttamista. Mitä vähemmän sallit, sitä parempi.
Sallimalla tietyt tiedostopäätteet tai MIME-tyypit voit altistaa järjestelmän käyttäjät turvallisuusriskeille ja se voi myös vaikuttaa sivuston saavutettavuuteen.
- header_snippets_help_html: Käytä tätä kenttää lisätäksesi uusia HTML-otsakkeita. Yleisin käyttötarkoitus on kolmannen osapuolen palveluiden integrointi, missä tarvitaan ylimääräisiä JavaScript- tai CSS-tiedostoja. Voit myös käyttää asetusta lisätäksesi uusia meta-merkintöjä HTML:ään. Huomioithan, että tämä asetus vaikuttaa vain osallistujille suunnatuilla julkisilla sivuilla, ei hallintakäyttäjien osiossa. Jos koodi on vuorovaikutuksessa ulkoisten sovellusrajapintojen kanssa tai se ei ole palvelun turvallisuuskäytännön mukainen, sisällön turvallisuuskäytäntöä (CSP, Content Security Policy) tulee muuttaa. Lue lisää dokumentaatiosivustolta.
+ header_snippets_help_html: Käytä tätä kenttää lisätäksesi uusia HTML-otsakkeita. Yleisin käyttötarkoitus on kolmannen osapuolen palveluiden integrointi, missä tarvitaan ylimääräisiä JavaScript- tai CSS-tiedostoja. Voit myös käyttää asetusta lisätäksesi uusia meta-merkintöjä HTML:ään. Huomioithan, että tämä asetus vaikuttaa vain osallistujille suunnatuilla julkisilla sivuilla, ei hallintakäyttäjien osiossa. Jos koodi on vuorovaikutuksessa ulkoisten sovellusrajapintojen kanssa tai se ei ole palvelun turvallisuuskäytännön mukainen, sisällön turvallisuuskäytäntöä (CSP, Content Security Policy) tulee muuttaa. Lue lisää dokumentaatiosivustolta.
index:
title: Organisaatiot
new:
diff --git a/decidim-system/config/locales/fi.yml b/decidim-system/config/locales/fi.yml
index 03c5534838f84..84b7ee32353b8 100644
--- a/decidim-system/config/locales/fi.yml
+++ b/decidim-system/config/locales/fi.yml
@@ -283,7 +283,7 @@ fi:
intro: |
Ole erityisen varovainen harkitessasi näiden asetusten muuttamista. Mitä vähemmän sallit, sitä parempi.
Sallimalla tietyt tiedostopäätteet tai MIME-tyypit voit altistaa järjestelmän käyttäjät turvallisuusriskeille ja se voi myös vaikuttaa sivuston saavutettavuuteen.
- header_snippets_help_html: Käytä tätä kenttää lisätäksesi uusia HTML-otsakkeita. Yleisin käyttötarkoitus on kolmannen osapuolen palveluiden integrointi, missä tarvitaan ylimääräisiä JavaScript- tai CSS-tiedostoja. Voit myös käyttää asetusta lisätäksesi uusia meta-merkintöjä HTML:ään. Huomioithan, että tämä asetus vaikuttaa vain osallistujille suunnatuilla julkisilla sivuilla, ei hallintakäyttäjien osiossa. Jos koodi on vuorovaikutuksessa ulkoisten sovellusrajapintojen kanssa tai se ei ole palvelun turvallisuuskäytännön mukainen, sisällön turvallisuuskäytäntöä (CSP, Content Security Policy) tulee muuttaa. Lue lisää dokumentaatiosivustolta.
+ header_snippets_help_html: Käytä tätä kenttää lisätäksesi uusia HTML-otsakkeita. Yleisin käyttötarkoitus on kolmannen osapuolen palveluiden integrointi, missä tarvitaan ylimääräisiä JavaScript- tai CSS-tiedostoja. Voit myös käyttää asetusta lisätäksesi uusia meta-merkintöjä HTML:ään. Huomioithan, että tämä asetus vaikuttaa vain osallistujille suunnatuilla julkisilla sivuilla, ei hallintakäyttäjien osiossa. Jos koodi on vuorovaikutuksessa ulkoisten sovellusrajapintojen kanssa tai se ei ole palvelun turvallisuuskäytännön mukainen, sisällön turvallisuuskäytäntöä (CSP, Content Security Policy) tulee muuttaa. Lue lisää dokumentaatiosivustolta.
index:
title: Organisaatiot
new:
diff --git a/decidim-system/config/locales/fr-CA.yml b/decidim-system/config/locales/fr-CA.yml
index e64f4e4bcbbb5..944bdf88204bb 100644
--- a/decidim-system/config/locales/fr-CA.yml
+++ b/decidim-system/config/locales/fr-CA.yml
@@ -216,7 +216,7 @@ fr-CA:
intro: |
Veuillez être extrèmement prudent lorsque vous envisagez de modifier ces paramètres. Moins vous autorisez, mieux c'est.
L'autorisation d'extensions de fichiers spécifiques ou de types MIME peut exposer les utilisateurs du système à des risques de sécurité et peut également affecter l'accessibilité du site.
- header_snippets_help_html: Utilisez ce champ pour ajouter des éléments à l'en-tête "head" HTML. L’utilisation la plus courante est d’intégrer des services tiers qui nécessitent du JavaScript ou du CSS supplémentaires. De plus, vous pouvez l'utiliser pour ajouter des balises méta supplémentaires au HTML. Notez que cela ne sera rendu que dans les pages publiques, pas dans la section admin. Si le code interagit avec des API externes ou ne respecte pas les directives de sécurité de l'application, il sera nécessaire de modifier la politique de sécurité du contenu. En savoir plus sur le site de documentation.
+ header_snippets_help_html: Utilisez ce champ pour ajouter des éléments à l'en-tête "head" HTML. L’utilisation la plus courante est d’intégrer des services tiers qui nécessitent du JavaScript ou du CSS supplémentaires. De plus, vous pouvez l'utiliser pour ajouter des balises méta supplémentaires au HTML. Notez que cela ne sera rendu que dans les pages publiques, pas dans la section admin. Si le code interagit avec des API externes ou ne respecte pas les directives de sécurité de l'application, il sera nécessaire de modifier la politique de sécurité du contenu. En savoir plus sur le site de documentation.
index:
title: Organisations
new:
diff --git a/decidim-system/config/locales/fr.yml b/decidim-system/config/locales/fr.yml
index 8b71d21aadb28..6052268a4813e 100644
--- a/decidim-system/config/locales/fr.yml
+++ b/decidim-system/config/locales/fr.yml
@@ -216,7 +216,7 @@ fr:
intro: |
Veuillez être extrêmement prudent lorsque vous envisagez de modifier ces paramètres. Moins vous autorisez, mieux c'est.
L'autorisation d'extensions de fichiers spécifiques ou de types MIME peut exposer les utilisateurs du système à des risques de sécurité et peut également affecter l'accessibilité du site.
- header_snippets_help_html: Utilisez ce champ pour ajouter des éléments à l'en-tête "head" HTML. L’utilisation la plus courante est d’intégrer des services tiers qui nécessitent du JavaScript ou du CSS supplémentaires. De plus, vous pouvez l'utiliser pour ajouter des balises méta supplémentaires au HTML. Notez que cela ne sera rendu que dans les pages publiques, pas dans la section admin. Si le code interagit avec des API externes ou ne respecte pas les directives de sécurité de l'application, il sera nécessaire de modifier la politique de sécurité du contenu. En savoir plus sur le site de documentation.
+ header_snippets_help_html: Utilisez ce champ pour ajouter des éléments à l'en-tête "head" HTML. L’utilisation la plus courante est d’intégrer des services tiers qui nécessitent du JavaScript ou du CSS supplémentaires. De plus, vous pouvez l'utiliser pour ajouter des balises méta supplémentaires au HTML. Notez que cela ne sera rendu que dans les pages publiques, pas dans la section admin. Si le code interagit avec des API externes ou ne respecte pas les directives de sécurité de l'application, il sera nécessaire de modifier la politique de sécurité du contenu. En savoir plus sur le site de documentation.
index:
title: Organisations
new:
diff --git a/decidim-system/config/locales/ja.yml b/decidim-system/config/locales/ja.yml
index 9e4cd6ff821b1..1cccb86e4a962 100644
--- a/decidim-system/config/locales/ja.yml
+++ b/decidim-system/config/locales/ja.yml
@@ -281,7 +281,7 @@ ja:
intro: |
これらの設定を変更する場合は、余分に注意してください。許可する数が少ないほど好ましいです。
特定のファイル拡張子や MIME タイプを許可することは、システムユーザーをセキュリティリスクにさらす可能性があり、ウェブサイトのアクセシビリティにも影響を与える可能性があります。
- header_snippets_help_html: このフィールドは、HTML の head 内に要素を追加するために使用します。最も一般的な用途は、追加の JavaScript や CSS を必要とするサードパーティサービスの統合です。また、HTML に追加のメタタグを挿入することもできます。なお、この内容は公開ページのみに反映され、管理セクションでは表示されません。もしコードが外部 API と連携したり、アプリケーションのセキュリティガイドラインに準拠していない場合は、Content Security Policy(CSP)の変更が必要になります。詳しくはドキュメントサイトをご覧ください。
+ header_snippets_help_html: このフィールドを使用して、HTML の head セクションに要素を追加します。最も一般的な使用例は、追加の JavaScript や CSS を必要とするサードパーティサービスを統合する場合です。また、HTML に追加のメタタグを追加するためにも使用できます。ただし、この機能は公開ページでのみレンダリングされ、管理画面では反映されません。コードが外部 API と連携している場合や、アプリケーションのセキュリティガイドラインに準拠していない場合は、コンテンツセキュリティポリシーの変更が必要になります。詳細については、ドキュメントサイト をご覧ください。
index:
title: 組織
new:
diff --git a/decidim-system/config/locales/sv.yml b/decidim-system/config/locales/sv.yml
index 9b8a9cae60fe2..c21948340f528 100644
--- a/decidim-system/config/locales/sv.yml
+++ b/decidim-system/config/locales/sv.yml
@@ -231,7 +231,7 @@ sv:
title: Tillåtna filändelser
file_sizes:
title: Maximal filstorlek
- header_snippets_help_html: Använd det här fältet för att göra tillägg till HTML-huvudet. Vanligaste användningen är för att integrera tredjepartstjänster som kräver extra JavaScript eller CSS. Du kan också lägga till extra metataggar till HTML. Observera att detta endast kommer att visas på offentliga sidor, inte i admingränssnittet. Om koden använder externa API:er eller bryter mot webbplatsens riktlinjer behöver du ändra säkerhetspolicyn. Läs mer på dokumentationssidan.
+ header_snippets_help_html: Använd det här fältet för att lägga till saker i HTML-rubriken. Vanligaste användningsområdet är att integrera tredjepartstjänster som kräver extra JavaScript eller CSS. Du kan också lägga till extra metataggar i HTML-koden. Notera att det bara kommer visas på offentliga sidor, inte i admin-sektionen. Om koden interagerar med externa API:er eller inte följer applikationens säkerhetskrav kommer det att vara nödvändigt att ändra innehållssäkerhetspolicyn. Läs mer på dokumentationssidan.
index:
title: Organisationer
new:
diff --git a/decidim-system/decidim-system.gemspec b/decidim-system/decidim-system.gemspec
index b6cd9f2b20ee6..bcbb01d6fee26 100644
--- a/decidim-system/decidim-system.gemspec
+++ b/decidim-system/decidim-system.gemspec
@@ -19,7 +19,7 @@ Gem::Specification.new do |s|
"homepage_uri" => "https://decidim.org",
"source_code_uri" => "https://github.com/decidim/decidim"
}
- s.required_ruby_version = "~> 3.3.0"
+ s.required_ruby_version = "~> 3.4.0"
s.name = "decidim-system"
s.summary = "Decidim system administration"
diff --git a/decidim-templates/app/views/decidim/templates/admin/block_user_templates/index.html.erb b/decidim-templates/app/views/decidim/templates/admin/block_user_templates/index.html.erb
index f716a9e5f066b..bbb803e7c7c7e 100644
--- a/decidim-templates/app/views/decidim/templates/admin/block_user_templates/index.html.erb
+++ b/decidim-templates/app/views/decidim/templates/admin/block_user_templates/index.html.erb
@@ -25,7 +25,7 @@
<%= link_to translated_attribute(template.name), edit_block_user_template_path(template) %>
">
- <%= l template.created_at, format: :long %>
+ <%= l template.created_at, format: :decidim_short %>
">
- <%= l template.created_at, format: :long %>
+ <%= l template.created_at, format: :decidim_short %>
" class="table-list__actions">
">
diff --git a/decidim-templates/decidim-templates.gemspec b/decidim-templates/decidim-templates.gemspec
index 6b9f19bf22aae..8a62392c31063 100644
--- a/decidim-templates/decidim-templates.gemspec
+++ b/decidim-templates/decidim-templates.gemspec
@@ -17,7 +17,7 @@ Gem::Specification.new do |s|
"homepage_uri" => "https://decidim.org",
"source_code_uri" => "https://github.com/decidim/decidim"
}
- s.required_ruby_version = "~> 3.3.0"
+ s.required_ruby_version = "~> 3.4.0"
s.name = "decidim-templates"
s.summary = "A decidim templates module"
diff --git a/decidim-verifications/config/locales/eu.yml b/decidim-verifications/config/locales/eu.yml
index f82b9df1923d2..404efb33755d2 100644
--- a/decidim-verifications/config/locales/eu.yml
+++ b/decidim-verifications/config/locales/eu.yml
@@ -124,10 +124,10 @@ eu:
verifications:
admin_log:
csv_datum:
- create: "%{user_name} -k sortu du errolda-datuen erregistro berria sortu du e-mail honekin: %{resource_email}"
- delete: "%{user_name} -k ezabatu du errolda-datuen erregistro berria e-mail honekin: %{resource_email}"
- import: "%{user_name} -k %{imported_count} errolda-erregistroak inportatu ditu"
- update: "%{user_name} -k eguneratu du errolda-datuen erregistro berria e-mail honekin: %{resource_email}"
+ create: "%{user_name} parte-hartzaileak sortu du errolda-datuen erregistro berria sortu du e-mail honekin: %{resource_email}"
+ delete: "%{user_name} parte-hartzaileak ezabatu du errolda-datuen erregistro berria e-mail honekin: %{resource_email}"
+ import: "%{user_name} parte-hartzaileak %{imported_count} errolda-erregistroak inportatu ditu"
+ update: "%{user_name} parte-hartzaileak eguneratu du errolda-datuen erregistro berria e-mail honekin: %{resource_email}"
authorizations:
authorization_metadata:
info: 'Hauek dira oraingo egiaztapenaren datuak:'
diff --git a/decidim-verifications/decidim-verifications.gemspec b/decidim-verifications/decidim-verifications.gemspec
index 01b0bffd10189..33f35c3a8b8ce 100644
--- a/decidim-verifications/decidim-verifications.gemspec
+++ b/decidim-verifications/decidim-verifications.gemspec
@@ -17,7 +17,7 @@ Gem::Specification.new do |s|
"homepage_uri" => "https://decidim.org",
"source_code_uri" => "https://github.com/decidim/decidim"
}
- s.required_ruby_version = "~> 3.3.0"
+ s.required_ruby_version = "~> 3.4.0"
s.summary = "Decidim verifications module"
s.description = "Several verification methods for your decidim instance"
diff --git a/decidim.gemspec b/decidim.gemspec
index b685bde97a85c..29659487c3ba1 100644
--- a/decidim.gemspec
+++ b/decidim.gemspec
@@ -18,7 +18,7 @@ Gem::Specification.new do |s|
"homepage_uri" => "https://decidim.org",
"source_code_uri" => "https://github.com/decidim/decidim"
}
- s.required_ruby_version = "~> 3.3.0"
+ s.required_ruby_version = "~> 3.4.0"
s.name = "decidim"
@@ -60,7 +60,6 @@ Gem::Specification.new do |s|
s.add_dependency "decidim-pages", Decidim.version
s.add_dependency "decidim-participatory_processes", Decidim.version
s.add_dependency "decidim-proposals", Decidim.version
- s.add_dependency "decidim-sortitions", Decidim.version
s.add_dependency "decidim-surveys", Decidim.version
s.add_dependency "decidim-system", Decidim.version
s.add_dependency "decidim-verifications", Decidim.version
diff --git a/docs/modules/develop/assets/images/maintainers-backports-checker.png b/docs/modules/develop/assets/images/maintainers-backports-checker.png
new file mode 100644
index 0000000000000..94cf1f1075187
Binary files /dev/null and b/docs/modules/develop/assets/images/maintainers-backports-checker.png differ
diff --git a/docs/modules/develop/pages/backports.adoc b/docs/modules/develop/pages/backports.adoc
index e5b9fccd32785..81e84169a076e 100644
--- a/docs/modules/develop/pages/backports.adoc
+++ b/docs/modules/develop/pages/backports.adoc
@@ -2,37 +2,118 @@
We only offer support for the last two mayor version.
-For instance, if we are on the version `0.28.0.dev`, we make backports for `v0.26.x` and `v0.27.x`. We only backport fixes and not features, as we want to respect xref:develop:guide_conventions.adoc[Semantic Versioning].
+For instance, if we are on the version `0.32.0.dev`, we make backports for `v0.31.x` and `v0.30.x`. We only backport fixes and not features, as we want to respect xref:develop:guide_conventions.adoc[Semantic Versioning].
The idea of a backport is to bring a given fix from the last development version to an older release.
The process for making backports is the following:
-. Check in the git commit history what was the latest backports on the branch that you are working with. https://github.com/decidim/decidim/commits/release/0.27-stable[Example for v0.27]. Copy the number of the last PR backported.
-. Search in GitHub for the this PR in the list of merged PRs of the `type: fix`. https://github.com/decidim/decidim/pulls?page=1&q=is%3Apr+sort%3Aupdated-desc+label%3A%22type%3A+fix%22+is%3Amerged[Example URL].
-. Check the PRs merged just before and after this one. You need to find the last ones that were not backported already to start with the backport process. A fast way for checking this out is to open the PRs and see the mentions from the backports in the GitHub references.
-. Once you have the list of the PRs that you want to backport, you can start with the process by using the https://github.com/decidim/decidim-maintainers_toolbox[decidim-backporter script]. This script mostly handles the branch creation, cherrypicking, labeling and pushing of the fix. For using it you will need to have a GitHub Personal Access Token.
+. Reproduce the error against develop.
+. Develop a fix for the issue, starting from the develop.
+. Open the Pull Request, adding the following labels: `type: fix`, `release: 0.xx`, in our example using `0.32.0.dev`, we would attach `type: fix`, `release: v0.31`.
+. If the fix affects multiple versions, attach the corresponding release tag (for instance, `release: v0.30`).
+. Be patient and wait for a maintainer to review and merge.
+. Once it is merged, an automated workflow will attempt to apply the patch.
+. If you have an already merged Pull Request, you can add another `release: v0.xx` tag, and this will retrigger the backport workflow. You do not need to decide when you open the PR which are the versions you want to backport to.
-This is an example on how this command is called:
+== Maintainers only
-```shell
-$ gem install UPDATE_WITH_YOUR_GEM_NAME_PRIOR_TO_RELEASE_TO_RUBYGEMS_ORG
-$ decidim-backporter --github-token=GITHUB_TOKEN --pull-request-id=10248 --version-number=0.27
-```
+In order to ease up the backport process, you will need to install the `decidim-maintainers_toolbox` gem.
-And this is the current full documentation for this script:
+[source,bash]
+----
+gem install decidim-maintainers_toolbox
+----
-```shell
-$ decidim-backporter --help
+This will provide you with some commands that you can use for day to day activities:
+
+Before starting to use `decidim-maintainers_toolbox` gem, you will need to make sure that you have available the `gh` command, provided by `GitHub`. Follow the https://github.com/cli/cli[gh project's page] for installation steps that are most suited for your Operating System.
+
+=== decidim-backports-checker
+
+The `decidim-backports-checker` is an utility that you can use to investigate which are the Pull Requests that needs to be backported.
+
+[source, bash]
+----
+Usage:
+ decidim-backports-checker --github-token=GITHUB_TOKEN --last-version-number=LAST_VERSION_NUMBER
+
+Options:
+--github-token=GITHUB_TOKEN # Required. Github Personal Access Token (PAT). It can be obtained from https://github.com/settings/tokens/new. You will need to create one with `public_repo` access.
+Alternatively, you can use the `gh` CLI tool to authenticate with `gh auth token` (i.e. --github-token=$(gh auth token))
+--last-version-number=LAST_VERSION_NUMBER # Required. The version number of the last supported version that you want to do the backports to. It must have the format MAJOR.MINOR.
+[--days-to-check-from=N] # How many days since the pull requests were merged we will check from.
+# Default: 90
+
+Backports checker. Shows the status of the pull requests opened in the last days
+
+The output by default is for the terminal. It uses a color code to differentiate the status of the Pull Requests, following the colors of GitHub:
+- Purple: closed with a merge
+- Red: closed without being merge
+- Green: opened without being merge
+----
+
+Any maintainer that wants to see the pending Pull Requests that needs to be backported to a specific version, should type in the following command:
+
+[source, bash]
+----
+decidim-backports-checker --github-token=$(gh auth token) --last-version-number=0.31
+----
+In our previous example, we have the develop branch set to be on 0.32.0.dev, which means that our latest released minor version is 0.31. We are using the minor version regardless if we are at `0.31.0.rc2`, `0.31.0` or `0.31.1`.
+
+image::maintainers-backports-checker.png[decidim-backports-checker output]
+
+In the above picture:
+
+- `15501` is a Pull Request that has been only opened for `0.31`, with no active backport to `0.30`.
+- `15201` is a Pull Request that has only been backported to `0.30`
+- `15181` is a Pull Request that has not been backported, or the automated backport script failed
+- We do not displayed a merged backport Pull Request.
+
+If you want to address a PR only for a specific version, you open the Pull Request for that version, then you can add `no-backport` label for the Pull Request that you do not want to backport to the oldest version.
+
+If a Pull Request is fully backported (merged backport Pull Requests in `0.31` and `0.30` versions), then the line will not be displayed.
+
+=== decidim-backporter
+
+As previously mentioned, we have an automated tool that will try to add create the backports automatically, but sometimes, due to conflicts the automated backport is not possible, so you need to use the `decidim-backporter` command.
+
+[source, bash]
+----
Usage:
decidim-backporter --github-token=GITHUB_TOKEN --pull-request-id=PULL_REQUEST_ID --version-number=VERSION_NUMBER
Options:
- --github-token=GITHUB_TOKEN # Required. GitHub Personal Access Token (PAT). It can be obtained from https://github.com/settings/tokens/new. You will need to create one with `public_repo` access.
- --version-number=VERSION_NUMBER # Required. The version number that you want to do the backport to. It must have the format MAJOR.MINOR.
- --pull-request-id=PULL_REQUEST_ID # Required. The ID of the pull request that you want to make the backport from. It should have the "type: fix" label.
- [--exit-with-unstaged-changes], [--no-exit-with-unstaged-changes] # Optional. Whether the script should exit with an error if there are unstaged changes in the current project.
- # Default: true
+ --github-token=GITHUB_TOKEN # Required. Github Personal Access Token (PAT). It can be obtained from https://github.com/settings/tokens/new. You will need to create one with `public_repo` access.
+Alternatively, you can use the `gh` CLI tool to authenticate with `gh auth token` (i.e. --github-token=$(gh auth token))
+ --version-number=VERSION_NUMBER # Required. The version number that you want to do the backport to. It must have the format MAJOR.MINOR.
+ --pull-request-id=PULL_REQUEST_ID # Required. The ID of the pull request that you want to make the backport from. It should have the "type: fix" label.
+ [--exit-with-unstaged-changes], [--no-exit-with-unstaged-changes], [--skip-exit-with-unstaged-changes] # Optional. Whether the script should exit with an error if there are unstaged changes in the current project.
+ # Default: true
+ [--with-console], [--no-with-console], [--skip-with-console] # Optional. Disables the shell dropout
+ # Default: true
Backport a pull request to another branch
-```
+----
+
+An example of the command is:
+
+[source, bash]
+----
+decidim-backporter --github-token=$(gh auth token) --pull-request-id=1234 --version-number=0.31
+----
+
+In this particular example, 1234 is the Pull Request merged against develop branch, while `--version-number` is the version where we want to backport.
+We do not need to pass the full version, as this will apply the fix only for the unreleased versions, regardless if we are on `0.31.0.rc1`, `0.31.0` or `0.31.1`
+
+The command will attempt to apply the patch, and if the patch fails with error, a console will be displayed, allowing you to change the files in your editor. After the conflict is fixed, you will need to write the following in your console:
+[source, bash]
+----
+git add
+git cherry-pick --continue
+# type logout or press CTRL + D
+----
+
+The process will continue creating the backport Pull Request.
+
+If you want to skip the backport creation for any reason, you just need to ensure that when your console drops, you do not have staged / modified files. Typing a `git cherry-pick --abort` will clean the backport process. After that you just need to exit the console with either `logout` or `CTRL+D`.
diff --git a/docs/modules/develop/pages/c4_component.adoc b/docs/modules/develop/pages/c4_component.adoc
index b12387baa4cad..8033132b8c66d 100644
--- a/docs/modules/develop/pages/c4_component.adoc
+++ b/docs/modules/develop/pages/c4_component.adoc
@@ -38,7 +38,6 @@ Container_Boundary(web_app, "Web Application") {
Component(pages, "Pages module", "Ruby On Rails Engine", "Component. adds static page capabilities to any participatory space. It basically provides an interface to include arbitrary HTML content to any step.")
Component(proposals, "Proposals module", "Ruby On Rails Engine", "Component. Adds one of the main components of Decidim: allows users to contribute to a participatory space by creating proposals.")
Component(surveys, "Surveys module", "Ruby On Rails Engine", "Component. Makes possible to publish surveys (for registered participants or visitors users).")
- Component(sortitions, "Sortitions module", "Ruby On Rails Engine", "Component. makes possible to select randomly a number of proposals among a set of proposals (or a category of proposals within a set) maximizing guarantees of randomness and avoiding manipulation of results by the administrator.")
Rel(surveys, forms, "Consumes")
Rel(meetings, forms, "Consumes")
@@ -50,7 +49,6 @@ Container_Boundary(web_app, "Web Application") {
' Rel(initiatives, comments, "Consumes")
' Rel(accountability, comments, "Consumes")
' Rel(budgets, comments, "Consumes")
- ' Rel(sortitions, comments, "Consumes")
' Rel(dev, comments, "Consumes")
' Rel(meetings, comments, "Consumes")
' Rel(debates, comments, "Consumes")
@@ -60,7 +58,6 @@ Container_Boundary(web_app, "Web Application") {
' Rel(initiatives, admin, "Managed in")
' Rel(accountability, admin, "Managed in")
' Rel(budgets, admin, "Managed in")
- ' Rel(sortitions, admin, "Managed in")
' Rel(meetings, admin, "Managed in")
' Rel(debates, admin, "Managed in")
' Rel(proposals, admin, "Managed in")
diff --git a/docs/modules/develop/pages/guid_data_migrations.adoc b/docs/modules/develop/pages/guide_data_migrations.adoc
similarity index 98%
rename from docs/modules/develop/pages/guid_data_migrations.adoc
rename to docs/modules/develop/pages/guide_data_migrations.adoc
index c53b37b19f274..1e26e89090cc4 100644
--- a/docs/modules/develop/pages/guid_data_migrations.adoc
+++ b/docs/modules/develop/pages/guide_data_migrations.adoc
@@ -7,7 +7,7 @@ As the need to migrate data increased, we need a more reliable way to migrate da
To run the data migrations, run the following command:
```console
-bin/rails data:migrate:up
+bin/rails data:migrate
```
To see the status of available data migrations, run the following command:
diff --git a/docs/modules/develop/pages/machine_translations.adoc b/docs/modules/develop/pages/machine_translations.adoc
index 95df884dde077..197ff663a795d 100644
--- a/docs/modules/develop/pages/machine_translations.adoc
+++ b/docs/modules/develop/pages/machine_translations.adoc
@@ -42,7 +42,7 @@ config.machine_translation_service = "MyApp::MyOwnTranslationService"
config.machine_translation_delay = 0.seconds
----
-The class will need to be implemented, or reuse one from the community. Check the docs on how to implement a machine translation service.
+The class will need to be implemented, or reuse one from the community. Check the docs on xref:services:machine_translations.adoc[how to implement a machine translation service].
== Enabling the integration, organization-wise
diff --git a/docs/modules/develop/pages/maintainers/releases.adoc b/docs/modules/develop/pages/maintainers/releases.adoc
index 778c4c1f60d60..91d343ad28179 100644
--- a/docs/modules/develop/pages/maintainers/releases.adoc
+++ b/docs/modules/develop/pages/maintainers/releases.adoc
@@ -2,6 +2,14 @@
In order to release new version you need to be owner of all the gems at RubyGems, ask one of the owners to add you before releasing. Try `gem owner decidim` to find out the owners of the gem. It is worth making sure you are owner of all gems.
+In order to release any other version of Decidim, is mandatory to have the `decidim-maintainers_toolbox` installed, and to have it on the latest version. What we can, we aim to automate.
+[source,bash]
+----
+gem install decidim-maintainers_toolbox
+----
+
+Before you begin the release process, make sure you check if there are any open or pending backports. Currently, is not mandatory to open or merge all the backports, but is something that we usually aim for. Refer to the xref:develop:backports.adoc[backports] page for more information.
+
== Release Candidates
Release Candidates are the same as beta versions.
@@ -9,7 +17,7 @@ They should be ready to go to production, but publicly released just before in o
If this is a *Release Candidate version* release, the steps to follow are:
-. Merge all the https://github.com/decidim/decidim/pulls?q=is%3Apr+is%3Aopen+author%3Adecidim-bot+sort%3Aupdated-desc[Crowdin pull requests created by the user `decidim-bot`], specially the one that is going to be marged against the release branch `release/x.y-stable` that should be returned by the provided example search (pick the correct pull request for the release from the results).
+. Merge all the https://github.com/decidim/decidim/pulls?q=is%3Apr+is%3Aopen+author%3Adecidim-bot+sort%3Aupdated-desc[Crowdin pull requests created by the user `decidim-bot`], specially the one that is going to be merged against the release branch `release/x.y-stable` that should be returned by the provided example search (pick the correct pull request for the release from the results).
. Go to develop with `git checkout develop`
. Install the last version of the `decidim-maintainers_toolbox` gem, and run the releaser command. Mind that for this to work you need locally the gh CLI from GitHub.
[source,bash]
@@ -19,16 +27,24 @@ decidim-releaser --github-token=(gh auth token) --version-type=rc
----
. This will create the stable branch and also create two Pull Requests:
.. One for changing the development version on the `develop` branch (with title "Bump develop to next release version (x.y.z)")
-.. Another for creating the the new release in the stable branch with title `Bump to vx.y.z version`. Wait for the tests to finish and check that everything is passing before releasing the version.
+.. Another for creating the new release in the stable branch with title `Bump to vx.y.z version`. Wait for the tests to finish and check that everything is passing before releasing the version.
During this process you will have the instructions on how to follow with the process in the command line. One of the tasks is updating Crowdin, you can read more about this in the "Create the stable branch in Crowdin" section of this page.
. Review, accept and merge the Pull Request.
. Run `git pull && bin/rake release_all`, this will create all the tags, push the commits and tags and release the gems to RubyGems. Be ready for the One Time Password fill for each of the gems.
+. Once all the gems are published:
+.. Re-run the failed generators tests at the release branch.
+.. Always check if there are any pending security CVE's that needs to be published. If there are, add a section header called "Security fixes", and add the relevant information there, like we have done in https://github.com/decidim/decidim/releases/tag/v0.31.0[v0.31.0 release notes]
+.... Add the advisory id
+.... Make sure you change the date, to be 2 months away from release date
+.... Add the date to your calendar to actually publish the CVE's and link them to the Release Notes when that is the case. You can see how the final result looks like at https://github.com/decidim/decidim/releases/tag/v0.29.0[v0.29.0 release notes]
+.. Create a new release at this repository, just go to the https://github.com/decidim/decidim/releases[releases page] and create a new one.
Usually, at this point, the release branch is deployed to Metadecidim during, at least, one week to validate the stability of the version.
=== During the validation period
-. During the validation period, bugfixes must be implemented directly to the current `release/x.y.z-stable` branch and ported to `develop`.
+. During the validation period, bugfixes must be implemented directly to the current `develop` branch, and if you need to backport, just add the labels `type: fix` and also the `release: v0.xx` to allow automated backports.
+ ... In special cases only (when the feature aimed to be fixed does not exist anymore in `develop`), you can open the Pull Request directly against the release branch. This is something that we usually defer to doing, as it could bring inconsistencies between the versions, making the maintenance harder.
. During the validation period, translations to the officially supported languages must be added to Crowdin and, when completed, merged into `release/x.y.z-stable`.
== Major/Minor versions
@@ -37,20 +53,22 @@ Release Candidates will be tested in a production server (usually Metadecidim) d
. Merge all the https://github.com/decidim/decidim/pulls?q=is%3Apr+is%3Aopen+author%3Adecidim-bot+sort%3Aupdated-desc[Crowdin pull requests created by the user `decidim-bot`], specially the one that is going to be marged against the release branch `release/x.y-stable` that should be returned by the provided example search (pick the correct pull request for the release from the results).
. Checkout the release stable branch `git checkout release/x.y-stable`.
-. Update `.decidim-version` by removing the `.rcN` suffix, leaving a clean version number like `x.y.z`
-. Run `bin/rake update_versions`, this will update all references to the new version.
-. Run `bin/rake patch_generators`, this will update the Gemfile for the generators to the new version.
-. Run `bin/rake bundle`, this will update all the `Gemfile.lock` files
-. Run `bin/rake webpack`, this will update the JavaScript bundle.
-. Update the `CHANGELOG.md`.
-Add the header with the current version and link like `+## [0.20.0](https://github.com/decidim/decidim/tree/v0.20.0)+` and the headers generated by the changelog generator.
-. Commit all the changes: `git add . && git commit -m "Bump to v0.XX.0 final version" && git push origin release/x.y-stable`.
+. Install the last version of the `decidim-maintainers_toolbox` gem, and run the releaser command. Mind that for this to work you need locally the gh CLI from GitHub.
+[source,bash]
+----
+gem install decidim-maintainers_toolbox
+decidim-releaser --github-token=(gh auth token) --version-type=minor
+----
. Wait for the tests to finish and check that everything is passing before releasing the version.
NOTE: When you bump the version, the generator tests will fail because the gems and NPM packages have not been actually published yet (as in sent to rubygems/npm). You may see errors such as `No matching version found for @decidim/browserslist-config@~0.xx.y` in the CI logs. This should be fine as long as you have ensured that the generators tests passed in the previous commit.
-. Run `git pull && bin/rake release_all`, this will create all the tags, push the commits and tags and release the gems to RubyGems.
+. Run `git pull && bin/rake release_all`, this will create all the tags, push the commits and tags and release the gems to RubyGems. Be ready for the One Time Password fill for each of the gems.
. Once all the gems are published:
- .. Re-run the failed generators tests at the release branch.
- .. Create a new release at this repository, just go to the https://github.com/decidim/decidim/releases[releases page] and create a new one.
+.. Re-run the failed generators tests at the release branch.
+.. Always check if there are any pending security CVE's that needs to be published. If there are, add a section header called "Security fixes", and add the relevant information there, like we have done in https://github.com/decidim/decidim/releases/tag/v0.31.0[v0.31.0 release notes]
+.... Add the advisory id
+.... Make sure you change the date, to be 2 months away from release date
+.... Add the date to your calendar to actually publish the CVE's and link them to the Release Notes when that is the case. You can see how the final result looks like at https://github.com/decidim/decidim/releases/tag/v0.29.0[v0.29.0 release notes]
+.. Create a new release at this repository, just go to the https://github.com/decidim/decidim/releases[releases page] and create a new one.
. Update Decidim's Docker repository as explained in the Docker images section below.
. Update Crowdin synchronization configuration with GitHub:
.. Add the new `release/x.y-stable` branch.
@@ -111,7 +129,11 @@ NOTE: When you bump the version, the generator tests will fail because the gems
. Run `git pull && bin/rake release_all`, this will create all the tags, push the commits and tags and release the gems to RubyGems. Be ready for the One Time Password fill for each of the gems.
. Once all the gems are published:
.. Re-run the failed generators tests at the release branch.
- .. Create a new release at this repository, just go to the https://github.com/decidim/decidim/releases[releases page] and create a new one.
+ .. Always check if there are any pending security CVE's that needs to be published. If there are, add a section header called "Security fixes", and add the relevant information there, like we have done in https://github.com/decidim/decidim/releases/tag/v0.31.0[v0.31.0 release notes]
+ .... Add the advisory id
+.... Make sure you change the date, to be 2 months away from release date
+.... Add the date to your calendar to actually publish the CVE's and link them to the Release Notes when that is the case. You can see how the final result looks like at https://github.com/decidim/decidim/releases/tag/v0.29.0[v0.29.0 release notes]
+.. Create a new release at this repository, just go to the https://github.com/decidim/decidim/releases[releases page] and create a new one.
. Update Decidim's Docker repository as explained in the Docker images section.
== Docker images for each release
diff --git a/docs/modules/install/pages/manual.adoc b/docs/modules/install/pages/manual.adoc
index 321b22b30b393..a8cdc06e545e6 100644
--- a/docs/modules/install/pages/manual.adoc
+++ b/docs/modules/install/pages/manual.adoc
@@ -57,7 +57,7 @@ An important component for Decidim is Node.js and Yarn. With this commands you w
----
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash
source "$HOME/.nvm/nvm.sh"
-nvm install 24
+nvm install 22
npm install -g yarn
----
@@ -158,5 +158,5 @@ The seed data will not be created in production environments, if you still want
[source,bash]
----
-SEED=true rails assets:precompile db:seed
+SEED=true bin/rails assets:precompile db:seed
----
diff --git a/docs/modules/install/pages/update.adoc b/docs/modules/install/pages/update.adoc
index 3e7cd6511049c..ad9d1b0106a2f 100644
--- a/docs/modules/install/pages/update.adoc
+++ b/docs/modules/install/pages/update.adoc
@@ -6,34 +6,16 @@ To keep our system up to date, we can visit the page https://github.com/decidim/
[source,ruby]
----
-gem "decidim", "0.20.1"
-gem "decidim-conferences", "0.20.1"
-gem "decidim-initiatives", "0.20.1"
+gem "decidim", "0.29.0"
+gem "decidim-conferences", "0.29.0"
+gem "decidim-initiatives", "0.29.0"
-gem "decidim-dev", "0.20.1"
+gem "decidim-dev", "0.29.0"
----
-For example, if the latest release is 0.16 we could decide to update.
+To update, we recommend using small increments. From time to time we change the Ruby version or update dependencies, and skipping multiple versions at once can introduce breaking changes. Therefore, if you need to upgrade from v0.29.0 to v0.31.0, we recommend to first upgrade to v0.30.0, follow the release notes, and then, from v0.30.0 to upgrade to v0.31.0.
-To update, usually requires only to change the old version number on these gems to the new one. For instance, previous example should be:
-
-[source,ruby]
-----
-gem "decidim", "0.21"
-gem "decidim-conferences", "0.21"
-gem "decidim-initiatives", "0.21"
-
-gem "decidim-dev", "0.21"
-----
-
-After doing that, you need to execute these commands:
-
-[source,console]
-----
-bundle update decidim
-bin/rails decidim:upgrade
-bin/rails db:migrate
-----
+So, to perform the upgrade, we first follow the https://github.com/decidim/decidim/releases/tag/v0.30.0[release notes for v0.30.0], then, after we confirmed everything went OK, we should follow the https://github.com/decidim/decidim/releases/tag/v0.31.0[release notes for v0.31.0].
In theory, that would be all. However, you need to be careful in certain situations, specially if your copy of Decidim has many code modifications. We'd recommend to always test the upgrade following Ruby on Rails best practices: working with development mode in localhost, deploying to a staging/preproduction server to test it manually (specially your modifications) and finally deploying to production. As an alternative you can test the upgrade in a separate machine with the same configuration (If using DigitalOcean you can create an snapshot of the server, tested the update, and then remove it, similar process on other providers).
@@ -88,6 +70,7 @@ include::install:partial$version_matrix.adoc[]
== Recommendations
. Make a full backup of the database before updating, just in case something unexpected happens.
+. Never add 2 or more versions of Decidim to the same deployment to production, as the database structure could change, deprecated functions could be removed, causing issues that may prevent you to successfully run post release commands.
. If you are more than update away. Always update from one version to the immediately next one and then repeat the process until you are up to date.
. Always check the instructions for a certain version upgrade in https://github.com/decidim/decidim/releases[Releases]. Some releases require to perform certain actions as they may change some database structures. Follow that instructions if you are affected.
. Check also the file https://github.com/decidim/decidim/blob/develop/CHANGELOG.md[CHANGELOG] It may have relevant information for updates between versions.
diff --git a/docs/modules/install/partials/version_matrix.adoc b/docs/modules/install/partials/version_matrix.adoc
index 3d039a627a8c1..1a61c951b49e7 100644
--- a/docs/modules/install/partials/version_matrix.adoc
+++ b/docs/modules/install/partials/version_matrix.adoc
@@ -2,16 +2,12 @@
|===
|Decidim version |Ruby version |Node version | Status
-|develop | 3.3.4 | 22.14.x | Unreleased
+|develop | 3.4.7 | 22.14.x | Unreleased
-|v0.30 | 3.3.4 | 18.17.x | Bug fixes and security updates
-
-|v0.29 | 3.2.2 | 18.17.x | Bug fixes and security updates
+|v0.31 | 3.3.4 | 22.14.x | Bug fixes and security updates
-|v0.28 | 3.1.1 | 18.17.x | Not maintained
-
-|v0.27 | 3.0.2 | 16.18.x | Security updates
+|v0.30 | 3.3.4 | 18.17.x | Bug fixes and security updates
-|v0.26 | 2.7.5+ | 16.9.x | Not maintained
+|v0.29 | 3.2.2 | 18.17.x | Not maintained
|===
diff --git a/docs/modules/services/pages/index.adoc b/docs/modules/services/pages/index.adoc
index f52dc2264ac35..4994476f87e5c 100644
--- a/docs/modules/services/pages/index.adoc
+++ b/docs/modules/services/pages/index.adoc
@@ -6,6 +6,7 @@ There are multiple services that can be enabled in a Decidim installation. It is
* xref:services:activestorage.adoc[Active Storage]
* xref:services:aitools.adoc[AI tools]
* xref:services:etherpad.adoc[Etherpad]
+* xref:services:machine_translation.adoc[Machine Translation]
* xref:services:maps.adoc[Maps]
* xref:services:sms.adoc[SMS]
* xref:services:smtp.adoc[SMTP]
diff --git a/docs/modules/services/pages/machine_translation.adoc b/docs/modules/services/pages/machine_translation.adoc
index af66f5971775d..bfc179d087bdb 100644
--- a/docs/modules/services/pages/machine_translation.adoc
+++ b/docs/modules/services/pages/machine_translation.adoc
@@ -16,7 +16,15 @@ class MyTranslationService
end
def translate
- # Actual code to translate the text
+ # Actual code for translating the text
+ translated_text = "#{target_locale} - #{text}"
+
+ Decidim::MachineTranslationSaveJob.perform_later(
+ resource,
+ field_name,
+ target_locale,
+ translated_text
+ )
end
end
....
@@ -34,5 +42,134 @@ Then you will need to configure it with the help of Environment Variables:
[source,bash]
....
export DECIDIM_ENABLE_MACHINE_TRANSLATION="true"
-export DECIDIM_MACHINE_TRANSLATION_SERVICE="MyTranslator"
+export DECIDIM_MACHINE_TRANSLATION_SERVICE="MyTranslationService"
+....
+
+You also need to enable the setting "Enable machine translations" in `Settings` -> `Configuration`.
+
+You can read more about the details of how this service work at `xref:develop:machine_translations.adoc[Using machine translations].
+
+== Examples
+
+=== LibreTranslate
+
+https://github.com/LibreTranslate/LibreTranslate[LibreTranslate] is a Free and Open Source Machine Translation API. Self-hosted, offline capable and easy to setup. If you do not want to self-host it, they also offer a paid service at https://libretranslate.com/[libretranslate.com].
+
+For using it, follow these steps:
+
+. https://docs.libretranslate.com/guides/installation/[Install LibreTranslate] with any of the methods proposed on their documentation. For demonstration purposes, it will be installed at `http://localhost:5000`. You have a Docker Compose configuration based on the LibreTranslate documentation.
+. Add the file `app/services/libre_translate_service.rb` to your application
+. Add these Environment Variables:
+[source,bash]
+....
+export DECIDIM_ENABLE_MACHINE_TRANSLATION="true"
+export DECIDIM_MACHINE_TRANSLATION_SERVICE="LibreTranslateService"
+export DECIDIM_LIBRE_TRANSLATE_SERVICE_URL="http://localhost:5000"
+....
+[start=4]
+. Restart the web application and queue servers
+. Sign in as administrator
+. Go to the admin panel and go into in `Settings` -> `Configuration`
+. Enable the settings "Enable machine translations" and "Translated text first"
+. Create a new Process or Edit an existing one
+. Go to the frontend and change the language
+
+==== Docker compose
+
+[source,yaml]
+....
+services:
+ libretranslate:
+ image: libretranslate/libretranslate
+ container_name: libretranslate
+ ports:
+ - "${LT_PORT:-5000}:5000"
+ volumes:
+ - lt-local:/home/libretranslate/.local
+ # Uncomment the line below if using --api-keys
+ # - lt-db:/app/db
+ stdin_open: true
+ tty: true
+ restart: unless-stopped
+ # Add any additional command arguments here
+ # command: ["--api-keys"]
+
+volumes:
+ lt-local:
+ name: lt-local
+....
+
+==== `app/services/libre_translate_service.rb`
+
+[source,ruby]
+....
+# frozen_string_literal: true
+
+require "faraday"
+require "json"
+
+# This translator uses LibreTranslate API to translate text
+# from one locale to another.
+class LibreTranslateService
+ attr_reader :text, :source_locale, :target_locale, :resource, :field_name
+
+ def initialize(resource, field_name, text, target_locale, source_locale)
+ @resource = resource
+ @field_name = field_name
+ @text = text
+ @target_locale = target_locale
+ @source_locale = source_locale
+ end
+
+ def translate
+ translated_text = fetch_translation || text
+
+ Decidim::MachineTranslationSaveJob.perform_later(
+ resource,
+ field_name,
+ target_locale,
+ translated_text
+ )
+ end
+
+ private
+
+ def fetch_translation
+ response = Faraday.post("#{host}/translate") do |req|
+ req.headers["Content-Type"] = "application/json"
+ req.body = translation_payload.to_json
+ end
+
+ parse_response(response)
+ rescue => e
+ log_error(e)
+ nil
+ end
+
+ def translation_payload
+ {
+ q: text,
+ source: source_locale,
+ target: target_locale,
+ api_key: api_key
+ }.compact
+ end
+
+ def parse_response(response)
+ result = JSON.parse(response.body)
+ result["translatedText"]
+ end
+
+ def host
+ Decidim::Env.new("DECIDIM_LIBRE_TRANSLATE_SERVICE_URL", "https://libretranslate.com").value
+ end
+
+ def api_key
+ Decidim::Env.new("DECIDIM_LIBRE_TRANSLATE_API_KEY").value
+ end
+
+ def log_error(error)
+ Rails.logger.error("LibreTranslate translation error: #{error.message}")
+ end
+end
....
diff --git a/lib/decidim.rb b/lib/decidim.rb
index 11eb5b2c96c0e..800e8a15135dd 100644
--- a/lib/decidim.rb
+++ b/lib/decidim.rb
@@ -21,5 +21,4 @@
require "decidim/surveys"
require "decidim/accountability"
require "decidim/debates"
-require "decidim/sortitions"
require "decidim/blogs"
diff --git a/lib/decidim/gem_manager.rb b/lib/decidim/gem_manager.rb
index 4283d28b1d076..eb1dec5440c85 100644
--- a/lib/decidim/gem_manager.rb
+++ b/lib/decidim/gem_manager.rb
@@ -33,7 +33,6 @@ class GemManager
pages
proposals
surveys
- sortitions
blogs
).freeze
diff --git a/package-lock.json b/package-lock.json
index c14c7c5a58756..93e72cf793898 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -5198,7 +5198,7 @@
"version": "2.1.13",
"license": "MIT",
"dependencies": {
- "linkifyjs": "^4.1.0"
+ "linkifyjs": "^4.3.2"
},
"funding": {
"type": "github",