From a145473452f91bf84902c6c9c45d5a0311fb4f2a Mon Sep 17 00:00:00 2001 From: Mir Bhatia Date: Thu, 21 May 2026 15:50:49 +0200 Subject: [PATCH 001/107] Fix handling of WP agenda items referencing deleted WPs --- .../app/services/meetings/copy_service.rb | 9 ++++-- .../reset_to_template_service.rb | 11 ++++--- .../meetings/copy_service_integration_spec.rb | 16 ++++++++++ .../reset_to_template_service_spec.rb | 29 +++++++++++++++++++ 4 files changed, 59 insertions(+), 6 deletions(-) diff --git a/modules/meeting/app/services/meetings/copy_service.rb b/modules/meeting/app/services/meetings/copy_service.rb index eaa751e1e10..a0c3f6cf4fb 100644 --- a/modules/meeting/app/services/meetings/copy_service.rb +++ b/modules/meeting/app/services/meetings/copy_service.rb @@ -113,14 +113,19 @@ module Meetings attachment_target]) end - def copy_meeting_agenda(copy) + def copy_meeting_agenda(copy) # rubocop:disable Metrics/AbcSize meeting.sections.each do |section| copy.sections << section.dup copied_section = copy.reload.sections.last section.agenda_items.each do |agenda_item| copied_agenda_item = agenda_item.dup copied_agenda_item.meeting_id = copy.id - copied_section.agenda_items << copied_agenda_item + copied_agenda_item.meeting_section = copied_section + + # A work_package agenda item whose WP was deleted has work_package_id nullified but + # item_type still set. Skip validations for this state + skip_validation = copied_agenda_item.work_package? && copied_agenda_item.work_package_id.nil? + copied_agenda_item.save!(validate: !skip_validation) end end end diff --git a/modules/meeting/app/services/recurring_meetings/reset_to_template_service.rb b/modules/meeting/app/services/recurring_meetings/reset_to_template_service.rb index b399aa6a59e..005125417d2 100644 --- a/modules/meeting/app/services/recurring_meetings/reset_to_template_service.rb +++ b/modules/meeting/app/services/recurring_meetings/reset_to_template_service.rb @@ -90,10 +90,13 @@ module RecurringMeetings section.attributes.except("id", "meeting_id", "created_at", "updated_at") ) section.agenda_items.each do |item| - # copy_attributes excludes :id and :meeting_id; we supply both FKs explicitly - new_section.agenda_items.create!( - item.copy_attributes.except("meeting_section_id").merge("meeting_id" => meeting.id) - ) + new_item = item.dup + new_item.meeting_section = new_section + + # A work_package agenda item whose WP was deleted has work_package_id nullified but + # item_type still set. Skip validations for this state + skip_validation = new_item.work_package? && new_item.work_package_id.nil? + new_item.save!(validate: !skip_validation) end end end diff --git a/modules/meeting/spec/services/meetings/copy_service_integration_spec.rb b/modules/meeting/spec/services/meetings/copy_service_integration_spec.rb index b3f36d94d40..46db2238711 100644 --- a/modules/meeting/spec/services/meetings/copy_service_integration_spec.rb +++ b/modules/meeting/spec/services/meetings/copy_service_integration_spec.rb @@ -196,4 +196,20 @@ RSpec.describe Meetings::CopyService, "integration", type: :model do end end end + + context "with a work_package agenda item whose work package was deleted" do + before do + item = create(:wp_meeting_agenda_item, meeting:) + # Simulate the work package being destroyed (dependent: :nullify) + item.update_columns(work_package_id: nil) + end + + it "copies the deleted-WP agenda item preserving its type and nil work_package_id" do + expect(service_result).to be_success + deleted_item = copy.reload.agenda_items.last + expect(deleted_item).to be_present + expect(deleted_item).to be_work_package + expect(deleted_item.work_package_id).to be_nil + end + end end diff --git a/modules/meeting/spec/services/recurring_meetings/reset_to_template_service_spec.rb b/modules/meeting/spec/services/recurring_meetings/reset_to_template_service_spec.rb index 384c3515320..777ea21ce2b 100644 --- a/modules/meeting/spec/services/recurring_meetings/reset_to_template_service_spec.rb +++ b/modules/meeting/spec/services/recurring_meetings/reset_to_template_service_spec.rb @@ -135,4 +135,33 @@ RSpec.describe RecurringMeetings::ResetToTemplateService, type: :model do expect(cancelled_occurrence.reload.participants.count).to eq(template_participant_count) end end + + context "when the template has a work package agenda item whose work package was deleted" do + before do + template_section = series.template.sections.first + wp_item = MeetingAgendaItem.create!( + meeting: series.template, + meeting_section: template_section, + item_type: :work_package, + work_package: create(:work_package, project:), + author: user, + position: 2 + ) + + # Simulate the work package being destroyed (dependent: :nullify) + wp_item.update_columns(work_package_id: nil) + end + + it "returns a successful service result" do + expect(service_result).to be_success + end + + it "copies the deleted WP agenda item preserving its type and nil work_package_id" do + service_result + deleted_item = cancelled_occurrence.reload.agenda_items.last + expect(deleted_item).to be_present + expect(deleted_item).to be_work_package + expect(deleted_item.work_package_id).to be_nil + end + end end From a7c324f9e75b415d193248906a32bd254aab461a Mon Sep 17 00:00:00 2001 From: Judith Roth Date: Tue, 26 May 2026 18:21:41 +0200 Subject: [PATCH 002/107] Set host setting for docker tls setup to avoid broken links with port --- docker/dev/tls/docker-compose.core-override.example.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/docker/dev/tls/docker-compose.core-override.example.yml b/docker/dev/tls/docker-compose.core-override.example.yml index 70c0d67a745..543a3e980e7 100644 --- a/docker/dev/tls/docker-compose.core-override.example.yml +++ b/docker/dev/tls/docker-compose.core-override.example.yml @@ -2,6 +2,7 @@ x-op-env-override: &environment OPENPROJECT_CLI_PROXY: "${OPENPROJECT_DEV_URL}" OPENPROJECT_DEV_EXTRA_HOSTS: "${OPENPROJECT_DEV_HOST}" + OPENPROJECT_HOST__NAME: "${OPENPROJECT_DEV_HOST}" OPENPROJECT_HTTPS: true SSL_CERT_FILE: /etc/ssl/certs/ca-certificates.crt # uncomment and set all the envs below to integrate keycloak with OpenProject From 0acb1d782a1863418352427f558442a6c93e4956 Mon Sep 17 00:00:00 2001 From: ulferts Date: Fri, 22 May 2026 10:23:26 +0200 Subject: [PATCH 003/107] use quicker NOT EXISTS for excluded types and statuses --- .../work_packages/scopes/without_excluded_type.rb | 6 +++--- .../scopes/without_status_considered_closed.rb | 14 +++++++------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/modules/backlogs/app/models/work_packages/scopes/without_excluded_type.rb b/modules/backlogs/app/models/work_packages/scopes/without_excluded_type.rb index 074b2cbb72e..65648bce4e6 100644 --- a/modules/backlogs/app/models/work_packages/scopes/without_excluded_type.rb +++ b/modules/backlogs/app/models/work_packages/scopes/without_excluded_type.rb @@ -34,15 +34,15 @@ module WorkPackages::Scopes::WithoutExcludedType class_methods do def without_excluded_type type_subquery = <<~SQL.squish - work_packages.type_id NOT IN ( - SELECT type_id + NOT EXISTS ( + SELECT 1 FROM backlog_excluded_types WHERE project_id = work_packages.project_id + AND type_id = work_packages.type_id ) SQL where(type_subquery) - .includes(:type) end end end diff --git a/modules/backlogs/app/models/work_packages/scopes/without_status_considered_closed.rb b/modules/backlogs/app/models/work_packages/scopes/without_status_considered_closed.rb index 03f77532fb2..00a19678b44 100644 --- a/modules/backlogs/app/models/work_packages/scopes/without_status_considered_closed.rb +++ b/modules/backlogs/app/models/work_packages/scopes/without_status_considered_closed.rb @@ -39,21 +39,21 @@ module WorkPackages::Scopes::WithoutStatusConsideredClosed # Additionally, all globally closed statuses are always treated as done, # safeguarding against empty/corrupt project configuration (per AC). status_subquery = <<~SQL.squish - work_packages.status_id NOT IN ( - SELECT status_id + NOT EXISTS ( + SELECT 1 FROM done_statuses_for_project WHERE project_id = work_packages.project_id - AND status_id IS NOT NULL + AND status_id = work_packages.status_id ) - AND work_packages.status_id NOT IN ( - SELECT id + AND NOT EXISTS ( + SELECT 1 FROM statuses - WHERE is_closed = TRUE + WHERE id = work_packages.status_id + AND is_closed = TRUE ) SQL where(status_subquery) - .includes(:status) end end end From e9f7c7dd7cd4c99331fdfb164ad885d0d95faf8d Mon Sep 17 00:00:00 2001 From: ulferts Date: Fri, 22 May 2026 18:06:02 +0200 Subject: [PATCH 004/107] centralize loading of backlog same as sprints --- .../backlogs/backlog_component.html.erb | 13 +- .../components/backlogs/backlog_component.rb | 10 +- .../components/backlogs/bucket_component.rb | 4 +- .../backlogs/sprints_component.html.erb | 2 +- .../backlogs/backlog_controller.rb | 12 +- .../backlogs/work_packages_controller.rb | 10 +- ...acklogs_inbox_for.rb => in_backlog_for.rb} | 7 +- .../backlogs/backlog/_backlog_list.html.erb | 2 +- .../backlogs/patches/work_package_patch.rb | 2 +- .../backlogs/backlog_controller_spec.rb | 12 +- .../scopes/backlogs_inbox_for_spec.rb | 100 ----------- .../scopes/in_backlog_for_spec.rb | 156 ++++++++++++++++++ 12 files changed, 204 insertions(+), 126 deletions(-) rename modules/backlogs/app/models/work_packages/scopes/{backlogs_inbox_for.rb => in_backlog_for.rb} (88%) delete mode 100644 modules/backlogs/spec/models/work_packages/scopes/backlogs_inbox_for_spec.rb create mode 100644 modules/backlogs/spec/models/work_packages/scopes/in_backlog_for_spec.rb diff --git a/modules/backlogs/app/components/backlogs/backlog_component.html.erb b/modules/backlogs/app/components/backlogs/backlog_component.html.erb index 86246593ea4..3e7cff65308 100644 --- a/modules/backlogs/app/components/backlogs/backlog_component.html.erb +++ b/modules/backlogs/app/components/backlogs/backlog_component.html.erb @@ -75,11 +75,18 @@ See COPYRIGHT and LICENSE files for more details. end %> - <%= render Backlogs::BucketComponent.with_collection(buckets, project:) %> - + <% buckets.each do |bucket| %> + <%= + render Backlogs::BucketComponent.new( + project:, + backlog_bucket: bucket, + work_packages: work_packages_by_backlog_id[bucket.id] || [] + ) + %> + <% end %> <%= render Backlogs::InboxComponent.new( - work_packages: inbox_work_packages, + work_packages: work_packages_by_backlog_id[nil] || [], project: project ) %> diff --git a/modules/backlogs/app/components/backlogs/backlog_component.rb b/modules/backlogs/app/components/backlogs/backlog_component.rb index 4cd0a1f0ef2..29c525da82e 100644 --- a/modules/backlogs/app/components/backlogs/backlog_component.rb +++ b/modules/backlogs/app/components/backlogs/backlog_component.rb @@ -34,15 +34,15 @@ module Backlogs include OpTurbo::Streamable include CommonHelper - attr_reader :inbox_work_packages, :buckets, :project, :current_user + attr_reader :work_packages_by_backlog_id, :buckets, :project, :current_user - def initialize(inbox_work_packages:, - buckets:, + def initialize(buckets:, + work_packages_by_backlog_id:, project:, current_user: User.current) super() - @inbox_work_packages = inbox_work_packages + @work_packages_by_backlog_id = work_packages_by_backlog_id @buckets = buckets @project = project @current_user = current_user @@ -55,7 +55,7 @@ module Backlogs private def total - @total ||= inbox_work_packages.count + (buckets&.sum { it.work_packages.size } || 0) + @total ||= work_packages_by_backlog_id.values.sum(&:count) end end end diff --git a/modules/backlogs/app/components/backlogs/bucket_component.rb b/modules/backlogs/app/components/backlogs/bucket_component.rb index 0db65776db9..3e416d63cf0 100644 --- a/modules/backlogs/app/components/backlogs/bucket_component.rb +++ b/modules/backlogs/app/components/backlogs/bucket_component.rb @@ -38,13 +38,13 @@ module Backlogs attr_reader :backlog_bucket, :work_packages, :project, :current_user - def initialize(backlog_bucket:, project:, current_user: User.current) + def initialize(backlog_bucket:, project:, work_packages: nil, current_user: User.current) super() @backlog_bucket = backlog_bucket @project = project @current_user = current_user - @work_packages = backlog_bucket.displayed_work_packages + @work_packages = work_packages || backlog_bucket.displayed_work_packages end def wrapper_uniq_by diff --git a/modules/backlogs/app/components/backlogs/sprints_component.html.erb b/modules/backlogs/app/components/backlogs/sprints_component.html.erb index af512ae98f4..56f3f4d2cca 100644 --- a/modules/backlogs/app/components/backlogs/sprints_component.html.erb +++ b/modules/backlogs/app/components/backlogs/sprints_component.html.erb @@ -63,7 +63,7 @@ See COPYRIGHT and LICENSE files for more details. <%= render Backlogs::SprintComponent.new( sprint:, project:, - work_packages: work_packages_by_sprint_id[sprint.id], + work_packages: work_packages_by_sprint_id[sprint.id] || [], active_sprint_ids: active_sprint_ids ) %> <% end %> diff --git a/modules/backlogs/app/controllers/backlogs/backlog_controller.rb b/modules/backlogs/app/controllers/backlogs/backlog_controller.rb index e7505175613..70bac33d5d4 100644 --- a/modules/backlogs/app/controllers/backlogs/backlog_controller.rb +++ b/modules/backlogs/app/controllers/backlogs/backlog_controller.rb @@ -70,14 +70,22 @@ module Backlogs .not_completed .order_by_date .includes(:project, :task_boards) + @active_sprint_ids = @sprints.select(&:active?).map(&:id) @work_packages_by_sprint_id = WorkPackage .where(sprint: @sprints, project: @project) .includes(:type, :status, :assigned_to, :priority, :parent) .order_by_position .group_by(&:sprint_id) - @active_sprint_ids = @sprints.select(&:active?).map(&:id) - @inbox_work_packages = WorkPackage.backlogs_inbox_for(project: @project) + + # Includes the work packages of both the buckets and the inbox. + # This has the drawback of loading more work packages than are displayed in the inbox as pagination + # will only show the top 50 and lowest 10 work packages. + # But doing only a single query to the database has its benefits, and currently this seems quicker. + @work_packages_by_backlog_id = WorkPackage + .in_backlog_for(project: @project) + .includes(:type, :status, :assigned_to, :priority, :parent) + .group_by(&:backlog_bucket_id) end end end diff --git a/modules/backlogs/app/controllers/backlogs/work_packages_controller.rb b/modules/backlogs/app/controllers/backlogs/work_packages_controller.rb index e8bfdc6c632..6fd55cdcb3a 100644 --- a/modules/backlogs/app/controllers/backlogs/work_packages_controller.rb +++ b/modules/backlogs/app/controllers/backlogs/work_packages_controller.rb @@ -104,10 +104,14 @@ module Backlogs end def backlog_component - inbox_work_packages = WorkPackage.backlogs_inbox_for(project: @project) buckets = BacklogBucket.for_project(@project) - Backlogs::BacklogComponent.new(inbox_work_packages:, buckets:, project: @project) + work_packages_by_backlog_id = WorkPackage + .in_backlog_for(project: @project) + .includes(:type, :status, :assigned_to, :priority, :parent) + .group_by(&:backlog_bucket_id) + + Backlogs::BacklogComponent.new(buckets:, work_packages_by_backlog_id:, project: @project) end def load_work_package @@ -125,7 +129,7 @@ module Backlogs elsif @work_package.backlog_bucket_id? @work_packages.merge(@work_package.backlog_bucket.displayed_work_packages) else - @work_packages.merge(WorkPackage.backlogs_inbox_for(project: @project)) + @work_packages.merge(WorkPackage.in_backlog_for(project: @project).where(backlog_bucket_id: nil)) end end end diff --git a/modules/backlogs/app/models/work_packages/scopes/backlogs_inbox_for.rb b/modules/backlogs/app/models/work_packages/scopes/in_backlog_for.rb similarity index 88% rename from modules/backlogs/app/models/work_packages/scopes/backlogs_inbox_for.rb rename to modules/backlogs/app/models/work_packages/scopes/in_backlog_for.rb index e1d0d077207..8ad59994f08 100644 --- a/modules/backlogs/app/models/work_packages/scopes/backlogs_inbox_for.rb +++ b/modules/backlogs/app/models/work_packages/scopes/in_backlog_for.rb @@ -28,17 +28,16 @@ # See COPYRIGHT and LICENSE files for more details. # ++ -module WorkPackages::Scopes::BacklogsInboxFor +module WorkPackages::Scopes::InBacklogFor extend ActiveSupport::Concern class_methods do - def backlogs_inbox_for(project:) + def in_backlog_for(project:) WorkPackage .visible - .where(project:, sprint_id: nil, backlog_bucket_id: nil) + .where(project:, sprint_id: nil) .without_excluded_type .without_status_considered_closed - .includes(:assigned_to, :priority, :parent) .order_by_position .order(WorkPackage.arel_table[:id].asc) end diff --git a/modules/backlogs/app/views/backlogs/backlog/_backlog_list.html.erb b/modules/backlogs/app/views/backlogs/backlog/_backlog_list.html.erb index fb11550a79e..a7e9444f36b 100644 --- a/modules/backlogs/app/views/backlogs/backlog/_backlog_list.html.erb +++ b/modules/backlogs/app/views/backlogs/backlog/_backlog_list.html.erb @@ -35,8 +35,8 @@ See COPYRIGHT and LICENSE files for more details. data-generic-drag-and-drop-target="scrollContainer"> <%= render Backlogs::BacklogComponent.new( - inbox_work_packages: @inbox_work_packages, buckets: @backlog_buckets, + work_packages_by_backlog_id: @work_packages_by_backlog_id, project: @project ) %> diff --git a/modules/backlogs/lib/open_project/backlogs/patches/work_package_patch.rb b/modules/backlogs/lib/open_project/backlogs/patches/work_package_patch.rb index ffa558e7cd8..f793d1808f6 100644 --- a/modules/backlogs/lib/open_project/backlogs/patches/work_package_patch.rb +++ b/modules/backlogs/lib/open_project/backlogs/patches/work_package_patch.rb @@ -48,7 +48,7 @@ module OpenProject::Backlogs::Patches::WorkPackagePatch include OpenProject::Backlogs::List - scopes :backlogs_inbox_for + scopes :in_backlog_for scopes :with_backlogs_neighbours scopes :without_status_considered_closed scopes :without_excluded_type diff --git a/modules/backlogs/spec/controllers/backlogs/backlog_controller_spec.rb b/modules/backlogs/spec/controllers/backlogs/backlog_controller_spec.rb index 5827d334856..cb0e3f9cce3 100644 --- a/modules/backlogs/spec/controllers/backlogs/backlog_controller_spec.rb +++ b/modules/backlogs/spec/controllers/backlogs/backlog_controller_spec.rb @@ -38,7 +38,9 @@ RSpec.describe Backlogs::BacklogController do shared_let(:status) { create(:status, name: "status 1", is_default: true) } shared_let(:sprint) { create(:sprint, project:) } shared_let(:backlog_bucket) { create(:backlog_bucket, project:) } - shared_let(:work_package) { create(:work_package, project:, status:) } + shared_let(:inbox_work_package) { create(:work_package, project:, status:) } + shared_let(:bucket_work_package) { create(:work_package, project:, status:, backlog_bucket:) } + shared_let(:sprint_work_package) { create(:work_package, project:, status:, sprint:) } current_user { user } @@ -63,9 +65,11 @@ RSpec.describe Backlogs::BacklogController do expect(response).to render_template("backlogs/backlog/_backlog_list") expect(response).to render_template(layout: false) expect(assigns(:project)).to eq(project) - expect(assigns(:backlog_buckets)).to be_present - expect(assigns(:inbox_work_packages)).to match [work_package] - expect(assigns(:sprints)).to be_present + expect(assigns(:backlog_buckets)).to match [backlog_bucket] + expect(assigns(:sprints)).to match [sprint] + expect(assigns(:work_packages_by_sprint_id)).to eq({ sprint.id => [sprint_work_package] }) + expect(assigns(:work_packages_by_backlog_id)).to eq({ nil => [inbox_work_package], + backlog_bucket.id => [bucket_work_package] }) end end end diff --git a/modules/backlogs/spec/models/work_packages/scopes/backlogs_inbox_for_spec.rb b/modules/backlogs/spec/models/work_packages/scopes/backlogs_inbox_for_spec.rb deleted file mode 100644 index 98aba91bd94..00000000000 --- a/modules/backlogs/spec/models/work_packages/scopes/backlogs_inbox_for_spec.rb +++ /dev/null @@ -1,100 +0,0 @@ -# frozen_string_literal: true - -# -- copyright -# OpenProject is an open source project management software. -# Copyright (C) the OpenProject GmbH -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License version 3. -# -# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: -# Copyright (C) 2006-2013 Jean-Philippe Lang -# Copyright (C) 2010-2013 the ChiliProject Team -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -# See COPYRIGHT and LICENSE files for more details. -# ++ - -require "spec_helper" - -RSpec.describe WorkPackages::Scopes::BacklogsInboxFor do - let(:open_status) { create(:status, is_closed: false) } - let(:closed_status) { create(:status, is_closed: true) } - let(:project) do - create(:project, - enabled_module_names: %w(work_package_tracking backlogs), - backlog_considered_closed_statuses: [closed_status]) - end - let(:sprint) { create(:sprint, project:) } - - before do - login_as create(:admin) - end - - subject(:inbox) { WorkPackage.backlogs_inbox_for(project:) } - - describe ".backlogs_inbox_for" do - it "returns work packages with no sprint assigned and open status" do - inbox_wp = create(:work_package, project:, status: open_status) - create(:work_package, project:, status: closed_status) - create(:work_package, project:, status: open_status, sprint:) - - expect(inbox).to contain_exactly(inbox_wp) - end - - it "excludes work packages with an excluded type from the inbox" do - excluded_type = create(:type_task) - included_type = create(:type_feature) - project.types << excluded_type - project.types << included_type - project.backlog_excluded_types << excluded_type - - visible_wp = create(:work_package, project:, status: open_status, type: included_type) - create(:work_package, project:, status: open_status, type: excluded_type) - - expect(inbox).to contain_exactly(visible_wp) - end - - it "excludes work packages with a done status (non-is_closed) from the inbox" do - done_like_status = create(:status, is_closed: false) - project.done_statuses << done_like_status - - visible_wp = create(:work_package, project:, status: open_status) - create(:work_package, project:, status: done_like_status) - - expect(inbox).to contain_exactly(visible_wp) - end - - it "excludes work packages from other projects" do - create(:work_package, status: open_status) - own_wp = create(:work_package, project:, status: open_status) - - expect(inbox).to contain_exactly(own_wp) - end - - it "orders by position ascending, falling back to id for unpositioned items" do - wp1 = create(:work_package, project:, status: open_status, position: 2) - wp2 = create(:work_package, project:, status: open_status, position: 1) - wp3 = create(:work_package, project:, status: open_status, position: nil) - wp4 = create(:work_package, project:, status: open_status, position: nil) - - wp3.update_column(:position, nil) - wp4.update_column(:position, nil) - - expect(inbox).to eq([wp2, wp1, wp3, wp4]) - end - end -end diff --git a/modules/backlogs/spec/models/work_packages/scopes/in_backlog_for_spec.rb b/modules/backlogs/spec/models/work_packages/scopes/in_backlog_for_spec.rb new file mode 100644 index 00000000000..f77af9d1d55 --- /dev/null +++ b/modules/backlogs/spec/models/work_packages/scopes/in_backlog_for_spec.rb @@ -0,0 +1,156 @@ +# frozen_string_literal: true + +# -- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +# ++ + +require "spec_helper" + +RSpec.describe WorkPackages::Scopes::InBacklogFor do + shared_let(:open_status) { create(:status, is_closed: false) } + shared_let(:closed_status) { create(:status, is_closed: true) } + shared_let(:excluded_type) { create(:type_task) } + shared_let(:excluded_status) { create(:status, is_closed: false) } + shared_let(:project) do + create(:project, + enabled_module_names: %w(work_package_tracking backlogs), + backlog_considered_closed_statuses: [closed_status]) do |p| + p.backlog_excluded_types << excluded_type + p.done_statuses << excluded_status + end + end + shared_let(:other_project) { create(:project) } + + shared_let(:sprint) { create(:sprint, project:) } + shared_let(:backlog_bucket) { create(:backlog_bucket, project:) } + + # Deliberately placed out of order. The before block further down will reorder them. + shared_let(:open_inbox_wp4) do + create(:work_package, subject: "Open Inbox 4", project:, status: open_status, sprint: nil, backlog_bucket: nil) + end + shared_let(:open_inbox_wp2) do + create(:work_package, subject: "Open Inbox 2", project:, status: open_status, sprint: nil, backlog_bucket: nil) + end + shared_let(:open_inbox_wp1) do + create(:work_package, subject: "Open Inbox 1", project:, status: open_status, sprint: nil, backlog_bucket: nil) + end + shared_let(:open_inbox_wp3) do + create(:work_package, subject: "Open Inbox 3", project:, status: open_status, sprint: nil, backlog_bucket: nil) + end + shared_let(:closed_inbox_wp) do + create(:work_package, status: closed_status, project:, sprint: nil, backlog_bucket: nil) + end + shared_let(:excluded_type_inbox_wp) do + create(:work_package, type: excluded_type, project:, status: open_status, sprint: nil, backlog_bucket: nil) + end + shared_let(:excluded_status_inbox_wp) do + create(:work_package, status: excluded_status, project:, sprint: nil, backlog_bucket: nil) + end + + shared_let(:open_bucket_wp4) do + create(:work_package, subject: "Open Bucket 4", project:, status: open_status, sprint: nil, backlog_bucket:) + end + shared_let(:open_bucket_wp3) do + create(:work_package, subject: "Open Bucket 3", project:, status: open_status, sprint: nil, backlog_bucket:) + end + shared_let(:open_bucket_wp2) do + create(:work_package, subject: "Open Bucket 2", project:, status: open_status, sprint: nil, backlog_bucket:) + end + shared_let(:open_bucket_wp1) do + create(:work_package, subject: "Open Bucket 1", project:, status: open_status, sprint: nil, backlog_bucket:) + end + shared_let(:closed_bucket_wp) do + create(:work_package, status: closed_status, project:, sprint: nil, backlog_bucket:) + end + shared_let(:excluded_type_bucket_wp) do + create(:work_package, type: excluded_type, project:, status: open_status, sprint: nil, backlog_bucket:) + end + shared_let(:excluded_status_bucket_wp) do + create(:work_package, status: excluded_status, project:, sprint: nil, backlog_bucket:) + end + + shared_let(:sprint_wp) do + create(:work_package, project:, status: open_status, sprint:, backlog_bucket: nil) + end + + shared_let(:other_project_wp) do + create(:work_package, project: other_project, status: open_status, sprint:, backlog_bucket: nil) + end + + shared_let(:user_with_permission) do + create(:user, member_with_permissions: { project => %i[view_work_packages], other_project => %i[view_work_packages] }) + end + + current_user { user_with_permission } + + subject(:backlog) { WorkPackage.in_backlog_for(project:) } + + describe ".in_backlog_for" do + before do + open_inbox_wp1.update_column(:position, 1) + open_inbox_wp2.update_column(:position, 2) + open_inbox_wp3.update_column(:position, 3) + open_inbox_wp4.update_column(:position, 4) + + open_bucket_wp1.update_column(:position, nil) + open_bucket_wp2.update_column(:position, nil) + open_bucket_wp3.update_column(:position, nil) + open_bucket_wp4.update_column(:position, nil) + end + + it "returns open work packages of the backlog (inbox + bucket) that are not excluded by type or status" do + # Excludes: + # - closed + # - excluded type + # - excluded status + # - in sprint + # - in other project + expect(backlog) + .to eq([ + # These are ordered by position + open_inbox_wp1, + open_inbox_wp2, + open_inbox_wp3, + open_inbox_wp4, + + # These are ordered by id since they don't have a position + open_bucket_wp4, + open_bucket_wp3, + open_bucket_wp2, + open_bucket_wp1 + ]) + end + + context "when the user is not allowed to view work packages" do + current_user { create(:user) } + + it "returns an empty relation" do + expect(backlog).to be_empty + end + end + end +end From 6618d5064b8084843602b88f94babf4f778d02bc Mon Sep 17 00:00:00 2001 From: Jan Sandbrink Date: Wed, 3 Jun 2026 08:45:59 +0200 Subject: [PATCH 005/107] Seed internal wiki provider Every OpenProject instance is supposed to have one internal wiki provider. --- .../wikis/internal_provider_seeder.rb | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 modules/wikis/app/seeders/basic_data/wikis/internal_provider_seeder.rb diff --git a/modules/wikis/app/seeders/basic_data/wikis/internal_provider_seeder.rb b/modules/wikis/app/seeders/basic_data/wikis/internal_provider_seeder.rb new file mode 100644 index 00000000000..639c93f5d53 --- /dev/null +++ b/modules/wikis/app/seeders/basic_data/wikis/internal_provider_seeder.rb @@ -0,0 +1,43 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +module BasicData + module Wikis + class InternalProviderSeeder < Seeder + def seed_data! + ::Wikis::InternalProvider.create!(universal_identifier: "internal", name: "internal", enabled: true) + end + + def applicable? + !::Wikis::InternalProvider.exists? + end + end + end +end From d9e6fafc7aaeca3fbed30335d760a22de8c1f1d4 Mon Sep 17 00:00:00 2001 From: Ivan Kuchin Date: Tue, 2 Jun 2026 21:28:25 +0200 Subject: [PATCH 006/107] retry failing feature specs if there are <= 10 --- docker/ci/entrypoint.sh | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/docker/ci/entrypoint.sh b/docker/ci/entrypoint.sh index 4f9b3b5d681..2230cdf887d 100755 --- a/docker/ci/entrypoint.sh +++ b/docker/ci/entrypoint.sh @@ -1,5 +1,6 @@ #!/bin/bash -set -e + +set -eo pipefail export PATH="/usr/lib/postgresql/$PGVERSION/bin:$PATH" export JOBS="${CI_JOBS:=$(nproc)}" @@ -166,7 +167,21 @@ run_features() { shopt -s globstar nullglob run_background start_hocuspocus reset_dbs - execute "time bundle exec turbo_tests --verbose -n $JOBS --runtime-log spec/support/runtime-logs/turbo_runtime_features.log {,modules/*/}spec/features/**/*_spec.rb" + + if ! execute "time bundle exec turbo_tests --verbose -n $JOBS --runtime-log spec/support/runtime-logs/turbo_runtime_features.log {,modules/*/}spec/features/**/*_spec.rb"; then + failed_count=$(grep --count ' failed ' tmp/spec_examples.txt 2>/dev/null || echo 0) + if [ "$failed_count" -eq 0 ]; then + echo "failed to find failing examples, unexpected" + exit 1 + elif [ "$failed_count" -le 10 ]; then + echo "retrying $failed_count failed examples" + execute "bundle exec rspec --only-failures --format documentation {,modules/*/}spec/features/**/*_spec.rb" + else + echo "too many failures ($failed_count), not retrying" + exit 1 + fi + fi + cleanup } From b31ea63f6381b4cee96e9f44d2542f269b06dd26 Mon Sep 17 00:00:00 2001 From: Mir Bhatia Date: Thu, 4 Jun 2026 09:49:45 +0200 Subject: [PATCH 007/107] Incorporate PR feedback --- .../meetings/copy_service_integration_spec.rb | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/modules/meeting/spec/services/meetings/copy_service_integration_spec.rb b/modules/meeting/spec/services/meetings/copy_service_integration_spec.rb index 46db2238711..2694eb9ca29 100644 --- a/modules/meeting/spec/services/meetings/copy_service_integration_spec.rb +++ b/modules/meeting/spec/services/meetings/copy_service_integration_spec.rb @@ -206,10 +206,35 @@ RSpec.describe Meetings::CopyService, "integration", type: :model do it "copies the deleted-WP agenda item preserving its type and nil work_package_id" do expect(service_result).to be_success - deleted_item = copy.reload.agenda_items.last + deleted_item = copy.reload.agenda_items.find_by(item_type: :work_package, work_package_id: nil) expect(deleted_item).to be_present expect(deleted_item).to be_work_package expect(deleted_item.work_package_id).to be_nil end end + + context "with a mix of valid and deleted work_package agenda items" do + let(:work_package) { create(:work_package, project:) } + + before do + create(:wp_meeting_agenda_item, meeting:, work_package:) + deleted_item = create(:wp_meeting_agenda_item, meeting:) + # Simulate the work package being destroyed (dependent: :nullify) + deleted_item.update_columns(work_package_id: nil) + end + + it "copies both the valid and deleted-WP agenda items" do + expect(service_result).to be_success + agenda_items = copy.reload.agenda_items + expect(agenda_items.count).to eq(2) + + valid_item = agenda_items.find_by(item_type: :work_package, work_package_id: work_package.id) + expect(valid_item).to be_present + expect(valid_item.work_package_id).to eq(work_package.id) + + deleted_item = agenda_items.find_by(item_type: :work_package, work_package_id: nil) + expect(deleted_item).to be_present + expect(deleted_item.work_package_id).to be_nil + end + end end From ba9f92e82a37ddd0671bfe2856bd4649ddfe18fe Mon Sep 17 00:00:00 2001 From: Tomas Hykel Date: Thu, 4 Jun 2026 20:47:20 +0200 Subject: [PATCH 008/107] [STC-805] Use semantic IDs in github/gitlab suggestions --- .../frontend/module/tab-prs/tab-prs.component.ts | 2 +- .../frontend/module/tab-mrs/tab-mrs.component.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/github_integration/frontend/module/tab-prs/tab-prs.component.ts b/modules/github_integration/frontend/module/tab-prs/tab-prs.component.ts index d553eacc43e..63e9712e4ae 100644 --- a/modules/github_integration/frontend/module/tab-prs/tab-prs.component.ts +++ b/modules/github_integration/frontend/module/tab-prs/tab-prs.component.ts @@ -58,7 +58,7 @@ export class TabPrsComponent implements OnInit { emptyText:string; ngOnInit():void { - this.emptyText = this.I18n.t('js.github_integration.tab_prs.empty', { wp_id: this.workPackage.id }); + this.emptyText = this.I18n.t('js.github_integration.tab_prs.empty', { wp_id: this.workPackage.displayId }); this.pullRequests$ = this .githubPullRequests .ofWorkPackage(this.workPackage) diff --git a/modules/gitlab_integration/frontend/module/tab-mrs/tab-mrs.component.ts b/modules/gitlab_integration/frontend/module/tab-mrs/tab-mrs.component.ts index 24869c3c275..d4de195c3cb 100644 --- a/modules/gitlab_integration/frontend/module/tab-mrs/tab-mrs.component.ts +++ b/modules/gitlab_integration/frontend/module/tab-mrs/tab-mrs.component.ts @@ -64,6 +64,6 @@ export class TabMrsComponent implements OnInit { } public getEmptyText() { - return this.I18n.t('js.gitlab_integration.tab_mrs.empty',{ wp_id: this.workPackage.id }); + return this.I18n.t('js.gitlab_integration.tab_mrs.empty',{ wp_id: this.workPackage.displayId }); } } From e0617c097a69bd23300e471b5cbe401079f3ea11 Mon Sep 17 00:00:00 2001 From: Ivan Kuchin Date: Thu, 28 May 2026 22:13:41 +0200 Subject: [PATCH 009/107] have_attr matcher --- .../models/work_packages/position_spec.rb | 690 ++++++++++-------- ...uild_positions_service_integration_spec.rb | 214 +++--- spec/support/matchers/have_attr.rb | 60 ++ 3 files changed, 536 insertions(+), 428 deletions(-) create mode 100644 spec/support/matchers/have_attr.rb diff --git a/modules/backlogs/spec/models/work_packages/position_spec.rb b/modules/backlogs/spec/models/work_packages/position_spec.rb index 73d815ac4fa..8b85499af92 100644 --- a/modules/backlogs/spec/models/work_packages/position_spec.rb +++ b/modules/backlogs/spec/models/work_packages/position_spec.rb @@ -66,29 +66,34 @@ RSpec.describe WorkPackage, "positions" do # rubocop:disable RSpec/SpecFilePathF let!(:bucket2_wp2) { create_work_package(subject: "Bucket 2 WorkPackage 2", backlog_bucket: bucket2) } let!(:bucket2_wp3) { create_work_package(subject: "Bucket 2 WorkPackage 3", backlog_bucket: bucket2) } - def wp_of_sprint_by_id_and_position(sprint) - WorkPackage.where(sprint:).pluck(:id, :position).to_h + def sprint_wps(sprint) + WorkPackage.where(sprint:) end - def wp_of_inbox_by_id_and_position - WorkPackage.where(sprint: nil, backlog_bucket: nil).pluck(:id, :position).to_h + def bucket_wps(bucket) + WorkPackage.where(backlog_bucket: bucket) end - def wp_of_bucket_by_id_and_position(bucket) - WorkPackage.where(backlog_bucket: bucket).pluck(:id, :position).to_h + def inbox_wps + WorkPackage.where(sprint: nil, backlog_bucket: nil) + end + + def have_positions(**) # rubocop:disable Naming/PredicatePrefix + have_attr(:position, identified_by: :subject, **) end context "when creating a work_package in a sprint" do it "puts them in order" do new_work_package = create_work_package(subject: "Newest WorkPackage", sprint: sprint1) - expect(wp_of_sprint_by_id_and_position(sprint1)) - .to eq(sprint1_wp1.id => 1, - sprint1_wp2.id => 2, - sprint1_wp3.id => 3, - sprint1_wp4.id => 4, - sprint1_wp5.id => 5, - new_work_package.id => 6) + expect(sprint_wps(sprint1)).to have_positions( + sprint1_wp1 => 1, + sprint1_wp2 => 2, + sprint1_wp3 => 3, + sprint1_wp4 => 4, + sprint1_wp5 => 5, + new_work_package => 6 + ) end end @@ -96,11 +101,12 @@ RSpec.describe WorkPackage, "positions" do # rubocop:disable RSpec/SpecFilePathF it "puts them in order" do new_work_package = create_work_package(subject: "Newest WorkPackage") - expect(wp_of_inbox_by_id_and_position) - .to eq(inbox_wp1.id => 1, - inbox_wp2.id => 2, - inbox_wp3.id => 3, - new_work_package.id => 4) + expect(inbox_wps).to have_positions( + inbox_wp1 => 1, + inbox_wp2 => 2, + inbox_wp3 => 3, + new_work_package => 4 + ) end end @@ -108,13 +114,14 @@ RSpec.describe WorkPackage, "positions" do # rubocop:disable RSpec/SpecFilePathF it "puts them in order" do new_work_package = create_work_package(subject: "Newest WorkPackage", backlog_bucket: bucket1) - expect(wp_of_bucket_by_id_and_position(bucket1)) - .to eq(bucket1_wp1.id => 1, - bucket1_wp2.id => 2, - bucket1_wp3.id => 3, - bucket1_wp4.id => 4, - bucket1_wp5.id => 5, - new_work_package.id => 6) + expect(bucket_wps(bucket1)).to have_positions( + bucket1_wp1 => 1, + bucket1_wp2 => 2, + bucket1_wp3 => 3, + bucket1_wp4 => 4, + bucket1_wp5 => 5, + new_work_package => 6 + ) end end @@ -123,17 +130,19 @@ RSpec.describe WorkPackage, "positions" do # rubocop:disable RSpec/SpecFilePathF sprint1_wp2.sprint = sprint2 sprint1_wp2.save! - expect(wp_of_sprint_by_id_and_position(sprint1)) - .to eq(sprint1_wp1.id => 1, - sprint1_wp3.id => 2, - sprint1_wp4.id => 3, - sprint1_wp5.id => 4) + expect(sprint_wps(sprint1)).to have_positions( + sprint1_wp1 => 1, + sprint1_wp3 => 2, + sprint1_wp4 => 3, + sprint1_wp5 => 4 + ) - expect(wp_of_sprint_by_id_and_position(sprint2)) - .to eq(sprint2_wp1.id => 1, - sprint2_wp2.id => 2, - sprint2_wp3.id => 3, - sprint1_wp2.id => 4) + expect(sprint_wps(sprint2)).to have_positions( + sprint2_wp1 => 1, + sprint2_wp2 => 2, + sprint2_wp3 => 3, + sprint1_wp2 => 4 + ) end end @@ -142,17 +151,19 @@ RSpec.describe WorkPackage, "positions" do # rubocop:disable RSpec/SpecFilePathF sprint1_wp2.sprint = nil sprint1_wp2.save! - expect(wp_of_sprint_by_id_and_position(sprint1)) - .to eq(sprint1_wp1.id => 1, - sprint1_wp3.id => 2, - sprint1_wp4.id => 3, - sprint1_wp5.id => 4) + expect(sprint_wps(sprint1)).to have_positions( + sprint1_wp1 => 1, + sprint1_wp3 => 2, + sprint1_wp4 => 3, + sprint1_wp5 => 4 + ) - expect(wp_of_inbox_by_id_and_position) - .to eq(inbox_wp1.id => 1, - inbox_wp2.id => 2, - inbox_wp3.id => 3, - sprint1_wp2.id => 4) + expect(inbox_wps).to have_positions( + inbox_wp1 => 1, + inbox_wp2 => 2, + inbox_wp3 => 3, + sprint1_wp2 => 4 + ) end end @@ -161,17 +172,19 @@ RSpec.describe WorkPackage, "positions" do # rubocop:disable RSpec/SpecFilePathF inbox_wp2.sprint = sprint1 inbox_wp2.save! - expect(wp_of_inbox_by_id_and_position) - .to eq(inbox_wp1.id => 1, - inbox_wp3.id => 2) + expect(inbox_wps).to have_positions( + inbox_wp1 => 1, + inbox_wp3 => 2 + ) - expect(wp_of_sprint_by_id_and_position(sprint1)) - .to eq(sprint1_wp1.id => 1, - sprint1_wp2.id => 2, - sprint1_wp3.id => 3, - sprint1_wp4.id => 4, - sprint1_wp5.id => 5, - inbox_wp2.id => 6) + expect(sprint_wps(sprint1)).to have_positions( + sprint1_wp1 => 1, + sprint1_wp2 => 2, + sprint1_wp3 => 3, + sprint1_wp4 => 4, + sprint1_wp5 => 5, + inbox_wp2 => 6 + ) end end @@ -179,11 +192,12 @@ RSpec.describe WorkPackage, "positions" do # rubocop:disable RSpec/SpecFilePathF it "reorders the existing work_packages" do sprint1_wp3.destroy! - expect(wp_of_sprint_by_id_and_position(sprint1)) - .to eq(sprint1_wp1.id => 1, - sprint1_wp2.id => 2, - sprint1_wp4.id => 3, - sprint1_wp5.id => 4) + expect(sprint_wps(sprint1)).to have_positions( + sprint1_wp1 => 1, + sprint1_wp2 => 2, + sprint1_wp4 => 3, + sprint1_wp5 => 4 + ) end end @@ -191,9 +205,10 @@ RSpec.describe WorkPackage, "positions" do # rubocop:disable RSpec/SpecFilePathF it "reorders the existing work_packages" do inbox_wp1.destroy! - expect(wp_of_inbox_by_id_and_position) - .to eq(inbox_wp2.id => 1, - inbox_wp3.id => 2) + expect(inbox_wps).to have_positions( + inbox_wp2 => 1, + inbox_wp3 => 2 + ) end end @@ -202,17 +217,19 @@ RSpec.describe WorkPackage, "positions" do # rubocop:disable RSpec/SpecFilePathF bucket1_wp2.backlog_bucket = bucket2 bucket1_wp2.save! - expect(wp_of_bucket_by_id_and_position(bucket1)) - .to eq(bucket1_wp1.id => 1, - bucket1_wp3.id => 2, - bucket1_wp4.id => 3, - bucket1_wp5.id => 4) + expect(bucket_wps(bucket1)).to have_positions( + bucket1_wp1 => 1, + bucket1_wp3 => 2, + bucket1_wp4 => 3, + bucket1_wp5 => 4 + ) - expect(wp_of_bucket_by_id_and_position(bucket2)) - .to eq(bucket2_wp1.id => 1, - bucket2_wp2.id => 2, - bucket2_wp3.id => 3, - bucket1_wp2.id => 4) + expect(bucket_wps(bucket2)).to have_positions( + bucket2_wp1 => 1, + bucket2_wp2 => 2, + bucket2_wp3 => 3, + bucket1_wp2 => 4 + ) end end @@ -221,17 +238,19 @@ RSpec.describe WorkPackage, "positions" do # rubocop:disable RSpec/SpecFilePathF bucket1_wp2.backlog_bucket = nil bucket1_wp2.save! - expect(wp_of_bucket_by_id_and_position(bucket1)) - .to eq(bucket1_wp1.id => 1, - bucket1_wp3.id => 2, - bucket1_wp4.id => 3, - bucket1_wp5.id => 4) + expect(bucket_wps(bucket1)).to have_positions( + bucket1_wp1 => 1, + bucket1_wp3 => 2, + bucket1_wp4 => 3, + bucket1_wp5 => 4 + ) - expect(wp_of_inbox_by_id_and_position) - .to eq(inbox_wp1.id => 1, - inbox_wp2.id => 2, - inbox_wp3.id => 3, - bucket1_wp2.id => 4) + expect(inbox_wps).to have_positions( + inbox_wp1 => 1, + inbox_wp2 => 2, + inbox_wp3 => 3, + bucket1_wp2 => 4 + ) end end @@ -240,17 +259,19 @@ RSpec.describe WorkPackage, "positions" do # rubocop:disable RSpec/SpecFilePathF inbox_wp2.backlog_bucket = bucket1 inbox_wp2.save! - expect(wp_of_inbox_by_id_and_position) - .to eq(inbox_wp1.id => 1, - inbox_wp3.id => 2) + expect(inbox_wps).to have_positions( + inbox_wp1 => 1, + inbox_wp3 => 2 + ) - expect(wp_of_bucket_by_id_and_position(bucket1)) - .to eq(bucket1_wp1.id => 1, - bucket1_wp2.id => 2, - bucket1_wp3.id => 3, - bucket1_wp4.id => 4, - bucket1_wp5.id => 5, - inbox_wp2.id => 6) + expect(bucket_wps(bucket1)).to have_positions( + bucket1_wp1 => 1, + bucket1_wp2 => 2, + bucket1_wp3 => 3, + bucket1_wp4 => 4, + bucket1_wp5 => 5, + inbox_wp2 => 6 + ) end end @@ -258,11 +279,12 @@ RSpec.describe WorkPackage, "positions" do # rubocop:disable RSpec/SpecFilePathF it "reorders the existing work_packages" do bucket1_wp3.destroy! - expect(wp_of_bucket_by_id_and_position(bucket1)) - .to eq(bucket1_wp1.id => 1, - bucket1_wp2.id => 2, - bucket1_wp4.id => 3, - bucket1_wp5.id => 4) + expect(bucket_wps(bucket1)).to have_positions( + bucket1_wp1 => 1, + bucket1_wp2 => 2, + bucket1_wp4 => 3, + bucket1_wp5 => 4 + ) end end @@ -272,19 +294,21 @@ RSpec.describe WorkPackage, "positions" do # rubocop:disable RSpec/SpecFilePathF sprint1_wp4.sprint = nil sprint1_wp4.save! - expect(wp_of_sprint_by_id_and_position(sprint1)) - .to eq(sprint1_wp1.id => 1, - sprint1_wp2.id => 2, - sprint1_wp3.id => 3, - sprint1_wp5.id => 4) + expect(sprint_wps(sprint1)).to have_positions( + sprint1_wp1 => 1, + sprint1_wp2 => 2, + sprint1_wp3 => 3, + sprint1_wp5 => 4 + ) - expect(wp_of_bucket_by_id_and_position(bucket1)) - .to eq(bucket1_wp1.id => 1, - bucket1_wp2.id => 2, - bucket1_wp3.id => 3, - bucket1_wp4.id => 4, - bucket1_wp5.id => 5, - sprint1_wp4.id => 6) + expect(bucket_wps(bucket1)).to have_positions( + bucket1_wp1 => 1, + bucket1_wp2 => 2, + bucket1_wp3 => 3, + bucket1_wp4 => 4, + bucket1_wp5 => 5, + sprint1_wp4 => 6 + ) end end @@ -292,19 +316,21 @@ RSpec.describe WorkPackage, "positions" do # rubocop:disable RSpec/SpecFilePathF it "reorders the remaining sprint work_packages and the ones in the bucket" do bucket1_wp3.update(backlog_bucket: nil, sprint: sprint1) - expect(wp_of_bucket_by_id_and_position(bucket1)) - .to eq(bucket1_wp1.id => 1, - bucket1_wp2.id => 2, - bucket1_wp4.id => 3, - bucket1_wp5.id => 4) + expect(bucket_wps(bucket1)).to have_positions( + bucket1_wp1 => 1, + bucket1_wp2 => 2, + bucket1_wp4 => 3, + bucket1_wp5 => 4 + ) - expect(wp_of_sprint_by_id_and_position(sprint1)) - .to eq(sprint1_wp1.id => 1, - sprint1_wp2.id => 2, - sprint1_wp3.id => 3, - sprint1_wp4.id => 4, - sprint1_wp5.id => 5, - bucket1_wp3.id => 6) + expect(sprint_wps(sprint1)).to have_positions( + sprint1_wp1 => 1, + sprint1_wp2 => 2, + sprint1_wp3 => 3, + sprint1_wp4 => 4, + sprint1_wp5 => 5, + bucket1_wp3 => 6 + ) end end @@ -313,12 +339,13 @@ RSpec.describe WorkPackage, "positions" do # rubocop:disable RSpec/SpecFilePathF it "moves the work_package to the beginning of the sprint" do sprint1_wp4.move_after(position: 1) - expect(wp_of_sprint_by_id_and_position(sprint1)) - .to eq(sprint1_wp4.id => 1, - sprint1_wp1.id => 2, - sprint1_wp2.id => 3, - sprint1_wp3.id => 4, - sprint1_wp5.id => 5) + expect(sprint_wps(sprint1)).to have_positions( + sprint1_wp4 => 1, + sprint1_wp1 => 2, + sprint1_wp2 => 3, + sprint1_wp3 => 4, + sprint1_wp5 => 5 + ) end end @@ -326,12 +353,13 @@ RSpec.describe WorkPackage, "positions" do # rubocop:disable RSpec/SpecFilePathF it "moves the work_package to the middle of the sprint" do sprint1_wp1.move_after(position: 3) - expect(wp_of_sprint_by_id_and_position(sprint1)) - .to eq(sprint1_wp2.id => 1, - sprint1_wp3.id => 2, - sprint1_wp1.id => 3, - sprint1_wp4.id => 4, - sprint1_wp5.id => 5) + expect(sprint_wps(sprint1)).to have_positions( + sprint1_wp2 => 1, + sprint1_wp3 => 2, + sprint1_wp1 => 3, + sprint1_wp4 => 4, + sprint1_wp5 => 5 + ) end end @@ -339,12 +367,13 @@ RSpec.describe WorkPackage, "positions" do # rubocop:disable RSpec/SpecFilePathF it "moves the work_package to the middle of the sprint" do sprint1_wp5.move_after(position: 3) - expect(wp_of_sprint_by_id_and_position(sprint1)) - .to eq(sprint1_wp1.id => 1, - sprint1_wp2.id => 2, - sprint1_wp5.id => 3, - sprint1_wp3.id => 4, - sprint1_wp4.id => 5) + expect(sprint_wps(sprint1)).to have_positions( + sprint1_wp1 => 1, + sprint1_wp2 => 2, + sprint1_wp5 => 3, + sprint1_wp3 => 4, + sprint1_wp4 => 5 + ) end end @@ -352,12 +381,13 @@ RSpec.describe WorkPackage, "positions" do # rubocop:disable RSpec/SpecFilePathF it "moves the work_package to the end of the sprint" do sprint1_wp2.move_after(position: 5) - expect(wp_of_sprint_by_id_and_position(sprint1)) - .to eq(sprint1_wp1.id => 1, - sprint1_wp3.id => 2, - sprint1_wp4.id => 3, - sprint1_wp5.id => 4, - sprint1_wp2.id => 5) + expect(sprint_wps(sprint1)).to have_positions( + sprint1_wp1 => 1, + sprint1_wp3 => 2, + sprint1_wp4 => 3, + sprint1_wp5 => 4, + sprint1_wp2 => 5 + ) end end @@ -365,12 +395,13 @@ RSpec.describe WorkPackage, "positions" do # rubocop:disable RSpec/SpecFilePathF it "moves the work_package to the top of the sprint" do sprint1_wp2.move_after(position: 6) - expect(wp_of_sprint_by_id_and_position(sprint1)) - .to eq(sprint1_wp2.id => 1, - sprint1_wp1.id => 2, - sprint1_wp3.id => 3, - sprint1_wp4.id => 4, - sprint1_wp5.id => 5) + expect(sprint_wps(sprint1)).to have_positions( + sprint1_wp2 => 1, + sprint1_wp1 => 2, + sprint1_wp3 => 3, + sprint1_wp4 => 4, + sprint1_wp5 => 5 + ) end end @@ -378,12 +409,13 @@ RSpec.describe WorkPackage, "positions" do # rubocop:disable RSpec/SpecFilePathF it "moves the work_package to the second position" do sprint1_wp4.move_after(prev_id: sprint1_wp1.id) - expect(wp_of_sprint_by_id_and_position(sprint1)) - .to eq(sprint1_wp1.id => 1, - sprint1_wp4.id => 2, - sprint1_wp2.id => 3, - sprint1_wp3.id => 4, - sprint1_wp5.id => 5) + expect(sprint_wps(sprint1)).to have_positions( + sprint1_wp1 => 1, + sprint1_wp4 => 2, + sprint1_wp2 => 3, + sprint1_wp3 => 4, + sprint1_wp5 => 5 + ) end end @@ -391,12 +423,13 @@ RSpec.describe WorkPackage, "positions" do # rubocop:disable RSpec/SpecFilePathF it "moves the work_package after the previous" do sprint1_wp1.move_after(prev_id: sprint1_wp3.id) - expect(wp_of_sprint_by_id_and_position(sprint1)) - .to eq(sprint1_wp2.id => 1, - sprint1_wp3.id => 2, - sprint1_wp1.id => 3, - sprint1_wp4.id => 4, - sprint1_wp5.id => 5) + expect(sprint_wps(sprint1)).to have_positions( + sprint1_wp2 => 1, + sprint1_wp3 => 2, + sprint1_wp1 => 3, + sprint1_wp4 => 4, + sprint1_wp5 => 5 + ) end end @@ -404,12 +437,13 @@ RSpec.describe WorkPackage, "positions" do # rubocop:disable RSpec/SpecFilePathF it "moves the work_package after the previous" do sprint1_wp5.move_after(prev_id: sprint1_wp3.id) - expect(wp_of_sprint_by_id_and_position(sprint1)) - .to eq(sprint1_wp1.id => 1, - sprint1_wp2.id => 2, - sprint1_wp3.id => 3, - sprint1_wp5.id => 4, - sprint1_wp4.id => 5) + expect(sprint_wps(sprint1)).to have_positions( + sprint1_wp1 => 1, + sprint1_wp2 => 2, + sprint1_wp3 => 3, + sprint1_wp5 => 4, + sprint1_wp4 => 5 + ) end end @@ -417,12 +451,13 @@ RSpec.describe WorkPackage, "positions" do # rubocop:disable RSpec/SpecFilePathF it "moves the work_package after the previous" do sprint1_wp1.move_after(prev_id: sprint1_wp5.id) - expect(wp_of_sprint_by_id_and_position(sprint1)) - .to eq(sprint1_wp2.id => 1, - sprint1_wp3.id => 2, - sprint1_wp4.id => 3, - sprint1_wp5.id => 4, - sprint1_wp1.id => 5) + expect(sprint_wps(sprint1)).to have_positions( + sprint1_wp2 => 1, + sprint1_wp3 => 2, + sprint1_wp4 => 3, + sprint1_wp5 => 4, + sprint1_wp1 => 5 + ) end end @@ -430,12 +465,13 @@ RSpec.describe WorkPackage, "positions" do # rubocop:disable RSpec/SpecFilePathF it "moves the work_package to the top of the sprint" do sprint1_wp4.move_after(prev_id: sprint2_wp2.id) - expect(wp_of_sprint_by_id_and_position(sprint1)) - .to eq(sprint1_wp4.id => 1, - sprint1_wp1.id => 2, - sprint1_wp2.id => 3, - sprint1_wp3.id => 4, - sprint1_wp5.id => 5) + expect(sprint_wps(sprint1)).to have_positions( + sprint1_wp4 => 1, + sprint1_wp1 => 2, + sprint1_wp2 => 3, + sprint1_wp3 => 4, + sprint1_wp5 => 5 + ) end end @@ -443,12 +479,13 @@ RSpec.describe WorkPackage, "positions" do # rubocop:disable RSpec/SpecFilePathF it "moves the work_package to the top of the sprint" do sprint1_wp4.move_after(prev_id: nil) - expect(wp_of_sprint_by_id_and_position(sprint1)) - .to eq(sprint1_wp4.id => 1, - sprint1_wp1.id => 2, - sprint1_wp2.id => 3, - sprint1_wp3.id => 4, - sprint1_wp5.id => 5) + expect(sprint_wps(sprint1)).to have_positions( + sprint1_wp4 => 1, + sprint1_wp1 => 2, + sprint1_wp2 => 3, + sprint1_wp3 => 4, + sprint1_wp5 => 5 + ) end end @@ -456,10 +493,11 @@ RSpec.describe WorkPackage, "positions" do # rubocop:disable RSpec/SpecFilePathF it "moves the work_package to the beginning of the sprint" do inbox_wp3.move_after(position: 1) - expect(wp_of_inbox_by_id_and_position) - .to eq(inbox_wp3.id => 1, - inbox_wp1.id => 2, - inbox_wp2.id => 3) + expect(inbox_wps).to have_positions( + inbox_wp3 => 1, + inbox_wp1 => 2, + inbox_wp2 => 3 + ) end end @@ -467,10 +505,11 @@ RSpec.describe WorkPackage, "positions" do # rubocop:disable RSpec/SpecFilePathF it "moves the work_package to the middle of the sprint" do inbox_wp1.move_after(position: 2) - expect(wp_of_inbox_by_id_and_position) - .to eq(inbox_wp2.id => 1, - inbox_wp1.id => 2, - inbox_wp3.id => 3) + expect(inbox_wps).to have_positions( + inbox_wp2 => 1, + inbox_wp1 => 2, + inbox_wp3 => 3 + ) end end @@ -478,10 +517,11 @@ RSpec.describe WorkPackage, "positions" do # rubocop:disable RSpec/SpecFilePathF it "moves the work_package to the middle of the sprint" do inbox_wp3.move_after(position: 2) - expect(wp_of_inbox_by_id_and_position) - .to eq(inbox_wp1.id => 1, - inbox_wp3.id => 2, - inbox_wp2.id => 3) + expect(inbox_wps).to have_positions( + inbox_wp1 => 1, + inbox_wp3 => 2, + inbox_wp2 => 3 + ) end end @@ -489,10 +529,11 @@ RSpec.describe WorkPackage, "positions" do # rubocop:disable RSpec/SpecFilePathF it "moves the work_package to the end of the sprint" do inbox_wp1.move_after(position: 3) - expect(wp_of_inbox_by_id_and_position) - .to eq(inbox_wp2.id => 1, - inbox_wp3.id => 2, - inbox_wp1.id => 3) + expect(inbox_wps).to have_positions( + inbox_wp2 => 1, + inbox_wp3 => 2, + inbox_wp1 => 3 + ) end end @@ -500,10 +541,11 @@ RSpec.describe WorkPackage, "positions" do # rubocop:disable RSpec/SpecFilePathF it "moves the work_package to the top of the sprint" do inbox_wp2.move_after(position: 4) - expect(wp_of_inbox_by_id_and_position) - .to eq(inbox_wp2.id => 1, - inbox_wp1.id => 2, - inbox_wp3.id => 3) + expect(inbox_wps).to have_positions( + inbox_wp2 => 1, + inbox_wp1 => 2, + inbox_wp3 => 3 + ) end end @@ -511,10 +553,11 @@ RSpec.describe WorkPackage, "positions" do # rubocop:disable RSpec/SpecFilePathF it "moves the work_package to the top of the sprint" do inbox_wp3.move_after(prev_id: nil) - expect(wp_of_inbox_by_id_and_position) - .to eq(inbox_wp3.id => 1, - inbox_wp1.id => 2, - inbox_wp2.id => 3) + expect(inbox_wps).to have_positions( + inbox_wp3 => 1, + inbox_wp1 => 2, + inbox_wp2 => 3 + ) end end @@ -522,10 +565,11 @@ RSpec.describe WorkPackage, "positions" do # rubocop:disable RSpec/SpecFilePathF it "moves the work_package to the second position" do inbox_wp3.move_after(prev_id: inbox_wp1.id) - expect(wp_of_inbox_by_id_and_position) - .to eq(inbox_wp1.id => 1, - inbox_wp3.id => 2, - inbox_wp2.id => 3) + expect(inbox_wps).to have_positions( + inbox_wp1 => 1, + inbox_wp3 => 2, + inbox_wp2 => 3 + ) end end @@ -533,10 +577,11 @@ RSpec.describe WorkPackage, "positions" do # rubocop:disable RSpec/SpecFilePathF it "moves the work_package after the previous" do inbox_wp1.move_after(prev_id: inbox_wp2.id) - expect(wp_of_inbox_by_id_and_position) - .to eq(inbox_wp2.id => 1, - inbox_wp1.id => 2, - inbox_wp3.id => 3) + expect(inbox_wps).to have_positions( + inbox_wp2 => 1, + inbox_wp1 => 2, + inbox_wp3 => 3 + ) end end @@ -544,10 +589,11 @@ RSpec.describe WorkPackage, "positions" do # rubocop:disable RSpec/SpecFilePathF it "moves the work_package after the previous" do inbox_wp3.move_after(prev_id: inbox_wp1.id) - expect(wp_of_inbox_by_id_and_position) - .to eq(inbox_wp1.id => 1, - inbox_wp3.id => 2, - inbox_wp2.id => 3) + expect(inbox_wps).to have_positions( + inbox_wp1 => 1, + inbox_wp3 => 2, + inbox_wp2 => 3 + ) end end @@ -555,10 +601,11 @@ RSpec.describe WorkPackage, "positions" do # rubocop:disable RSpec/SpecFilePathF it "moves the work_package after the previous" do inbox_wp1.move_after(prev_id: inbox_wp3.id) - expect(wp_of_inbox_by_id_and_position) - .to eq(inbox_wp2.id => 1, - inbox_wp3.id => 2, - inbox_wp1.id => 3) + expect(inbox_wps).to have_positions( + inbox_wp2 => 1, + inbox_wp3 => 2, + inbox_wp1 => 3 + ) end end @@ -566,10 +613,11 @@ RSpec.describe WorkPackage, "positions" do # rubocop:disable RSpec/SpecFilePathF it "moves the work_package to the top position" do inbox_wp3.move_after(prev_id: sprint2_wp2.id) - expect(wp_of_inbox_by_id_and_position) - .to eq(inbox_wp3.id => 1, - inbox_wp1.id => 2, - inbox_wp2.id => 3) + expect(inbox_wps).to have_positions( + inbox_wp3 => 1, + inbox_wp1 => 2, + inbox_wp2 => 3 + ) end end @@ -577,12 +625,13 @@ RSpec.describe WorkPackage, "positions" do # rubocop:disable RSpec/SpecFilePathF it "moves the work_package to the beginning of the bucket" do bucket1_wp4.move_after(position: 1) - expect(wp_of_bucket_by_id_and_position(bucket1)) - .to eq(bucket1_wp4.id => 1, - bucket1_wp1.id => 2, - bucket1_wp2.id => 3, - bucket1_wp3.id => 4, - bucket1_wp5.id => 5) + expect(bucket_wps(bucket1)).to have_positions( + bucket1_wp4 => 1, + bucket1_wp1 => 2, + bucket1_wp2 => 3, + bucket1_wp3 => 4, + bucket1_wp5 => 5 + ) end end @@ -590,12 +639,13 @@ RSpec.describe WorkPackage, "positions" do # rubocop:disable RSpec/SpecFilePathF it "moves the work_package to the middle of the bucket" do bucket1_wp1.move_after(position: 3) - expect(wp_of_bucket_by_id_and_position(bucket1)) - .to eq(bucket1_wp2.id => 1, - bucket1_wp3.id => 2, - bucket1_wp1.id => 3, - bucket1_wp4.id => 4, - bucket1_wp5.id => 5) + expect(bucket_wps(bucket1)).to have_positions( + bucket1_wp2 => 1, + bucket1_wp3 => 2, + bucket1_wp1 => 3, + bucket1_wp4 => 4, + bucket1_wp5 => 5 + ) end end @@ -603,12 +653,13 @@ RSpec.describe WorkPackage, "positions" do # rubocop:disable RSpec/SpecFilePathF it "moves the work_package to the middle of the bucket" do bucket1_wp5.move_after(position: 3) - expect(wp_of_bucket_by_id_and_position(bucket1)) - .to eq(bucket1_wp1.id => 1, - bucket1_wp2.id => 2, - bucket1_wp5.id => 3, - bucket1_wp3.id => 4, - bucket1_wp4.id => 5) + expect(bucket_wps(bucket1)).to have_positions( + bucket1_wp1 => 1, + bucket1_wp2 => 2, + bucket1_wp5 => 3, + bucket1_wp3 => 4, + bucket1_wp4 => 5 + ) end end @@ -616,12 +667,13 @@ RSpec.describe WorkPackage, "positions" do # rubocop:disable RSpec/SpecFilePathF it "moves the work_package to the end of the bucket" do bucket1_wp2.move_after(position: 5) - expect(wp_of_bucket_by_id_and_position(bucket1)) - .to eq(bucket1_wp1.id => 1, - bucket1_wp3.id => 2, - bucket1_wp4.id => 3, - bucket1_wp5.id => 4, - bucket1_wp2.id => 5) + expect(bucket_wps(bucket1)).to have_positions( + bucket1_wp1 => 1, + bucket1_wp3 => 2, + bucket1_wp4 => 3, + bucket1_wp5 => 4, + bucket1_wp2 => 5 + ) end end @@ -629,12 +681,13 @@ RSpec.describe WorkPackage, "positions" do # rubocop:disable RSpec/SpecFilePathF it "moves the work_package to the second position" do bucket1_wp4.move_after(prev_id: bucket1_wp1.id) - expect(wp_of_bucket_by_id_and_position(bucket1)) - .to eq(bucket1_wp1.id => 1, - bucket1_wp4.id => 2, - bucket1_wp2.id => 3, - bucket1_wp3.id => 4, - bucket1_wp5.id => 5) + expect(bucket_wps(bucket1)).to have_positions( + bucket1_wp1 => 1, + bucket1_wp4 => 2, + bucket1_wp2 => 3, + bucket1_wp3 => 4, + bucket1_wp5 => 5 + ) end end @@ -642,12 +695,13 @@ RSpec.describe WorkPackage, "positions" do # rubocop:disable RSpec/SpecFilePathF it "moves the work_package after the previous" do bucket1_wp1.move_after(prev_id: bucket1_wp3.id) - expect(wp_of_bucket_by_id_and_position(bucket1)) - .to eq(bucket1_wp2.id => 1, - bucket1_wp3.id => 2, - bucket1_wp1.id => 3, - bucket1_wp4.id => 4, - bucket1_wp5.id => 5) + expect(bucket_wps(bucket1)).to have_positions( + bucket1_wp2 => 1, + bucket1_wp3 => 2, + bucket1_wp1 => 3, + bucket1_wp4 => 4, + bucket1_wp5 => 5 + ) end end @@ -655,12 +709,13 @@ RSpec.describe WorkPackage, "positions" do # rubocop:disable RSpec/SpecFilePathF it "moves the work_package to the last position" do bucket1_wp1.move_after(prev_id: bucket1_wp5.id) - expect(wp_of_bucket_by_id_and_position(bucket1)) - .to eq(bucket1_wp2.id => 1, - bucket1_wp3.id => 2, - bucket1_wp4.id => 3, - bucket1_wp5.id => 4, - bucket1_wp1.id => 5) + expect(bucket_wps(bucket1)).to have_positions( + bucket1_wp2 => 1, + bucket1_wp3 => 2, + bucket1_wp4 => 3, + bucket1_wp5 => 4, + bucket1_wp1 => 5 + ) end end @@ -668,12 +723,13 @@ RSpec.describe WorkPackage, "positions" do # rubocop:disable RSpec/SpecFilePathF it "moves the work_package to the top of the bucket" do bucket1_wp4.move_after(prev_id: nil) - expect(wp_of_bucket_by_id_and_position(bucket1)) - .to eq(bucket1_wp4.id => 1, - bucket1_wp1.id => 2, - bucket1_wp2.id => 3, - bucket1_wp3.id => 4, - bucket1_wp5.id => 5) + expect(bucket_wps(bucket1)).to have_positions( + bucket1_wp4 => 1, + bucket1_wp1 => 2, + bucket1_wp2 => 3, + bucket1_wp3 => 4, + bucket1_wp5 => 5 + ) end end @@ -681,12 +737,13 @@ RSpec.describe WorkPackage, "positions" do # rubocop:disable RSpec/SpecFilePathF it "moves the work_package to the top of the bucket" do bucket1_wp4.move_after(prev_id: bucket2_wp2.id) - expect(wp_of_bucket_by_id_and_position(bucket1)) - .to eq(bucket1_wp4.id => 1, - bucket1_wp1.id => 2, - bucket1_wp2.id => 3, - bucket1_wp3.id => 4, - bucket1_wp5.id => 5) + expect(bucket_wps(bucket1)).to have_positions( + bucket1_wp4 => 1, + bucket1_wp1 => 2, + bucket1_wp2 => 3, + bucket1_wp3 => 4, + bucket1_wp5 => 5 + ) end end @@ -695,23 +752,25 @@ RSpec.describe WorkPackage, "positions" do # rubocop:disable RSpec/SpecFilePathF it "moves the work_package to the beginning of the sprint" do sprint1_wp4.move_after(position: "1") - expect(wp_of_sprint_by_id_and_position(sprint1)) - .to eq(sprint1_wp4.id => 1, - sprint1_wp1.id => 2, - sprint1_wp2.id => 3, - sprint1_wp3.id => 4, - sprint1_wp5.id => 5) + expect(sprint_wps(sprint1)).to have_positions( + sprint1_wp4 => 1, + sprint1_wp1 => 2, + sprint1_wp2 => 3, + sprint1_wp3 => 4, + sprint1_wp5 => 5 + ) end it "moves the work_package to the middle of the sprint" do sprint1_wp1.move_after(position: "3") - expect(wp_of_sprint_by_id_and_position(sprint1)) - .to eq(sprint1_wp2.id => 1, - sprint1_wp3.id => 2, - sprint1_wp1.id => 3, - sprint1_wp4.id => 4, - sprint1_wp5.id => 5) + expect(sprint_wps(sprint1)).to have_positions( + sprint1_wp2 => 1, + sprint1_wp3 => 2, + sprint1_wp1 => 3, + sprint1_wp4 => 4, + sprint1_wp5 => 5 + ) end end @@ -719,12 +778,13 @@ RSpec.describe WorkPackage, "positions" do # rubocop:disable RSpec/SpecFilePathF it "moves the work_package after the previous" do sprint1_wp4.move_after(prev_id: sprint1_wp1.id.to_s) - expect(wp_of_sprint_by_id_and_position(sprint1)) - .to eq(sprint1_wp1.id => 1, - sprint1_wp4.id => 2, - sprint1_wp2.id => 3, - sprint1_wp3.id => 4, - sprint1_wp5.id => 5) + expect(sprint_wps(sprint1)).to have_positions( + sprint1_wp1 => 1, + sprint1_wp4 => 2, + sprint1_wp2 => 3, + sprint1_wp3 => 4, + sprint1_wp5 => 5 + ) end end @@ -732,10 +792,11 @@ RSpec.describe WorkPackage, "positions" do # rubocop:disable RSpec/SpecFilePathF it "moves the work_package to the beginning of the inbox" do inbox_wp3.move_after(position: "1") - expect(wp_of_inbox_by_id_and_position) - .to eq(inbox_wp3.id => 1, - inbox_wp1.id => 2, - inbox_wp2.id => 3) + expect(inbox_wps).to have_positions( + inbox_wp3 => 1, + inbox_wp1 => 2, + inbox_wp2 => 3 + ) end end @@ -743,12 +804,13 @@ RSpec.describe WorkPackage, "positions" do # rubocop:disable RSpec/SpecFilePathF it "moves the work_package to the beginning of the bucket" do bucket1_wp4.move_after(position: "1") - expect(wp_of_bucket_by_id_and_position(bucket1)) - .to eq(bucket1_wp4.id => 1, - bucket1_wp1.id => 2, - bucket1_wp2.id => 3, - bucket1_wp3.id => 4, - bucket1_wp5.id => 5) + expect(bucket_wps(bucket1)).to have_positions( + bucket1_wp4 => 1, + bucket1_wp1 => 2, + bucket1_wp2 => 3, + bucket1_wp3 => 4, + bucket1_wp5 => 5 + ) end end end diff --git a/modules/backlogs/spec/services/backlogs/work_packages/rebuild_positions_service_integration_spec.rb b/modules/backlogs/spec/services/backlogs/work_packages/rebuild_positions_service_integration_spec.rb index 610bb4c3b8a..ee08ca0b527 100644 --- a/modules/backlogs/spec/services/backlogs/work_packages/rebuild_positions_service_integration_spec.rb +++ b/modules/backlogs/spec/services/backlogs/work_packages/rebuild_positions_service_integration_spec.rb @@ -75,55 +75,53 @@ RSpec.describe Backlogs::WorkPackages::RebuildPositionsService, "integration", t shared_let(:bucket2_wp2) { create_work_package(subject: "Bucket 2 WorkPackage 2", backlog_bucket: bucket2, position: nil) } shared_let(:bucket2_wp3) { create_work_package(subject: "Bucket 2 WorkPackage 3", backlog_bucket: bucket2, position: nil) } + def have_positions(**) # rubocop:disable Naming/PredicatePrefix + have_attr(:position, identified_by: :subject, **) + end + context "with the project provided" do before do described_class.new(project: project1).call end it "fixes the positions in that project while keeping those that have some in the same order" do # rubocop:disable RSpec/ExampleLength - expect(WorkPackage.where(sprint: sprint1).to_h { [it.subject, it.position] }) - .to eql( - sprint1_wp2.subject => 1, - sprint1_wp3.subject => 2, - sprint1_wp4.subject => 3, - sprint1_wp1.subject => 4, - sprint1_wp5.subject => 5 - ) + expect(WorkPackage.where(sprint: sprint1)).to have_positions( + sprint1_wp2 => 1, + sprint1_wp3 => 2, + sprint1_wp4 => 3, + sprint1_wp1 => 4, + sprint1_wp5 => 5 + ) - expect(WorkPackage.where(sprint: sprint2).to_h { [it.subject, it.position] }) - .to eql( - sprint2_wp3.subject => 1, - sprint2_wp2.subject => 2, - sprint2_wp1.subject => 3 - ) + expect(WorkPackage.where(sprint: sprint2)).to have_positions( + sprint2_wp3 => 1, + sprint2_wp2 => 2, + sprint2_wp1 => 3 + ) - expect(WorkPackage.where(sprint: nil, backlog_bucket: nil, project: project1).to_h { [it.subject, it.position] }) - .to eql( - inbox_wp1.subject => 1, - inbox_wp2.subject => 2, - inbox_wp3.subject => 3 - ) + expect(WorkPackage.where(sprint: nil, backlog_bucket: nil, project: project1)).to have_positions( + inbox_wp1 => 1, + inbox_wp2 => 2, + inbox_wp3 => 3 + ) - expect(WorkPackage.where(sprint: sprint3).to_h { [it.subject, it.position] }) - .to eql( - sprint3_wp1.subject => nil, - sprint3_wp2.subject => nil, - sprint3_wp3.subject => nil - ) + expect(WorkPackage.where(sprint: sprint3)).to have_positions( + sprint3_wp1 => nil, + sprint3_wp2 => nil, + sprint3_wp3 => nil + ) - expect(WorkPackage.where(backlog_bucket: bucket1).to_h { [it.subject, it.position] }) - .to eql( - bucket1_wp3.subject => 1, - bucket1_wp2.subject => 2, - bucket1_wp1.subject => 3 - ) + expect(WorkPackage.where(backlog_bucket: bucket1)).to have_positions( + bucket1_wp3 => 1, + bucket1_wp2 => 2, + bucket1_wp1 => 3 + ) - expect(WorkPackage.where(backlog_bucket: bucket2).to_h { [it.subject, it.position] }) - .to eql( - bucket2_wp1.subject => nil, - bucket2_wp2.subject => nil, - bucket2_wp3.subject => nil - ) + expect(WorkPackage.where(backlog_bucket: bucket2)).to have_positions( + bucket2_wp1 => nil, + bucket2_wp2 => nil, + bucket2_wp3 => nil + ) end end @@ -133,49 +131,43 @@ RSpec.describe Backlogs::WorkPackages::RebuildPositionsService, "integration", t end it "fixes only the work packages in the other project" do # rubocop:disable RSpec/ExampleLength - expect(WorkPackage.where(sprint: sprint1).to_h { [it.subject, it.position] }) - .to eql( - sprint1_wp1.subject => nil, - sprint1_wp2.subject => 1, - sprint1_wp3.subject => 2, - sprint1_wp4.subject => 2, - sprint1_wp5.subject => nil - ) + expect(WorkPackage.where(sprint: sprint1)).to have_positions( + sprint1_wp1 => nil, + sprint1_wp2 => 1, + sprint1_wp3 => 2, + sprint1_wp4 => 2, + sprint1_wp5 => nil + ) - expect(WorkPackage.where(sprint: sprint2).to_h { [it.subject, it.position] }) - .to eql( - sprint2_wp3.subject => 1, - sprint2_wp2.subject => 2, - sprint2_wp1.subject => 3 - ) + expect(WorkPackage.where(sprint: sprint2)).to have_positions( + sprint2_wp3 => 1, + sprint2_wp2 => 2, + sprint2_wp1 => 3 + ) - expect(WorkPackage.where(sprint: nil, backlog_bucket: nil, project: project1).to_h { [it.subject, it.position] }) - .to eql( - inbox_wp1.subject => nil, - inbox_wp2.subject => nil, - inbox_wp3.subject => nil - ) + expect(WorkPackage.where(sprint: nil, backlog_bucket: nil, project: project1)).to have_positions( + inbox_wp1 => nil, + inbox_wp2 => nil, + inbox_wp3 => nil + ) - expect(WorkPackage.where(sprint: sprint3).to_h { [it.subject, it.position] }) - .to eql( - sprint3_wp1.subject => 1, - sprint3_wp2.subject => 2, - sprint3_wp3.subject => 3 - ) + expect(WorkPackage.where(sprint: sprint3)).to have_positions( + sprint3_wp1 => 1, + sprint3_wp2 => 2, + sprint3_wp3 => 3 + ) - expect(WorkPackage.where(backlog_bucket: bucket1).to_h { [it.subject, it.position] }) - .to eql( - bucket1_wp1.subject => nil, - bucket1_wp2.subject => 2, - bucket1_wp3.subject => 1 - ) + expect(WorkPackage.where(backlog_bucket: bucket1)).to have_positions( + bucket1_wp1 => nil, + bucket1_wp2 => 2, + bucket1_wp3 => 1 + ) - expect(WorkPackage.where(backlog_bucket: bucket2).to_h { [it.subject, it.position] }) - .to eql( - bucket2_wp1.subject => 1, - bucket2_wp2.subject => 2, - bucket2_wp3.subject => 3 - ) + expect(WorkPackage.where(backlog_bucket: bucket2)).to have_positions( + bucket2_wp1 => 1, + bucket2_wp2 => 2, + bucket2_wp3 => 3 + ) end end @@ -185,49 +177,43 @@ RSpec.describe Backlogs::WorkPackages::RebuildPositionsService, "integration", t end it "fixes the positions while keeping those that have some in the same order in all projects" do # rubocop:disable RSpec/ExampleLength - expect(WorkPackage.where(sprint: sprint1).to_h { [it.subject, it.position] }) - .to eql( - sprint1_wp2.subject => 1, - sprint1_wp3.subject => 2, - sprint1_wp4.subject => 3, - sprint1_wp1.subject => 4, - sprint1_wp5.subject => 5 - ) + expect(WorkPackage.where(sprint: sprint1)).to have_positions( + sprint1_wp2 => 1, + sprint1_wp3 => 2, + sprint1_wp4 => 3, + sprint1_wp1 => 4, + sprint1_wp5 => 5 + ) - expect(WorkPackage.where(sprint: sprint2).to_h { [it.subject, it.position] }) - .to eql( - sprint2_wp3.subject => 1, - sprint2_wp2.subject => 2, - sprint2_wp1.subject => 3 - ) + expect(WorkPackage.where(sprint: sprint2)).to have_positions( + sprint2_wp3 => 1, + sprint2_wp2 => 2, + sprint2_wp1 => 3 + ) - expect(WorkPackage.where(sprint: nil, backlog_bucket: nil, project: project1).to_h { [it.subject, it.position] }) - .to eql( - inbox_wp1.subject => 1, - inbox_wp2.subject => 2, - inbox_wp3.subject => 3 - ) + expect(WorkPackage.where(sprint: nil, backlog_bucket: nil, project: project1)).to have_positions( + inbox_wp1 => 1, + inbox_wp2 => 2, + inbox_wp3 => 3 + ) - expect(WorkPackage.where(sprint: sprint3).to_h { [it.subject, it.position] }) - .to eql( - sprint3_wp1.subject => 1, - sprint3_wp2.subject => 2, - sprint3_wp3.subject => 3 - ) + expect(WorkPackage.where(sprint: sprint3)).to have_positions( + sprint3_wp1 => 1, + sprint3_wp2 => 2, + sprint3_wp3 => 3 + ) - expect(WorkPackage.where(backlog_bucket: bucket1).to_h { [it.subject, it.position] }) - .to eql( - bucket1_wp3.subject => 1, - bucket1_wp2.subject => 2, - bucket1_wp1.subject => 3 - ) + expect(WorkPackage.where(backlog_bucket: bucket1)).to have_positions( + bucket1_wp3 => 1, + bucket1_wp2 => 2, + bucket1_wp1 => 3 + ) - expect(WorkPackage.where(backlog_bucket: bucket2).to_h { [it.subject, it.position] }) - .to eql( - bucket2_wp1.subject => 1, - bucket2_wp2.subject => 2, - bucket2_wp3.subject => 3 - ) + expect(WorkPackage.where(backlog_bucket: bucket2)).to have_positions( + bucket2_wp1 => 1, + bucket2_wp2 => 2, + bucket2_wp3 => 3 + ) end end end diff --git a/spec/support/matchers/have_attr.rb b/spec/support/matchers/have_attr.rb new file mode 100644 index 00000000000..1da3353f9cb --- /dev/null +++ b/spec/support/matchers/have_attr.rb @@ -0,0 +1,60 @@ +# frozen_string_literal: true + +# -- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +# ++ + +# When you need to check an attribute for multiple records: +# +# expect(WorkPackage.where(sprint:)).to have_attr(:position, +# wp1 => 1, +# wp2 => 2, +# wp3 => nil +# ) +# +# Specify `identified_by` attribute to be used instead of `id` to differentiate +# records in failurediff, it must be unique: +# +# expect(WorkPackage.where(sprint:)).to have_attr(:position, identified_by: :subject, +# wp1 => 1, +# wp2 => 2 +# ) +RSpec::Matchers.define :have_attr do |attribute, identified_by: :id, **expected| + match do |actual| + @actual = actual.pluck(identified_by, attribute).to_h + @expected = expected.transform_keys { it.public_send(identified_by) } + @actual == @expected + end + + diffable + + define_method(:expected) { @expected } + + failure_message do |_| + "expected #{attribute.inspect} (identified by #{identified_by.inspect}) to match" + end +end From 91c4566c556fa89b92350148010f6629336417bf Mon Sep 17 00:00:00 2001 From: Ivan Kuchin Date: Fri, 29 May 2026 21:49:28 +0200 Subject: [PATCH 010/107] chain experiment --- .../models/work_packages/position_spec.rb | 2 +- ...uild_positions_service_integration_spec.rb | 2 +- .../matchers/{have_attr.rb => pluck.rb} | 45 ++++++++++++++----- 3 files changed, 37 insertions(+), 12 deletions(-) rename spec/support/matchers/{have_attr.rb => pluck.rb} (67%) diff --git a/modules/backlogs/spec/models/work_packages/position_spec.rb b/modules/backlogs/spec/models/work_packages/position_spec.rb index 8b85499af92..b948f1ad786 100644 --- a/modules/backlogs/spec/models/work_packages/position_spec.rb +++ b/modules/backlogs/spec/models/work_packages/position_spec.rb @@ -79,7 +79,7 @@ RSpec.describe WorkPackage, "positions" do # rubocop:disable RSpec/SpecFilePathF end def have_positions(**) # rubocop:disable Naming/PredicatePrefix - have_attr(:position, identified_by: :subject, **) + pluck(:position, identified_by: :subject).eq(**) end context "when creating a work_package in a sprint" do diff --git a/modules/backlogs/spec/services/backlogs/work_packages/rebuild_positions_service_integration_spec.rb b/modules/backlogs/spec/services/backlogs/work_packages/rebuild_positions_service_integration_spec.rb index ee08ca0b527..82f617010e7 100644 --- a/modules/backlogs/spec/services/backlogs/work_packages/rebuild_positions_service_integration_spec.rb +++ b/modules/backlogs/spec/services/backlogs/work_packages/rebuild_positions_service_integration_spec.rb @@ -76,7 +76,7 @@ RSpec.describe Backlogs::WorkPackages::RebuildPositionsService, "integration", t shared_let(:bucket2_wp3) { create_work_package(subject: "Bucket 2 WorkPackage 3", backlog_bucket: bucket2, position: nil) } def have_positions(**) # rubocop:disable Naming/PredicatePrefix - have_attr(:position, identified_by: :subject, **) + pluck(:position).eq(**) end context "with the project provided" do diff --git a/spec/support/matchers/have_attr.rb b/spec/support/matchers/pluck.rb similarity index 67% rename from spec/support/matchers/have_attr.rb rename to spec/support/matchers/pluck.rb index 1da3353f9cb..6bc20650d0f 100644 --- a/spec/support/matchers/have_attr.rb +++ b/spec/support/matchers/pluck.rb @@ -30,23 +30,48 @@ # When you need to check an attribute for multiple records: # -# expect(WorkPackage.where(sprint:)).to have_attr(:position, -# wp1 => 1, -# wp2 => 2, -# wp3 => nil +# expect(WorkPackage.where(sprint:)).to pluck(:position).eq( +# sprint1_wp2 => 1, +# sprint1_wp3 => 2, +# sprint1_wp4 => 3, +# sprint1_wp1 => 4, +# sprint1_wp5 => 6 # ) # +# Fails with: +# +# 582 => 1, +# 583 => 2, +# 584 => 3, +# -585 => 6, +# +585 => 5, +# # Specify `identified_by` attribute to be used instead of `id` to differentiate # records in failurediff, it must be unique: # -# expect(WorkPackage.where(sprint:)).to have_attr(:position, identified_by: :subject, -# wp1 => 1, -# wp2 => 2 +# expect(WorkPackage.where(sprint:)).to pluck(:position, identified_by: :subject).eq( +# sprint1_wp2 => 1, +# sprint1_wp3 => 2, +# sprint1_wp4 => 3, +# sprint1_wp1 => 4, +# sprint1_wp5 => 6 # ) -RSpec::Matchers.define :have_attr do |attribute, identified_by: :id, **expected| - match do |actual| - @actual = actual.pluck(identified_by, attribute).to_h +# +# Fails with: +# +# "Sprint 1 WorkPackage 2" => 1, +# "Sprint 1 WorkPackage 3" => 2, +# "Sprint 1 WorkPackage 4" => 3, +# -"Sprint 1 WorkPackage 5" => 6, +# +"Sprint 1 WorkPackage 5" => 5, + +RSpec::Matchers.define :pluck do |attribute, identified_by: :id| + chain :eq do |expected| @expected = expected.transform_keys { it.public_send(identified_by) } + end + + match do |actual| + @actual = actual.pluck(identified_by, attribute).to_h @actual == @expected end From f1c67762551dfd9bd0502f94b388352d08da307e Mon Sep 17 00:00:00 2001 From: Eric Schubert Date: Fri, 5 Jun 2026 13:50:27 +0200 Subject: [PATCH 011/107] [#73352] added create wiki page dialog - https://community.openproject.org/work_packages/73352 - add new create wiki page dialog and form - add concept of two step dialog - consolidated search and create wiki pages into a single controller --- config/locales/en.yml | 1 + .../create_new_wiki_page_dialog.html.erb | 47 ++++++++++ .../wikis/create_new_wiki_page_dialog.rb | 78 +++++++++++++++++ .../relation_page_links_component.html.erb | 4 +- ...ages_controller.rb => pages_controller.rb} | 44 +++++++++- .../forms/wikis/create_new_wiki_page_form.rb | 85 +++++++++++++++++++ .../forms/create_new_wiki_page_form_model.rb | 46 ++++++++++ .../show.html.erb => pages/search.html.erb} | 0 modules/wikis/config/locales/en.yml | 4 + modules/wikis/config/routes.rb | 8 +- .../wikis/lib/open_project/wikis/engine.rb | 8 +- 11 files changed, 319 insertions(+), 6 deletions(-) create mode 100644 modules/wikis/app/components/wikis/create_new_wiki_page_dialog.html.erb create mode 100644 modules/wikis/app/components/wikis/create_new_wiki_page_dialog.rb rename modules/wikis/app/controllers/wikis/{search_pages_controller.rb => pages_controller.rb} (58%) create mode 100644 modules/wikis/app/forms/wikis/create_new_wiki_page_form.rb create mode 100644 modules/wikis/app/models/wikis/forms/create_new_wiki_page_form_model.rb rename modules/wikis/app/views/wikis/{search_pages/show.html.erb => pages/search.html.erb} (100%) diff --git a/config/locales/en.yml b/config/locales/en.yml index 28ed13fa8a2..7f8da22ec0d 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -2944,6 +2944,7 @@ en: button_login: "Sign in" button_move: "Move" button_move_and_follow: "Move and follow" + button_next: "Next" button_print: "Print" button_quote: "Quote" button_remove: Remove diff --git a/modules/wikis/app/components/wikis/create_new_wiki_page_dialog.html.erb b/modules/wikis/app/components/wikis/create_new_wiki_page_dialog.html.erb new file mode 100644 index 00000000000..90556381cc1 --- /dev/null +++ b/modules/wikis/app/components/wikis/create_new_wiki_page_dialog.html.erb @@ -0,0 +1,47 @@ +<%#-- copyright +OpenProject is an open source project management software. +Copyright (C) the OpenProject GmbH + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License version 3. + +OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +Copyright (C) 2006-2013 Jean-Philippe Lang +Copyright (C) 2010-2013 the ChiliProject Team + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +See COPYRIGHT and LICENSE files for more details. + +++#%> + +<%= render(Primer::Alpha::Dialog.new(id:, title: t(".title"), size: :large, **system_arguments)) do |dialog| %> + <% + dialog.with_body(classes: "Overlay-body_autocomplete_height") do + primer_form_with(**form_options) do |form| + render(::Wikis::CreateNewWikiPageForm.new(form)) + end + end + %> + + <% dialog.with_footer do %> + <%= render(Primer::Beta::Button.new(data: { "close-dialog-id": id })) { t(:button_cancel) } %> + <%= + render(Primer::Beta::Button.new(scheme: :primary, form: form_id, type: :submit)) do + show_first_step? ? t(:button_next) : t(:button_add) + end + %> + <% end %> +<% end %> diff --git a/modules/wikis/app/components/wikis/create_new_wiki_page_dialog.rb b/modules/wikis/app/components/wikis/create_new_wiki_page_dialog.rb new file mode 100644 index 00000000000..bbe6ad20015 --- /dev/null +++ b/modules/wikis/app/components/wikis/create_new_wiki_page_dialog.rb @@ -0,0 +1,78 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +module Wikis + class CreateNewWikiPageDialog < ApplicationComponent + include OpTurbo::Streamable + + attr_reader :linkable, :provider, :title + + def initialize(linkable:, provider:, title:, **) + super(nil, **) + + @linkable = linkable + @provider = provider + @title = title + end + + def id = "create-new-wiki-page-dialog" + + def form_id = "#{id}-form" + + def show_first_step? + title.blank? + end + + def form_options + { + id: form_id, + model: Forms::CreateNewWikiPageFormModel.new(linkable:, provider:, title:), + url: form_url, + data: { + turbo_frame: WorkPackageWikisTabComponent::TURBO_FRAME_ID + } + } + end + + def system_arguments + options + end + + private + + def form_url + if show_first_step? + continue_create_new_page_dialog_wiki_pages_path + else + create_and_link_wiki_pages_path + end + end + end +end diff --git a/modules/wikis/app/components/wikis/relation_page_links_component.html.erb b/modules/wikis/app/components/wikis/relation_page_links_component.html.erb index bdbb740acae..9dcea1dc8d6 100644 --- a/modules/wikis/app/components/wikis/relation_page_links_component.html.erb +++ b/modules/wikis/app/components/wikis/relation_page_links_component.html.erb @@ -52,7 +52,9 @@ See COPYRIGHT and LICENSE files for more details. ) menu.with_item( label: t(".link_new"), - disabled: true # work in progress + tag: :a, + href: create_new_page_dialog_wiki_pages_path(linkable: work_package, provider:), + content_arguments: { data: { controller: "async-dialog" } } ) end end diff --git a/modules/wikis/app/controllers/wikis/search_pages_controller.rb b/modules/wikis/app/controllers/wikis/pages_controller.rb similarity index 58% rename from modules/wikis/app/controllers/wikis/search_pages_controller.rb rename to modules/wikis/app/controllers/wikis/pages_controller.rb index 636d2f1338b..27b2fed99ae 100644 --- a/modules/wikis/app/controllers/wikis/search_pages_controller.rb +++ b/modules/wikis/app/controllers/wikis/pages_controller.rb @@ -29,14 +29,38 @@ #++ module Wikis - class SearchPagesController < ApplicationController + class PagesController < ApplicationController + include OpTurbo::ComponentStream include Dry::Monads[:result] + before_action :authorize, except: %i[search] + # The search is project independent and thus permission independent. The user will see results according to # the permissions set in each wiki. - no_authorization_required! :show + no_authorization_required! :search - def show + def create_and_link + # TODO: implement service to create page and link + render_error_flash_message_via_turbo_stream( + message: "Not implemented yet. Trying to create a new page with #{create_new_page_params.to_h}" + ) + respond_to_with_turbo_streams + end + + def create_new_page_dialog + linkable = WorkPackage.visible.find(params.expect(:linkable)) + provider = Provider.visible.find(params.expect(:provider)) + respond_with_dialog Wikis::CreateNewWikiPageDialog.new(linkable:, provider:, title: nil) + end + + def continue_create_new_page_dialog + params = create_new_page_params + linkable = WorkPackage.visible.find(params[:linkable_id]) + provider = Provider.visible.find(params[:provider_id]) + respond_with_dialog Wikis::CreateNewWikiPageDialog.new(linkable:, provider:, title: params[:title]) + end + + def search provider = Provider.visible.find(params.expect(:provider_id)) query = params[:query] form_name = params[:name] @@ -57,5 +81,19 @@ module Wikis end end end + + def create_new_page_params + params.expect(wikis_forms_create_new_wiki_page_form_model: %i[provider_id linkable_type linkable_id title]) + .merge(parent_page_identifier: parse_identifier(params[:wiki_page_selection])) + end + + def parse_identifier(wiki_page_selection) + case wiki_page_selection + in [selected_page] + MultiJson.load(selected_page, symbolize_keys: true)[:value] + else + nil + end + end end end diff --git a/modules/wikis/app/forms/wikis/create_new_wiki_page_form.rb b/modules/wikis/app/forms/wikis/create_new_wiki_page_form.rb new file mode 100644 index 00000000000..7429568bfb9 --- /dev/null +++ b/modules/wikis/app/forms/wikis/create_new_wiki_page_form.rb @@ -0,0 +1,85 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +module Wikis + class CreateNewWikiPageForm < ApplicationForm + form do |f| + f.hidden(name: :provider_id) + f.hidden(name: :linkable_type) + f.hidden(name: :linkable_id) + + if first_step? + f.text_field(name: :title, label: I18n.t("wikis.create_new_wiki_page_dialog.page_title"), required: true) + else + f.hidden(name: :title) + + f.html_content do + render(Primer::Beta::Text.new) { I18n.t("wikis.create_new_wiki_page_dialog.parent_help_text") } + end + + f.html_content do + render( + Primer::OpenProject::FilterableTreeView.new( + src: helpers.search_wiki_pages_path(provider_id: model.provider_id, name: "wiki_page_selection"), + form_arguments: { builder: rails_builder(f), name: "wiki_page_selection" }, + filter_mode_control_arguments: { hidden: true }, + filter_input_arguments: { + placeholder: I18n.t("wikis.link_existing_wiki_page_form.placeholder"), + # every other property is just refilling the default values, + # as those are not merged into custom arguments + name: :filter, + label: I18n.t(:button_filter), + type: :search, + leading_visual: { icon: :search }, + visually_hide_label: true, + show_clear_button: true + }, + include_sub_items_check_box_arguments: { hidden: true }, + no_results_node_arguments: { label: I18n.t("wikis.link_existing_wiki_page_form.no_results") } + ) + ) + end + end + end + + private + + # Primer's FormObject stores the underlying ActionView/Primer form builder + # as @builder. FilterableTreeView requires an ActionView::FormBuilder to + # generate its hidden form inputs via hidden_field. + def rails_builder(form) + form.instance_variable_get(:@builder) + end + + def first_step? + model.title.blank? + end + end +end diff --git a/modules/wikis/app/models/wikis/forms/create_new_wiki_page_form_model.rb b/modules/wikis/app/models/wikis/forms/create_new_wiki_page_form_model.rb new file mode 100644 index 00000000000..ea44329e029 --- /dev/null +++ b/modules/wikis/app/models/wikis/forms/create_new_wiki_page_form_model.rb @@ -0,0 +1,46 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +module Wikis + module Forms + class CreateNewWikiPageFormModel + extend ActiveModel::Naming + + attr_reader :linkable_id, :linkable_type, :provider_id, :title + + def initialize(linkable:, provider:, title:) + @linkable_id = linkable.id + @linkable_type = linkable.class.name + @provider_id = provider.id + @title = title + end + end + end +end diff --git a/modules/wikis/app/views/wikis/search_pages/show.html.erb b/modules/wikis/app/views/wikis/pages/search.html.erb similarity index 100% rename from modules/wikis/app/views/wikis/search_pages/show.html.erb rename to modules/wikis/app/views/wikis/pages/search.html.erb diff --git a/modules/wikis/config/locales/en.yml b/modules/wikis/config/locales/en.yml index 34bd78b1bbb..413b0063f32 100644 --- a/modules/wikis/config/locales/en.yml +++ b/modules/wikis/config/locales/en.yml @@ -50,6 +50,10 @@ en: delete_relation_page_link_confirmation_dialog: title: Delete related wiki page link heading: Delete related wiki page link? + create_new_wiki_page_dialog: + title: Create new wiki page + page_title: Title + parent_help_text: Select a parent for this new wiki page. health_checks: authentication: existing_token: User token diff --git a/modules/wikis/config/routes.rb b/modules/wikis/config/routes.rb index 242e3c63458..767a6d72acc 100644 --- a/modules/wikis/config/routes.rb +++ b/modules/wikis/config/routes.rb @@ -62,6 +62,7 @@ Rails.application.routes.draw do resources :relation_wiki_page_links, only: %i[create destroy], controller: "wikis/relation_page_links" do collection do get :link_existing_dialog + post :create_and_link_new_wiki_page end member do @@ -73,5 +74,10 @@ Rails.application.routes.draw do get :load end - resource :search_wiki_pages, controller: "wikis/search_pages", only: %i[show] + resource :wiki_pages, controller: "wikis/pages", only: [] do + get :search + get :create_new_page_dialog + post :continue_create_new_page_dialog + post :create_and_link + end end diff --git a/modules/wikis/lib/open_project/wikis/engine.rb b/modules/wikis/lib/open_project/wikis/engine.rb index a8ce614c2cb..cb7ff2a78b1 100644 --- a/modules/wikis/lib/open_project/wikis/engine.rb +++ b/modules/wikis/lib/open_project/wikis/engine.rb @@ -73,7 +73,13 @@ module OpenProject::Wikis project_module :work_package_tracking do permission :manage_wiki_page_links, { - "wikis/relation_page_links": %i[create destroy confirm_delete_dialog link_existing_dialog] + "wikis/pages": %i[create_and_link + create_new_page_dialog + continue_create_new_page_dialog], + "wikis/relation_page_links": %i[create + destroy + confirm_delete_dialog + link_existing_dialog] }, permissible_on: :project, dependencies: %i[edit_work_packages], From 524d0ee347264b32e0a26ee152f695e70220f027 Mon Sep 17 00:00:00 2001 From: Eric Schubert Date: Fri, 5 Jun 2026 15:04:51 +0200 Subject: [PATCH 012/107] [#73352] change title accessor to page title --- .../components/wikis/create_new_wiki_page_dialog.rb | 10 +++++----- .../wikis/app/controllers/wikis/pages_controller.rb | 6 +++--- .../wikis/app/forms/wikis/create_new_wiki_page_form.rb | 6 +++--- .../wikis/forms/create_new_wiki_page_form_model.rb | 6 +++--- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/modules/wikis/app/components/wikis/create_new_wiki_page_dialog.rb b/modules/wikis/app/components/wikis/create_new_wiki_page_dialog.rb index bbe6ad20015..aef06d64e95 100644 --- a/modules/wikis/app/components/wikis/create_new_wiki_page_dialog.rb +++ b/modules/wikis/app/components/wikis/create_new_wiki_page_dialog.rb @@ -32,14 +32,14 @@ module Wikis class CreateNewWikiPageDialog < ApplicationComponent include OpTurbo::Streamable - attr_reader :linkable, :provider, :title + attr_reader :linkable, :provider, :page_title - def initialize(linkable:, provider:, title:, **) + def initialize(linkable:, provider:, page_title:, **) super(nil, **) @linkable = linkable @provider = provider - @title = title + @page_title = page_title end def id = "create-new-wiki-page-dialog" @@ -47,13 +47,13 @@ module Wikis def form_id = "#{id}-form" def show_first_step? - title.blank? + page_title.blank? end def form_options { id: form_id, - model: Forms::CreateNewWikiPageFormModel.new(linkable:, provider:, title:), + model: Forms::CreateNewWikiPageFormModel.new(linkable:, provider:, page_title:), url: form_url, data: { turbo_frame: WorkPackageWikisTabComponent::TURBO_FRAME_ID diff --git a/modules/wikis/app/controllers/wikis/pages_controller.rb b/modules/wikis/app/controllers/wikis/pages_controller.rb index 27b2fed99ae..7e9b1e29388 100644 --- a/modules/wikis/app/controllers/wikis/pages_controller.rb +++ b/modules/wikis/app/controllers/wikis/pages_controller.rb @@ -50,14 +50,14 @@ module Wikis def create_new_page_dialog linkable = WorkPackage.visible.find(params.expect(:linkable)) provider = Provider.visible.find(params.expect(:provider)) - respond_with_dialog Wikis::CreateNewWikiPageDialog.new(linkable:, provider:, title: nil) + respond_with_dialog Wikis::CreateNewWikiPageDialog.new(linkable:, provider:, page_title: nil) end def continue_create_new_page_dialog params = create_new_page_params linkable = WorkPackage.visible.find(params[:linkable_id]) provider = Provider.visible.find(params[:provider_id]) - respond_with_dialog Wikis::CreateNewWikiPageDialog.new(linkable:, provider:, title: params[:title]) + respond_with_dialog Wikis::CreateNewWikiPageDialog.new(linkable:, provider:, page_title: params[:page_title]) end def search @@ -83,7 +83,7 @@ module Wikis end def create_new_page_params - params.expect(wikis_forms_create_new_wiki_page_form_model: %i[provider_id linkable_type linkable_id title]) + params.expect(wikis_forms_create_new_wiki_page_form_model: %i[provider_id linkable_type linkable_id page_title]) .merge(parent_page_identifier: parse_identifier(params[:wiki_page_selection])) end diff --git a/modules/wikis/app/forms/wikis/create_new_wiki_page_form.rb b/modules/wikis/app/forms/wikis/create_new_wiki_page_form.rb index 7429568bfb9..e0f2791a84f 100644 --- a/modules/wikis/app/forms/wikis/create_new_wiki_page_form.rb +++ b/modules/wikis/app/forms/wikis/create_new_wiki_page_form.rb @@ -36,9 +36,9 @@ module Wikis f.hidden(name: :linkable_id) if first_step? - f.text_field(name: :title, label: I18n.t("wikis.create_new_wiki_page_dialog.page_title"), required: true) + f.text_field(name: :page_title, label: I18n.t("wikis.create_new_wiki_page_dialog.page_title"), required: true) else - f.hidden(name: :title) + f.hidden(name: :page_title) f.html_content do render(Primer::Beta::Text.new) { I18n.t("wikis.create_new_wiki_page_dialog.parent_help_text") } @@ -79,7 +79,7 @@ module Wikis end def first_step? - model.title.blank? + model.page_title.blank? end end end diff --git a/modules/wikis/app/models/wikis/forms/create_new_wiki_page_form_model.rb b/modules/wikis/app/models/wikis/forms/create_new_wiki_page_form_model.rb index ea44329e029..ed731cadf95 100644 --- a/modules/wikis/app/models/wikis/forms/create_new_wiki_page_form_model.rb +++ b/modules/wikis/app/models/wikis/forms/create_new_wiki_page_form_model.rb @@ -33,13 +33,13 @@ module Wikis class CreateNewWikiPageFormModel extend ActiveModel::Naming - attr_reader :linkable_id, :linkable_type, :provider_id, :title + attr_reader :linkable_id, :linkable_type, :provider_id, :page_title - def initialize(linkable:, provider:, title:) + def initialize(linkable:, provider:, page_title:) @linkable_id = linkable.id @linkable_type = linkable.class.name @provider_id = provider.id - @title = title + @page_title = page_title end end end From 55e43c43571d47d898b4301f792f386a65c93907 Mon Sep 17 00:00:00 2001 From: Eric Schubert Date: Fri, 5 Jun 2026 15:14:24 +0200 Subject: [PATCH 013/107] [#73352] reordered yml file --- modules/wikis/config/locales/en.yml | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/modules/wikis/config/locales/en.yml b/modules/wikis/config/locales/en.yml index 413b0063f32..00311950146 100644 --- a/modules/wikis/config/locales/en.yml +++ b/modules/wikis/config/locales/en.yml @@ -40,20 +40,13 @@ en: open_wiki: Open wiki save_and_continue: Save and continue wiki_page: Wiki page - instructions: - xwiki: - integration: XWiki Administration - oauth_application_details_html: The client secret value will not be accessible again after you close this window. Please copy these values into the [XWiki OpenProject Integration settings](xwiki_admin_link). - provider_types: - xwiki: - name: XWiki + create_new_wiki_page_dialog: + page_title: Title + parent_help_text: Select a parent for this new wiki page. + title: Create new wiki page delete_relation_page_link_confirmation_dialog: title: Delete related wiki page link heading: Delete related wiki page link? - create_new_wiki_page_dialog: - title: Create new wiki page - page_title: Title - parent_help_text: Select a parent for this new wiki page. health_checks: authentication: existing_token: User token @@ -68,6 +61,10 @@ en: xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. xwiki_oauth_unauthorized: The user token was not recognized by XWiki. + instructions: + xwiki: + integration: XWiki Administration + oauth_application_details_html: The client secret value will not be accessible again after you close this window. Please copy these values into the [XWiki OpenProject Integration settings](xwiki_admin_link). link_existing_wiki_page_dialog: title: Add existing wiki page link_existing_wiki_page_form: @@ -83,6 +80,9 @@ en: unexpected: An unexpected error occurred page_link_component: remove: Remove page link + provider_types: + xwiki: + name: XWiki relation_page_links_component: link_existing: Existing wiki page link_new: New wiki page From 7c3cd3953a5fac3acb42bde19d05688d81c0f7a0 Mon Sep 17 00:00:00 2001 From: Eric Schubert Date: Fri, 5 Jun 2026 15:37:38 +0200 Subject: [PATCH 014/107] [#73352] use form model as dialog component model - initialize the form models in the controller --- .../wikis/create_new_wiki_page_dialog.rb | 14 ++------------ .../app/controllers/wikis/pages_controller.rb | 14 ++++++++++---- .../wikis/forms/create_new_wiki_page_form_model.rb | 8 ++++---- modules/wikis/config/routes.rb | 1 - 4 files changed, 16 insertions(+), 21 deletions(-) diff --git a/modules/wikis/app/components/wikis/create_new_wiki_page_dialog.rb b/modules/wikis/app/components/wikis/create_new_wiki_page_dialog.rb index aef06d64e95..4a53280b601 100644 --- a/modules/wikis/app/components/wikis/create_new_wiki_page_dialog.rb +++ b/modules/wikis/app/components/wikis/create_new_wiki_page_dialog.rb @@ -32,28 +32,18 @@ module Wikis class CreateNewWikiPageDialog < ApplicationComponent include OpTurbo::Streamable - attr_reader :linkable, :provider, :page_title - - def initialize(linkable:, provider:, page_title:, **) - super(nil, **) - - @linkable = linkable - @provider = provider - @page_title = page_title - end - def id = "create-new-wiki-page-dialog" def form_id = "#{id}-form" def show_first_step? - page_title.blank? + model.page_title.blank? end def form_options { id: form_id, - model: Forms::CreateNewWikiPageFormModel.new(linkable:, provider:, page_title:), + model:, url: form_url, data: { turbo_frame: WorkPackageWikisTabComponent::TURBO_FRAME_ID diff --git a/modules/wikis/app/controllers/wikis/pages_controller.rb b/modules/wikis/app/controllers/wikis/pages_controller.rb index 7e9b1e29388..290b823eb68 100644 --- a/modules/wikis/app/controllers/wikis/pages_controller.rb +++ b/modules/wikis/app/controllers/wikis/pages_controller.rb @@ -50,14 +50,20 @@ module Wikis def create_new_page_dialog linkable = WorkPackage.visible.find(params.expect(:linkable)) provider = Provider.visible.find(params.expect(:provider)) - respond_with_dialog Wikis::CreateNewWikiPageDialog.new(linkable:, provider:, page_title: nil) + form_object = Forms::CreateNewWikiPageFormModel.new(linkable_id: linkable.id, + linkable_type: linkable.class.name, + provider_id: provider.id, + page_title: nil) + respond_with_dialog Wikis::CreateNewWikiPageDialog.new(form_object) end def continue_create_new_page_dialog params = create_new_page_params - linkable = WorkPackage.visible.find(params[:linkable_id]) - provider = Provider.visible.find(params[:provider_id]) - respond_with_dialog Wikis::CreateNewWikiPageDialog.new(linkable:, provider:, page_title: params[:page_title]) + form_object = Forms::CreateNewWikiPageFormModel.new(linkable_id: params[:linkable_id], + linkable_type: params[:linkable_type], + provider_id: params[:provider_id], + page_title: params[:page_title]) + respond_with_dialog Wikis::CreateNewWikiPageDialog.new(form_object) end def search diff --git a/modules/wikis/app/models/wikis/forms/create_new_wiki_page_form_model.rb b/modules/wikis/app/models/wikis/forms/create_new_wiki_page_form_model.rb index ed731cadf95..d3553a24aa4 100644 --- a/modules/wikis/app/models/wikis/forms/create_new_wiki_page_form_model.rb +++ b/modules/wikis/app/models/wikis/forms/create_new_wiki_page_form_model.rb @@ -35,10 +35,10 @@ module Wikis attr_reader :linkable_id, :linkable_type, :provider_id, :page_title - def initialize(linkable:, provider:, page_title:) - @linkable_id = linkable.id - @linkable_type = linkable.class.name - @provider_id = provider.id + def initialize(linkable_id:, linkable_type:, provider_id:, page_title:) + @linkable_id = linkable_id + @linkable_type = linkable_type + @provider_id = provider_id @page_title = page_title end end diff --git a/modules/wikis/config/routes.rb b/modules/wikis/config/routes.rb index 767a6d72acc..3ed715835be 100644 --- a/modules/wikis/config/routes.rb +++ b/modules/wikis/config/routes.rb @@ -62,7 +62,6 @@ Rails.application.routes.draw do resources :relation_wiki_page_links, only: %i[create destroy], controller: "wikis/relation_page_links" do collection do get :link_existing_dialog - post :create_and_link_new_wiki_page end member do From 17b345391a20361f919dec5e3300051f140ae86c Mon Sep 17 00:00:00 2001 From: ulferts Date: Fri, 5 Jun 2026 17:28:27 +0200 Subject: [PATCH 015/107] extract container data loading into concern --- .../backlogs/backlog_controller.rb | 30 +-------- .../backlogs/concerns/container_loading.rb | 67 +++++++++++++++++++ .../backlogs/work_packages_controller.rb | 12 ++-- 3 files changed, 75 insertions(+), 34 deletions(-) create mode 100644 modules/backlogs/app/controllers/backlogs/concerns/container_loading.rb diff --git a/modules/backlogs/app/controllers/backlogs/backlog_controller.rb b/modules/backlogs/app/controllers/backlogs/backlog_controller.rb index 70bac33d5d4..7bb07b35f7e 100644 --- a/modules/backlogs/app/controllers/backlogs/backlog_controller.rb +++ b/modules/backlogs/app/controllers/backlogs/backlog_controller.rb @@ -31,6 +31,7 @@ module Backlogs class BacklogController < BaseController include WorkPackages::WithSplitView + include Backlogs::Concerns::ContainerLoading current_menu_item %i[show details] do :backlog @@ -39,7 +40,7 @@ module Backlogs def show case turbo_frame_request_id when "backlogs_container" - load_backlogs + load_container_data render partial: "backlogs/backlog/backlog_list", layout: false else @@ -51,7 +52,7 @@ module Backlogs if turbo_frame_request? render "work_packages/split_view", layout: false else - load_backlogs + load_container_data render "backlogs/backlog/show" end @@ -62,30 +63,5 @@ module Backlogs def split_view_base_route project_backlogs_backlog_path(@project, request.query_parameters) end - - def load_backlogs - @backlog_buckets = BacklogBucket.for_project(@project) - - @sprints = Sprint.for_project(@project) - .not_completed - .order_by_date - .includes(:project, :task_boards) - @active_sprint_ids = @sprints.select(&:active?).map(&:id) - - @work_packages_by_sprint_id = WorkPackage - .where(sprint: @sprints, project: @project) - .includes(:type, :status, :assigned_to, :priority, :parent) - .order_by_position - .group_by(&:sprint_id) - - # Includes the work packages of both the buckets and the inbox. - # This has the drawback of loading more work packages than are displayed in the inbox as pagination - # will only show the top 50 and lowest 10 work packages. - # But doing only a single query to the database has its benefits, and currently this seems quicker. - @work_packages_by_backlog_id = WorkPackage - .in_backlog_for(project: @project) - .includes(:type, :status, :assigned_to, :priority, :parent) - .group_by(&:backlog_bucket_id) - end end end diff --git a/modules/backlogs/app/controllers/backlogs/concerns/container_loading.rb b/modules/backlogs/app/controllers/backlogs/concerns/container_loading.rb new file mode 100644 index 00000000000..e383a2afbc1 --- /dev/null +++ b/modules/backlogs/app/controllers/backlogs/concerns/container_loading.rb @@ -0,0 +1,67 @@ +# frozen_string_literal: true + +# -- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +# ++ + +module Backlogs::Concerns + module ContainerLoading + extend ActiveSupport::Concern + + def load_container_data + load_sprint_data + load_backlog_data + end + + def load_sprint_data + @sprints = Sprint.for_project(@project) + .not_completed + .order_by_date + .includes(:project, :task_boards) + @active_sprint_ids = @sprints.select(&:active?).map(&:id) + + @work_packages_by_sprint_id = WorkPackage + .where(sprint: @sprints, project: @project) + .includes(:type, :status, :assigned_to, :priority, :parent) + .order_by_position + .group_by(&:sprint_id) + end + + def load_backlog_data + @backlog_buckets = BacklogBucket.for_project(@project) + + # Includes the work packages of both the buckets and the inbox. + # This has the drawback of loading more work packages than are displayed in the inbox as pagination + # will only show the top 50 and lowest 10 work packages. + # But doing only a single query (+ includes) to the database has its benefits, and currently this seems quicker. + @work_packages_by_backlog_id = WorkPackage + .in_backlog_for(project: @project) + .includes(:type, :status, :assigned_to, :priority, :parent) + .group_by(&:backlog_bucket_id) + end + end +end diff --git a/modules/backlogs/app/controllers/backlogs/work_packages_controller.rb b/modules/backlogs/app/controllers/backlogs/work_packages_controller.rb index 6fd55cdcb3a..00cb1f97d2d 100644 --- a/modules/backlogs/app/controllers/backlogs/work_packages_controller.rb +++ b/modules/backlogs/app/controllers/backlogs/work_packages_controller.rb @@ -31,6 +31,7 @@ module Backlogs class WorkPackagesController < BaseController include OpTurbo::ComponentStream + include Backlogs::Concerns::ContainerLoading before_action :load_work_package @@ -104,14 +105,11 @@ module Backlogs end def backlog_component - buckets = BacklogBucket.for_project(@project) + load_backlog_data - work_packages_by_backlog_id = WorkPackage - .in_backlog_for(project: @project) - .includes(:type, :status, :assigned_to, :priority, :parent) - .group_by(&:backlog_bucket_id) - - Backlogs::BacklogComponent.new(buckets:, work_packages_by_backlog_id:, project: @project) + Backlogs::BacklogComponent.new(buckets: @backlog_buckets, + work_packages_by_backlog_id: @work_packages_by_backlog_id, + project: @project) end def load_work_package From 63191fd88f93590e81ee08aa3e0d2b7dc97c1ec8 Mon Sep 17 00:00:00 2001 From: ulferts Date: Fri, 5 Jun 2026 17:29:47 +0200 Subject: [PATCH 016/107] dedicated scope for inbox of project --- .../backlogs/work_packages_controller.rb | 2 +- .../work_packages/scopes/in_inbox_for.rb | 40 ++++++ .../backlogs/patches/work_package_patch.rb | 1 + .../work_packages/scopes/in_inbox_for_spec.rb | 127 ++++++++++++++++++ 4 files changed, 169 insertions(+), 1 deletion(-) create mode 100644 modules/backlogs/app/models/work_packages/scopes/in_inbox_for.rb create mode 100644 modules/backlogs/spec/models/work_packages/scopes/in_inbox_for_spec.rb diff --git a/modules/backlogs/app/controllers/backlogs/work_packages_controller.rb b/modules/backlogs/app/controllers/backlogs/work_packages_controller.rb index 00cb1f97d2d..d3b756294cd 100644 --- a/modules/backlogs/app/controllers/backlogs/work_packages_controller.rb +++ b/modules/backlogs/app/controllers/backlogs/work_packages_controller.rb @@ -127,7 +127,7 @@ module Backlogs elsif @work_package.backlog_bucket_id? @work_packages.merge(@work_package.backlog_bucket.displayed_work_packages) else - @work_packages.merge(WorkPackage.in_backlog_for(project: @project).where(backlog_bucket_id: nil)) + @work_packages.merge(WorkPackage.in_inbox_for(project: @project)) end end end diff --git a/modules/backlogs/app/models/work_packages/scopes/in_inbox_for.rb b/modules/backlogs/app/models/work_packages/scopes/in_inbox_for.rb new file mode 100644 index 00000000000..16a13cce5d5 --- /dev/null +++ b/modules/backlogs/app/models/work_packages/scopes/in_inbox_for.rb @@ -0,0 +1,40 @@ +# frozen_string_literal: true + +# -- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +# ++ + +module WorkPackages::Scopes::InInboxFor + extend ActiveSupport::Concern + + class_methods do + def in_inbox_for(project:) + in_backlog_for(project:) + .where(backlog_bucket: nil) + end + end +end diff --git a/modules/backlogs/lib/open_project/backlogs/patches/work_package_patch.rb b/modules/backlogs/lib/open_project/backlogs/patches/work_package_patch.rb index f793d1808f6..2f2e7a18879 100644 --- a/modules/backlogs/lib/open_project/backlogs/patches/work_package_patch.rb +++ b/modules/backlogs/lib/open_project/backlogs/patches/work_package_patch.rb @@ -49,6 +49,7 @@ module OpenProject::Backlogs::Patches::WorkPackagePatch include OpenProject::Backlogs::List scopes :in_backlog_for + scopes :in_inbox_for scopes :with_backlogs_neighbours scopes :without_status_considered_closed scopes :without_excluded_type diff --git a/modules/backlogs/spec/models/work_packages/scopes/in_inbox_for_spec.rb b/modules/backlogs/spec/models/work_packages/scopes/in_inbox_for_spec.rb new file mode 100644 index 00000000000..c53c1f50784 --- /dev/null +++ b/modules/backlogs/spec/models/work_packages/scopes/in_inbox_for_spec.rb @@ -0,0 +1,127 @@ +# frozen_string_literal: true + +# -- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +# ++ + +require "spec_helper" + +RSpec.describe WorkPackages::Scopes::InInboxFor do + shared_let(:open_status) { create(:status, is_closed: false) } + shared_let(:closed_status) { create(:status, is_closed: true) } + shared_let(:excluded_type) { create(:type_task) } + shared_let(:excluded_status) { create(:status, is_closed: false) } + shared_let(:project) do + create(:project, + enabled_module_names: %w(work_package_tracking backlogs), + backlog_considered_closed_statuses: [closed_status]) do |p| + p.backlog_excluded_types << excluded_type + p.done_statuses << excluded_status + end + end + shared_let(:other_project) { create(:project) } + + shared_let(:sprint) { create(:sprint, project:) } + shared_let(:backlog_bucket) { create(:backlog_bucket, project:) } + + # Deliberately placed out of order. The before block further down will reorder them. + shared_let(:open_inbox_wp4) do + create(:work_package, subject: "Open Inbox 4", project:, status: open_status, sprint: nil, backlog_bucket: nil) + end + shared_let(:open_inbox_wp2) do + create(:work_package, subject: "Open Inbox 2", project:, status: open_status, sprint: nil, backlog_bucket: nil) + end + shared_let(:open_inbox_wp1) do + create(:work_package, subject: "Open Inbox 1", project:, status: open_status, sprint: nil, backlog_bucket: nil) + end + shared_let(:open_inbox_wp3) do + create(:work_package, subject: "Open Inbox 3", project:, status: open_status, sprint: nil, backlog_bucket: nil) + end + shared_let(:closed_inbox_wp) do + create(:work_package, status: closed_status, project:, sprint: nil, backlog_bucket: nil) + end + shared_let(:excluded_type_inbox_wp) do + create(:work_package, type: excluded_type, project:, status: open_status, sprint: nil, backlog_bucket: nil) + end + shared_let(:excluded_status_inbox_wp) do + create(:work_package, status: excluded_status, project:, sprint: nil, backlog_bucket: nil) + end + + shared_let(:open_bucket_wp) do + create(:work_package, subject: "Bucket", project:, status: open_status, sprint: nil, backlog_bucket:) + end + shared_let(:sprint_wp) do + create(:work_package, project:, status: open_status, sprint:, backlog_bucket: nil) + end + + # This is invalid as buckets are not shared. + # It is nevertheless added + shared_let(:other_project_wp) do + create(:work_package, project: other_project, status: open_status, sprint: nil, backlog_bucket:) + end + + shared_let(:user_with_permission) do + create(:user, member_with_permissions: { project => %i[view_work_packages], other_project => %i[view_work_packages] }) + end + + current_user { user_with_permission } + + subject(:backlog) { WorkPackage.in_inbox_for(project:) } + + describe ".in_inbox_for" do + before do + open_inbox_wp1.update_column(:position, 1) + open_inbox_wp2.update_column(:position, 2) + open_inbox_wp3.update_column(:position, 3) + open_inbox_wp4.update_column(:position, 4) + end + + it "returns open work packages of the backlog inbox that are not excluded by type or status" do + # Excludes: + # - closed + # - excluded type + # - excluded status + # - in sprint + # - in other project + expect(backlog) + .to eq([ + open_inbox_wp1, + open_inbox_wp2, + open_inbox_wp3, + open_inbox_wp4 + ]) + end + + context "when the user is not allowed to view work packages" do + current_user { create(:user) } + + it "returns an empty relation" do + expect(backlog).to be_empty + end + end + end +end From d5280b7b550831b90d586d4ea39d9edd9ec57ab1 Mon Sep 17 00:00:00 2001 From: ulferts Date: Fri, 5 Jun 2026 17:31:12 +0200 Subject: [PATCH 017/107] extract methods --- .../app/components/backlogs/backlog_component.html.erb | 4 ++-- .../backlogs/app/components/backlogs/backlog_component.rb | 8 ++++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/modules/backlogs/app/components/backlogs/backlog_component.html.erb b/modules/backlogs/app/components/backlogs/backlog_component.html.erb index 3e7cff65308..a76327a93a3 100644 --- a/modules/backlogs/app/components/backlogs/backlog_component.html.erb +++ b/modules/backlogs/app/components/backlogs/backlog_component.html.erb @@ -80,13 +80,13 @@ See COPYRIGHT and LICENSE files for more details. render Backlogs::BucketComponent.new( project:, backlog_bucket: bucket, - work_packages: work_packages_by_backlog_id[bucket.id] || [] + work_packages: work_packages_for(bucket) ) %> <% end %> <%= render Backlogs::InboxComponent.new( - work_packages: work_packages_by_backlog_id[nil] || [], + work_packages: work_packages_for_inbox, project: project ) %> diff --git a/modules/backlogs/app/components/backlogs/backlog_component.rb b/modules/backlogs/app/components/backlogs/backlog_component.rb index 29c525da82e..cd3ec8e9b3e 100644 --- a/modules/backlogs/app/components/backlogs/backlog_component.rb +++ b/modules/backlogs/app/components/backlogs/backlog_component.rb @@ -57,5 +57,13 @@ module Backlogs def total @total ||= work_packages_by_backlog_id.values.sum(&:count) end + + def work_packages_for_inbox + work_packages_by_backlog_id[nil] || [] + end + + def work_packages_for(bucket) + work_packages_by_backlog_id[bucket.id] || [] + end end end From 8cf295af21bb702a12c32c2b42c665d40a8ed723 Mon Sep 17 00:00:00 2001 From: ulferts Date: Fri, 5 Jun 2026 17:31:37 +0200 Subject: [PATCH 018/107] remove collection param declaration as that is no longer used --- modules/backlogs/app/components/backlogs/bucket_component.rb | 2 -- 1 file changed, 2 deletions(-) diff --git a/modules/backlogs/app/components/backlogs/bucket_component.rb b/modules/backlogs/app/components/backlogs/bucket_component.rb index 3e416d63cf0..b771ca79580 100644 --- a/modules/backlogs/app/components/backlogs/bucket_component.rb +++ b/modules/backlogs/app/components/backlogs/bucket_component.rb @@ -34,8 +34,6 @@ module Backlogs include OpTurbo::Streamable include CommonHelper - with_collection_parameter :backlog_bucket - attr_reader :backlog_bucket, :work_packages, :project, :current_user def initialize(backlog_bucket:, project:, work_packages: nil, current_user: User.current) From fc5335055940ae00caf7d06f0e13d5d42372dbe5 Mon Sep 17 00:00:00 2001 From: ulferts Date: Fri, 5 Jun 2026 17:33:20 +0200 Subject: [PATCH 019/107] remove dead AR fallback code --- modules/backlogs/app/components/backlogs/inbox_component.rb | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/modules/backlogs/app/components/backlogs/inbox_component.rb b/modules/backlogs/app/components/backlogs/inbox_component.rb index d397231756e..a802cfdf550 100644 --- a/modules/backlogs/app/components/backlogs/inbox_component.rb +++ b/modules/backlogs/app/components/backlogs/inbox_component.rb @@ -68,11 +68,7 @@ module Backlogs end def last_omitted_id - if work_packages.respond_to?(:reverse_order) - work_packages.reverse_order.offset(tail_size).limit(1).pick(:id) - else - work_packages[-(tail_size + 1)]&.id - end + work_packages[-(tail_size + 1)]&.id end private From 58d0d86d1345dd16b89e3a815d2519e4eabc4108 Mon Sep 17 00:00:00 2001 From: ulferts Date: Fri, 5 Jun 2026 17:34:01 +0200 Subject: [PATCH 020/107] move includes on fallbacks into bucket and sprint component --- modules/backlogs/app/components/backlogs/bucket_component.rb | 1 + modules/backlogs/app/components/backlogs/sprint_component.rb | 4 ++-- modules/backlogs/app/models/backlog_bucket.rb | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/modules/backlogs/app/components/backlogs/bucket_component.rb b/modules/backlogs/app/components/backlogs/bucket_component.rb index b771ca79580..579d5c6ce23 100644 --- a/modules/backlogs/app/components/backlogs/bucket_component.rb +++ b/modules/backlogs/app/components/backlogs/bucket_component.rb @@ -43,6 +43,7 @@ module Backlogs @project = project @current_user = current_user @work_packages = work_packages || backlog_bucket.displayed_work_packages + .includes(:status, :type, :assigned_to, :priority, :parent) end def wrapper_uniq_by diff --git a/modules/backlogs/app/components/backlogs/sprint_component.rb b/modules/backlogs/app/components/backlogs/sprint_component.rb index 7a793ce6fbf..dbc92a0e984 100644 --- a/modules/backlogs/app/components/backlogs/sprint_component.rb +++ b/modules/backlogs/app/components/backlogs/sprint_component.rb @@ -46,8 +46,8 @@ module Backlogs @project = project @current_user = current_user @active_sprint_ids = active_sprint_ids - @work_packages = work_packages || sprint.work_packages_for(project).includes(:status, :type, :assigned_to, :priority, - :parent) + @work_packages = work_packages || sprint.work_packages_for(project) + .includes(:status, :type, :assigned_to, :priority, :parent) end def wrapper_uniq_by diff --git a/modules/backlogs/app/models/backlog_bucket.rb b/modules/backlogs/app/models/backlog_bucket.rb index 6e0e6081065..68c36c150d6 100644 --- a/modules/backlogs/app/models/backlog_bucket.rb +++ b/modules/backlogs/app/models/backlog_bucket.rb @@ -48,6 +48,6 @@ class BacklogBucket < ApplicationRecord validates :name, :project, presence: true def self.for_project(project) - where(project:).order_alphabetically.includes(displayed_work_packages: %i[assigned_to priority parent]) + where(project:).order_alphabetically end end From 123c07db6e6699386876ca74afa6657c8ae8a81c Mon Sep 17 00:00:00 2001 From: ulferts Date: Fri, 5 Jun 2026 17:34:15 +0200 Subject: [PATCH 021/107] simplify order statement --- .../backlogs/app/models/work_packages/scopes/in_backlog_for.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/backlogs/app/models/work_packages/scopes/in_backlog_for.rb b/modules/backlogs/app/models/work_packages/scopes/in_backlog_for.rb index 8ad59994f08..aeea30d0658 100644 --- a/modules/backlogs/app/models/work_packages/scopes/in_backlog_for.rb +++ b/modules/backlogs/app/models/work_packages/scopes/in_backlog_for.rb @@ -39,7 +39,7 @@ module WorkPackages::Scopes::InBacklogFor .without_excluded_type .without_status_considered_closed .order_by_position - .order(WorkPackage.arel_table[:id].asc) + .order(id: :asc) end end end From 33a3387d56e5674132013c8cc2abf365a3a95ada Mon Sep 17 00:00:00 2001 From: ulferts Date: Fri, 5 Jun 2026 17:35:01 +0200 Subject: [PATCH 022/107] clarify purpose of wp in spec --- .../spec/models/work_packages/scopes/in_backlog_for_spec.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/backlogs/spec/models/work_packages/scopes/in_backlog_for_spec.rb b/modules/backlogs/spec/models/work_packages/scopes/in_backlog_for_spec.rb index f77af9d1d55..8819a7ff70d 100644 --- a/modules/backlogs/spec/models/work_packages/scopes/in_backlog_for_spec.rb +++ b/modules/backlogs/spec/models/work_packages/scopes/in_backlog_for_spec.rb @@ -97,8 +97,10 @@ RSpec.describe WorkPackages::Scopes::InBacklogFor do create(:work_package, project:, status: open_status, sprint:, backlog_bucket: nil) end + # This is invalid as buckets are not shared. + # It is nevertheless added shared_let(:other_project_wp) do - create(:work_package, project: other_project, status: open_status, sprint:, backlog_bucket: nil) + create(:work_package, project: other_project, status: open_status, sprint: nil, backlog_bucket:) end shared_let(:user_with_permission) do From d965a0c5b0e1377accd4f29a681c9a51bc1534f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20G=C3=BCnther?= Date: Tue, 2 Jun 2026 16:30:28 +0200 Subject: [PATCH 023/107] Call meeting.destroy!, not delete to also delete content https://community.openproject.org/work_packages/MEET-551 --- .../recurring_meetings/update_service.rb | 2 +- .../update_service_integration_spec.rb | 40 +++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/modules/meeting/app/services/recurring_meetings/update_service.rb b/modules/meeting/app/services/recurring_meetings/update_service.rb index 307875406d0..678eb8b1ddf 100644 --- a/modules/meeting/app/services/recurring_meetings/update_service.rb +++ b/modules/meeting/app/services/recurring_meetings/update_service.rb @@ -175,7 +175,7 @@ module RecurringMeetings .cancelled .find_each do |meeting| occurring = recurring_meeting.schedule.occurs_at?(meeting.recurrence_start_time) - meeting.delete unless occurring + meeting.destroy! unless occurring end end diff --git a/modules/meeting/spec/services/recurring_meetings/update_service_integration_spec.rb b/modules/meeting/spec/services/recurring_meetings/update_service_integration_spec.rb index 56b887f9d9d..fc5a5254507 100644 --- a/modules/meeting/spec/services/recurring_meetings/update_service_integration_spec.rb +++ b/modules/meeting/spec/services/recurring_meetings/update_service_integration_spec.rb @@ -101,6 +101,46 @@ RSpec.describe RecurringMeetings::UpdateService, "integration", type: :model do end end + context "when ending a series with a stale cancelled occurrence" do + let(:series) do + create(:recurring_meeting, + project:, + start_time: 1.month.ago + 10.hours, + frequency: "daily", + interval: 1, + end_after: "specific_date", + end_date: 1.month.from_now) + end + let(:instance) do + described_class.new(model: series, user:, contract_class: RecurringMeetings::EndSeriesContract) + end + let(:params) do + { + end_after: "specific_date", + end_date: Time.zone.yesterday + } + end + let!(:cancelled_occurrence) do + create(:recurring_meeting_occurrence, + recurring_meeting: series, + start_time: Time.zone.tomorrow + 10.hours, + recurrence_start_time: Time.zone.tomorrow + 10.hours, + state: :cancelled) + end + let!(:section) { create(:meeting_section, meeting: cancelled_occurrence) } + let!(:agenda_item) do + create(:meeting_agenda_item, meeting: cancelled_occurrence, meeting_section: section) + end + + it "destroys the cancelled occurrence with its structured meeting content" do + expect(service_result).to be_success + + expect { cancelled_occurrence.reload }.to raise_error(ActiveRecord::RecordNotFound) + expect { section.reload }.to raise_error(ActiveRecord::RecordNotFound) + expect { agenda_item.reload }.to raise_error(ActiveRecord::RecordNotFound) + end + end + describe "rescheduling job" do context "when updating the title" do let(:params) do From 56a9345962e4789bea9ac594435c14889c4f063e Mon Sep 17 00:00:00 2001 From: Mir Bhatia Date: Mon, 8 Jun 2026 08:19:27 +0200 Subject: [PATCH 024/107] Update SetAttributesService to allow replacing participants list --- .../meetings/set_attributes_service.rb | 20 +++++++++--- .../api/v3/meetings/meetings_resource_spec.rb | 31 +++++++++++++++++++ 2 files changed, 47 insertions(+), 4 deletions(-) diff --git a/modules/meeting/app/services/meetings/set_attributes_service.rb b/modules/meeting/app/services/meetings/set_attributes_service.rb index bd30307312b..c8ce03a03f4 100644 --- a/modules/meeting/app/services/meetings/set_attributes_service.rb +++ b/modules/meeting/app/services/meetings/set_attributes_service.rb @@ -60,14 +60,26 @@ module Meetings model.participants.clear model.participants_attributes = participants_attributes else - model.participants_attributes = merge_with_existing_participants(participants_attributes) + replace_participants(participants_attributes) end end - def merge_with_existing_participants(participants_attributes) - existing_user_ids = model.participants.to_set { |p| p.user_id.to_i } + def replace_participants(participants_attributes) + incoming_user_ids = participants_attributes.to_set { |attrs| attrs[:user_id].to_i } + existing_participants = model.participants.index_by { |p| p.user_id.to_i } - participants_attributes.reject { |attrs| existing_user_ids.include?(attrs[:user_id].to_i) } + mark_removed_participants(incoming_user_ids, existing_participants) + model.participants_attributes = added_participant_attributes(participants_attributes, existing_participants) + end + + def mark_removed_participants(incoming_user_ids, existing_participants) + existing_participants.each do |user_id, participant| + participant.mark_for_destruction unless incoming_user_ids.include?(user_id) + end + end + + def added_participant_attributes(participants_attributes, existing_participants) + participants_attributes.reject { |attrs| existing_participants.key?(attrs[:user_id].to_i) } end def set_default_participant diff --git a/modules/meeting/spec/requests/api/v3/meetings/meetings_resource_spec.rb b/modules/meeting/spec/requests/api/v3/meetings/meetings_resource_spec.rb index f1dae62f395..19e89a2c769 100644 --- a/modules/meeting/spec/requests/api/v3/meetings/meetings_resource_spec.rb +++ b/modules/meeting/spec/requests/api/v3/meetings/meetings_resource_spec.rb @@ -303,6 +303,37 @@ RSpec.describe "API v3 Meeting resource", content_type: :json do end end + context "when sending a smaller list of participants to _links.participants" do + let(:participant_user) do + create(:user, member_with_permissions: { project => [:view_meetings] }) + end + let(:other_participant_user) do + create(:user, member_with_permissions: { project => [:view_meetings] }) + end + + before do + create(:meeting_participant, meeting:, user: participant_user, invited: true) + create(:meeting_participant, meeting:, user: other_participant_user, invited: true) + end + + it "removes unlisted participants" do + expect(meeting.participants.count).to eq(2) + + body = { + lockVersion: meeting.lock_version, + _links: { + participants: [{ href: api_v3_paths.user(participant_user.id) }] + } + }.to_json + + patch path, body + + expect(last_response).to have_http_status(:ok) + expect(meeting.participants.reload.map(&:user_id)).to contain_exactly(participant_user.id) + expect(last_response.body).to have_json_size(1).at_path("_embedded/participants") + end + end + context "without edit_meetings permission" do let(:permissions) { %i[view_meetings] } From 879cb108c9e7ffe5a62419b33405c059032f12bb Mon Sep 17 00:00:00 2001 From: Kabiru Mwenja Date: Fri, 5 Jun 2026 22:27:14 +0300 Subject: [PATCH 025/107] Seek changes-filter predecessor via LATERAL instead of a version scan MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The :only_changes activity filter identified each journal's predecessor with `version = (SELECT MAX(version) WHERE version < current)`. That predicate cannot use the (journable_type, journable_id, version) index, so Postgres scanned every journal of the journable and filtered by version — turning a per-page filter into an O(history) sweep run twice (pagy's count plus the page query). A LATERAL `ORDER BY version DESC LIMIT 1` seeks the predecessor through that index in a single row, preserving gap-tolerant matching on `< version`. --- .../paginator/journal_changes_filter.rb | 42 +++++++++---------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/app/services/work_packages/activities_tab/paginator/journal_changes_filter.rb b/app/services/work_packages/activities_tab/paginator/journal_changes_filter.rb index 0c5075b04a2..538dcc99427 100644 --- a/app/services/work_packages/activities_tab/paginator/journal_changes_filter.rb +++ b/app/services/work_packages/activities_tab/paginator/journal_changes_filter.rb @@ -60,13 +60,10 @@ class WorkPackages::ActivitiesTab::Paginator::JournalChangesFilter def attribute_data_changes_condition_sql <<~SQL.squish SELECT 1 - FROM journals predecessor + FROM #{predecessor_lateral_sql} INNER JOIN work_package_journals pred_data ON predecessor.data_id = pred_data.id INNER JOIN work_package_journals curr_data ON journals.data_id = curr_data.id - WHERE predecessor.journable_id = journals.journable_id - AND predecessor.journable_type = journals.journable_type - AND predecessor.version = (#{max_predecessor_version_sql}) - AND (#{data_changes_condition_sql}) + WHERE (#{data_changes_condition_sql}) SQL end @@ -98,15 +95,22 @@ class WorkPackages::ActivitiesTab::Paginator::JournalChangesFilter ) end - # Identify the immediate predecessor journal for comparison. - # NB: Journal versions are incremental but not guaranteed to be sequential. - def max_predecessor_version_sql + # The immediate predecessor journal, exposed as a `predecessor` relation for + # comparison. Seeking the highest version below the current one through the + # (journable_type, journable_id, version) index keeps this a single-row lookup + # per journal; versions are incremental but may have gaps, so the seek matches + # on `< version` rather than `version - 1`. + def predecessor_lateral_sql <<~SQL.squish - SELECT MAX(version) - FROM journals p2 - WHERE p2.journable_id = journals.journable_id - AND p2.journable_type = journals.journable_type - AND p2.version < journals.version + LATERAL ( + SELECT p.id, p.data_id + FROM journals p + WHERE p.journable_id = journals.journable_id + AND p.journable_type = journals.journable_type + AND p.version < journals.version + ORDER BY p.version DESC + LIMIT 1 + ) predecessor SQL end @@ -154,10 +158,7 @@ class WorkPackages::ActivitiesTab::Paginator::JournalChangesFilter <<~SQL.squish SELECT 1 FROM #{table} curr - LEFT JOIN journals predecessor - ON predecessor.journable_id = journals.journable_id - AND predecessor.journable_type = journals.journable_type - AND predecessor.version = (#{max_predecessor_version_sql}) + LEFT JOIN #{predecessor_lateral_sql} ON TRUE LEFT JOIN #{table} pred ON pred.journal_id = predecessor.id AND #{join_conditions} @@ -175,16 +176,13 @@ class WorkPackages::ActivitiesTab::Paginator::JournalChangesFilter <<~SQL.squish SELECT 1 - FROM journals predecessor + FROM #{predecessor_lateral_sql} INNER JOIN #{table} pred ON pred.journal_id = predecessor.id LEFT JOIN #{table} curr ON curr.journal_id = journals.id AND #{join_conditions} - WHERE predecessor.journable_id = journals.journable_id - AND predecessor.journable_type = journals.journable_type - AND predecessor.version = (#{max_predecessor_version_sql}) - AND curr.id IS NULL + WHERE curr.id IS NULL SQL end end From 40301c346305bdd60fbc5f1cf2ecbd866427cf6c Mon Sep 17 00:00:00 2001 From: Jan Sandbrink Date: Thu, 4 Jun 2026 13:14:51 +0200 Subject: [PATCH 026/107] Make SSRF error message more specific Feedback from devs that were confronted with the "is not an allowed host" message shows, that the message is not very actionable. It's not clear why something that is clearly a legitimate and existing host would be considered "not allowed". The new error message clearly points at the SSRF policy as the source. Making the problem more search engine friendly and hopefully allowing admins to better understand what they have to fix. --- config/locales/en.yml | 2 +- .../app/services/openid_connect/providers/update_service.rb | 2 +- .../services/openid_connect/providers/update_service_spec.rb | 2 +- .../app/validator/nextcloud_compatible_host_validator.rb | 2 +- .../contracts/storages/storages/shared_contract_examples.rb | 4 ++-- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/config/locales/en.yml b/config/locales/en.yml index 63344b1fc29..a8b9cb507d1 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -2245,7 +2245,6 @@ en: not_a_datetime: "is not a valid date time." not_a_number: "is not a number." not_allowed: "is invalid because of missing permissions." - host_not_allowed: "is not an allowed host." not_json: "is not parseable as JSON." not_json_object: "is not a JSON object." not_an_integer: "is not an integer." @@ -2258,6 +2257,7 @@ en: regex_list_invalid: "Lines %{invalid_lines} could not be parsed as regular expression." hexcode_invalid: "is not a valid 6-digit hexadecimal color code." smaller_than_or_equal_to_max_length: "must be smaller than or equal to maximum length." + ssrf_filtered: "violates the SSRF policy of this OpenProject instance." taken: "has already been taken." too_long: "is too long (maximum is %{count} characters)." too_short: "is too short (minimum is %{count} characters)." diff --git a/modules/openid_connect/app/services/openid_connect/providers/update_service.rb b/modules/openid_connect/app/services/openid_connect/providers/update_service.rb index 1c4ab6167d4..e29d05de295 100644 --- a/modules/openid_connect/app/services/openid_connect/providers/update_service.rb +++ b/modules/openid_connect/app/services/openid_connect/providers/update_service.rb @@ -114,7 +114,7 @@ module OpenIDConnect if host.present? && OpenProject::SsrfProtection.safe_ip?(host) true else - call.errors.add(:metadata_url, :host_not_allowed) + call.errors.add(:metadata_url, :ssrf_filtered) call.success = false false end diff --git a/modules/openid_connect/spec/services/openid_connect/providers/update_service_spec.rb b/modules/openid_connect/spec/services/openid_connect/providers/update_service_spec.rb index 8ce703e4ae3..7be98aad37f 100644 --- a/modules/openid_connect/spec/services/openid_connect/providers/update_service_spec.rb +++ b/modules/openid_connect/spec/services/openid_connect/providers/update_service_spec.rb @@ -92,7 +92,7 @@ RSpec.describe OpenIDConnect::Providers::UpdateService, type: :model do result = service_call expect(result).not_to be_success - expect(result.errors[:metadata_url]).to include("is not an allowed host.") + expect(result.errors[:metadata_url]).to include("violates the SSRF policy of this OpenProject instance.") expect(httpx_session).not_to have_received(:get) end end diff --git a/modules/storages/app/validator/nextcloud_compatible_host_validator.rb b/modules/storages/app/validator/nextcloud_compatible_host_validator.rb index aabdcbcf612..ef4760e1a38 100644 --- a/modules/storages/app/validator/nextcloud_compatible_host_validator.rb +++ b/modules/storages/app/validator/nextcloud_compatible_host_validator.rb @@ -50,7 +50,7 @@ class NextcloudCompatibleHostValidator < ActiveModel::EachValidator return false if host.blank? return true if OpenProject::SsrfProtection.safe_ip?(host) - contract.errors.add(attribute, :host_not_allowed) + contract.errors.add(attribute, :ssrf_filtered) false rescue URI::InvalidURIError false diff --git a/modules/storages/spec/contracts/storages/storages/shared_contract_examples.rb b/modules/storages/spec/contracts/storages/storages/shared_contract_examples.rb index 0b1f83ae507..d33470a736b 100644 --- a/modules/storages/spec/contracts/storages/storages/shared_contract_examples.rb +++ b/modules/storages/spec/contracts/storages/storages/shared_contract_examples.rb @@ -275,7 +275,7 @@ RSpec.shared_examples_for "nextcloud storage contract", :storage_server_helpers, context "when host is localhost" do let(:storage_host) { "http://localhost:1234" } - include_examples "contract is invalid", host: :host_not_allowed + include_examples "contract is invalid", host: :ssrf_filtered it "does not perform metadata discovery requests" do contract.validate @@ -288,7 +288,7 @@ RSpec.shared_examples_for "nextcloud storage contract", :storage_server_helpers, context "when host uses https protocol" do let(:storage_host) { "https://172.16.193.146" } - include_examples "contract is invalid", host: :host_not_allowed + include_examples "contract is invalid", host: :ssrf_filtered end end From b4ba7ac8c099be2f6d3b169363bb9ad07f2044a2 Mon Sep 17 00:00:00 2001 From: Jan Sandbrink Date: Thu, 4 Jun 2026 13:16:56 +0200 Subject: [PATCH 027/107] Include SSRF hint in release notes Our changes to SSRF filtering (notably: applying it everywhere) can easily affect running instances of OpenProject. Including this hint in the release notes hopefully helps admins deploying their own instances to be aware of the upcoming change. --- docs/release-notes/17-6-0/README.md | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/docs/release-notes/17-6-0/README.md b/docs/release-notes/17-6-0/README.md index 7fe7625d46d..c08b6b3ce9e 100644 --- a/docs/release-notes/17-6-0/README.md +++ b/docs/release-notes/17-6-0/README.md @@ -19,7 +19,20 @@ In these Release Notes, we will give an overview of important feature changes. A ## Important updates and breaking changes - +### Integrations (e.g. Nextcloud and XWiki) respect global SSRF filters + +To increase the security of OpenProject installations, we've added protections against server-side request forgery in previous releases +of OpenProject. These prevent OpenProject from making network requests into private IP address space. + +Starting with OpenProject 17.6, these protections expand into the code that's responsible for web requests of storage and wiki integrations as well. +This means if you have a Nextcloud instance or an XWiki instance reachable via a private (i.e. not publicly routable) IP address, you need to +add it to the SSRF allowlist to be able to keep the integration working. This is usually achieved by defining the following environment variable: + +``` +OPENPROJECT_SSRF_PROTECTION_IP_ALLOWLIST=2001:db8:100::/48 +``` + +The list accepts one or multiple IP addresses or ranges (in CIDR notation) that shall be exempt from SSRF filtering. From 07372e35140ede00ef61006aef0a1fa8ec9e93f3 Mon Sep 17 00:00:00 2001 From: Jan Sandbrink Date: Thu, 4 Jun 2026 13:28:02 +0200 Subject: [PATCH 028/107] Try to order some YAML keys --- config/locales/en.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/config/locales/en.yml b/config/locales/en.yml index a8b9cb507d1..0dfcf46bfcc 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -2197,17 +2197,14 @@ en: before: "must be before %{date}." before_or_equal_to: "must be before or equal to %{date}." blank: "can't be blank." - not_before_start_date: "must not be before the start date." - overlapping_range: "overlaps with an existing non-working day range." blank_nested: "needs to have the property '%{property}' set." cannot_delete_mapping: "is required. Cannot be deleted." - is_for_all_cannot_modify: "is for all projects and can therefore not be modified." cant_link_a_work_package_with_a_descendant: "A work package cannot be linked to one of its subtasks." circular_dependency: "This relation would create a circular dependency." confirmation: "doesn't match %{attribute}." could_not_be_copied: "%{dependency} could not be (fully) copied." + datetime_must_be_in_future: "must be in the future." does_not_exist: "does not exist." - user_already_in_department: "User %{user_id} is already a member of department %{department_id}." error_enterprise_only: "%{action} is only available in the OpenProject Enterprise edition." error_unauthorized: "may not be accessed." error_readonly: "was attempted to be written but is not writable." @@ -2228,18 +2225,20 @@ en: greater_than_or_equal_to: "must be greater than or equal to %{count}." greater_than_or_equal_to_start_date: "must be greater than or equal to the start date." greater_than_start_date: "must be greater than the start date." + hexcode_invalid: "is not a valid 6-digit hexadecimal color code." inclusion: "is not set to one of the allowed values." inclusion_nested: "is not set to one of the allowed values at path '%{path}'." invalid: "is invalid." invalid_uri: "must be a valid URI." invalid_url: "is not a valid URL." invalid_url_scheme: "is not a supported protocol (allowed: %{allowed_schemes})." + is_for_all_cannot_modify: "is for all projects and can therefore not be modified." less_than_or_equal_to: "must be less than or equal to %{count}." not_available: "is not available due to a system configuration." + not_before_start_date: "must not be before the start date." not_deletable: "cannot be deleted." not_editable: "cannot be edited because it is already in effect." not_current_user: "is not the current user." - system_wide_non_working_day_exists: "conflicts with an existing system-wide non-working day for this date." not_found: "not found." not_a_date: "is not a valid date." not_a_datetime: "is not a valid date time." @@ -2250,14 +2249,14 @@ en: not_an_integer: "is not an integer." not_an_iso_date: "is not a valid date. Required format: YYYY-MM-DD." not_same_project: "doesn't belong to the same project." - datetime_must_be_in_future: "must be in the future." odd: "must be odd." + overlapping_range: "overlaps with an existing non-working day range." regex_match_failed: "does not match the regular expression %{expression}." regex_invalid: "could not be validated with the associated regular expression." regex_list_invalid: "Lines %{invalid_lines} could not be parsed as regular expression." - hexcode_invalid: "is not a valid 6-digit hexadecimal color code." smaller_than_or_equal_to_max_length: "must be smaller than or equal to maximum length." ssrf_filtered: "violates the SSRF policy of this OpenProject instance." + system_wide_non_working_day_exists: "conflicts with an existing system-wide non-working day for this date." taken: "has already been taken." too_long: "is too long (maximum is %{count} characters)." too_short: "is too short (minimum is %{count} characters)." @@ -2269,6 +2268,7 @@ en: unremovable: "cannot be removed." url_not_secure_context: > is not providing a "Secure Context". Either use HTTPS or a loopback address, such as localhost. + user_already_in_department: "User %{user_id} is already a member of department %{department_id}." wrong_length: "is the wrong length (should be %{count} characters)." models: group: From 96d594727903bbe96043ef17a308dcb35f4b10fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20G=C3=BCnther?= Date: Mon, 8 Jun 2026 09:59:54 +0200 Subject: [PATCH 029/107] Update security fixes --- docs/release-notes/17-3-3/README.md | 80 +++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 docs/release-notes/17-3-3/README.md diff --git a/docs/release-notes/17-3-3/README.md b/docs/release-notes/17-3-3/README.md new file mode 100644 index 00000000000..4b185833b06 --- /dev/null +++ b/docs/release-notes/17-3-3/README.md @@ -0,0 +1,80 @@ +--- +title: OpenProject 17.3.3 +sidebar_navigation: + title: 17.3.3 +release_version: 17.3.3 +release_date: 2026-06-08 +--- + +# OpenProject 17.3.3 + +Release date: 2026-06-08 + +We released [OpenProject 17.3.3](https://community.openproject.org/versions/2299). +The release contains several bug fixes and we recommend updating to the newest version. +Below you will find a complete list of all changes and bug fixes. + +## Security fixes + +### CVE-2026-47193 - Journal diff endpoint bypasses object, journal, and field visibility checks +This vulnerability was reported as part of the [YesWeHack.com OpenProject Bug Bounty program](https://yeswehack.com/programs/openproject), sponsored by the European Commission. + +For more information, please see the [GitHub advisory #GHSA-f2rx-x2qj-2hgj](https://github.com/opf/openproject/security/advisories/GHSA-f2rx-x2qj-2hgj) + +### GHSA-3vpx-94qx-xpw6 - IDOR through /projects//settings/project_storages/ via PATCH parameter "storages_project_storage[project_folder_id]" leads to Access to Unauthorized Resources +A project-admin in one project can hijack the managed Nextcloud or OneDrive folder of another project on the same storage by writing the victim project's `project_folder_id` into the attacker's `Storages::ProjectStorage` row. The next managed-folder sync overwrites the ACL on the referenced folder with the attacker project's user list. + +This vulnerability was reported as part of the [YesWeHack.com OpenProject Bug Bounty program](https://yeswehack.com/programs/openproject), sponsored by the European Commission. + +For more information, please see the [GitHub advisory #GHSA-3vpx-94qx-xpw6](https://github.com/opf/openproject/security/advisories/GHSA-3vpx-94qx-xpw6) + +### GHSA-6crw-7f5r-4qj9 - CSRF on TARGET through /users/:id via POST parameter "user[admin]" +Turbo Drive auto-injects CSRF tokens (from ``) on forms injected via the XSS's `append` Turbo Stream action. A second action, `dispatch_event` with `name="submit"`, auto-submits the form with no victim interaction beyond viewing the work package, resulting in a CSRF attack + +This vulnerability was reported as part of the [YesWeHack.com OpenProject Bug Bounty program](https://yeswehack.com/programs/openproject), sponsored by the European Commission. + +For more information, please see the [GitHub advisory #GHSA-6crw-7f5r-4qj9](https://github.com/opf/openproject/security/advisories/GHSA-6crw-7f5r-4qj9) + +### GHSA-98vw-2r87-fx2r - SQL injection in timestamps functionality +OpenProject baseline comparison allows callers to request historic work-package attributes using the `timestamps` parameter. + +The timestamp parser accepts a relative date keyword on the first line because its regular expression uses line anchors. The parser validates the input, but the original multi-line string is kept and later interpolated into a raw SQL `CASE ... THEN ''` expression. + +An authenticated user who can save a query can persist a timestamp array value containing literal commas and trigger a top-level data-modifying CTE. This gives the attacker a generic database write primitive as the OpenProject application database role. + +The demonstrated impact is administrator privilege escalation: the attacker uses that write primitive to update their own account record, setting the account's administrator flag to true. The same injection also allows in-band data disclosure through work-package timestamp metadata. + +This vulnerability was reported as part of the [YesWeHack.com OpenProject Bug Bounty program](https://yeswehack.com/programs/openproject), sponsored by the European Commission. + +For more information, please see the [GitHub advisory #GHSA-98vw-2r87-fx2r](https://github.com/opf/openproject/security/advisories/GHSA-98vw-2r87-fx2r) + +### GHSA-h83w-5q5x-pq27 - Information Disclosure (cleartext storage of data) on localhost through memcached via Others "storage..httpx_access_token" leads to Sensitive Data Exposure +OpenProject's Storages module writes the OneDrive/SharePoint userless OAuth `access_token` plaintext to `Rails.cache` under the deterministic key `storage..httpx_access_token`, repopulated continuously by an hourly cron and every userless-OAuth call site (see Write cadence). None of the three allowed cache backends (`file_store`, `memcache`, `redis`) encrypts at rest. An attacker with read access to the cache backend recovers the Azure-AD application-tier bearer with an anonymous `get` over the memcached binary protocol (or the equivalent against Redis) + +This vulnerability was reported as part of the [YesWeHack.com OpenProject Bug Bounty program](https://yeswehack.com/programs/openproject), sponsored by the European Commission. + +For more information, please see the [GitHub advisory #GHSA-h83w-5q5x-pq27](https://github.com/opf/openproject/security/advisories/GHSA-h83w-5q5x-pq27) + +### GHSA-q33w-f822-hg8x - Stored XSS on openproject.example.com through /api/v3/projects/{project}/work_packages via POST parameter "description" +The HTML sanitizer grants `` elements unrestricted `data-*` attributes via `:data` wildcard. An attacker injects `data-controller="poll-for-changes"` into a work package description, causing Stimulus.js to mount a controller that fetches an attacker-uploaded attachment and passes it to `renderStreamMessage()`. This executes arbitrary Turbo Stream actions — including `redirect_to` — in every victim's authenticated browser session, redirecting them to an attacker-controlled server. + +This vulnerability was reported as part of the [YesWeHack.com OpenProject Bug Bounty program](https://yeswehack.com/programs/openproject), sponsored by the European Commission. + +For more information, please see the [GitHub advisory #GHSA-q33w-f822-hg8x](https://github.com/opf/openproject/security/advisories/GHSA-q33w-f822-hg8x) + +### GHSA-qj96-f42f-6336 - Cache store poisoning leads to Remote Code Execution (RCE) +This vulnerability was reported as part of the [YesWeHack.com OpenProject Bug Bounty program](https://yeswehack.com/programs/openproject), sponsored by the European Commission. + +For more information, please see the [GitHub advisory #GHSA-qj96-f42f-6336](https://github.com/opf/openproject/security/advisories/GHSA-qj96-f42f-6336) + + + + +## Bug fixes and changes + + + + + + + From 667006bfc541e7715f2bdd1064cc8b3ef8bd3fd8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20G=C3=BCnther?= Date: Mon, 8 Jun 2026 09:59:55 +0200 Subject: [PATCH 030/107] Add release-notes file --- docs/release-notes/README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/release-notes/README.md b/docs/release-notes/README.md index 1e7f36f8c1e..7e15b7308c4 100644 --- a/docs/release-notes/README.md +++ b/docs/release-notes/README.md @@ -13,6 +13,13 @@ Stay up to date and get an overview of the new features included in the releases +## 17.3.3 + +Release date: 2026-06-08 + +[Release Notes](17-3-3/) + + ## 17.3.2 Release date: 2026-05-13 From b6bd1c3d7b4cb0d9d0a402bb479d7fcaf071eed9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20G=C3=BCnther?= Date: Mon, 8 Jun 2026 09:59:57 +0200 Subject: [PATCH 031/107] Update hocuspocus image to openproject/hocuspocus:17.3.3 --- docker/prod/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/prod/Dockerfile b/docker/prod/Dockerfile index c6144a26339..44bab1d60b9 100755 --- a/docker/prod/Dockerfile +++ b/docker/prod/Dockerfile @@ -141,7 +141,7 @@ ENV PGDATA=/var/openproject/pgdata COPY --from=openproject/gosu /go/bin/gosu /usr/local/bin/gosu RUN chmod +x /usr/local/bin/gosu && gosu nobody true -COPY --from=openproject/hocuspocus:17.3.2 --chown=$APP_USER:$APP_USER /app /opt/hocuspocus +COPY --from=openproject/hocuspocus:17.3.3 --chown=$APP_USER:$APP_USER /app /opt/hocuspocus # Keep node/npm in all-in-one for bundled hocuspocus even when BIM support is disabled. COPY --from=build-base /usr/local/bin/node /usr/local/bin/node COPY --from=build-base /usr/local/lib/node_modules /usr/local/lib/node_modules From 5ee515c5c80c3aaf1e7527f63e4e69798aef1b29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20G=C3=BCnther?= Date: Mon, 8 Jun 2026 09:59:57 +0200 Subject: [PATCH 032/107] Update publiccode.yml --- publiccode.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/publiccode.yml b/publiccode.yml index c63a0fc2f8c..27fdcd10f82 100644 --- a/publiccode.yml +++ b/publiccode.yml @@ -7,8 +7,8 @@ name: OpenProject applicationSuite: openDesk url: 'https://github.com/opf/openproject' roadmap: 'https://www.openproject.org/roadmap' -releaseDate: '2026-05-13' -softwareVersion: '17.3.2' +releaseDate: '2026-06-08' +softwareVersion: '17.3.3' developmentStatus: stable softwareType: standalone/web logo: 'publiccode_logo.svg' From 769063cf4b1375f01f3e60029177171ebcc0a910 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20G=C3=BCnther?= Date: Mon, 8 Jun 2026 09:59:59 +0200 Subject: [PATCH 033/107] Bumped version to 17.3.4 [ci skip] --- lib/open_project/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/open_project/version.rb b/lib/open_project/version.rb index 06123b70f5f..9dbcb9768d2 100644 --- a/lib/open_project/version.rb +++ b/lib/open_project/version.rb @@ -33,7 +33,7 @@ module OpenProject module VERSION # :nodoc: MAJOR = 17 MINOR = 3 - PATCH = 3 + PATCH = 4 class << self def revision From 58d67ab81f02a40203f127f541c37f90d4d6f6ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20G=C3=BCnther?= Date: Mon, 8 Jun 2026 10:04:29 +0200 Subject: [PATCH 034/107] Update security fixes --- docs/release-notes/17-4-1/README.md | 92 +++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 docs/release-notes/17-4-1/README.md diff --git a/docs/release-notes/17-4-1/README.md b/docs/release-notes/17-4-1/README.md new file mode 100644 index 00000000000..4122ed32c8d --- /dev/null +++ b/docs/release-notes/17-4-1/README.md @@ -0,0 +1,92 @@ +--- +title: OpenProject 17.4.1 +sidebar_navigation: + title: 17.4.1 +release_version: 17.4.1 +release_date: 2026-06-08 +--- + +# OpenProject 17.4.1 + +Release date: 2026-06-08 + +We released [OpenProject 17.4.1](https://community.openproject.org/versions/2301). +The release contains several bug fixes and we recommend updating to the newest version. +Below you will find a complete list of all changes and bug fixes. + +## Security fixes + +### CVE-2026-47193 - Journal diff endpoint bypasses object, journal, and field visibility checks +This vulnerability was reported as part of the [YesWeHack.com OpenProject Bug Bounty program](https://yeswehack.com/programs/openproject), sponsored by the European Commission. + +For more information, please see the [GitHub advisory #GHSA-f2rx-x2qj-2hgj](https://github.com/opf/openproject/security/advisories/GHSA-f2rx-x2qj-2hgj) + +### CVE-2026-49355 - Private work package data disclosure through single meeting agenda item API +`GET /api/v3/meetings/:meeting_id/agenda_items/:agenda_item_id` discloses private work package data from a linked work package that belongs to a private/inaccessible project. + +This vulnerability was reported as part of the [YesWeHack.com OpenProject Bug Bounty program](https://yeswehack.com/programs/openproject), sponsored by the European Commission. + +For more information, please see the [GitHub advisory #GHSA-g387-6rm2-xw88](https://github.com/opf/openproject/security/advisories/GHSA-g387-6rm2-xw88) + +### GHSA-3vpx-94qx-xpw6 - IDOR through /projects//settings/project_storages/ via PATCH parameter "storages_project_storage[project_folder_id]" leads to Access to Unauthorized Resources +A project-admin in one project can hijack the managed Nextcloud or OneDrive folder of another project on the same storage by writing the victim project's `project_folder_id` into the attacker's `Storages::ProjectStorage` row. The next managed-folder sync overwrites the ACL on the referenced folder with the attacker project's user list. + +This vulnerability was reported as part of the [YesWeHack.com OpenProject Bug Bounty program](https://yeswehack.com/programs/openproject), sponsored by the European Commission. + +For more information, please see the [GitHub advisory #GHSA-3vpx-94qx-xpw6](https://github.com/opf/openproject/security/advisories/GHSA-3vpx-94qx-xpw6) + +### GHSA-6crw-7f5r-4qj9 - CSRF on TARGET through /users/:id via POST parameter "user[admin]" +Turbo Drive auto-injects CSRF tokens (from ``) on forms injected via the XSS's `append` Turbo Stream action. A second action, `dispatch_event` with `name="submit"`, auto-submits the form with no victim interaction beyond viewing the work package, resulting in a CSRF attack + +This vulnerability was reported as part of the [YesWeHack.com OpenProject Bug Bounty program](https://yeswehack.com/programs/openproject), sponsored by the European Commission. + +For more information, please see the [GitHub advisory #GHSA-6crw-7f5r-4qj9](https://github.com/opf/openproject/security/advisories/GHSA-6crw-7f5r-4qj9) + +### GHSA-98vw-2r87-fx2r - SQL injection in timestamps functionality +OpenProject baseline comparison allows callers to request historic work-package attributes using the `timestamps` parameter. + +The timestamp parser accepts a relative date keyword on the first line because its regular expression uses line anchors. The parser validates the input, but the original multi-line string is kept and later interpolated into a raw SQL `CASE ... THEN ''` expression. + +An authenticated user who can save a query can persist a timestamp array value containing literal commas and trigger a top-level data-modifying CTE. This gives the attacker a generic database write primitive as the OpenProject application database role. + +The demonstrated impact is administrator privilege escalation: the attacker uses that write primitive to update their own account record, setting the account's administrator flag to true. The same injection also allows in-band data disclosure through work-package timestamp metadata. + +This vulnerability was reported as part of the [YesWeHack.com OpenProject Bug Bounty program](https://yeswehack.com/programs/openproject), sponsored by the European Commission. + +For more information, please see the [GitHub advisory #GHSA-98vw-2r87-fx2r](https://github.com/opf/openproject/security/advisories/GHSA-98vw-2r87-fx2r) + +### GHSA-h83w-5q5x-pq27 - Information Disclosure (cleartext storage of data) on localhost through memcached via Others "storage..httpx_access_token" leads to Sensitive Data Exposure +OpenProject's Storages module writes the OneDrive/SharePoint userless OAuth `access_token` plaintext to `Rails.cache` under the deterministic key `storage..httpx_access_token`, repopulated continuously by an hourly cron and every userless-OAuth call site (see Write cadence). None of the three allowed cache backends (`file_store`, `memcache`, `redis`) encrypts at rest. An attacker with read access to the cache backend recovers the Azure-AD application-tier bearer with an anonymous `get` over the memcached binary protocol (or the equivalent against Redis) + +This vulnerability was reported as part of the [YesWeHack.com OpenProject Bug Bounty program](https://yeswehack.com/programs/openproject), sponsored by the European Commission. + +For more information, please see the [GitHub advisory #GHSA-h83w-5q5x-pq27](https://github.com/opf/openproject/security/advisories/GHSA-h83w-5q5x-pq27) + +### GHSA-q33w-f822-hg8x - Stored XSS on openproject.example.com through /api/v3/projects/{project}/work_packages via POST parameter "description" +The HTML sanitizer grants `` elements unrestricted `data-*` attributes via `:data` wildcard. An attacker injects `data-controller="poll-for-changes"` into a work package description, causing Stimulus.js to mount a controller that fetches an attacker-uploaded attachment and passes it to `renderStreamMessage()`. This executes arbitrary Turbo Stream actions — including `redirect_to` — in every victim's authenticated browser session, redirecting them to an attacker-controlled server. + +This vulnerability was reported as part of the [YesWeHack.com OpenProject Bug Bounty program](https://yeswehack.com/programs/openproject), sponsored by the European Commission. + +For more information, please see the [GitHub advisory #GHSA-q33w-f822-hg8x](https://github.com/opf/openproject/security/advisories/GHSA-q33w-f822-hg8x) + +### GHSA-qj96-f42f-6336 - Cache store poisoning leads to Remote Code Execution (RCE) +This vulnerability was reported as part of the [YesWeHack.com OpenProject Bug Bounty program](https://yeswehack.com/programs/openproject), sponsored by the European Commission. + +For more information, please see the [GitHub advisory #GHSA-qj96-f42f-6336](https://github.com/opf/openproject/security/advisories/GHSA-qj96-f42f-6336) + + + + +## Bug fixes and changes + + + + +- Bugfix: Migration 20250929070310 failing due to update code failing on not-yet fully migrated schema \[[#75286](https://community.openproject.org/wp/75286)\] + + + + +## Contributions +A big thanks to our Community members for reporting bugs and helping us identify and provide fixes. +This release, special thanks for reporting and finding bugs go to Alexander Aleschenko. From 0e0be3c331080ba450a66e83608209a2599a75e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20G=C3=BCnther?= Date: Mon, 8 Jun 2026 10:04:30 +0200 Subject: [PATCH 035/107] Add release-notes file --- docs/release-notes/README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/release-notes/README.md b/docs/release-notes/README.md index 19b3a23a073..80211c24b65 100644 --- a/docs/release-notes/README.md +++ b/docs/release-notes/README.md @@ -13,6 +13,13 @@ Stay up to date and get an overview of the new features included in the releases +## 17.4.1 + +Release date: 2026-06-08 + +[Release Notes](17-4-1/) + + ## 17.3.3 Release date: 2026-06-08 From b01a19634bd1d99de5a060e10e34d35785b1be35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20G=C3=BCnther?= Date: Mon, 8 Jun 2026 10:04:31 +0200 Subject: [PATCH 036/107] Update hocuspocus image to openproject/hocuspocus:17.4.1 --- docker/prod/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/prod/Dockerfile b/docker/prod/Dockerfile index 1e6d1c509ee..66b589d5ba6 100755 --- a/docker/prod/Dockerfile +++ b/docker/prod/Dockerfile @@ -141,7 +141,7 @@ ENV PGDATA=/var/openproject/pgdata COPY --from=openproject/gosu /go/bin/gosu /usr/local/bin/gosu RUN chmod +x /usr/local/bin/gosu && gosu nobody true -COPY --from=openproject/hocuspocus:17.4.0 --chown=$APP_USER:$APP_USER /app /opt/hocuspocus +COPY --from=openproject/hocuspocus:17.4.1 --chown=$APP_USER:$APP_USER /app /opt/hocuspocus # Keep node/npm in all-in-one for bundled hocuspocus even when BIM support is disabled. COPY --from=build-base /usr/local/bin/node /usr/local/bin/node COPY --from=build-base /usr/local/lib/node_modules /usr/local/lib/node_modules From 8203fc2286fd48d7d72f52b3c4a2487f96fcea28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20G=C3=BCnther?= Date: Mon, 8 Jun 2026 10:04:31 +0200 Subject: [PATCH 037/107] Update publiccode.yml --- publiccode.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/publiccode.yml b/publiccode.yml index d76300c1325..a79f8fbfc91 100644 --- a/publiccode.yml +++ b/publiccode.yml @@ -7,8 +7,8 @@ name: OpenProject applicationSuite: openDesk url: 'https://github.com/opf/openproject' roadmap: 'https://www.openproject.org/roadmap' -releaseDate: '2026-05-13' -softwareVersion: '17.4.0' +releaseDate: '2026-06-08' +softwareVersion: '17.4.1' developmentStatus: stable softwareType: standalone/web logo: 'publiccode_logo.svg' From 1451d2c3c490b8c6fdd0dfeea2e6c13123afae2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20G=C3=BCnther?= Date: Mon, 8 Jun 2026 10:04:34 +0200 Subject: [PATCH 038/107] Bumped version to 17.4.2 [ci skip] --- lib/open_project/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/open_project/version.rb b/lib/open_project/version.rb index dba81e17a42..7c6533fe732 100644 --- a/lib/open_project/version.rb +++ b/lib/open_project/version.rb @@ -33,7 +33,7 @@ module OpenProject module VERSION # :nodoc: MAJOR = 17 MINOR = 4 - PATCH = 1 + PATCH = 2 class << self def revision From c30644bfa96c6740581183320991ccc3722eecf7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20G=C3=BCnther?= Date: Mon, 8 Jun 2026 10:34:16 +0200 Subject: [PATCH 039/107] Revert "Update hocuspocus image to openproject/hocuspocus:17.4.1" This reverts commit b01a19634bd1d99de5a060e10e34d35785b1be35. --- docker/prod/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/prod/Dockerfile b/docker/prod/Dockerfile index 66b589d5ba6..1e6d1c509ee 100755 --- a/docker/prod/Dockerfile +++ b/docker/prod/Dockerfile @@ -141,7 +141,7 @@ ENV PGDATA=/var/openproject/pgdata COPY --from=openproject/gosu /go/bin/gosu /usr/local/bin/gosu RUN chmod +x /usr/local/bin/gosu && gosu nobody true -COPY --from=openproject/hocuspocus:17.4.1 --chown=$APP_USER:$APP_USER /app /opt/hocuspocus +COPY --from=openproject/hocuspocus:17.4.0 --chown=$APP_USER:$APP_USER /app /opt/hocuspocus # Keep node/npm in all-in-one for bundled hocuspocus even when BIM support is disabled. COPY --from=build-base /usr/local/bin/node /usr/local/bin/node COPY --from=build-base /usr/local/lib/node_modules /usr/local/lib/node_modules From d82d532685fe4a1c359a7604c6f5c0ae2038bdca Mon Sep 17 00:00:00 2001 From: corinnaguenther <131807161+corinnaguenther@users.noreply.github.com> Date: Mon, 8 Jun 2026 10:51:27 +0200 Subject: [PATCH 040/107] Update glossary for 17.5 (#23530) * Update glossary for 17.5 [OP-19159] Update Glossary with new terms for 17.5 https://community.openproject.org/wp/OP-19159 * Fix mistakes in the whole glossary * Update docs/glossary/README.md Co-authored-by: Maya Berdygylyjova * update after review --------- Co-authored-by: Maya Berdygylyjova --- docs/glossary/README.md | 41 ++++++++++++++++++++++++----------------- 1 file changed, 24 insertions(+), 17 deletions(-) diff --git a/docs/glossary/README.md b/docs/glossary/README.md index 75dafaa325a..fd88e86fcd0 100644 --- a/docs/glossary/README.md +++ b/docs/glossary/README.md @@ -82,7 +82,7 @@ In OpenProject, authentication is an important element to guarantee a data prote Backlogs is a [module](#module) in OpenProject that brings features that support [Agile project management](#agile-project-management), in particular the Scrum methodology, such as a product backlog and sprint backlogs. -It includes functionality for planning and managing sprints, including a sprint board that is automatically created when a sprint is started. Within the backlog, work packages can be organized using **backlog buckets** to group items into clearly defined sections. Work packages that are not assigned to a backlog bucket or a sprint are listed in the **index backlog**. +It includes functionality for planning and managing [sprints](#sprint), including a sprint [board](#board) that is automatically created when a sprint is started. Within the backlog, work packages can be organized using **backlog buckets** to group items into clearly defined sections. Work packages that are not assigned to a backlog bucket or a sprint are listed in the **inbox** backlog bucket. To use backlogs in OpenProject, the Backlogs module has to be activated in the [project settings](#project-settings) by a project admin. @@ -98,7 +98,7 @@ BIM stands for Building Information Modeling. In OpenProject, we offer a special ### Board -A board in OpenProject is a view that allows you to see your work packages as cards divided into columns. A board is a typical element in [agile project management](#agile-project-management), supporting methodologies such as Scrum or Kanban. OpenProject, you can use a [basic board](../user-guide/agile-boards/#basic-boards) or [advanced Action boards](../user-guide/agile-boards). Use advanced Action boards to quickly change attributes of your work package. [Read more about boards for agile project management](../user-guide/agile-boards/). +A board in OpenProject is a view that allows you to see your work packages as cards divided into columns. A board is a typical element in [agile project management](#agile-project-management), supporting methodologies such as Scrum or Kanban. In OpenProject, you can use a [basic board](../user-guide/agile-boards/#basic-boards) or [advanced Action boards](../user-guide/agile-boards). Use advanced Action boards to quickly change attributes of your work package. [Read more about boards for agile project management](../user-guide/agile-boards/). **More information on boards in OpenProject** @@ -200,7 +200,7 @@ Excel synchronization is an integration in OpenProject which allows you to easil ### File storage -File storages can be configured in the System Administration and then be selected in the [project settings](#project-settings). OpenProject offers a [Nextcloud integration](#nextcloud-integration) to support file storage. [More information on file storage with the Nextcloud integration](../user-guide/file-management/nextcloud-integration/). +File storages can be configured in the system administration and then be selected in the [project settings](#project-settings). OpenProject offers a [Nextcloud integration](#nextcloud-integration) to support file storage. [More information on file storage with the Nextcloud integration](../user-guide/file-management/nextcloud-integration/). ### Filters @@ -218,11 +218,11 @@ The Gantt charts [module](#module) in OpenProject displays the work packages in ### Global modules -In OpenProject, global modules are defined as a menu to access all [modules](#module) for *all* your projects. With global modules you can easily see all your project-overarching information at one place, e.g. for work packages, boards, calendars or meetings. Click on the grid icon on the left side of the header menu to access the global modules. [Read more about global modules in OpenProject](../user-guide/home/global-modules/). +In OpenProject, global modules are defined as a menu to access all [modules](#module) for *all* your projects. With global modules you can easily see all your project-overarching information at one place, e.g. for [work packages](#work-package), [boards](#board), calendars or [meetings](#meetings). Click on the grid icon on the left side of the header menu to access the global modules. [Read more about global modules in OpenProject](../user-guide/home/global-modules/). ### Group -A group in OpenProject is defined as a list of users which can be added as a member to projects with a selected [role](#role). Groups can also be assigned to work packages. New groups can be defined in *Administration → Users and permissions → Groups*. +A group in OpenProject is defined as a list of users which can be added as a member to projects with a selected [role](#role). Groups can also be assigned to work packages. They can be nested to represent organizational structures and inherit permissions from parent groups. New groups can be defined in *Administration → Users and permissions → Groups*. ## H @@ -343,7 +343,7 @@ OpenProject on-premises is a self-hosted version of OpenProject. As opposed to t **More information on OpenProject on-premises** -- [See our pricing side about your options for OpenProject](https://www.openproject.org/pricing/). +- [See our pricing page about your options for OpenProject](https://www.openproject.org/pricing/). - [Read a blog article comparing on-premises and cloud](https://www.openproject.org/blog/why-self-hosting-software/). - [Read how to activate the Enterprise on-premises edition](../enterprise-guide/enterprise-on-premises-guide/activate-enterprise-on-premises/). - [Read how to start a trial for Enterprise on-premises](../enterprise-guide/enterprise-on-premises-guide/enterprise-on-premises-trial/). @@ -379,7 +379,7 @@ PM² is a project management framework developed by the European Commission to s ### PMflex -PMflex is is a comprehensive and flexible project management system based on the European [PM²](#pm--pm2) standard and further developed for public administration in Germany. [Read more about how to use PMflex with OpenProject](https://www.openproject.org/pmflex). If you are looking for specific PMflex terminology, please see our [use case of implementing PM² and PMflex project management in OpenProject](../use-cases/project-management-pm2-pmflex/#implementing-pm-and-pmflex-project-management-in-openproject). +PMflex is a comprehensive and flexible project management system based on the European [PM²](#pm--pm2) standard and further developed for public administration in Germany. [Read more about how to use PMflex with OpenProject](https://www.openproject.org/pmflex). If you are looking for specific PMflex terminology, please see our [use case of implementing PM² and PMflex project management in OpenProject](../use-cases/project-management-pm2-pmflex/#implementing-pm-and-pmflex-project-management-in-openproject). ### Portfolio @@ -388,7 +388,7 @@ In OpenProject, you can manage your project portfolio by creating, filtering and ### Primer design system -OpenProject started adopting [Github's Primer Design System](https://primer.style/) in 2023. New features will be developed using Primer and existing features will will be gradually revised. Relevant reusable components from Primer as well as common patterns and compositions of these components will be documented in our [Lookbook](https://qa.openproject-edge.com/lookbook/pages/how_to_use). [Read more about OpenProject's decision to use Primer](https://www.openproject.org/blog/primer-design-system/). +OpenProject started adopting [Github's Primer Design System](https://primer.style/) in 2023. New features will be developed using Primer and existing features will be gradually revised. Relevant reusable components from Primer as well as common patterns and compositions of these components will be documented in our [Lookbook](https://qa.openproject-edge.com/lookbook/pages/how_to_use). [Read more about OpenProject's decision to use Primer](https://www.openproject.org/blog/primer-design-system/). ### Project @@ -404,9 +404,7 @@ A project attribute in OpenProject is a [custom field](#custom-field) that appli ### Project folder -Project folders help collaborating in the most efficient way. They can be used with -OpenProject's [Nextcloud integration](#nextcloud-integration) or with -OpenProject's [OneDrive integration](#onedrive-integration). [Read more about project folders in OpenProject](../user-guide/projects/project-settings/files/#project-folders). +Project folders help collaborating in the most efficient way. They can be used with OpenProject's [Nextcloud integration](#nextcloud-integration) or with OpenProject's [OneDrive integration](#onedrive-integration). [Read more about project folders in OpenProject](../user-guide/projects/project-settings/files/#project-folders). ### Project home @@ -437,7 +435,7 @@ Phases and phase gates are visible on the [project home](#project-home) page, in ### Project lists -In OpenProject, project lists are very useful for project portfolio managers to get an overview of all their [projects](#project) on the instance. Access your project lists on OpenProject by either navigating to the "All projects" menu and clicking on the "Project lists" button, or via the [Global modules](#global-modules). [Read more about project lists OpenProject](../user-guide/projects/project-lists/). +In OpenProject, project lists are very useful for project portfolio managers to get an overview of all their [projects](#project) on the instance. Access your project lists on OpenProject by either navigating to the "All projects" menu and clicking on the "Project lists" button, or via the [Global modules](#global-modules). [Read more about project lists in OpenProject](../user-guide/projects/project-lists/). ### Project navigation @@ -481,7 +479,7 @@ In OpenProject, you can set work packages in relation to each other. Some relati OpenProject offers different types of reminders so that you can lean back and never forget a task. One is the [date alert](#date-alerts) (Enterprise add-on), which generates automatic and customized [notifications](#notifications) regarding a work package's due date or start date. -OpenProject also allows you to set **work package reminders**: Simply activate the clock icon on top of a work package and choose from different options, e.g. to be reminded the next day (at 9 am) or in one week. You can also set a custom date. [Read more about work package reminders in OpenProject](../user-guide/work-packages/edit-work-package/#work-package-reminders). +OpenProject also allows you to set **work package reminders**: Simply activate the clock icon on top of a work package and choose from different options, e.g. to be reminded the next day (at 9 am) or in one week. You can also set a custom date. [Read more about work package reminders in OpenProject](../user-guide/work-packages/edit-work-package/#work-package-reminders). ### Repository @@ -509,6 +507,10 @@ SAML (Security Assertion Markup Language) is an open standard for exchanging aut OpenProject offers the possibility to share work packages with external groups or users that are not [members](#member) of the project. This feature is an [Enterprise add-on](#enterprise-add-on). Every user with whom a work package is shared must either already be a user of the instance or be newly created. The latter requires special rights. [Read more about OpenProject's feature to share work packages with project non-members](../user-guide/work-packages/share-work-packages/). +### Sprint + +A sprint is a time-boxed iteration used in agile project management to plan and execute work during a defined period. In OpenProject, sprints are managed through the [Backlogs](#backlogs) module and include attributes such as start and end dates. Sprint [boards](#board) are automatically created when a sprint is started. + ### Story points Story points is a term known in Scrum. They are defined as numbers assigned to a [work package](#work-package) used to estimate (relatively) the size of the work. In OpenProject, you can add story points to work packages. [Read how to work with story points in OpenProject](../user-guide/backlogs-scrum/#story-points). @@ -545,7 +547,7 @@ The OpenProject [user guide](../user-guide/) is an in-depth guide of all feature ### Versions -Versions in OpenProject are defined as an attribute for [work packages](#work-package) or in the [Backlogs](#backlogs) module. Versions will be displayed in the [Roadmap](#roadmap). In the [Enterprise edition](#enterprise-add-on), you can also create a version [board](#board) to get an overview of the progress of your versions. [Read more about how to manage versions in OpenProject](../user-guide/projects/project-settings/versions/). +Versions in OpenProject are used to group and organize work packages, for example to plan releases, milestones, or delivery targets. Versions are displayed in the [Roadmap](#roadmap) and can be assigned to work packages as an attribute. You can also create a version [board](#board) to get an overview of the progress of your versions. [Read more about how to manage versions in OpenProject](../user-guide/projects/project-settings/versions/). ## W @@ -569,7 +571,8 @@ In OpenProject, a wiki is defined as a [module](#module) that allows to use wiki ### Work, Remaining Work and % Complete -In OpenProject, '**Work**' refers to a work package attribute indicating the estimated hours and days needed to complete a task. +In OpenProject, '**Work**' refers to a work package attribute indicating the estimated hours and days needed to complete a task. + '**Remaining work**' is a work package attribute that shows how much work is left to finish the work package. It is automatically calculated if you work with [status-based progress reporting](../user-guide/time-and-costs/progress-tracking/#status-based-progress-reporting). And '**% Complete**' is an automatically calculated work package attribute that shows in percentage how much work is already completed. All three attributes are important for [progress reporting with OpenProject](https://www.openproject.org/blog/changes-progress-work-estimates/). To make it easier for project managers to work with work package hierarchies, OpenProject also displays a value (in blue) for the total amount of work in the Work field for parent work packages – next to the value for the dedicated work package. This **total work value** is the sum of the work value of the parent work package and all the work values of its children. The same principle applies to the work package attribute Remaining Work. [Read in our user guide about how to configure a work package](../user-guide/work-packages/work-package-table-configuration/) @@ -599,7 +602,11 @@ If you need a Category that applies to all projects on your instance, we recomme ### Work package ID -Work package ID is defined as a unique ascending number assigned to a newly created work package. Work package IDs cannot be changed and are numbered across all projects of an OpenProject instance (therefore, the numbering within a project may not be sequential). +In OpenProject, every work package has a unique ID (identifier). It is automatically assigned when a work package is created. Work package IDs are configured globally and apply across the entire OpenProject instance. + +By default, work package IDs are numerical, ascending numbers, for example #429. System [administrators](#admin) can optionally switch to project-based work package IDs, which consist of a project-specific prefix and an ascending number (e.g. OP-382). Project-based identifiers that have been used are [reserved and can be released if necessary](../system-admin-guide/projects/reserved-project-identifiers/) so that they can be used again. + +Administrators can configure work package identifiers under *Administration → Work packages → Identifiers*. [Read more in the OpenProject system admin guide](../user-guide/projects/project-settings/project-information/#change-project-identifier). ### Work package subject @@ -617,7 +624,7 @@ Work package types are the different items a work package can represent. Each wo ### Work package view -A list of work packages is considered a view. The containing work packages in any view can be displayed a number of different ways. Examples for most used work package views are the [table view](#work-package-table), the full screen view or the split screen view. You can also display work packages in a card view and use them in a [board](#board) to use agile methods. [Read more about work package views in OpenProject](../user-guide/work-packages/work-package-views/#work-packages-views). +A list of work packages is considered a view. The containing work packages in any view can be displayed a number of different ways. Examples for most used work package views are the [table view](#work-package-table), the full screen view or the split screen view. You can also display work packages in a card view and use them in a [board](#board) to use agile methods. [Read more about work package views in OpenProject](../user-guide/work-packages/work-package-views/#work-packages-views). ### WYSIWYG editor From 7411f1d985c25e77c42f6906b033e2466f570d73 Mon Sep 17 00:00:00 2001 From: Henriette Darge Date: Mon, 8 Jun 2026 11:01:35 +0200 Subject: [PATCH 041/107] Set min-height to avoid label being cut off --- app/components/work_packages/info_line_component.sass | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/components/work_packages/info_line_component.sass b/app/components/work_packages/info_line_component.sass index 365c23227f4..b1d65da4f1d 100644 --- a/app/components/work_packages/info_line_component.sass +++ b/app/components/work_packages/info_line_component.sass @@ -4,6 +4,9 @@ @include text-shortener min-width: 25px max-width: 66% + // The label has a height of 18.5px. Half pixels are resolved differently by each OS/browser combination, + // resulting in cases where the bottom of the label was cut off + min-height: 19px &--id white-space: nowrap From 63332d3957d0581f20f6cbb790342aaf6472a8a4 Mon Sep 17 00:00:00 2001 From: Behrokh Satarnejad <62008897+bsatarnejad@users.noreply.github.com> Date: Mon, 8 Jun 2026 11:35:22 +0200 Subject: [PATCH 042/107] [Dream-709] Highlighting of selecting WP does not work in notification center (#23599) * Fix selected notification highlight for semantic WP IDs * Update spec --- .../center/in-app-notification-center.component.html | 4 ++-- .../center/in-app-notification-center.component.ts | 10 +++++++++- .../notifications/semantic_id_navigation_spec.rb | 1 + 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/frontend/src/app/features/in-app-notifications/center/in-app-notification-center.component.html b/frontend/src/app/features/in-app-notifications/center/in-app-notification-center.component.html index 7cb262762df..e3e3ce5ddc1 100644 --- a/frontend/src/app/features/in-app-notifications/center/in-app-notification-center.component.html +++ b/frontend/src/app/features/in-app-notifications/center/in-app-notification-center.component.html @@ -13,12 +13,12 @@ class="op-ian-item" [class.op-ian-item_expanded]="records[0].expanded" [class.op-ian-item_read]="records[0].readIAN === true" - [class.op-ian-item_selected]="(selectedWorkPackage$ | async) === idFromLink(records[0]._links.resource.href)" + [class.op-ian-item_selected]="notificationMatchesSelectedWorkPackage(records[0], selectedWorkPackage$ | async)" [notification]="records[0]" [aggregatedNotifications]="records" attr.data-test-selector="op-ian-notification-item-{{records[0].id}}" [attr.data-qa-ian-read]="records[0].readIAN === true || undefined" - [attr.data-qa-ian-selected]="(selectedWorkPackage$ | async) === idFromLink(records[0]._links.resource.href)" + [attr.data-qa-ian-selected]="notificationMatchesSelectedWorkPackage(records[0], selectedWorkPackage$ | async)" /> } @else { diff --git a/frontend/src/app/features/in-app-notifications/center/in-app-notification-center.component.ts b/frontend/src/app/features/in-app-notifications/center/in-app-notification-center.component.ts index 8d882fa961d..becd64a64ea 100644 --- a/frontend/src/app/features/in-app-notifications/center/in-app-notification-center.component.ts +++ b/frontend/src/app/features/in-app-notifications/center/in-app-notification-center.component.ts @@ -153,7 +153,7 @@ export class InAppNotificationCenterComponent implements OnInit { protected readonly idFromLink = idFromLink; ngOnInit():void { - const facet = this.urlParams.get('facet') || 'unread'; + const facet = this.urlParams.get('facet') ?? 'unread'; this.storeService.setFacet(facet as 'unread'|'all'); this.storeService.setFilters({ filter: this.urlParams.get('filter'), @@ -172,4 +172,12 @@ export class InAppNotificationCenterComponent implements OnInit { return this.text.no_notification_for_filter; } + + notificationMatchesSelectedWorkPackage(notification:INotification, selected:string|null):boolean { + const href = notification._links.resource?.href; + const workPackageId = href ? idFromLink(href) : null; + const workPackage = workPackageId ? this.apiV3.work_packages.cache.current(workPackageId) : null; + + return selected === workPackageId || selected === workPackage?.displayId; + } } diff --git a/spec/features/notifications/semantic_id_navigation_spec.rb b/spec/features/notifications/semantic_id_navigation_spec.rb index a4bd84fc066..ff0ae8c796e 100644 --- a/spec/features/notifications/semantic_id_navigation_spec.rb +++ b/spec/features/notifications/semantic_id_navigation_spec.rb @@ -42,6 +42,7 @@ RSpec.describe "Notification center uses displayId when navigating to the work p expect(page).to have_current_path( "/notifications/details/#{semantic_id}/activity" ) + center.expect_item_selected(notification) end it "renders the notification's WP link with the semantic identifier in its href" do From 52276e0db3e34a4a130eb923c2e34e42b90036cc Mon Sep 17 00:00:00 2001 From: Wieland Lindenthal Date: Fri, 5 Jun 2026 16:35:31 +0200 Subject: [PATCH 043/107] Fix CTRL+Z in documents https://community.openproject.org/wp/STC-779 Three independent defects together caused Y.UndoManager state to be lost in the documents module: 1. `useCreateBlockNote(editorParams, [activeUser])` used `[activeUser]` as the recreation key. BlockNote's `useCreateBlockNote(options, deps)` uses `deps` as the sole `useMemo` key (options is intentionally NOT in deps). Since `block-note-element.ts` parses a fresh `activeUser` from the host attribute via `JSON.parse` on every `renderCallback` invocation, any path that re-rendered the React tree handed in a new object reference and rebuilt the editor (and its UndoManager). 2. `LiveCollaborationManager.initializeYjsProvider` was not idempotent. Stimulus's `init-yjs-provider` controller can fire `connect()` a second time without firing `disconnect()` (HMR replay, Turbo morph, parent re-attach). The duplicate call destroyed the live Y.Doc + provider and rebuilt both, remounting the editor and wiping its history. The controller now adopts the existing session via `getCurrentSessionFor(documentName)` instead of constructing a duplicate. 3. The `React.StrictMode` wrap in `block-note-element.ts` caused BlockNoteView to destroy and recreate the ProseMirror view between StrictMode's two dev-mode mounts. `y-prosemirror`'s `yUndoPlugin` destroys the `Y.UndoManager` on view-destroy (removing its `afterTransaction` handler from the Y.Doc), but the plugin state retains the now-dead UndoManager reference. After the second mount the editor reused the destroyed UndoManager, no handler was re-attached, no stack items were recorded, and Ctrl+Z was a no-op. StrictMode is dev-only and incompatible with the current y-prosemirror lifecycle, so it is removed from the BlockNote tree. Verified on release/17.5: typing produces stack items, Ctrl+Z reverts to the previous state, Ctrl+Shift+Z reapplies, and the Y.Doc has exactly one `afterTransaction` observer (the live UndoManager's). Synthetic duplicate `connect()` no longer remounts the editor. Co-Authored-By: Claude Opus 4.7 --- frontend/src/elements/block-note-element.ts | 11 +++++-- .../react/components/OpBlockNoteEditor.tsx | 6 +++- .../documents/init-yjs-provider.controller.ts | 13 +++++++- .../helpers/live-collaboration-helpers.ts | 31 +++++++++++++++++-- 4 files changed, 54 insertions(+), 7 deletions(-) diff --git a/frontend/src/elements/block-note-element.ts b/frontend/src/elements/block-note-element.ts index 6ba9a5e5c2e..91f280db7e1 100644 --- a/frontend/src/elements/block-note-element.ts +++ b/frontend/src/elements/block-note-element.ts @@ -88,9 +88,14 @@ class BlockNoteElement extends HTMLElement { this.reactRoot = createRoot(this.editorMount); this.renderCallback = (provider:HocuspocusProvider) => { - this.reactRoot?.render( - React.createElement(React.StrictMode, null, this.BlockNoteReactContainer(provider)) - ); + // Do NOT wrap in React.StrictMode. StrictMode's dev-mode double-mount causes + // BlockNoteView to destroy and recreate the ProseMirror view between the two mounts. + // y-prosemirror's `yUndoPlugin` destroys the Y.UndoManager on view-destroy (removing + // its `afterTransaction` handler from the Y.Doc), but the plugin's STATE retains the + // now-destroyed UndoManager reference. On the second mount the editor reuses the + // destroyed UndoManager, no `afterTransaction` handler is ever re-attached, no stack + // items are recorded, and Ctrl+Z becomes a no-op. + this.reactRoot?.render(this.BlockNoteReactContainer(provider)); }; LiveCollaborationManager.onReady(this.renderCallback); diff --git a/frontend/src/react/components/OpBlockNoteEditor.tsx b/frontend/src/react/components/OpBlockNoteEditor.tsx index 0bf2ef36b9f..60388ea1ca7 100644 --- a/frontend/src/react/components/OpBlockNoteEditor.tsx +++ b/frontend/src/react/components/OpBlockNoteEditor.tsx @@ -124,7 +124,11 @@ export function OpBlockNoteEditor({ }; }, [hocuspocusProvider, doc, activeUser, localeDictionary, attachmentsEnabled, uploadFile, captureExternalLinks]); - const editor = useCreateBlockNote(editorParams, [activeUser]); + // Create the editor exactly once per mount. `useCreateBlockNote(options, deps)` uses `deps` + // as the sole `useMemo` key — `options` is intentionally NOT in deps. `[activeUser]` rebuilt + // the editor (wiping `Y.UndoManager` history) whenever a fresh `activeUser` reference + // reached this component, e.g. on Stimulus reconnect / Turbo morph. + const editor = useCreateBlockNote(editorParams, []); useOpBlockNoteExtensions(editor); type EditorType = typeof editor; const theme = useOpTheme(); diff --git a/frontend/src/stimulus/controllers/dynamic/documents/init-yjs-provider.controller.ts b/frontend/src/stimulus/controllers/dynamic/documents/init-yjs-provider.controller.ts index e935131f9f8..3920327b064 100644 --- a/frontend/src/stimulus/controllers/dynamic/documents/init-yjs-provider.controller.ts +++ b/frontend/src/stimulus/controllers/dynamic/documents/init-yjs-provider.controller.ts @@ -74,6 +74,17 @@ export default class extends Controller { connect():void { this.currentToken = this.tokenPayloadValue; + // If a provider for this document is already live, don't build a duplicate + // — adopt it. Stimulus can fire connect() a second time (HMR replay, Turbo + // morph, parent re-attach) without firing disconnect(); building a fresh + // Y.Doc + provider in that case would destroy the live one and wipe the + // editor's Y.UndoManager mid-session. + const existing = LiveCollaborationManager.getCurrentSessionFor(this.documentNameValue); + if (existing) { + this.ownedProvider = existing.provider; + return; + } + const ydoc:Doc = new Y.Doc(); const provider = new HocuspocusProvider({ url: this.hocuspocusUrlValue, @@ -87,7 +98,7 @@ export default class extends Controller { }, }); - LiveCollaborationManager.initializeYjsProvider(provider, ydoc); + LiveCollaborationManager.initializeYjsProvider(provider, ydoc, this.documentNameValue); this.ownedProvider = provider; if (this.refreshUrlValue && this.tokenExpiresInSecondsValue) { diff --git a/frontend/src/stimulus/helpers/live-collaboration-helpers.ts b/frontend/src/stimulus/helpers/live-collaboration-helpers.ts index d1a5452f2ff..3a3d8e933d0 100644 --- a/frontend/src/stimulus/helpers/live-collaboration-helpers.ts +++ b/frontend/src/stimulus/helpers/live-collaboration-helpers.ts @@ -36,21 +36,47 @@ type Listener = (provider:HocuspocusProvider) => void; class LiveCollaborationManagerClass { yjsProviderInstance:HocuspocusProvider|null = null; yjsDocInstance:Doc|null = null; + private currentDocumentName:string|null = null; private listeners:Listener[] = []; /** - * Initializes the YJS Provider + * Returns the active session for the given document, or null if none. + * + * Used by the init-yjs-provider Stimulus controller to detect that a + * provider for the same document is already live — letting it adopt the + * existing session instead of building a duplicate Y.Doc + provider pair. + * Stimulus can fire `connect()` a second time (HMR replay, Turbo morph) + * without firing `disconnect()`; without this check, the spurious re-init + * would tear down the live Y.Doc and wipe the editor's Y.UndoManager + * history mid-session. + */ + getCurrentSessionFor(documentName:string):{provider:HocuspocusProvider; doc:Doc} | null { + if (this.yjsProviderInstance && this.yjsDocInstance && this.currentDocumentName === documentName) { + return { provider: this.yjsProviderInstance, doc: this.yjsDocInstance }; + } + return null; + } + + /** + * Initializes the YJS Provider for the given document. + * + * Callers SHOULD first check {@link getCurrentSessionFor} and adopt any + * existing session rather than calling this with a fresh provider, since + * this method unconditionally tears down the previous provider/doc. + * * @param provider The provider to use * @param doc The Y.Doc instance to use + * @param documentName Logical identifier of the document being edited * @returns void */ - initializeYjsProvider(provider:HocuspocusProvider, doc:Doc) { + initializeYjsProvider(provider:HocuspocusProvider, doc:Doc, documentName:string) { this.destroyYjsProvider(); this.destroyYjsDoc(); this.yjsProviderInstance = provider; this.yjsDocInstance = doc; + this.currentDocumentName = documentName; this.listeners.forEach((listener) => listener(this.yjsProviderInstance!)); } @@ -82,6 +108,7 @@ class LiveCollaborationManagerClass { private destroy():void { this.destroyYjsProvider(); this.destroyYjsDoc(); + this.currentDocumentName = null; this.listeners = []; } From 5bc54dd1ec09ce75853b1c672e4da38562bd1651 Mon Sep 17 00:00:00 2001 From: ulferts Date: Mon, 8 Jun 2026 13:09:08 +0200 Subject: [PATCH 044/107] fix flickering work package table on my page spec rspec ./modules/my_page/spec/features/my/work_package_table_spec.rb:81 The spec actually tested a differnt widget --- .../features/my/work_package_table_spec.rb | 25 +++++++++++-------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/modules/my_page/spec/features/my/work_package_table_spec.rb b/modules/my_page/spec/features/my/work_package_table_spec.rb index e0fc6a8a15d..0921cd72aae 100644 --- a/modules/my_page/spec/features/my/work_package_table_spec.rb +++ b/modules/my_page/spec/features/my/work_package_table_spec.rb @@ -84,18 +84,21 @@ RSpec.describe "Arbitrary WorkPackage query table widget on my page", created_by_me_area = Components::Grids::GridArea.new(".grid--area.-widgeted:nth-of-type(2)") expect(created_by_me_area.area) .to have_css(".subject", text: type_work_package.subject) - - my_page.add_widget(1, 2, :column, "Work packages table") - - # Actually there are two success messages displayed currently. One for the grid getting updated and one - # for the query assigned to the new widget being created. A user will not notice it but the automated - # browser can get confused. Therefore we wait. - sleep(2) + assigned_to_me_area = Components::Grids::GridArea.new(".grid--area.-widgeted:nth-of-type(1)") my_page.expect_and_dismiss_toaster message: I18n.t("js.notice_successful_update") - filter_area = Components::Grids::GridArea.new(".grid--area.-widgeted:nth-of-type(3)") - filter_area.expect_to_span(1, 3, 2, 4) + my_page.add_widget(1, 3, :column, "Work packages table") + + my_page.expect_and_dismiss_toaster message: I18n.t("js.notice_successful_update") + + created_by_me_area.remove + assigned_to_me_area.remove + + my_page.expect_and_dismiss_toaster message: I18n.t("js.notice_successful_update") + + filter_area = Components::Grids::GridArea.new(".grid--area.-widgeted:nth-of-type(1)") + filter_area.expect_to_span(1, 1, 2, 2) # At the beginning, the default query is displayed expect(filter_area.area) @@ -108,7 +111,7 @@ RSpec.describe "Arbitrary WorkPackage query table widget on my page", filter_area.configure_wp_table modal.switch_to("Filters") - filters.expect_filter_count(3) + filters.expect_filter_count(2) filters.add_filter_by("Type", "is (OR)", type.name) modal.save @@ -167,7 +170,7 @@ RSpec.describe "Arbitrary WorkPackage query table widget on my page", my_page.visit! wait_for_network_idle - filter_area = Components::Grids::GridArea.new(".grid--area.-widgeted:nth-of-type(3)") + filter_area = Components::Grids::GridArea.new(".grid--area.-widgeted:nth-of-type(1)") retry_block do # Wait for the widget to load from its persisted state before asserting. From 164e31c1d5a71e4e121e39db7d3e5109c07c8a50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20G=C3=BCnther?= Date: Wed, 3 Jun 2026 14:45:52 +0200 Subject: [PATCH 045/107] Add flat paths for meeting API --- .../agenda_items_by_meeting_api.rb | 13 +- .../meeting_agenda_item_representer.rb | 8 +- .../meeting_agenda_items_api.rb | 56 +++++++ .../meeting_outcome_representer.rb | 22 +-- .../meeting_outcomes/meeting_outcomes_api.rb | 56 +++++++ .../outcomes_by_agenda_item_api.rb | 16 +- .../meeting_section_representer.rb | 3 +- .../meeting_sections/meeting_sections_api.rb | 56 +++++++ .../sections_by_meeting_api.rb | 13 +- .../api/v3/meetings/meeting_representer.rb | 4 +- .../lib/api/v3/meetings/meetings_api.rb | 5 + .../lib/open_project/meeting/engine.rb | 48 ++++-- .../agenda_items_by_meeting_resource_spec.rb | 139 ++++++++++++++++-- .../outcomes_by_agenda_item_resource_spec.rb | 80 ++++++++-- .../sections_by_meeting_resource_spec.rb | 55 +++++-- 15 files changed, 471 insertions(+), 103 deletions(-) create mode 100644 modules/meeting/lib/api/v3/meeting_agenda_items/meeting_agenda_items_api.rb create mode 100644 modules/meeting/lib/api/v3/meeting_outcomes/meeting_outcomes_api.rb create mode 100644 modules/meeting/lib/api/v3/meeting_sections/meeting_sections_api.rb diff --git a/modules/meeting/lib/api/v3/meeting_agenda_items/agenda_items_by_meeting_api.rb b/modules/meeting/lib/api/v3/meeting_agenda_items/agenda_items_by_meeting_api.rb index c9b1f484bc5..5fc7f2dcb1a 100644 --- a/modules/meeting/lib/api/v3/meeting_agenda_items/agenda_items_by_meeting_api.rb +++ b/modules/meeting/lib/api/v3/meeting_agenda_items/agenda_items_by_meeting_api.rb @@ -36,17 +36,10 @@ module API get do items = @meeting.agenda_items.includes(:author, :presenter, :work_package, :meeting_section) MeetingAgendaItemCollectionRepresenter.new(items, - self_link: api_v3_paths.meeting_agenda_items(@meeting.id), + self_link: api_v3_paths.meeting_agenda_items(meeting_id: @meeting.id), current_user:) end - post(&::API::V3::Utilities::Endpoints::Create - .new(model: MeetingAgendaItem, - params_modifier: ->(params) { - params.except(:meeting, :meeting_id).merge(meeting: @meeting) - }) - .mount) - route_param :agenda_item_id, type: Integer, desc: "Agenda item ID" do after_validation do @meeting_agenda_item = @meeting.agenda_items.find(declared_params[:agenda_item_id]) @@ -54,10 +47,6 @@ module API get &::API::V3::Utilities::Endpoints::Show.new(model: MeetingAgendaItem).mount - patch &::API::V3::Utilities::Endpoints::Update.new(model: MeetingAgendaItem).mount - - delete &::API::V3::Utilities::Endpoints::Delete.new(model: MeetingAgendaItem).mount - mount ::API::V3::MeetingOutcomes::OutcomesByAgendaItemAPI end end diff --git a/modules/meeting/lib/api/v3/meeting_agenda_items/meeting_agenda_item_representer.rb b/modules/meeting/lib/api/v3/meeting_agenda_items/meeting_agenda_item_representer.rb index 16d41286ba6..9a23182b7ab 100644 --- a/modules/meeting/lib/api/v3/meeting_agenda_items/meeting_agenda_item_representer.rb +++ b/modules/meeting/lib/api/v3/meeting_agenda_items/meeting_agenda_item_representer.rb @@ -42,8 +42,7 @@ module API { outcomes: %i[author work_package] } ] - self_link id_attribute: ->(*) { [represented.meeting_id, represented.id] }, - title_getter: ->(*) { represented.title } + self_link title_getter: ->(*) { represented.title } property :id @@ -88,7 +87,7 @@ module API next if represented.meeting_section_id.nil? { - href: api_v3_paths.meeting_section(represented.meeting_id, represented.meeting_section_id), + href: api_v3_paths.meeting_section(represented.meeting_section_id), title: represented.meeting_section&.title } } @@ -102,8 +101,7 @@ module API link: ->(*) { represented.outcomes.map do |outcome| { - href: api_v3_paths - .meeting_agenda_item_outcome(represented.meeting_id, represented.id, outcome.id), + href: api_v3_paths.meeting_outcome(outcome.id), title: outcome.id.to_s } end diff --git a/modules/meeting/lib/api/v3/meeting_agenda_items/meeting_agenda_items_api.rb b/modules/meeting/lib/api/v3/meeting_agenda_items/meeting_agenda_items_api.rb new file mode 100644 index 00000000000..a1936b3c0a6 --- /dev/null +++ b/modules/meeting/lib/api/v3/meeting_agenda_items/meeting_agenda_items_api.rb @@ -0,0 +1,56 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +module API + module V3 + module MeetingAgendaItems + class MeetingAgendaItemsAPI < ::API::OpenProjectAPI + resources :meeting_agenda_items do + post &::API::V3::Utilities::Endpoints::Create.new(model: MeetingAgendaItem).mount + + route_param :id, type: Integer, desc: "Agenda item ID" do + after_validation do + @meeting_agenda_item = MeetingAgendaItem + .joins(meeting: :project) + .merge(Meeting.visible) + .find(declared_params[:id]) + end + + get &::API::V3::Utilities::Endpoints::Show.new(model: MeetingAgendaItem).mount + + patch &::API::V3::Utilities::Endpoints::Update.new(model: MeetingAgendaItem).mount + + delete &::API::V3::Utilities::Endpoints::Delete.new(model: MeetingAgendaItem).mount + end + end + end + end + end +end diff --git a/modules/meeting/lib/api/v3/meeting_outcomes/meeting_outcome_representer.rb b/modules/meeting/lib/api/v3/meeting_outcomes/meeting_outcome_representer.rb index 153353f19fe..dac02c36edb 100644 --- a/modules/meeting/lib/api/v3/meeting_outcomes/meeting_outcome_representer.rb +++ b/modules/meeting/lib/api/v3/meeting_outcomes/meeting_outcome_representer.rb @@ -39,10 +39,7 @@ module API self.to_eager_load = [{ meeting_agenda_item: :meeting }, :author, :work_package] - self_link path: :meeting_agenda_item_outcome, - id_attribute: ->(*) { - [represented.meeting_agenda_item.meeting_id, represented.meeting_agenda_item_id, represented.id] - }, + self_link path: :meeting_outcome, title_getter: ->(*) { represented.id.to_s } property :id @@ -56,13 +53,16 @@ module API representer: ::API::V3::Users::UserRepresenter, skip_render: ->(*) { represented.author_id.nil? } - link :agendaItem do - { - href: api_v3_paths.meeting_agenda_item(represented.meeting_agenda_item.meeting_id, - represented.meeting_agenda_item_id), - title: represented.meeting_agenda_item.title - } - end + associated_resource :meeting_agenda_item, + as: :agendaItem, + link: ->(*) { + next if represented.meeting_agenda_item_id.nil? + + { + href: api_v3_paths.meeting_agenda_item(represented.meeting_agenda_item_id), + title: represented.meeting_agenda_item.title + } + } associated_visible_resource :work_package diff --git a/modules/meeting/lib/api/v3/meeting_outcomes/meeting_outcomes_api.rb b/modules/meeting/lib/api/v3/meeting_outcomes/meeting_outcomes_api.rb new file mode 100644 index 00000000000..8101c85217f --- /dev/null +++ b/modules/meeting/lib/api/v3/meeting_outcomes/meeting_outcomes_api.rb @@ -0,0 +1,56 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +module API + module V3 + module MeetingOutcomes + class MeetingOutcomesAPI < ::API::OpenProjectAPI + resources :meeting_outcomes do + post &::API::V3::Utilities::Endpoints::Create.new(model: MeetingOutcome).mount + + route_param :id, type: Integer, desc: "Outcome ID" do + after_validation do + @meeting_outcome = MeetingOutcome + .joins(meeting_agenda_item: { meeting: :project }) + .merge(Meeting.visible) + .find(declared_params[:id]) + end + + get &::API::V3::Utilities::Endpoints::Show.new(model: MeetingOutcome).mount + + patch &::API::V3::Utilities::Endpoints::Update.new(model: MeetingOutcome).mount + + delete &::API::V3::Utilities::Endpoints::Delete.new(model: MeetingOutcome).mount + end + end + end + end + end +end diff --git a/modules/meeting/lib/api/v3/meeting_outcomes/outcomes_by_agenda_item_api.rb b/modules/meeting/lib/api/v3/meeting_outcomes/outcomes_by_agenda_item_api.rb index 9ab379fad82..298e54d3421 100644 --- a/modules/meeting/lib/api/v3/meeting_outcomes/outcomes_by_agenda_item_api.rb +++ b/modules/meeting/lib/api/v3/meeting_outcomes/outcomes_by_agenda_item_api.rb @@ -38,29 +38,17 @@ module API MeetingOutcomeCollectionRepresenter.new(outcomes, self_link: api_v3_paths - .meeting_agenda_item_outcomes(@meeting.id, @meeting_agenda_item.id), + .meeting_agenda_item_outcomes(@meeting_agenda_item.id, + meeting_id: @meeting.id), current_user:) end - post(&::API::V3::Utilities::Endpoints::Create - .new(model: MeetingOutcome, - params_modifier: ->(params) { - params - .except(:meeting_agenda_item, :meeting_agenda_item_id) - .merge(meeting_agenda_item: @meeting_agenda_item) - }) - .mount) - route_param :outcome_id, type: Integer, desc: "Outcome ID" do after_validation do @meeting_outcome = @meeting_agenda_item.outcomes.find(declared_params[:outcome_id]) end get &::API::V3::Utilities::Endpoints::Show.new(model: MeetingOutcome).mount - - patch &::API::V3::Utilities::Endpoints::Update.new(model: MeetingOutcome).mount - - delete &::API::V3::Utilities::Endpoints::Delete.new(model: MeetingOutcome).mount end end end diff --git a/modules/meeting/lib/api/v3/meeting_sections/meeting_section_representer.rb b/modules/meeting/lib/api/v3/meeting_sections/meeting_section_representer.rb index 79b6c768f62..3ffef01b4fe 100644 --- a/modules/meeting/lib/api/v3/meeting_sections/meeting_section_representer.rb +++ b/modules/meeting/lib/api/v3/meeting_sections/meeting_section_representer.rb @@ -38,8 +38,7 @@ module API self.to_eager_load = [:meeting] - self_link id_attribute: ->(*) { [represented.meeting_id, represented.id] }, - title_getter: ->(*) { represented.title } + self_link title_getter: ->(*) { represented.title } property :id diff --git a/modules/meeting/lib/api/v3/meeting_sections/meeting_sections_api.rb b/modules/meeting/lib/api/v3/meeting_sections/meeting_sections_api.rb new file mode 100644 index 00000000000..4434c35ea40 --- /dev/null +++ b/modules/meeting/lib/api/v3/meeting_sections/meeting_sections_api.rb @@ -0,0 +1,56 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +module API + module V3 + module MeetingSections + class MeetingSectionsAPI < ::API::OpenProjectAPI + resources :meeting_sections do + post &::API::V3::Utilities::Endpoints::Create.new(model: MeetingSection).mount + + route_param :id, type: Integer, desc: "Section ID" do + after_validation do + @meeting_section = MeetingSection + .joins(meeting: :project) + .merge(Meeting.visible) + .find(declared_params[:id]) + end + + get &::API::V3::Utilities::Endpoints::Show.new(model: MeetingSection).mount + + patch &::API::V3::Utilities::Endpoints::Update.new(model: MeetingSection).mount + + delete &::API::V3::Utilities::Endpoints::Delete.new(model: MeetingSection).mount + end + end + end + end + end +end diff --git a/modules/meeting/lib/api/v3/meeting_sections/sections_by_meeting_api.rb b/modules/meeting/lib/api/v3/meeting_sections/sections_by_meeting_api.rb index efe1479a4d6..ace20bb5f02 100644 --- a/modules/meeting/lib/api/v3/meeting_sections/sections_by_meeting_api.rb +++ b/modules/meeting/lib/api/v3/meeting_sections/sections_by_meeting_api.rb @@ -36,27 +36,16 @@ module API get do sections = @meeting.sections MeetingSectionCollectionRepresenter.new(sections, - self_link: api_v3_paths.meeting_sections(@meeting.id), + self_link: api_v3_paths.meeting_sections(meeting_id: @meeting.id), current_user:) end - post(&::API::V3::Utilities::Endpoints::Create - .new(model: MeetingSection, - params_modifier: ->(params) { - params.except(:meeting, :meeting_id).merge(meeting: @meeting) - }) - .mount) - route_param :section_id, type: Integer, desc: "Section ID" do after_validation do @meeting_section = @meeting.sections.find(declared_params[:section_id]) end get &::API::V3::Utilities::Endpoints::Show.new(model: MeetingSection).mount - - patch &::API::V3::Utilities::Endpoints::Update.new(model: MeetingSection).mount - - delete &::API::V3::Utilities::Endpoints::Delete.new(model: MeetingSection).mount end end end diff --git a/modules/meeting/lib/api/v3/meetings/meeting_representer.rb b/modules/meeting/lib/api/v3/meetings/meeting_representer.rb index 11cc02bb724..793490a5a01 100644 --- a/modules/meeting/lib/api/v3/meetings/meeting_representer.rb +++ b/modules/meeting/lib/api/v3/meetings/meeting_representer.rb @@ -76,13 +76,13 @@ module API link :agendaItems do { - href: api_v3_paths.meeting_agenda_items(represented.id) + href: api_v3_paths.meeting_agenda_items(meeting_id: represented.id) } end link :sections do { - href: api_v3_paths.meeting_sections(represented.id) + href: api_v3_paths.meeting_sections(meeting_id: represented.id) } end diff --git a/modules/meeting/lib/api/v3/meetings/meetings_api.rb b/modules/meeting/lib/api/v3/meetings/meetings_api.rb index 34e793394d3..d339b4cc684 100644 --- a/modules/meeting/lib/api/v3/meetings/meetings_api.rb +++ b/modules/meeting/lib/api/v3/meetings/meetings_api.rb @@ -1,4 +1,5 @@ # frozen_string_literal: true + #-- copyright # OpenProject is an open source project management software. # Copyright (C) the OpenProject GmbH @@ -58,6 +59,10 @@ module API mount ::API::V3::MeetingSections::SectionsByMeetingAPI end end + + mount ::API::V3::MeetingAgendaItems::MeetingAgendaItemsAPI + mount ::API::V3::MeetingSections::MeetingSectionsAPI + mount ::API::V3::MeetingOutcomes::MeetingOutcomesAPI end end end diff --git a/modules/meeting/lib/open_project/meeting/engine.rb b/modules/meeting/lib/open_project/meeting/engine.rb index c7894770d41..8ea3f1a9cdc 100644 --- a/modules/meeting/lib/open_project/meeting/engine.rb +++ b/modules/meeting/lib/open_project/meeting/engine.rb @@ -241,28 +241,52 @@ module OpenProject::Meeting "#{root}/meetings/#{id}/form" end - add_api_path :meeting_agenda_items do |meeting_id| - "#{meeting(meeting_id)}/agenda_items" + add_api_path :meeting_agenda_items do |meeting_id: nil| + if meeting_id + "#{meeting(meeting_id)}/agenda_items" + else + "#{root}/meeting_agenda_items" + end end - add_api_path :meeting_agenda_item do |meeting_id, id| - "#{meeting(meeting_id)}/agenda_items/#{id}" + add_api_path :meeting_agenda_item do |id, meeting_id: nil| + if meeting_id + "#{meeting(meeting_id)}/agenda_items/#{id}" + else + "#{root}/meeting_agenda_items/#{id}" + end end - add_api_path :meeting_agenda_item_outcomes do |meeting_id, agenda_item_id| - "#{meeting_agenda_item(meeting_id, agenda_item_id)}/outcomes" + add_api_path :meeting_agenda_item_outcomes do |agenda_item_id, meeting_id: nil| + "#{meeting_agenda_item(agenda_item_id, meeting_id:)}/outcomes" end - add_api_path :meeting_agenda_item_outcome do |meeting_id, agenda_item_id, id| - "#{meeting_agenda_item_outcomes(meeting_id, agenda_item_id)}/#{id}" + add_api_path :meeting_outcomes do + "#{root}/meeting_outcomes" end - add_api_path :meeting_sections do |meeting_id| - "#{meeting(meeting_id)}/sections" + add_api_path :meeting_outcome do |id| + "#{root}/meeting_outcomes/#{id}" end - add_api_path :meeting_section do |meeting_id, id| - "#{meeting(meeting_id)}/sections/#{id}" + add_api_path :meeting_agenda_item_outcome do |id, agenda_item_id:, meeting_id: nil| + "#{meeting_agenda_item_outcomes(agenda_item_id, meeting_id:)}/#{id}" + end + + add_api_path :meeting_sections do |meeting_id: nil| + if meeting_id + "#{meeting(meeting_id)}/sections" + else + "#{root}/meeting_sections" + end + end + + add_api_path :meeting_section do |id, meeting_id: nil| + if meeting_id + "#{meeting(meeting_id)}/sections/#{id}" + else + "#{root}/meeting_sections/#{id}" + end end add_api_path :recurring_meetings do diff --git a/modules/meeting/spec/requests/api/v3/meeting_agenda_items/agenda_items_by_meeting_resource_spec.rb b/modules/meeting/spec/requests/api/v3/meeting_agenda_items/agenda_items_by_meeting_resource_spec.rb index 5d5bdb39574..c040a31a1ed 100644 --- a/modules/meeting/spec/requests/api/v3/meeting_agenda_items/agenda_items_by_meeting_resource_spec.rb +++ b/modules/meeting/spec/requests/api/v3/meeting_agenda_items/agenda_items_by_meeting_resource_spec.rb @@ -51,7 +51,7 @@ RSpec.describe "API v3 Meeting Agenda Items sub-resource", content_type: :json d end describe "GET /api/v3/meetings/:meeting_id/agenda_items" do - let(:path) { api_v3_paths.meeting_agenda_items(meeting.id) } + let(:path) { api_v3_paths.meeting_agenda_items(meeting_id: meeting.id) } before { get path } @@ -69,6 +69,18 @@ RSpec.describe "API v3 Meeting Agenda Items sub-resource", content_type: :json d expect(last_response.body) .to have_json_size(1) .at_path("_embedded/elements/0/_embedded/outcomes") + + expect(last_response.body) + .to be_json_eql(api_v3_paths.meeting_outcome(outcome.id).to_json) + .at_path("_embedded/elements/0/_links/outcomes/0/href") + + expect(last_response.body) + .to be_json_eql(api_v3_paths.meeting_agenda_item(agenda_item.id).to_json) + .at_path("_embedded/elements/0/_links/self/href") + + expect(last_response.body) + .to be_json_eql(api_v3_paths.meeting_section(section.id).to_json) + .at_path("_embedded/elements/0/_links/section/href") end context "without view_meetings permission" do @@ -80,11 +92,16 @@ RSpec.describe "API v3 Meeting Agenda Items sub-resource", content_type: :json d end end - describe "POST /api/v3/meetings/:meeting_id/agenda_items" do - let(:path) { api_v3_paths.meeting_agenda_items(meeting.id) } + describe "POST /api/v3/meeting_agenda_items" do + let(:path) { api_v3_paths.meeting_agenda_items } let(:body) do { - title: "New agenda item" + title: "New agenda item", + _links: { + meeting: { + href: api_v3_paths.meeting(meeting.id) + } + } }.to_json end @@ -109,6 +126,44 @@ RSpec.describe "API v3 Meeting Agenda Items sub-resource", content_type: :json d .at_path("title") end + context "with a section href returned by the section collection" do + let!(:target_section) { create(:meeting_section, meeting:) } + let(:target_section_href) do + get api_v3_paths.meeting_sections(meeting_id: meeting.id) + + JSON + .parse(last_response.body) + .dig("_embedded", "elements") + .find { |item| item["id"] == target_section.id } + .dig("_links", "self", "href") + end + let(:body) do + { + title: "New agenda item in target section", + _links: { + meeting: { + href: api_v3_paths.meeting(meeting.id) + }, + section: { + href: target_section_href + } + } + }.to_json + end + + it "responds with 201" do + expect(target_section_href).to eq(api_v3_paths.meeting_section(target_section.id)) + expect(response).to have_http_status(:created) + end + + it "creates the agenda item in that section" do + response + + expect(meeting.agenda_items.find_by(title: "New agenda item in target section").meeting_section) + .to eq(target_section) + end + end + context "without manage_agendas permission" do let(:permissions) { %i[view_meetings] } @@ -119,7 +174,7 @@ RSpec.describe "API v3 Meeting Agenda Items sub-resource", content_type: :json d end describe "GET /api/v3/meetings/:meeting_id/agenda_items/:id" do - let(:path) { api_v3_paths.meeting_agenda_item(meeting.id, agenda_item.id) } + let(:path) { api_v3_paths.meeting_agenda_item(agenda_item.id, meeting_id: meeting.id) } before { get path } @@ -141,7 +196,7 @@ RSpec.describe "API v3 Meeting Agenda Items sub-resource", content_type: :json d context "with an item from another meeting" do let(:other_meeting) { create(:meeting, project:, author: current_user) } - let(:path) { api_v3_paths.meeting_agenda_item(other_meeting.id, agenda_item.id) } + let(:path) { api_v3_paths.meeting_agenda_item(agenda_item.id, meeting_id: other_meeting.id) } it "returns 404" do expect(last_response).to have_http_status(:not_found) @@ -155,7 +210,7 @@ RSpec.describe "API v3 Meeting Agenda Items sub-resource", content_type: :json d create(:wp_meeting_agenda_item, meeting:, meeting_section: section, work_package: private_work_package, author: current_user) end - let(:path) { api_v3_paths.meeting_agenda_item(meeting.id, wp_agenda_item.id) } + let(:path) { api_v3_paths.meeting_agenda_item(wp_agenda_item.id, meeting_id: meeting.id) } it "returns 200" do expect(last_response).to have_http_status(:ok) @@ -173,8 +228,34 @@ RSpec.describe "API v3 Meeting Agenda Items sub-resource", content_type: :json d end end - describe "PATCH /api/v3/meetings/:meeting_id/agenda_items/:id" do - let(:path) { api_v3_paths.meeting_agenda_item(meeting.id, agenda_item.id) } + describe "GET /api/v3/meeting_agenda_items/:id" do + let(:path) { api_v3_paths.meeting_agenda_item(agenda_item.id) } + + before { get path } + + it "returns 200 and the agenda item" do + expect(last_response).to have_http_status(:ok) + + expect(last_response.body) + .to be_json_eql("MeetingAgendaItem".to_json) + .at_path("_type") + + expect(last_response.body) + .to be_json_eql(api_v3_paths.meeting_agenda_item(agenda_item.id).to_json) + .at_path("_links/self/href") + end + + context "without view_meetings permission" do + let(:permissions) { [] } + + it "returns 404" do + expect(last_response).to have_http_status(:not_found) + end + end + end + + describe "PATCH /api/v3/meeting_agenda_items/:id" do + let(:path) { api_v3_paths.meeting_agenda_item(agenda_item.id) } let(:body) do { title: "Updated title", @@ -193,6 +274,42 @@ RSpec.describe "API v3 Meeting Agenda Items sub-resource", content_type: :json d expect(agenda_item.reload.title).to eq("Updated title") end + context "with a section href returned by the agenda item collection" do + let(:target_section) { create(:meeting_section, meeting:) } + let!(:target_agenda_item) do + create(:meeting_agenda_item, meeting:, meeting_section: target_section, author: current_user) + end + let(:target_section_href) do + get api_v3_paths.meeting_agenda_items(meeting_id: meeting.id) + + JSON + .parse(last_response.body) + .dig("_embedded", "elements") + .find { |item| item["id"] == target_agenda_item.id } + .dig("_links", "section", "href") + end + let(:body) do + { + lockVersion: agenda_item.lock_version, + _links: { + section: { + href: target_section_href + } + } + }.to_json + end + + it "responds with 200" do + expect(target_section_href).to eq(api_v3_paths.meeting_section(target_section.id)) + expect(response).to have_http_status(:ok) + end + + it "moves the agenda item to that section" do + response + expect(agenda_item.reload.meeting_section).to eq(target_section) + end + end + context "without manage_agendas permission" do let(:permissions) { %i[view_meetings] } @@ -202,8 +319,8 @@ RSpec.describe "API v3 Meeting Agenda Items sub-resource", content_type: :json d end end - describe "DELETE /api/v3/meetings/:meeting_id/agenda_items/:id" do - let(:path) { api_v3_paths.meeting_agenda_item(meeting.id, agenda_item.id) } + describe "DELETE /api/v3/meeting_agenda_items/:id" do + let(:path) { api_v3_paths.meeting_agenda_item(agenda_item.id) } before { delete path } diff --git a/modules/meeting/spec/requests/api/v3/meeting_outcomes/outcomes_by_agenda_item_resource_spec.rb b/modules/meeting/spec/requests/api/v3/meeting_outcomes/outcomes_by_agenda_item_resource_spec.rb index dc0b3d6419a..5dfc4be0954 100644 --- a/modules/meeting/spec/requests/api/v3/meeting_outcomes/outcomes_by_agenda_item_resource_spec.rb +++ b/modules/meeting/spec/requests/api/v3/meeting_outcomes/outcomes_by_agenda_item_resource_spec.rb @@ -51,7 +51,7 @@ RSpec.describe "API v3 Meeting Outcomes sub-resource", content_type: :json do end describe "GET /api/v3/meetings/:meeting_id/agenda_items/:agenda_item_id/outcomes" do - let(:path) { api_v3_paths.meeting_agenda_item_outcomes(meeting.id, agenda_item.id) } + let(:path) { api_v3_paths.meeting_agenda_item_outcomes(agenda_item.id, meeting_id: meeting.id) } before { get path } @@ -65,11 +65,19 @@ RSpec.describe "API v3 Meeting Outcomes sub-resource", content_type: :json do expect(last_response.body) .to have_json_size(1) .at_path("_embedded/elements") + + expect(last_response.body) + .to be_json_eql(api_v3_paths.meeting_outcome(outcome.id).to_json) + .at_path("_embedded/elements/0/_links/self/href") + + expect(last_response.body) + .to be_json_eql(api_v3_paths.meeting_agenda_item(agenda_item.id).to_json) + .at_path("_embedded/elements/0/_links/agendaItem/href") end context "with an agenda item from another meeting" do let(:other_meeting) { create(:meeting, project:, author: current_user) } - let(:path) { api_v3_paths.meeting_agenda_item_outcomes(other_meeting.id, agenda_item.id) } + let(:path) { api_v3_paths.meeting_agenda_item_outcomes(agenda_item.id, meeting_id: other_meeting.id) } it "returns 404" do expect(last_response).to have_http_status(:not_found) @@ -108,12 +116,17 @@ RSpec.describe "API v3 Meeting Outcomes sub-resource", content_type: :json do end end - describe "POST /api/v3/meetings/:meeting_id/agenda_items/:agenda_item_id/outcomes" do - let(:path) { api_v3_paths.meeting_agenda_item_outcomes(meeting.id, agenda_item.id) } + describe "POST /api/v3/meeting_outcomes" do + let(:path) { api_v3_paths.meeting_outcomes } let(:body) do { kind: "information", - notes: { raw: "Outcome created via API" } + notes: { raw: "Outcome created via API" }, + _links: { + agendaItem: { + href: api_v3_paths.meeting_agenda_item(agenda_item.id) + } + } }.to_json end @@ -153,6 +166,9 @@ RSpec.describe "API v3 Meeting Outcomes sub-resource", content_type: :json do { kind: "work_package", _links: { + agendaItem: { + href: api_v3_paths.meeting_agenda_item(agenda_item.id) + }, workPackage: { href: api_v3_paths.work_package(work_package.id) } @@ -182,6 +198,9 @@ RSpec.describe "API v3 Meeting Outcomes sub-resource", content_type: :json do { kind: "work_package", _links: { + agendaItem: { + href: api_v3_paths.meeting_agenda_item(agenda_item.id) + }, workPackage: { href: api_v3_paths.work_package(private_work_package.id) } @@ -197,7 +216,11 @@ RSpec.describe "API v3 Meeting Outcomes sub-resource", content_type: :json do end describe "GET /api/v3/meetings/:meeting_id/agenda_items/:agenda_item_id/outcomes/:id" do - let(:path) { api_v3_paths.meeting_agenda_item_outcome(meeting.id, agenda_item.id, outcome.id) } + let(:path) do + api_v3_paths.meeting_agenda_item_outcome(outcome.id, + agenda_item_id: agenda_item.id, + meeting_id: meeting.id) + end before { get path } @@ -211,11 +234,19 @@ RSpec.describe "API v3 Meeting Outcomes sub-resource", content_type: :json do expect(last_response.body) .to be_json_eql(outcome.id.to_json) .at_path("id") + + expect(last_response.body) + .to be_json_eql(api_v3_paths.meeting_outcome(outcome.id).to_json) + .at_path("_links/self/href") end context "with an outcome from another agenda item" do let(:other_agenda_item) { create(:meeting_agenda_item, meeting:, meeting_section: section, author: current_user) } - let(:path) { api_v3_paths.meeting_agenda_item_outcome(meeting.id, other_agenda_item.id, outcome.id) } + let(:path) do + api_v3_paths.meeting_agenda_item_outcome(outcome.id, + agenda_item_id: other_agenda_item.id, + meeting_id: meeting.id) + end it "returns 404" do expect(last_response).to have_http_status(:not_found) @@ -242,13 +273,38 @@ RSpec.describe "API v3 Meeting Outcomes sub-resource", content_type: :json do .at_path("_links/workPackage/href") expect(last_response.body).not_to have_json_path("_embedded/workPackage") - end end end - describe "PATCH /api/v3/meetings/:meeting_id/agenda_items/:agenda_item_id/outcomes/:id" do - let(:path) { api_v3_paths.meeting_agenda_item_outcome(meeting.id, agenda_item.id, outcome.id) } + describe "GET /api/v3/meeting_outcomes/:id" do + let(:path) { api_v3_paths.meeting_outcome(outcome.id) } + + before { get path } + + it "returns 200 and the outcome" do + expect(last_response).to have_http_status(:ok) + + expect(last_response.body) + .to be_json_eql("MeetingOutcome".to_json) + .at_path("_type") + + expect(last_response.body) + .to be_json_eql(api_v3_paths.meeting_outcome(outcome.id).to_json) + .at_path("_links/self/href") + end + + context "without view_meetings permission" do + let(:permissions) { [] } + + it "returns 404" do + expect(last_response).to have_http_status(:not_found) + end + end + end + + describe "PATCH /api/v3/meeting_outcomes/:id" do + let(:path) { api_v3_paths.meeting_outcome(outcome.id) } let(:body) do { notes: { raw: "Updated outcome" } @@ -271,8 +327,8 @@ RSpec.describe "API v3 Meeting Outcomes sub-resource", content_type: :json do end end - describe "DELETE /api/v3/meetings/:meeting_id/agenda_items/:agenda_item_id/outcomes/:id" do - let(:path) { api_v3_paths.meeting_agenda_item_outcome(meeting.id, agenda_item.id, outcome.id) } + describe "DELETE /api/v3/meeting_outcomes/:id" do + let(:path) { api_v3_paths.meeting_outcome(outcome.id) } before { delete path } diff --git a/modules/meeting/spec/requests/api/v3/meeting_sections/sections_by_meeting_resource_spec.rb b/modules/meeting/spec/requests/api/v3/meeting_sections/sections_by_meeting_resource_spec.rb index 17782fcc872..ebfd2190f65 100644 --- a/modules/meeting/spec/requests/api/v3/meeting_sections/sections_by_meeting_resource_spec.rb +++ b/modules/meeting/spec/requests/api/v3/meeting_sections/sections_by_meeting_resource_spec.rb @@ -49,7 +49,7 @@ RSpec.describe "API v3 Meeting Sections sub-resource", content_type: :json do end describe "GET /api/v3/meetings/:meeting_id/sections" do - let(:path) { api_v3_paths.meeting_sections(meeting.id) } + let(:path) { api_v3_paths.meeting_sections(meeting_id: meeting.id) } before { get path } @@ -59,6 +59,10 @@ RSpec.describe "API v3 Meeting Sections sub-resource", content_type: :json do expect(last_response.body) .to be_json_eql("Collection".to_json) .at_path("_type") + + expect(last_response.body) + .to be_json_eql(api_v3_paths.meeting_section(section.id).to_json) + .at_path("_embedded/elements/0/_links/self/href") end context "without view_meetings permission" do @@ -70,11 +74,16 @@ RSpec.describe "API v3 Meeting Sections sub-resource", content_type: :json do end end - describe "POST /api/v3/meetings/:meeting_id/sections" do - let(:path) { api_v3_paths.meeting_sections(meeting.id) } + describe "POST /api/v3/meeting_sections" do + let(:path) { api_v3_paths.meeting_sections } let(:body) do { - title: "New Section" + title: "New Section", + _links: { + meeting: { + href: api_v3_paths.meeting(meeting.id) + } + } }.to_json end @@ -109,7 +118,7 @@ RSpec.describe "API v3 Meeting Sections sub-resource", content_type: :json do end describe "GET /api/v3/meetings/:meeting_id/sections/:id" do - let(:path) { api_v3_paths.meeting_section(meeting.id, section.id) } + let(:path) { api_v3_paths.meeting_section(section.id, meeting_id: meeting.id) } before { get path } @@ -127,7 +136,7 @@ RSpec.describe "API v3 Meeting Sections sub-resource", content_type: :json do context "with a section from another meeting" do let(:other_meeting) { create(:meeting, project:, author: current_user) } - let(:path) { api_v3_paths.meeting_section(other_meeting.id, section.id) } + let(:path) { api_v3_paths.meeting_section(section.id, meeting_id: other_meeting.id) } it "returns 404" do expect(last_response).to have_http_status(:not_found) @@ -135,8 +144,34 @@ RSpec.describe "API v3 Meeting Sections sub-resource", content_type: :json do end end - describe "PATCH /api/v3/meetings/:meeting_id/sections/:id" do - let(:path) { api_v3_paths.meeting_section(meeting.id, section.id) } + describe "GET /api/v3/meeting_sections/:id" do + let(:path) { api_v3_paths.meeting_section(section.id) } + + before { get path } + + it "returns 200 and the section" do + expect(last_response).to have_http_status(:ok) + + expect(last_response.body) + .to be_json_eql("MeetingSection".to_json) + .at_path("_type") + + expect(last_response.body) + .to be_json_eql(api_v3_paths.meeting_section(section.id).to_json) + .at_path("_links/self/href") + end + + context "without view_meetings permission" do + let(:permissions) { [] } + + it "returns 404" do + expect(last_response).to have_http_status(:not_found) + end + end + end + + describe "PATCH /api/v3/meeting_sections/:id" do + let(:path) { api_v3_paths.meeting_section(section.id) } let(:body) do { title: "Updated Section Title" @@ -163,8 +198,8 @@ RSpec.describe "API v3 Meeting Sections sub-resource", content_type: :json do end end - describe "DELETE /api/v3/meetings/:meeting_id/sections/:id" do - let(:path) { api_v3_paths.meeting_section(meeting.id, section.id) } + describe "DELETE /api/v3/meeting_sections/:id" do + let(:path) { api_v3_paths.meeting_section(section.id) } before { delete path } From ccdaa9f534b5064dcb4f99e06d1a7286e021fda6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20G=C3=BCnther?= Date: Mon, 8 Jun 2026 12:59:10 +0200 Subject: [PATCH 046/107] Update openapi docs --- docs/api/apiv3/openapi-spec.yml | 16 +- docs/api/apiv3/paths/meeting_agenda_item.yml | 55 +------ .../paths/meeting_agenda_item_by_meeting.yml | 43 ++++++ .../paths/meeting_agenda_item_outcome.yml | 142 +----------------- .../paths/meeting_agenda_item_outcomes.yml | 73 --------- docs/api/apiv3/paths/meeting_agenda_items.yml | 51 +------ .../paths/meeting_agenda_items_by_meeting.yml | 38 +++++ docs/api/apiv3/paths/meeting_outcome.yml | 124 +++++++++++++++ docs/api/apiv3/paths/meeting_outcomes.yml | 59 ++++++++ docs/api/apiv3/paths/meeting_section.yml | 65 +------- .../paths/meeting_section_by_meeting.yml | 43 ++++++ docs/api/apiv3/paths/meeting_sections.yml | 51 +------ .../paths/meeting_sections_by_meeting.yml | 38 +++++ 13 files changed, 378 insertions(+), 420 deletions(-) create mode 100644 docs/api/apiv3/paths/meeting_agenda_item_by_meeting.yml create mode 100644 docs/api/apiv3/paths/meeting_agenda_items_by_meeting.yml create mode 100644 docs/api/apiv3/paths/meeting_outcome.yml create mode 100644 docs/api/apiv3/paths/meeting_outcomes.yml create mode 100644 docs/api/apiv3/paths/meeting_section_by_meeting.yml create mode 100644 docs/api/apiv3/paths/meeting_sections_by_meeting.yml diff --git a/docs/api/apiv3/openapi-spec.yml b/docs/api/apiv3/openapi-spec.yml index c47cf84d2ad..a23b2192a10 100644 --- a/docs/api/apiv3/openapi-spec.yml +++ b/docs/api/apiv3/openapi-spec.yml @@ -272,20 +272,32 @@ paths: "/api/v3/meetings/{id}": "$ref": "./paths/meeting.yml" "/api/v3/meetings/{id}/agenda_items": - "$ref": "./paths/meeting_agenda_items.yml" + "$ref": "./paths/meeting_agenda_items_by_meeting.yml" "/api/v3/meetings/{meeting_id}/agenda_items/{id}": + "$ref": "./paths/meeting_agenda_item_by_meeting.yml" + "/api/v3/meeting_agenda_items": + "$ref": "./paths/meeting_agenda_items.yml" + "/api/v3/meeting_agenda_items/{id}": "$ref": "./paths/meeting_agenda_item.yml" "/api/v3/meetings/{meeting_id}/agenda_items/{agenda_item_id}/outcomes": "$ref": "./paths/meeting_agenda_item_outcomes.yml" "/api/v3/meetings/{meeting_id}/agenda_items/{agenda_item_id}/outcomes/{id}": "$ref": "./paths/meeting_agenda_item_outcome.yml" + "/api/v3/meeting_outcomes": + "$ref": "./paths/meeting_outcomes.yml" + "/api/v3/meeting_outcomes/{id}": + "$ref": "./paths/meeting_outcome.yml" "/api/v3/meetings/{id}/attachments": "$ref": "./paths/meeting_attachments.yml" "/api/v3/meetings/{id}/form": "$ref": "./paths/meeting_form.yml" "/api/v3/meetings/{id}/sections": - "$ref": "./paths/meeting_sections.yml" + "$ref": "./paths/meeting_sections_by_meeting.yml" "/api/v3/meetings/{meeting_id}/sections/{id}": + "$ref": "./paths/meeting_section_by_meeting.yml" + "/api/v3/meeting_sections": + "$ref": "./paths/meeting_sections.yml" + "/api/v3/meeting_sections/{id}": "$ref": "./paths/meeting_section.yml" "/api/v3/meetings/form": "$ref": "./paths/meetings_form.yml" diff --git a/docs/api/apiv3/paths/meeting_agenda_item.yml b/docs/api/apiv3/paths/meeting_agenda_item.yml index 4c11743260b..8f2de6626ed 100644 --- a/docs/api/apiv3/paths/meeting_agenda_item.yml +++ b/docs/api/apiv3/paths/meeting_agenda_item.yml @@ -1,19 +1,12 @@ -# /api/v3/meetings/{meeting_id}/agenda_items/{id} +# /api/v3/meeting_agenda_items/{id} --- get: summary: Get a meeting agenda item operationId: get_meeting_agenda_item tags: - Meetings - description: Retrieve an individual agenda item of a meeting. + description: Retrieve an individual agenda item. parameters: - - description: Meeting identifier - example: 1 - in: path - name: meeting_id - required: true - schema: - type: integer - description: Agenda item identifier example: 1 in: path @@ -40,7 +33,7 @@ get: errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- - Returned if the agenda item or meeting does not exist or the client does not have sufficient permissions. + Returned if the agenda item does not exist or the client does not have sufficient permissions. patch: summary: Update a meeting agenda item @@ -49,13 +42,6 @@ patch: - Meetings description: Updates the given agenda item. parameters: - - description: Meeting identifier - example: 1 - in: path - name: meeting_id - required: true - schema: - type: integer - description: Agenda item identifier example: 1 in: path @@ -82,12 +68,6 @@ patch: application/hal+json: schema: $ref: "../components/schemas/error_response.yml" - examples: - response: - value: - _type: Error - errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission - message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions. @@ -97,14 +77,8 @@ patch: application/hal+json: schema: $ref: "../components/schemas/error_response.yml" - examples: - response: - value: - _type: Error - errorIdentifier: urn:openproject-org:api:v3:errors:NotFound - message: The requested resource could not be found. description: |- - Returned if the agenda item or meeting does not exist. + Returned if the agenda item does not exist or the client does not have sufficient permissions. '406': $ref: "../components/responses/missing_content_type.yml" '415': @@ -122,13 +96,6 @@ delete: - Meetings description: Deletes the agenda item. parameters: - - description: Meeting identifier - example: 1 - in: path - name: meeting_id - required: true - schema: - type: integer - description: Agenda item identifier example: 1 in: path @@ -144,12 +111,6 @@ delete: application/hal+json: schema: $ref: "../components/schemas/error_response.yml" - examples: - response: - value: - _type: Error - errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission - message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions. @@ -159,11 +120,5 @@ delete: application/hal+json: schema: $ref: "../components/schemas/error_response.yml" - examples: - response: - value: - _type: Error - errorIdentifier: urn:openproject-org:api:v3:errors:NotFound - message: The requested resource could not be found. description: |- - Returned if the agenda item or meeting does not exist. + Returned if the agenda item does not exist or the client does not have sufficient permissions. diff --git a/docs/api/apiv3/paths/meeting_agenda_item_by_meeting.yml b/docs/api/apiv3/paths/meeting_agenda_item_by_meeting.yml new file mode 100644 index 00000000000..0067285a39e --- /dev/null +++ b/docs/api/apiv3/paths/meeting_agenda_item_by_meeting.yml @@ -0,0 +1,43 @@ +# /api/v3/meetings/{meeting_id}/agenda_items/{id} +--- +get: + summary: Get a meeting agenda item + operationId: get_meeting_agenda_item_by_meeting + tags: + - Meetings + description: Retrieve an individual agenda item of a meeting. + parameters: + - description: Meeting identifier + example: 1 + in: path + name: meeting_id + required: true + schema: + type: integer + - description: Agenda item identifier + example: 1 + in: path + name: id + required: true + schema: + type: integer + responses: + '200': + description: OK + content: + application/hal+json: + schema: + $ref: "../components/schemas/meeting_agenda_item_model.yml" + '404': + content: + application/hal+json: + schema: + $ref: "../components/schemas/error_response.yml" + examples: + response: + value: + _type: Error + errorIdentifier: urn:openproject-org:api:v3:errors:NotFound + message: The requested resource could not be found. + description: |- + Returned if the agenda item or meeting does not exist or the client does not have sufficient permissions. diff --git a/docs/api/apiv3/paths/meeting_agenda_item_outcome.yml b/docs/api/apiv3/paths/meeting_agenda_item_outcome.yml index 00a6172cd06..c4622ca48b6 100644 --- a/docs/api/apiv3/paths/meeting_agenda_item_outcome.yml +++ b/docs/api/apiv3/paths/meeting_agenda_item_outcome.yml @@ -2,7 +2,7 @@ --- get: summary: Get a meeting outcome - operationId: get_meeting_outcome + operationId: get_meeting_outcome_by_agenda_item tags: - Meetings description: Retrieve an individual outcome of a meeting agenda item. @@ -48,143 +48,3 @@ get: message: The requested resource could not be found. description: |- Returned if the outcome, agenda item, or meeting does not exist or the client does not have sufficient permissions. - -patch: - summary: Update a meeting outcome - operationId: update_meeting_outcome - tags: - - Meetings - description: Updates the given meeting outcome. - parameters: - - description: Meeting identifier - example: 1 - in: path - name: meeting_id - required: true - schema: - type: integer - - description: Agenda item identifier - example: 1 - in: path - name: agenda_item_id - required: true - schema: - type: integer - - description: Outcome identifier - example: 1 - in: path - name: id - required: true - schema: - type: integer - requestBody: - content: - application/json: - schema: - $ref: "../components/schemas/meeting_outcome_write_model.yml" - responses: - '200': - description: OK - content: - application/hal+json: - schema: - $ref: "../components/schemas/meeting_outcome_model.yml" - '400': - $ref: "../components/responses/invalid_request_body.yml" - '403': - content: - application/hal+json: - schema: - $ref: "../components/schemas/error_response.yml" - examples: - response: - value: - _type: Error - errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission - message: You are not authorized to access this resource. - description: |- - Returned if the client does not have sufficient permissions. - - **Required permission:** manage outcomes - '404': - content: - application/hal+json: - schema: - $ref: "../components/schemas/error_response.yml" - examples: - response: - value: - _type: Error - errorIdentifier: urn:openproject-org:api:v3:errors:NotFound - message: The requested resource could not be found. - description: |- - Returned if the outcome, agenda item, or meeting does not exist. - '406': - $ref: "../components/responses/missing_content_type.yml" - '415': - $ref: "../components/responses/unsupported_media_type.yml" - '422': - description: |- - Returned if: - - * a constraint for a property was violated (`PropertyConstraintViolation`) - -delete: - summary: Delete a meeting outcome - operationId: delete_meeting_outcome - tags: - - Meetings - description: Deletes the outcome. - parameters: - - description: Meeting identifier - example: 1 - in: path - name: meeting_id - required: true - schema: - type: integer - - description: Agenda item identifier - example: 1 - in: path - name: agenda_item_id - required: true - schema: - type: integer - - description: Outcome identifier - example: 1 - in: path - name: id - required: true - schema: - type: integer - responses: - '204': - description: Returned if the outcome was successfully deleted - '403': - content: - application/hal+json: - schema: - $ref: "../components/schemas/error_response.yml" - examples: - response: - value: - _type: Error - errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission - message: You are not authorized to access this resource. - description: |- - Returned if the client does not have sufficient permissions. - - **Required permission:** manage outcomes - '404': - content: - application/hal+json: - schema: - $ref: "../components/schemas/error_response.yml" - examples: - response: - value: - _type: Error - errorIdentifier: urn:openproject-org:api:v3:errors:NotFound - message: The requested resource could not be found. - description: |- - Returned if the outcome, agenda item, or meeting does not exist. diff --git a/docs/api/apiv3/paths/meeting_agenda_item_outcomes.yml b/docs/api/apiv3/paths/meeting_agenda_item_outcomes.yml index 13f5b8f66be..32d096816b8 100644 --- a/docs/api/apiv3/paths/meeting_agenda_item_outcomes.yml +++ b/docs/api/apiv3/paths/meeting_agenda_item_outcomes.yml @@ -43,76 +43,3 @@ get: Returned if the agenda item or meeting does not exist or the client does not have sufficient permissions to see it. **Required permission:** view meetings - -post: - summary: Create meeting outcome - operationId: create_meeting_outcome - tags: - - Meetings - description: Creates a new outcome for the given meeting agenda item. - parameters: - - description: Meeting identifier - example: 1 - in: path - name: meeting_id - required: true - schema: - type: integer - - description: Agenda item identifier - example: 1 - in: path - name: agenda_item_id - required: true - schema: - type: integer - requestBody: - content: - application/json: - schema: - $ref: "../components/schemas/meeting_outcome_write_model.yml" - responses: - '201': - description: Created - content: - application/hal+json: - schema: - $ref: "../components/schemas/meeting_outcome_model.yml" - '400': - $ref: "../components/responses/invalid_request_body.yml" - '403': - content: - application/hal+json: - schema: - $ref: "../components/schemas/error_response.yml" - examples: - response: - value: - _type: Error - errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission - message: You are not authorized to access this resource. - description: |- - Returned if the client does not have sufficient permissions. - - **Required permission:** manage outcomes - '404': - content: - application/hal+json: - schema: - $ref: "../components/schemas/error_response.yml" - examples: - response: - value: - _type: Error - errorIdentifier: urn:openproject-org:api:v3:errors:NotFound - message: The requested resource could not be found. - description: |- - Returned if the agenda item or meeting does not exist or the client does not have sufficient permissions to see it. - '406': - $ref: "../components/responses/missing_content_type.yml" - '415': - $ref: "../components/responses/unsupported_media_type.yml" - '422': - description: |- - Returned if: - - * a constraint for a property was violated (`PropertyConstraintViolation`) diff --git a/docs/api/apiv3/paths/meeting_agenda_items.yml b/docs/api/apiv3/paths/meeting_agenda_items.yml index 590180f157d..23bf5e6f549 100644 --- a/docs/api/apiv3/paths/meeting_agenda_items.yml +++ b/docs/api/apiv3/paths/meeting_agenda_items.yml @@ -1,56 +1,11 @@ -# /api/v3/meetings/{id}/agenda_items +# /api/v3/meeting_agenda_items --- -get: - summary: List meeting agenda items - operationId: list_meeting_agenda_items - tags: - - Meetings - description: Lists all agenda items for the given meeting. - parameters: - - description: Meeting identifier - example: 1 - in: path - name: id - required: true - schema: - type: integer - responses: - '200': - description: OK - content: - application/hal+json: - schema: - $ref: "../components/schemas/meeting_agenda_item_collection_model.yml" - '404': - content: - application/hal+json: - schema: - $ref: "../components/schemas/error_response.yml" - examples: - response: - value: - _type: Error - errorIdentifier: urn:openproject-org:api:v3:errors:NotFound - message: The requested resource could not be found. - description: |- - Returned if the meeting does not exist or the client does not have sufficient permissions to see it. - - **Required permission:** view meetings - post: summary: Create meeting agenda item operationId: create_meeting_agenda_item tags: - Meetings - description: Creates a new agenda item for the given meeting. - parameters: - - description: Meeting identifier - example: 1 - in: path - name: id - required: true - schema: - type: integer + description: Creates a new agenda item. The request body must link the meeting. requestBody: content: application/json: @@ -92,7 +47,7 @@ post: errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- - Returned if the meeting does not exist or the client does not have sufficient permissions to see it. + Returned if the linked meeting does not exist or the client does not have sufficient permissions to see it. '406': $ref: "../components/responses/missing_content_type.yml" '415': diff --git a/docs/api/apiv3/paths/meeting_agenda_items_by_meeting.yml b/docs/api/apiv3/paths/meeting_agenda_items_by_meeting.yml new file mode 100644 index 00000000000..c49c9e7eb03 --- /dev/null +++ b/docs/api/apiv3/paths/meeting_agenda_items_by_meeting.yml @@ -0,0 +1,38 @@ +# /api/v3/meetings/{id}/agenda_items +--- +get: + summary: List meeting agenda items + operationId: list_meeting_agenda_items + tags: + - Meetings + description: Lists all agenda items for the given meeting. + parameters: + - description: Meeting identifier + example: 1 + in: path + name: id + required: true + schema: + type: integer + responses: + '200': + description: OK + content: + application/hal+json: + schema: + $ref: "../components/schemas/meeting_agenda_item_collection_model.yml" + '404': + content: + application/hal+json: + schema: + $ref: "../components/schemas/error_response.yml" + examples: + response: + value: + _type: Error + errorIdentifier: urn:openproject-org:api:v3:errors:NotFound + message: The requested resource could not be found. + description: |- + Returned if the meeting does not exist or the client does not have sufficient permissions to see it. + + **Required permission:** view meetings diff --git a/docs/api/apiv3/paths/meeting_outcome.yml b/docs/api/apiv3/paths/meeting_outcome.yml new file mode 100644 index 00000000000..28581ff2423 --- /dev/null +++ b/docs/api/apiv3/paths/meeting_outcome.yml @@ -0,0 +1,124 @@ +# /api/v3/meeting_outcomes/{id} +--- +get: + summary: Get a meeting outcome + operationId: get_meeting_outcome + tags: + - Meetings + description: Retrieve an individual meeting outcome. + parameters: + - description: Outcome identifier + example: 1 + in: path + name: id + required: true + schema: + type: integer + responses: + '200': + description: OK + content: + application/hal+json: + schema: + $ref: "../components/schemas/meeting_outcome_model.yml" + '404': + content: + application/hal+json: + schema: + $ref: "../components/schemas/error_response.yml" + examples: + response: + value: + _type: Error + errorIdentifier: urn:openproject-org:api:v3:errors:NotFound + message: The requested resource could not be found. + description: |- + Returned if the outcome does not exist or the client does not have sufficient permissions. + +patch: + summary: Update a meeting outcome + operationId: update_meeting_outcome + tags: + - Meetings + description: Updates the given meeting outcome. + parameters: + - description: Outcome identifier + example: 1 + in: path + name: id + required: true + schema: + type: integer + requestBody: + content: + application/json: + schema: + $ref: "../components/schemas/meeting_outcome_write_model.yml" + responses: + '200': + description: OK + content: + application/hal+json: + schema: + $ref: "../components/schemas/meeting_outcome_model.yml" + '400': + $ref: "../components/responses/invalid_request_body.yml" + '403': + content: + application/hal+json: + schema: + $ref: "../components/schemas/error_response.yml" + description: |- + Returned if the client does not have sufficient permissions. + + **Required permission:** manage outcomes + '404': + content: + application/hal+json: + schema: + $ref: "../components/schemas/error_response.yml" + description: |- + Returned if the outcome does not exist or the client does not have sufficient permissions. + '406': + $ref: "../components/responses/missing_content_type.yml" + '415': + $ref: "../components/responses/unsupported_media_type.yml" + '422': + description: |- + Returned if: + + * a constraint for a property was violated (`PropertyConstraintViolation`) + +delete: + summary: Delete a meeting outcome + operationId: delete_meeting_outcome + tags: + - Meetings + description: Deletes the outcome. + parameters: + - description: Outcome identifier + example: 1 + in: path + name: id + required: true + schema: + type: integer + responses: + '204': + description: Returned if the outcome was successfully deleted + '403': + content: + application/hal+json: + schema: + $ref: "../components/schemas/error_response.yml" + description: |- + Returned if the client does not have sufficient permissions. + + **Required permission:** manage outcomes + '404': + content: + application/hal+json: + schema: + $ref: "../components/schemas/error_response.yml" + description: |- + Returned if the outcome does not exist or the client does not have sufficient permissions. diff --git a/docs/api/apiv3/paths/meeting_outcomes.yml b/docs/api/apiv3/paths/meeting_outcomes.yml new file mode 100644 index 00000000000..4cf6088a753 --- /dev/null +++ b/docs/api/apiv3/paths/meeting_outcomes.yml @@ -0,0 +1,59 @@ +# /api/v3/meeting_outcomes +--- +post: + summary: Create meeting outcome + operationId: create_meeting_outcome + tags: + - Meetings + description: Creates a new meeting outcome. The request body must link the agenda item. + requestBody: + content: + application/json: + schema: + $ref: "../components/schemas/meeting_outcome_write_model.yml" + responses: + '201': + description: Created + content: + application/hal+json: + schema: + $ref: "../components/schemas/meeting_outcome_model.yml" + '400': + $ref: "../components/responses/invalid_request_body.yml" + '403': + content: + application/hal+json: + schema: + $ref: "../components/schemas/error_response.yml" + examples: + response: + value: + _type: Error + errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission + message: You are not authorized to access this resource. + description: |- + Returned if the client does not have sufficient permissions. + + **Required permission:** manage outcomes + '404': + content: + application/hal+json: + schema: + $ref: "../components/schemas/error_response.yml" + examples: + response: + value: + _type: Error + errorIdentifier: urn:openproject-org:api:v3:errors:NotFound + message: The requested resource could not be found. + description: |- + Returned if the linked agenda item does not exist or the client does not have sufficient permissions to see it. + '406': + $ref: "../components/responses/missing_content_type.yml" + '415': + $ref: "../components/responses/unsupported_media_type.yml" + '422': + description: |- + Returned if: + + * a constraint for a property was violated (`PropertyConstraintViolation`) diff --git a/docs/api/apiv3/paths/meeting_section.yml b/docs/api/apiv3/paths/meeting_section.yml index 79c167db431..d06fc3dcb5c 100644 --- a/docs/api/apiv3/paths/meeting_section.yml +++ b/docs/api/apiv3/paths/meeting_section.yml @@ -1,19 +1,12 @@ -# /api/v3/meetings/{meeting_id}/sections/{id} +# /api/v3/meeting_sections/{id} --- get: summary: Get a meeting section operationId: get_meeting_section tags: - Meetings - description: Retrieve an individual section of a meeting. + description: Retrieve an individual meeting section. parameters: - - description: Meeting identifier - example: 1 - in: path - name: meeting_id - required: true - schema: - type: integer - description: Section identifier example: 1 in: path @@ -33,29 +26,16 @@ get: application/hal+json: schema: $ref: "../components/schemas/error_response.yml" - examples: - response: - value: - _type: Error - errorIdentifier: urn:openproject-org:api:v3:errors:NotFound - message: The requested resource could not be found. description: |- - Returned if the section or meeting does not exist or the client does not have sufficient permissions. + Returned if the section does not exist or the client does not have sufficient permissions. patch: summary: Update a meeting section operationId: update_meeting_section tags: - Meetings - description: Updates the given section. + description: Updates the given meeting section. parameters: - - description: Meeting identifier - example: 1 - in: path - name: meeting_id - required: true - schema: - type: integer - description: Section identifier example: 1 in: path @@ -82,12 +62,6 @@ patch: application/hal+json: schema: $ref: "../components/schemas/error_response.yml" - examples: - response: - value: - _type: Error - errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission - message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions. @@ -97,14 +71,8 @@ patch: application/hal+json: schema: $ref: "../components/schemas/error_response.yml" - examples: - response: - value: - _type: Error - errorIdentifier: urn:openproject-org:api:v3:errors:NotFound - message: The requested resource could not be found. description: |- - Returned if the section or meeting does not exist. + Returned if the section does not exist or the client does not have sufficient permissions. '406': $ref: "../components/responses/missing_content_type.yml" '415': @@ -120,15 +88,8 @@ delete: operationId: delete_meeting_section tags: - Meetings - description: Deletes the section and all its agenda items. + description: Deletes the meeting section. parameters: - - description: Meeting identifier - example: 1 - in: path - name: meeting_id - required: true - schema: - type: integer - description: Section identifier example: 1 in: path @@ -144,12 +105,6 @@ delete: application/hal+json: schema: $ref: "../components/schemas/error_response.yml" - examples: - response: - value: - _type: Error - errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission - message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions. @@ -159,11 +114,5 @@ delete: application/hal+json: schema: $ref: "../components/schemas/error_response.yml" - examples: - response: - value: - _type: Error - errorIdentifier: urn:openproject-org:api:v3:errors:NotFound - message: The requested resource could not be found. description: |- - Returned if the section or meeting does not exist. + Returned if the section does not exist or the client does not have sufficient permissions. diff --git a/docs/api/apiv3/paths/meeting_section_by_meeting.yml b/docs/api/apiv3/paths/meeting_section_by_meeting.yml new file mode 100644 index 00000000000..6eaed2fc867 --- /dev/null +++ b/docs/api/apiv3/paths/meeting_section_by_meeting.yml @@ -0,0 +1,43 @@ +# /api/v3/meetings/{meeting_id}/sections/{id} +--- +get: + summary: Get a meeting section + operationId: get_meeting_section_by_meeting + tags: + - Meetings + description: Retrieve an individual section of a meeting. + parameters: + - description: Meeting identifier + example: 1 + in: path + name: meeting_id + required: true + schema: + type: integer + - description: Section identifier + example: 1 + in: path + name: id + required: true + schema: + type: integer + responses: + '200': + description: OK + content: + application/hal+json: + schema: + $ref: "../components/schemas/meeting_section_model.yml" + '404': + content: + application/hal+json: + schema: + $ref: "../components/schemas/error_response.yml" + examples: + response: + value: + _type: Error + errorIdentifier: urn:openproject-org:api:v3:errors:NotFound + message: The requested resource could not be found. + description: |- + Returned if the section or meeting does not exist or the client does not have sufficient permissions. diff --git a/docs/api/apiv3/paths/meeting_sections.yml b/docs/api/apiv3/paths/meeting_sections.yml index 5d5bf04218a..db095f5071f 100644 --- a/docs/api/apiv3/paths/meeting_sections.yml +++ b/docs/api/apiv3/paths/meeting_sections.yml @@ -1,56 +1,11 @@ -# /api/v3/meetings/{id}/sections +# /api/v3/meeting_sections --- -get: - summary: List meeting sections - operationId: list_meeting_sections - tags: - - Meetings - description: Lists all sections for the given meeting. - parameters: - - description: Meeting identifier - example: 1 - in: path - name: id - required: true - schema: - type: integer - responses: - '200': - description: OK - content: - application/hal+json: - schema: - $ref: "../components/schemas/meeting_section_collection_model.yml" - '404': - content: - application/hal+json: - schema: - $ref: "../components/schemas/error_response.yml" - examples: - response: - value: - _type: Error - errorIdentifier: urn:openproject-org:api:v3:errors:NotFound - message: The requested resource could not be found. - description: |- - Returned if the meeting does not exist or the client does not have sufficient permissions to see it. - - **Required permission:** view meetings - post: summary: Create meeting section operationId: create_meeting_section tags: - Meetings - description: Creates a new section for the given meeting. - parameters: - - description: Meeting identifier - example: 1 - in: path - name: id - required: true - schema: - type: integer + description: Creates a new section. The request body must link the meeting. requestBody: content: application/json: @@ -92,7 +47,7 @@ post: errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- - Returned if the meeting does not exist or the client does not have sufficient permissions to see it. + Returned if the linked meeting does not exist or the client does not have sufficient permissions to see it. '406': $ref: "../components/responses/missing_content_type.yml" '415': diff --git a/docs/api/apiv3/paths/meeting_sections_by_meeting.yml b/docs/api/apiv3/paths/meeting_sections_by_meeting.yml new file mode 100644 index 00000000000..e54b6956670 --- /dev/null +++ b/docs/api/apiv3/paths/meeting_sections_by_meeting.yml @@ -0,0 +1,38 @@ +# /api/v3/meetings/{id}/sections +--- +get: + summary: List meeting sections + operationId: list_meeting_sections + tags: + - Meetings + description: Lists all sections for the given meeting. + parameters: + - description: Meeting identifier + example: 1 + in: path + name: id + required: true + schema: + type: integer + responses: + '200': + description: OK + content: + application/hal+json: + schema: + $ref: "../components/schemas/meeting_section_collection_model.yml" + '404': + content: + application/hal+json: + schema: + $ref: "../components/schemas/error_response.yml" + examples: + response: + value: + _type: Error + errorIdentifier: urn:openproject-org:api:v3:errors:NotFound + message: The requested resource could not be found. + description: |- + Returned if the meeting does not exist or the client does not have sufficient permissions to see it. + + **Required permission:** view meetings From 968d53c07d28ff4b58a405934337316e8474ca78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20G=C3=BCnther?= Date: Mon, 8 Jun 2026 13:19:05 +0200 Subject: [PATCH 047/107] Add release notes section --- docs/release-notes/17-6-0/README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/docs/release-notes/17-6-0/README.md b/docs/release-notes/17-6-0/README.md index c08b6b3ce9e..2e7c49049c9 100644 --- a/docs/release-notes/17-6-0/README.md +++ b/docs/release-notes/17-6-0/README.md @@ -34,6 +34,18 @@ OPENPROJECT_SSRF_PROTECTION_IP_ALLOWLIST=2001:db8:100::/48 The list accepts one or multiple IP addresses or ranges (in CIDR notation) that shall be exempt from SSRF filtering. +### Meeting API structure changes + +17.6. introduces new endpoints for meeting outcomes, +and changes the self link for all meeting related resources to be flat: + +That means, some of the responses have changed: + +POST/PATCH/DELETE `/api/v3/meetings/:id/agenda_items)` is no longer available, +they have been moved to the `/api/v3/meeting_agendas/` respectively. The same is true for outcomes and sections. + +This follows the APIv3 standards, and also fixes a bug related to the self link. + From 6f07ff3f14ab39a47031aff67ca548dcb546e622 Mon Sep 17 00:00:00 2001 From: ehassan01 Date: Mon, 8 Jun 2026 13:36:23 +0200 Subject: [PATCH 048/107] =?UTF-8?q?[DOCU-821]=2017.5=20Users=20and=20group?= =?UTF-8?q?s=20administration=20changes=20=20https://comm=E2=80=A6=20(#235?= =?UTF-8?q?83)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [DOCU-821] 17.5 Users and groups administration changes https://community.openproject.org/wp/DOCU-821 [DOCU-821] 17.5 Users and groups administration changes https://community.openproject.org/wp/DOCU-821 * [DOCU-821] 17.5 Users and groups administration changes https://community.openproject.org/wp/DOCU-821 [DOCU-821] 17.5 Users and groups administration changes https://community.openproject.org/wp/DOCU-821 * [DOCU-821] 17.5 Users and groups administration changes https://community.openproject.org/wp/DOCU-821 [DOCU-821] 17.5 Users and groups administration changes https://community.openproject.org/wp/DOCU-821 * update after a review --------- Co-authored-by: Maya Berdygylyjova --- .../users-permissions/users/README.md | 99 +++++++++++------- ...nproject_system_admin_guide_users_list.png | Bin 16649 -> 55205 bytes .../openproject_systemguide_add_filters.png | Bin 0 -> 15896 bytes ...openproject_systemguide_configure_view.png | Bin 0 -> 23855 bytes ...roject_systemguide_configure_view_form.png | Bin 0 -> 24532 bytes .../openproject_systemguide_filter_users.png | Bin 23356 -> 57661 bytes ...openproject_systemguide_filters_button.png | Bin 0 -> 11389 bytes 7 files changed, 60 insertions(+), 39 deletions(-) create mode 100644 docs/system-admin-guide/users-permissions/users/openproject_systemguide_add_filters.png create mode 100644 docs/system-admin-guide/users-permissions/users/openproject_systemguide_configure_view.png create mode 100644 docs/system-admin-guide/users-permissions/users/openproject_systemguide_configure_view_form.png create mode 100644 docs/system-admin-guide/users-permissions/users/openproject_systemguide_filters_button.png diff --git a/docs/system-admin-guide/users-permissions/users/README.md b/docs/system-admin-guide/users-permissions/users/README.md index 47c0653a863..46c4315d457 100644 --- a/docs/system-admin-guide/users-permissions/users/README.md +++ b/docs/system-admin-guide/users-permissions/users/README.md @@ -20,45 +20,64 @@ To manage users click on your avatar (top right corner) and select **Administrat In the Community edition there is no limit to the number of users. In Enterprise editions (cloud and on-premises) the user limit is based on your subscription. The number of users for your subscription is thus not bound to names. For example, if you block a user you can add a new one without upgrading. -| Topic | Content | -| ----------------------------------------------- | -------------------------------------------------------- | -| [User list](#user-list) | Manage all users in OpenProject. | -| [Filter users](#filter-users) | Filter users in the list. | -| [Lock and unlock users](#lock-and-unlock-users) | Block a user permanently in the system or unlock a user. | -| [Create users](#create-users) | Invite or create new users. Resend or delete user invitations | -| [Manage user settings](#manage-user-settings) | Manage user details. | -| [Authentication](#authentication) | Set and use authentication methods. | -| [Delete users](#delete-users) | Delete a user from the system. | +| Topic | Content | +| ----------------------------------------------- | ------------------------------------------------------------ | +| [User list](#user-list) | Manage all users in OpenProject. | +| [Filter users](#filter-users) | Filter users in the list. | +| [Configure view](#configure-view) | Configure how user information is displayed. | +| [Lock and unlock users](#lock-and-unlock-users) | Block a user permanently in the system or unlock a user. | +| [Create users](#create-users) | Invite or create new users. Resend or delete user invitations | +| [Manage user settings](#manage-user-settings) | Manage user details. | +| [Authentication](#authentication) | Set and use authentication methods. | +| [Delete users](#delete-users) | Delete a user from the system. | ## User list The User list is where users are managed. They can be added, edited or deleted from this list, which can be filtered if required. -![openproject_system_admin_guide_users_list](openproject_system_admin_guide_users_list.png) +![List of users under OpenProject administration](openproject_system_admin_guide_users_list.png) Column headers can be clicked to toggle sort direction. Arrows indicate sort order, up for ascending (a-z/0-9) and down for descending (z-a/9-0). Paging controls are shown at the bottom of the list. You will also see whether a user is a system administrator in OpenProject. ## Filter users -At the top of the user list is a filter box. Filter by status. group or name, then click the green **Apply** button to filter the list. Click the **Clear** button to reset the filter fields and refresh the list. +To filter for users, begin by clicking the **Filters** button. -* **Status** - select from Active, All or Locked Temporarily. Each selection shows the number of users. -* **Group** - select from the list of existing groups. -* **Name** - enter any text; this can contain a "%" wild card for 0 or more characters. The filter applies to user name, first name, last name and email address. +!["Filters" button to filter through users list in OpenProject administration](openproject_systemguide_filters_button.png) -![Filter users in OpenProject](openproject_systemguide_filter_users.png) +Clicking on it opens up the **+Add filter** form. Here, you can filter by group, status, name or username, and your list is automatically updated. Each filter button displays additional filtering options to help you narrow down results. The results are then filtered based on the selected criteria. Click the **x** symbol in front of each selected filter to clear the filter and the **x** symbol at the **top-right corner** to close the form. + +![Add filter form](openproject_systemguide_add_filters.png) + +- **Username** - enter any text or character like @, .com which is unique to the user list. +- **Name** - enter any text; this can contain a "%" wild card for 0 or more characters. For example, if you are filtering for a user named Niklas but are unsure if it's Niklas, Niclas, Nikolas, or Nicholas, you can search for “Ni%las” and all matching users will be listed. The filter applies to first name, last name and email address. +- **Group** - select from the list of existing groups. +- **Status** - select from Active, Registered, Locked, Invited, Deleted. Each selection shows the number of users. + +![Filters for user list in OpenProject administration](openproject_systemguide_filter_users.png) + +## Configure view + +To configure how the table of users is displayed, click on the More menu **(...)**. + +![Menu for configure view for the user list in OpenProject administration](openproject_systemguide_configure_view.png) + +This opens up a form where you can add columns, or manage and reorder columns via drag and drop. Click **Apply** to save your changes. + +![Open form to configure view for the user list in OpenProject administration](openproject_systemguide_configure_view_form.png) ## Lock and unlock users -Handling locking and unlocking of users is also done from the user list. To disable a user's access click the **Lock permanently** link next to a user. Use the **Unlock** link to restore the user's access. +Handling locking and unlocking of users is also done from the user list. To disable a user's access click, the **Lock permanently** link next to a user. Use the **Unlock** link to restore the user's access. If you are using [Enterprise cloud](../../../enterprise-guide/enterprise-cloud-guide) or [Enterprise on-premises](../../../enterprise-guide/enterprise-on-premises-guide) locking a user will free up a user license and so you could add another user to the system within your booked plan. -> **Note**: The previous activities from a locked user will still be displayed in the system. +> [!NOTE] +> The previous activities from a locked user will still be displayed in the system. ![Lock users in OpenProject](open_project_system_admin_lock_user_permanently.png) -If a user has repeated failed logins the user will be locked temporarily and a **Reset failed logins** link will be shown in the user list. Click the link to unlock it right away, or wait and it will be unlocked automatically. Have a look at the section [Other authentication settings](../../authentication/login-registration-settings/) for failed attempts and time blocked. +If a user has repeated failed logins, the user will be locked temporarily and a **Reset failed logins** link will be shown in the user list. Click the link to unlock it right away, or wait and it will be unlocked automatically. Have a look at the section [Other authentication settings](../../authentication/login-registration-settings/) for failed attempts and time blocked. ## Create users @@ -75,7 +94,7 @@ Enter the email address, first name, and last name of the new user. Tick the box Note: the email field must be a valid format and be unique or it will be rejected on clicking the button. Click the **Create** button to add the user and show that user's details page. Click the **Create and continue** button to add the user and stay on the new user form to add another user. Either way, the new user will be invited via email. -When adding the last of multiple users you can click on **Create** or click the **Users** link in the menu on the left. The **Users list** will be shown. Click on the name of each user to [edit their details](#set-initial-details). +When adding the last of multiple users you can click on **Create** or click the **Users** link in the menu on the left. The **Users list** will be shown. Click on the name of each user to [edit their details](#set-initial-details). ### Create user (via self-registration) @@ -110,8 +129,10 @@ In the top right, click the **Send invitation** button in order to send the emai ### Delete user invitations -To invalidate or revoke a user's invitation click on the user name and then on **Delete** in the upper right corner. This will prevent the invited user from logging in. -Please note: this only works for users who haven't logged in yet. If the user is already active this will delete his/her whole profile and account. Deleting users can't be revoked. +To invalidate or revoke a user's invitation, click on the user name and then on **Delete** in the upper right corner. This will prevent the invited user from logging in. + +> [!NOTE] +> This only works for users who haven't logged in yet. If the user is already active, this will delete his/her whole profile and account. Deleting users can't be revoked. ## Manage user settings @@ -119,11 +140,11 @@ You can manage individual user details if you click on the user name in the list ### General settings -![administration-user-settings-manage-user](openproject_system_guide_general_tab.png) +![Settings to manage a user under OpenProject administration](openproject_system_guide_general_tab.png) On the **General** tab the following fields are shown: -1. User's master date +1. User's master data - **Status** - this is set by the system. - **Username** - this defaults to the email address for a new user (unless the user used the self registration). It can be changed on this page. Users cannot change their own user name. - **First name**, **Last name**, **Email** - these fields are filled from the **New user** page. Users can change them under their **Profile** page; they are mandatory. @@ -139,7 +160,7 @@ On the **General** tab the following fields are shown: To create a new password for a user (e.g. if he/she lost it) navigate to the **Authentication** section of the **General** tab. You can either **Assign a random password** (check the box on top) or set a new password manually and send it to them (preferably through secured communication). Consider checking the box next to **Enforce password change on next login**. -![reset-user-password](Authentication.png) +![Reset user password under OpenProject administration](Authentication.png) ### Add users to a project @@ -147,19 +168,20 @@ In order to see and work in a project, a user has to be a member of a project an On the **Projects** tab, select the new project from the drop-down list, choose the [roles](../roles-permissions) for this project and click the green **Add** button. -![Sysadmin add project](Sys-admin-add-project1.gif) +![Add users to a project under OpenProject system administration](Sys-admin-add-project1.gif) ### Add users to groups On the **Groups** tab you can see the groups the user belongs to. If a group is shown, click the group name link. -![User groups](system_guide_user_groups.png) +![User groups in OpenProject administration](system_guide_user_groups.png) If no groups are shown (i.e. the user does not belong to any group, yet), click the **Manage groups** link to [edit groups](../groups). -![Manage Groups](system_guide_manage_groups.png) +![Manage groups in OpenProject administration](system_guide_manage_groups.png) -**Please note**: The **Groups** tab is only shown if at least one user group exists in OpenProject. +> [!NOTE] +> The **Groups** tab is only shown if at least one user group exists in OpenProject. ### Global roles @@ -167,7 +189,7 @@ In order to add a global role to a user, at least one global role needs to be [c On the **Global roles** tab, select or de-select the global role(s) for this user. Click the **Add** button. -![Add global roles](openproject_system_guide_add_global_roles.png) +![Add global user roles in OpenProject administration](openproject_system_guide_add_global_roles.png) ### Notification settings @@ -181,13 +203,13 @@ Under **Email reminders** tab you can edit the [email reminders settings](../../ The rate history tab shows the hourly rates that have been defined for the user. The **Default rate** is applied to projects with no rate defined. All projects that the user is a member of are listed with the user's rates. -The **Valid from** date will effect the rate used when creating a [budget](../../../user-guide/budgets/) and when [logging time](../../../user-guide/time-and-costs/time-tracking/). +The **Valid from** date will affect the rate used when creating a [budget](../../../user-guide/budgets/) and when [logging time](../../../user-guide/time-and-costs/time-tracking/). If you want to set a different hourly rate for the user on different projects, you can overwrite the default rate with a different rate below in the respective projects. To enter a new hourly rate, click on the **Update** icon next to the rate history. You can either set a **default hourly rate** or define a rate for a certain project. -![set-hourly-rate-administration](system_guide_rate_history.png) +![Set hourly rates for users in OpenProject administrationin OpenProject administration](system_guide_rate_history.png) 1. Enter a date from which the rate is **Valid from**. 2. Enter the (hourly) **Rate**. The currency can only be changed in the [respective settings](../../time-and-costs). @@ -199,10 +221,9 @@ To enter a new hourly rate, click on the **Update** icon next to the rate histor ### Avatar -The **Avatar** tab shows the default icon to be shown for this user. A custom image can be uploaded as the avatar. In addition, users can also use their [Gravatar](https://en.wikipedia.org/wiki/Gravatar). User can manage this under their [profile settings](../../../user-guide/account-settings/#set-an-avatar). These features can be disabled in the [avatar settings](../avatars). +The **Avatar** tab shows the default icon to be shown for this user. A custom image can be uploaded as the avatar. In addition, users can also use their [Gravatar](https://en.wikipedia.org/wiki/Gravatar). Users can manage this under their [profile settings](../../../user-guide/account-settings/#set-an-avatar). These features can be disabled in the [avatar settings](../avatars). > [!TIP] -> > Hovering over a user's avatar or name, for example on the Members page or the Activity page, will display their information. ### Two-factor authentication (2FA) @@ -219,9 +240,9 @@ Use the **self-registration** field to give the following controls over a new us The user details Authentication section has fields **Assign random password**, **Password**, **Confirmation** and **Enforce password change**. -* If you are near the new user, you can enter a password and confirmation then tell the user what it is. They can then sign in. It is recommended that you also tick the enforce password change checkbox, so that the user is prompted to change their password after they sign in. -* You can phone the new user or send them an email, not using OpenProject, to give them the password. In this case it is more important to tick the enforce password change checkbox. -* Tick the Assign random password, and probably the enforce password change checkbox. When the details are saved OpenProject will send an email to the new user with their password. +- If you are near the new user, you can enter a password and confirmation then tell the user what it is. They can then sign in. It is recommended that you also tick the enforce password change checkbox, so that the user is prompted to change their password after they sign in. +- You can phone the new user or send them an email, not using OpenProject, to give them the password. In this case it is more important to tick the enforce password change checkbox. +- Tick the Assign random password, and probably the enforce password change checkbox. When the details are saved OpenProject will send an email to the new user with their password. ### Account activation by email @@ -231,8 +252,8 @@ Leave all fields blank. When the details are saved OpenProject will send an emai Two [settings](../settings/#user-deletion) allow users to be deleted from the system: -* **User accounts deletable by admins** - if ticked, a **Delete** button is shown on the user details page. -* **Users allowed to delete their accounts** - if ticked, a **Delete account** menu entry is shown in the **Account settings** page. +- **User accounts deletable by admins** - if ticked, a **Delete** button is shown on the user details page. +- **Users allowed to delete their accounts** - if ticked, a **Delete account** menu entry is shown in the **Account settings** page. To delete another user's account open the [user list](#user-list). Click on the **user name** of the user which you want to delete. Click the **Delete** button at the top right. @@ -240,7 +261,7 @@ To delete another user's account open the [user list](#user-list). Click on the You will then be asked to confirm the deletion of the user permanently from the system. Checking the consent box will activate the **Delete permanently** button. -![delete user](delete-user-confirmation.png) +![Delete user in OpenProject administration](delete-user-confirmation.png) > [!CAUTION] > Deleting a user account is a permanent action and cannot be reversed. The previous activities from this user will still be displayed in the system but reassigned to **Deleted user**. This is also true for the Time and cost and the Budget modules. Spent time will be still be visible for **Deleted user** inside a Work package. Time and cost reports will contain the entries with reference to **Deleted user**. Labor budgets that have been setup for the user are displayed under **Deleted user**, too. If you would like to keep track of the user's name in connection with the mentioned activities, the spent time and the budget, you are able to keep the user's name in the historical data by simply [locking the user](#lock-and-unlock-users). diff --git a/docs/system-admin-guide/users-permissions/users/openproject_system_admin_guide_users_list.png b/docs/system-admin-guide/users-permissions/users/openproject_system_admin_guide_users_list.png index a84d8b5d8f27a5df06c3d7e1ab020b40f1934391..f201f2f346443f92b0c1c207f7199c12303d5fc3 100644 GIT binary patch literal 55205 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 literal 16649 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 V^w^JU-u+`xlvR-_k}~@8{{X&HU!DK} diff --git a/docs/system-admin-guide/users-permissions/users/openproject_systemguide_add_filters.png b/docs/system-admin-guide/users-permissions/users/openproject_systemguide_add_filters.png new file mode 100644 index 0000000000000000000000000000000000000000..4b94ced7c7e0ec399cef25326ef4ba0a615329d7 GIT binary patch literal 15896 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 literal 0 HcmV?d00001 diff --git a/docs/system-admin-guide/users-permissions/users/openproject_systemguide_configure_view.png b/docs/system-admin-guide/users-permissions/users/openproject_systemguide_configure_view.png new file mode 100644 index 0000000000000000000000000000000000000000..e70e5bbae9ab637f3a4c3cb1ecf801092a414b3e GIT binary patch literal 23855 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 literal 0 HcmV?d00001 diff --git a/docs/system-admin-guide/users-permissions/users/openproject_systemguide_configure_view_form.png b/docs/system-admin-guide/users-permissions/users/openproject_systemguide_configure_view_form.png new file mode 100644 index 0000000000000000000000000000000000000000..dd6dcf480aac8a7047ed6c077a81fab4ed078d73 GIT binary patch literal 24532 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 E0~?XV`2YX_ literal 0 HcmV?d00001 diff --git a/docs/system-admin-guide/users-permissions/users/openproject_systemguide_filter_users.png b/docs/system-admin-guide/users-permissions/users/openproject_systemguide_filter_users.png index fb4b6334031f4e6f34c4e2e5b5f460cfd9d24e72..02ef4cf6416182f95e8f543bd8aa847b1be7c492 100644 GIT binary patch literal 57661 zcmdSB2T;@7yDl8Id&{=Lwos&6C`uKiNsCGo>C(IO-dm{AtOUF}`Z^Stj$l(weIm5VGF0RX@i z)n|$?0D$xC0Kjj%f1am)^2Vm_5%nL9&kL2OfQkXOHR_w+9iC`B0RXBKE|IMMpuWH0 z`OMe{0J!$^k0$m`Gc5qHFs!QhL=R-KId>sT-|iH+yYpvp(u2ee_#NM$1%T-7 z|B6C&%F_r*>q)o`+9v?^A%%4n7d3R$N3@ybcWS2FZgp3$gW{t=@`9BbE*oYQ&5J2` z1Q4RBR<@MPi}pDTu`Kr^_;6ge1j`CaK3k;pHcTWJEEj$wGW_f%d-_{CLMGNhGnP0k zsxi@eiLtAXG7wJ(nHDVnVy`bbI|0wcm5mr2hY7OI^ZV}@v7GBFWKc4wzj9XHkuA|ZBBi`&;QdO31(wkpbvr=4Abv$C*G7|KU zeYyu?jcfC_G~KKb>E zT6LAtW?ato9qso)SLxV!_2QiDoD1C4$gBaBg}?Ez2#eU}m{g_O6q(N4)Y+SokT%`+ zQ#8{~^pkUy(NPakG2HzUaT3HVmi#a;s}QT1*{*7b&TS^mcylc&-XrjdBral#v+G;8 z7qRRl?Q8<8a*b6pkKwGk z`R&G?H&-RGGY8SNjiGnX=RD$>mT$6C7pO3u<7z|#*^3a^5rj#gnV6uBKksC3ugSF-L-%y2ZjVi#}>2HcKfn(#o>3)epYxtjFtfH3!aY zEDB;;qA^@VDDI#qNn-*VAh35bD`~Tx>7j%;5}#MCY+MRI`6?-0SgGZ{W_b{-KmU8> zQLEk~WJx6cWG*Gh`C%E5THB!_Hok}5IX*<$xr!?2J+t&v&uup3y-i76RX^IJ`E+_k z0g7&!#_BZhv_yHG#uFLiGd*B-Ed}yOuWR0Va+>g+s^Kb|(x4m{BE?m_CKM(V1v3YE zUnX}@^2V+@z;~@u5rHbMH$6@Ro>*dnNc`p?E-5iMSvhr#uIPGe! z%#P`D<`6HPy8H9Och9M7)j@C8cTPk|Ub^|ZiGq1OrqXsM-pglM<8*9uAEqQC(-5nf zd@QDhIg$<`N(aW~D#4J?iCZUMRH7g)3EoajNeVsB=vG;{Zy2n<7WE!X={MC|=E0RfN^6+OyR=>)3K}bWY+~^-cwl6h zZ+U(KPBR>JE-7=3!6%ao5ubPLF;GF<^~r3}LyHMwwJlEB>)C0Zi_U2suoUb^eYR|_ zXb9Ask7V-pfX+?VY4$21_2qIf*d3u57&r7*Nn0a*Y$pATfW6kK$C#&sKGNqL1=xFZ zdh(n^Y*uQ9K%z0ic+CSj0>8*^3C?Th6J2x5JFny9MtE6VLZl_>u!T8oW;|d)7_*+# z5M@V!@+wmvf?xd|3S%_{7iiS|U^4JiKigiD56YjcYBORIGne3!>OfS*bll+geq_h7 z`RSFe3*p>&_%{?5Y|VvM|y?-CNbWV+bhIFwYd?kVP%IGZ--kCkda*~z4T zARoy@Nlm$aNMMiYQ};mIFLw$D#Lne_rH_g8oE^~$9}fJqf_}S^li+)w!-BUGzY?HH zE+o-QXs%*Y0n22Af#uG<+?=S*yIDAa$+Gf9`hH9Pf zb_?cRX-@$@p05br;WRDSD3#|q8#&iB7B=Z6*dNegjj`{b{f&XQ!!lj)j*A^oUv-c7 z6Z|317~DgE>^icx{m9Ei=69Z zHirT$3S?~gw8bZreGdr9+}j}`8B#jym{yj;8e-(68Jzuz)2pDp52!9~L|ua22!$E= zXgS8KbCwU$a>^ysP41;6FQcB|mHZ7B;<1d_bkhSD|IGso5L%5ZVfeYM6NA|5AbgO2$r{f;C1;Il-&9GeM z@wvVrLb6eft*Y;2s5tGkU+F3{XXjg9gZBF*()G%*S=PJYH!>GY_>N{oq?hN<^TW3N zlIK5b&a2g5VLilW;Z41DVdJWW8ztelqxU*!#2=rS9Lhfkm?vPX8x|AfA7#UWo^IFQ z=Q#TEeI0@smJp{L&!Q}NSi261+jY;1cj5P`KYEqbBXF*g^&w+*3xwZNv7x?ws zQZh!v{@FO%;sU<++M7+x!|o+BNJ1{zv;xiT_GXC{{0EUn8ys4^!4*1-U4+f%{Sj|B z1NURnT!JC1#TPn63ENR2NGgj8;xxLmm<#k*gd8KIaX8a5|JBrC=8V}JVR&4L0uOXg zF)ODJtSv^XAZqLt_xiD>RainvWw3W_W#u~ScIk|Tzy&93oi^>jcstx-M!2C#GRcQy zjK{Wu=#{t_V?YX9bJ4%q!*#vX5a_=*pJwECucYg}OzMX7nwwq%Rto6R*>-cNw24>o z%FdfHlVys7cNs-MfA^RP+$apX4N(_^}DD$s_-F68yC17v3~z# zg%thhl7SqXdf0D^b>=l$90mNRVSbMcL^u2WvM<@7nBv7nczls^;G35bx{%!DJyd)p zo9KP>uoIJm_F~KWc{YBC%W`Lrc-yucxaD3ve+Hm)X8FpplS#{@~<2&#VyHb`oLSvJODJn%NNK_~4)?n&=NwyI%p2qZ`@V{7t} zX4~Ft(CXj5t_72PEt}O&vVJp>%t5#Wbabm_yo4Mw%G85wu$kq$<)cAbp4QFVkl4oz zWhP0a!mnJPr@~4{%SotmJ?HhaohqTnz5HlRdZT%Y5-jdNQ{ZNjw>TeZ#bkKN_(#?+ z930Fd`$24jL(8=zf0knCIZXg4^i4$VsX=_tOH6 zXWr*1Z|H&1gq=2~9YG5=wN$~Fu9i~E7uSZ`jB6+J?0Oxc{fyO9g_(*KB^Gc0v3u}$ zK}!n`4`}TJm}~9wN;P3c&<3;8pU0(2%ktzJQ%IYyaT|q<20087t4}4$_j;9C$4+to zs@%yXxsA$dyu~PRa?5|xePi;o(*E~wtsg3CDP2?y#cJx-Y`j^uW#G4sd#On!q|}$A zb>i*hL=HNayPnUu64GV;z3IA}N0SF>em>1ev!#o$eO6F^RZ8y}hs>jhCA0PCzs6ca zUDU}}G@@fVB}>6u$dCJ<@qWc)zgA;MP|crcSYk```NE(3&v1x|EH7W>=Jv~OZ^m(9 z-)E_rU!W3d>g$#Ipa18An5^$TRt7m4>RHxYfZb&p?qP|QyNlv6J|C;G@lW-`_?&-D z`LAJk%=4>I6`w&|F|Br;s;Sc(L&IZizI}h^^rd8PZx3{MC^`JXf82Ss3J<5X#=n{$ z%HOb9YonjDt~?in2;cb8Yi=1*%M>-z7z!4hJG zS+6o#h`JVdE~ek7MD2%@q|TfBD#;#o!iJ~+rk6Kj12!G>;D@x7;gnO7p_7}$xXJ1R zkIhH8W*b^WT#^I4HHQC18aHm9WGr&n{D;${YOWmUBEQ$;9Zp0j63Ve7cz;yLwC$Ef z2B~+I0)J@jTECF{Ju6c)VZ=R5dcJ3;RxE`Fh>eTc30ZtAwX>pvDF^_@_Nat;gtZ-P z?(2|#{4{q^Pfl)miiG6y1mOyd35OSv@`fopG#?HeK_{pYs;Ly{QBa$>M_AZtGgBcp zSkcx_@Eskpv;Hn;d_bZM+4LwDBEPo-3RE_BCj`g_5f`M6bOkT=d#A|CinSlrQabZy zPf}sOPbs7Q!Jx4ROHg=*{q3`os}L$`^|Lnw%{@03F#;+o^WWVHO~$+bu#;G*X(fk zy~$>kJmjntezmgg#J^=+JYLo*wHU-_y6yckE9{#gdc^7GPeU_mJVG%a@!bjGoy8E+ zgNCUVeG}8ceACpXl^!*W1Mt*}&3A$9bLgijX=&gRfy>2ZvXCH)ft7BTgr9k^WliR=tXAie>QqLfItC`@;fs+cT04 z8fpyEer2Eqa946sY;+XG{D!!!=ueBp0%f+ELd9GR_RGor5-5QNXMOS5;`axyCIgEk zobJoG-1l9*@g|I%J^Ap$)f6bJ7AnM@tp(X$O}U?nXkr2ih^e+oNUju?R?dcmNI&r% z+RLWJydjO-y(6%cOx{0Q)e|iEai87SFKb4G@)bAm(G)!crHdS(J&NIs%jB4fGdWYw zsMsw>{b|H8qkc9+tB{GW9I%VB-;Q5Pl|dX4TwkiT9af?cfzaTtS1k77?$t^glMQ}b zy%K)x-X(AguW#oP5O4Y8<0@tto@tLJ5g)wt_K6$Yv6jE(zx8rzT-eEVHh;?JwKmOvtZ)dh1swCT|v#e}R{DOG~x{ z^1>kg`zsw>X6ts8j8Cs0Qx-FXxGpH-Vq60?_9dJ+ReQ9%p>vu22RtyGN=Z_}#`qA@ z7Q}<`V!wa1xxc2tQItn0RM&kc>ro?OqTR#~jfL+Qb#-o>?{b=Ge?ML}4+)cg;7&&L z>OAr|OjN?nT2hh+*oOrCg=8Q69B6H=vx7b8Twjce@HSJ?+@beU?K>9nnCufXc1-0O z!%U(0RgCpxL@v(Lq@+Y?GjN4ng#0(u+a)Sc}6sS{2%Jn&D+PE0R`Mp zVu4dXuW;bze>jmd-C9&#VH%~N{jGqB=ezG^?e`}CX`Opn!;0rj{00C%MKAaEV#)&; zS5n;?W@RN%ZFa7+ZN?u*9qh3|&(MGW0}wt(C|r}``d`tABDdr&5WkzBMi~gk&75? z)jk8=qFb9T5x@5fXciCbKL7dX-|)wOb>U1n_WNm)QDxH~7C>%p?lqH+UvSIFL%_0K zwy^yqB$kYw1X-`ZY_`8QS_cyLeECajbh?#?3dfGTUPeIkDGu=o99u1;GH?Hq{-^I2 zMh&jUX8S)p&`b%ljMd%BI`es*T;~q!W%F!R13OiEF|!J=t0DQBsr%83YVAYG=Ky&tRmZ9jLJfYQBjIfG!3|8^8E4!^ zN;FYvS{2J41E%j`DLYkjV^FB7sj&w7{Yf3ZkDAztVhidR77N7Jt+% z!8@_q@@&QPS-9RcDX}Zv8}HjVx;M@k-l+K=^knH$x(`!3x2NOfW~^ACdlI%uh~?lK zSCXGZJU|nH!K1y)>O=mcL>B4_R@NPMo+KXily2>O?d_L3fBcH|c-m89$UP0c2z> zO`A=m2POJ*bCaJ`s16J6W4P6Ll3;NgCB5hB_4H$b(5)2zn&Cv9ix&}ESN1PLt%B{`h?D>5ldZt;GRMRXBUOL zqMa=11^=;uP7w(}YsWIvk4N z?5eTr9eL5gMdU@CwQ7_d(=PJJg4{JlC06=wrc7c%tGi1Nbunj=AVz@@VNLm5Ez(2fm;Vj*xNGkOV?l>oFzOsV<6=5b1F zJfjYu+*!nZ@kESPX9Q>HjZ;mscil{2QJuft8Go>d;J85vK0E}G;WwS!&h@tg2V_p$ zr0N~LIyi3y3tNP``l5ni&T1o<7!B;YhYQkafA7X6V$K$_Eqc%r(W}5yX;g9<>gzA7 z-L^Fg>5N)SiM)#`^x;Lo;(=7ze~SDycdbx)v^ck8)XDD5bxN()5{ty^W$^ouZVCyx z@8a3GKE#S1`(y+1b!plJ^Sd~5=;Cu323zEa; z;nr>#;#668N90)8OL>_bSE-{Ak(iihRP)*0#?CO-ohlY&Xsi&%KZ4=CYe8;2mgcgg zVLK6f|CZZ3QOr7GVk2LQP=6(j2u6|G4S_m=u?z~53@h$N)u=!b^pLM^Ne_k&3a-aq zsM_Z1Tk|{^8yWHbfJ4P>2V1fvEE{kVt*nd+(H!*jA&p0i8GAGBGPyMxa9ruO?lH%W zL#pRQ!dm$KWp=;T)j6-60gG3Dy7ES#%|`u{Og?Jd+`g=CE2U^Vio3TaTev1#WjiKf z9`&&OA=gcwwI6jgFOdf2cc%}^r-^w1$VvG*i^cMHwZrvV%K71RGTT+5ePD+tZLKe@ zOmtgQ?a7jq+N}Y%Js@iymQbX4+(_YI(!X>unp=|W5vyx(8FmoIj{e4P@H@RQim>Bo zDkeLUZf+6DT1xvn@>HIT3VXLTu@bDq^#rbuTZo4vw)7k`gElG+^|yTx{qOeMrp>N@ z4KGHDiyWd-;ZK^!-c;PX+T12GYk_)oR7>u%)CJD*P0mY%xf$F5!zEeEoBnypSqwHu*O3 z)1qVr{&J&sQq+-aaRqf+&mE&=C_W?z=K!Tl!`o+to?f%Ba%ZkwjqK3D#;m~i_unB2 ze>*RBY!Wf;SZR1VmMK*C@KPvxb!!CyBU|1EOhR{z^}`+3n=OkX8&Q#l!`}1$w1{rY zXA?da?fbcD8Kp$0WK0f&LiDs^s%~@-ZCAIYt9g;dO@PL9X+EY@N$zsXakB)A>_cSC zMAwxB_8Y+aIkb7mDO_AbCESuzU|nRW0eo3qA-eOxxKb&k#Ac}|@!3Ihp=hU3_Ggv( zb-5c%WMBU*(akcvuSu=6pUl}lsLBoUS|mkE1S6E30^ikQYTfP>LSHaHb$YjfNxLd% zGk8F#4xM?k=Oe*|C^qtVe&*2n+U53qq-CXWA3$hJil&RPeeBj+Sb*G0~y@iTPjZZ?h6p(-?!h0@}U&O>{knBu|tl zj(HK~4EthiCmW!JL0@PF(c(m_tv(RRY+^TAP>Xr(j39j$cU~QA3#?`K9cawA>(#(u zVJ(90ZOZ{7#AJqmgv49uvm=S~IoBCk%ErDbj^PTyuQ8b-MlUFJ+~t4YYQmyVt>Y zrBn<3zP9D3r{9RDPYt7Ly~1&Sa0)$lsd;~3hIf*!vm1MKv;BHN*EXz)Yg^5fyM?35 znuwex^Pbmtr69ShDQ~;4u2reMTUNtOkBkMYhSX5!?b&97%M2bjxC4)uab-%P;A}|? zdmoaae^#`vji()vVutcvu=q_fv2$Oz{YHKTQNQq8$F^I5k%;VYg-q9xhgJ-tM4ioi zX$XuMUA^Hz2ee9tGM3Ev@hWiBlvQhi`KH@X8q)>`ap`+LO0(5_p6aE8Wr6#?jOPUbfaN9GS`!IiXcA{1dFoBQTsIPU&QQ3Q1a@M)as|bToCLV z`36Wy#~VKxwqI=R zPR5M{O(7E@=?B(DNtl#wSfyW6!4jz3iwb{U9U>@f zxM(`)Y3ciD|BB!wH9I!?WRi~JB&P2ToE}M9!=SBQqm++uB-qcTy*i#~&G&bN zhQw6UfRE@IZl*R!U7^J3x@mdqK$BZCROUdL9sfX$YDAym$Z9HpgcoMIC+>W!8d7G} z5C5wh`8jKpcP7bSHTdkSw}|RQ4xO6M^SaEnEZsgCvW5>rHQi9w#Gvx*s7{c58g$RCx z&R-6avArKCtyoVr!UVc`n$zjgfb*u7&(Q_Q&Jo+ z{yR5ORpwc3&@GZ8E|7It+VBStNZYy=zmdUoH}zF1#wd^AE8) z3p9Z!r*NmJ!droIi4$iWtr)Tt4yv_hg$K}+?X&!}Dfa?Bj6a6x357UDa=HGH3+VO% z`ENIqw!fXDnrQXsddt209$zO}Vt^-7_Wgl(r8kFpB<7lwOfG$$K3GJkS+7u5l!^W_ z%Dox}K;%~OG%xwvjZ&DrOnHiV=Lj8{N1)7(FYQIH1^1=R#CiAWDX+8E91pCbYO{x!x*lJ*uEmKlm*j<^~ zS+Rt%H_Vl2R&r7;sH%xxup;a&4X6a#rML9bUhYmL3a`n%fPB4uMgc#xIqowGL`!0Y zBexpe8Oj@G1;8C8^7M3%JGfJKmh2C|Q<=Nzj!-PSi3h`sd%fK@=ie=s5lJot(;b06 z;ThNFK-c!b-pQuGhZ9tT_D;Bcq_`CLptY-~lVO<#gaY|rRxEjJ+kW|z^(~!W>g@Fr zr!NUqxgyFIK~Ej;6&TS%;N+#3fN_i1u{C1@&0tgFM(EGbo5DtUW2A=URMQjGdo7_E z&Jes#9~cV-dEn3?Oo|hGU8!wh-JgfL+33m}r|wA1_+FP|qjvh1&2JGWF3$$FUE_Wp zxzz1+(J#~eA6@IE_>1V;p268;s=t=b=8`OEzI zabyws)b%oKrHiUZILUi9kynOrjWEhx`T7|lukLrKIQ#x_vLGdKHY&Mj!|!PGU~0&X z8Z5a+T|HE$m`05kPt1c{4)%3FZVZ7BsDdn_5rREIXCfYyE0PW46+r7^)t$ z88sO?;V*JPs@+o%^qVOa%Sk_hG@YEFI`@_}?t*?T5$bRwpx{^-@CX^Q;Mx5S+f|t9 zdaXah?Z%q{f`RYa!CJ_!Cq@vaW?E_fYqvOlCzB_ySG%-kWAdJ0sWPHzVf|G>le)-D zv^iIU!&*YAaa>&-naKIsbUY_<&-PYvP!M(Xt~Matoqpye0UQM?p=4!OYIt%oWWRqn zqeT7$j{#x&8~48{+7xT?d@A}CG`Eu3sk14kMjMjiB;D)2=C=QL+noPT?D?6${Br~U zGX$@u+a7_R^o0`V>N;CK_4}J5sQ&4>+G95}6kwcFo&o@r>O#~XuL1_2C9-;R3LCR* z`Oiv}TbVz=#syY;#jKEb!}UEw&l$n+q;r5W&3`t&SmF}vSN9*~!HE-njg3}gXN?J; zHD-M6AJzIlbq4qDBUL9h%H$vFpK~oXJSXJEOIA6#)tIYs(tf zJKl?fV(=Y7h^>bs(LwyOT~)BpaPfm<&ZU84TFeM_|9?Hnje1MR+4Zo4sMt6Uj3-)v zcpD}$`(Cz{9s9lWGRkf8rv#(-4Zj~V;X+;(b~?>boHw0l$3i4S8~PFxkK z5mQc0RSATPO6P%9$6n@r3eagC8VY_&S$)72Cw~%`aQ{tj9;HWyrp#u#E8feLRMDmV zGK93fZ8&mRZxwR6lo7-hviy-b*bY+ndzqGehP=o&Vd8t8o~xBCu?W^xOaAIcC1LPH zUq8EMH?jWUlWK9VX)HNlZJOt*c`j zIvq{QJAErNF*Q$(GYBUfT0AI`6J)zQe@++$Qjk4Ne`5`+ zyF3VzkG!cxdPv4^l%lcve@DE-ZF*G3=-BWgY#suiZT#r_e$#84`?&MNG1Nj~w@RRJ zUQ+(Ka3B|1PnYp`fNjZzw{!`e%Z75-driWGD%$q()2WN z^Cm$;E`lPHLj}5<5YBa{%6oDlFK6XSk9O1nqpG4Gb%u7I>qn@Rghu9n37BQA4LUBr z%-l8m==L-{hk>|f@n9wOK7yaetPVsZs|CWsTMzjwpd$ZEhcc_%4JOMFufA*M*BREc+pbrSs_k0^O4NKKOn=7{(=TEDDW=Nm|xR^mx>(C@W&^EH+vS7 zhjab{t8xm%vRJ`djf^*PioQ2QH;l~yTu}By%Nyq~-;wTYS_bFoofdW}^6}@|L!V?p zk@oKjZ5?Xa(Vw!_(C?xW^e%B+eBI%7ok?jwJ0OxHCkWu^>q4pMt>Z<1fj1**BaUM# z-809>zU4PkZXdOfyFr0noy;aJTsiDvA#A4|z^+SzM+qL5zJa9OgL5{Sh8%IFurc9q ztx~Yj?tIg0T=@mJd`dz@XS!TKY(Xt=*TVIPF4Pj;V}nAvsO!-YDlBu7b5%7?$o}Xf z^OnMbFCygvd37#sZ^ZoKgti=%bX3Ai_7Ye{Kt^7+Lvk%C${#gcCS9*keIa7 zv0<`cuPy28;u2m3*}8{dA?})ckv7#X-c~*#ZZo-I@Rk#vWzQ?SCQU~WYDXUXMrOL) zAMeR(y~9u}JIfp4tZN3JzBn<=wKv}ZF-tfrE$q&nnijaRtjv3Xqjj}_9?5FM_HRbo z^bgo4Whypi%kF`Uu1dL12kwBDHifEn_v_>UgO1~2s}C^CAu9N-=}o`#HR!P<|$>Bnvu z)e=l0Y+#V1;$>Mv9dl4G1jD4#5NmYsjD#Diqj}8JleZ@ihJ}eAn>`!j5FLfTC7IC^ zI2d>pXD#I)@+mu)4A!fS-A)}>a+|LEA_6M@lPz)UvF;GB&;Tv{JJvNO@cr_EuiMae zW*PE6(uw{R6XwX2Gv-vYbWNF(gFECm9K{}I$~?3$T2|~Q#wA!eEocYMKje%B_sQMU z{Bl{-8zH~-i6tVa#GIOz5FL%+-{h>dJyOz@E%TVci3_h9cgo<@6g#yeebj80rw z%=G#`z}e{|+|Do)ii;JeW4p%79-x=y+1Df2$j3F4D8X7Ni0;f=$i)_5hQC^&K(3#@ z(g5V|y8wMBonxK_Nwzl@JHCXMOCzk-6o=;;v^GlCs!=p+CIk5ia9GMRS$$)FOsdM! zw~$eVjfHk4Oej-C&i+Qpy6eOn7;|gEM)O^`741$ov0186PPd>^{&9yN=hcTrSvQW4 z?!Be)gCGL^pw|lFKDE;-c8JKf=%~*{oeRu2dG*xqKsieOb{_T`vOONbd0|-M`auCiNI8WkF02wSc6*QZ-6+Dtq3~mYM;wc z>H~v9WOatvt+4YrjPIQ_4}aB-@tVf@90;X(?x_CrEx?rzzta;Qy!2J1=+n}}Z!5ss zp*G{tfKgfFgESeNr^F=mD2t4;Z^G4M`grERr=uTb%9y`9%^6&kW%K@V`!`z0=sh1c zuGbxJ@j(&M9Q0FtYubwoBe1I?gl|o!D>HZ6Pv)eg$}8_&U~}Kne$+NRX*p4j{TikK zzScS$>OHo)QDWrG{`?C~2`w|>(>ceCl7U4}+`BO>$jFD6BiJ^XgT6cH zg^K9s;kzR1VD2IBk(HrMu&^SGg*Wv)fJN>4>YC?^5Mr_5-T4;Y_R#TAT#$nNh0PJc z#MfdL+4#q@rgfA=L{8-WW=Q7N*j?$BF#pXem-et8U9A-`4`bVdyYre8G0>A8Fg*Hx zF&5sbD!d%#&Xj#*vcFvg2(&r5@$PcB?BzA*D+Vkl#V9r9E zSw%i((UKjo>k*+udJ!1h0tdYmyv)IU{ET)po1S+CB_l=E4#g){GQF0R z5)dkcH+m24^bQCo#rS@6SnLxhv2$5VIL4kB#yc=0IY(Dj*y0~mLtc};#4U%OPb%!h zoACIphOMg(g?-P~nZ25a!tbSd4?~CYtt-N9*EmI5!l?;-8}eu}>4BOYpKgNfv%>kI z0R5!rfHK|TM_1*2Z2O^X-u}S-vdJAtsvcd0SjbV)x`@hCNE3bn71=~wk|K}V?yb#Y z=5+qN!xv%LBgh{f_nfzh>|Y^|YR^ghWWV|ZH@X{b0|uhSe54wz8=81%SEE5>)Wain?f&1>Vv)n2#;nJ+XIT}V;eYnu- zHSZOy*lT7!wQJ$^?>7Vq?7I8tp^dP=Qc-(~Z3h(OcxPgC6h}&D zS@3yyqYzk%oJssV!u)#0QTB;ndmG4hjJh1 z+K%8ynIgL4471sSd3b5GX^k!U5eN69)LPY}(o5BDu)JJp(xeq;Gof{$gqg#cK|yK@y1}!?^0lOV9|B$hG8LJLa2NWO z{mB*$Wja3H`z8hMTEXRC3PP;8jW`274Xp1Q=U#Y6r=h5{>UoxFC$`2!Gx%VNYK9`@ zsbRQDu%g(ruxEu!RTzaO?J5h34DHS0Udr945nU!o=Li&?*C6*PA`C@f!m7}-9NjF4FEir zJ4-14FL-)=^u8`sXjge+F8C0~k`ByoU zIcbb2O%3M&r7s}Ji$VV>a}-OIm~mtGnNLeiF*4+;G~Sy&Q=hcKJc;KW6+H$l|MEeF zNeWgAJ^L+!st+coyvpF3Xh=vEi1U}BqC`NIkXpO%8J(3sM+2xY(c+<|fB-(tzbyf5 z&|9_u00#edyCF|L{neviIfMUMw)}sRNdKQa`uGw1`G3)P>H~eqf2R?TTAiY0R z#Q(JZmQ1`H7Bc{RW3TwtAkG_~VQ?X+e*$wsy z$ybLlNCCjt^-^v)uAjWI zU4EVe;*1jsQWsd&yyLap4r&sq&2fD5@_T;F6t|OI0h2ZUcJ~oAao*(IV~H;6ZcLQ7 z8NT*d_XX}|Rn-9-`KbwnB{&=zL7j08?UD7h2iPO2fF-bX!7R-y>2&GO3ecx-!!W)1 zAtA6jMQg&|vPj_GQkt04uyg8X^I;C7WG|6VHcpp|9i+7-NUdHrh(+pJt^pBV(_EDV zHx@f6Zl^H~L_g$gx*xCQ0=ShTWC}lhJKIpO#s?TI&d^@1(%7sDtpzPNViCJe*0g}} z__F|$eP7zu2+lANThMB5y$}`VQ@`rR^d*sP;i`o%Z=xMpAbNpi4PYd+if0e{!V2M~Pi3YupK)5XM4%z~g+Urvc9;60V1l=2nMY zHAyS2hGP%KxCz$l{=*`o2^6ZQBxJvrg3s3^0imM@@pE=2Y%0d?@H+g3e(R?cQbRNy{aAuA^~7>UM(T3{ zbqsCVnY8g)m09Ol~+1!2PvCT zpqfLjejNhPqnER|%9NpvnbfXbD+TmM_H%SWgiusFFp$Shd-uqksZ)!Qoi#OQgx`N^ zwF5*BK*d$E$=#|5p=u`I-s|QO?K!)^6e?)lZ#^ib+wX$kRLQ;y3v(*M_q^}5!7K49 zMM$18K^PN;=|%>i>;sqQs+UKWSb=O$Z<3vFmR|E0g#%_|mi+z0cWwoDgY_<4xML6h zp>}s0=>fU+W=1QL?DWRA`1AcYGb#rh*(lfp=i$*NOmmX;^PoOk;#;+dC1)31A}+}X zn2RSV9}A9F79~DjTraKERHIVG-)M{9U_7Ez9WEzyc$Y@R@%7Rt`>HL2p824=Y&c?V z5*L#a?evhK0`ETyG^-sDvqzA)-bVGm!%KM&V{PKWx5FWasZuB5mlSwu0VR&}d?$39 z>=S=aIx#TY#*$f9m9yz-bPEqnL)fdgRGnFng@)UH$H zc`BIk$*aM8PF{p^RNOi5F%S9uN>KUWot-yFs3_p9ujcj}gr7**s(f<>Tx0{PfLRF! z-$1eK<~JRy$mJVvEBvUX1WBXFYa12O5lnuuuaD<$rqcglmzh{O+F3p_J@A|*(}q5H zEiSo&{&4lpPQul>k?2*XyL<1xcp;#*dB>}`=8TJ{)<)N^%^GJ(*CDs$?_6vRNVuAM z7=JIbA^NY|6ZRoWM6BP2q*+`fKrk z$>O|6H{*f80ar<04mQKpEl*Ov4W{p=!X@af_-1bDm1+MT`H^FH1SI;!qV7So4A*80#ldFAH?-8ibP3!bzxiWQ62>@`r;BjRBoe*_tA2X$ zkb{7jX@)#RuXh;w?(c*t7uvlc(UhRGWJ7K6D&qYUsT zWG6j^+z4u$_CB6s-zx`*}Z3E-YN;M4nBq;88*wK$Fj`l(BGqlt|2(tBl^=n zxX=KisF&zetVb!&^Og(y^QR~lkzwMRLRSD{DTOzsmu`d`N2eXmT=fdTsUvaEW+{zI zSGU@)O<4Gy-H@+Zt==t9OLBK>(yRt2q%=d2U7x|O*W6~d&Fq{;N|bVMeq~vmXbk9M z34B_X#u=o3xtpm4@rAcO;lgPQuLH;R&=al5`A}B*$f41v6VW|`*6ZxY5^Y5tY4S?9 z6|N&eTs!0}wZ6)ZGcY6`zi`a2@i4fY2H8UValRxZ%zS z%&v@O9NdW?@X1SjYS0S)KrO~vCt2%!xpglWE9jJrU;7b^9xxS3xQ>JZ=kL3k-Hm_@ z0jDKR*%B;99;DwCZOzb`t|}DwVeKy^Zthb|vu{(u_Fem~ zkKgQuVAl6O&o(fdi`@2|^X2q1KFAq_dE@iZ-ZfdfW=`wUy%2j5Ahd%~o zvsUF!KRj||62ZXFA1U1{Wj0uAdfM!puquU3VHR)D7GNdEfSSw^M$6AM0IqiFI%=)e#d%}I6+Vhij4qZ-`e7xyuT^LiNAimiq?oJNSS>>P{%-=MNTAw!tqW|jnv zk&WuEw#clG`~7w=$nW&^ZfZO!9G3F6j@Q<+mW&=6s^2ho)NR{|_O9t;1IpW{RHl_l zQ$We|H5nK~y7G@4rOy>!P5VaYVh>{t-R0$hmgBF)1d21gL~dm(1}X7IV9+VF=R0FB zUE23xPyYQ{l2GihFF$~_m@tAV0W;FlF+~3z0oIH{K{E`_0pbcj%QpMyY5hZvCItm) zw69M*zcx=>me5v7GY;J7s1NNXy{rD@S8Bo&7ba{0L5cc1n;*Kw0UpndVr!p{Y@hw~ z5kQ+((D@46HPb)Y01MauzxZ(>M=rO98R?Za5n;jV+s`d1OQC=b)_)<)$0`3Cod2H! zOyN8POlZWoX#uwptf`%*3>ach128C}BI;i;(PI7oJAvbWB21f8Yqj|^9IgL@z4r`j zYF*cbablTH6;wn(nh1hY1*Mm$NRy`0yHZ7(gkC~)D$+rE2Lb6#dQYa(Yv>&!gx*3D zAf%tcTx+hi&OYbty{~ij^?m31t}j2hU}S`hyyMCHKKFCq&;91#rh9{1BcBn+@A`~g zov51unstGe1IP2m$-q_WuX$I+eu(&t|aoabh0Q2>w z*Xc%1dt8(FW;6OpB?TZJIDs^Kel%zMJ*Ex-{Zc^mygMBKo!0TeM~RhY@;T`g-Q+9n zo1Q5wHV8Q>otC{3-zGm2V8GOl>X{!c?XRzT{i;)-q7c;uYs>2vH&Qb()sw!o!1%>o zi*uCcsoce|PY_2Rt%JLF!+?Cr z@gS!9yPkC*JRA&Uu0Xcd-=EiN&Bi$b|N7?M^Wm1Fg^dlx9H?gzYvotuaf(EvFtM^# zFDgmQitEGKOX13lik@|vqoR(Cbi>yce2@^ypijk)8ndGxMKZ3eTY_~t{E*v{ry2XL zw;-szgE+Ni-3w!aK)PB+8GeNuw8pKhx43m}OG0kH+F`2-IBB=5R$5Pz5o8P6{QR7d zb>RZ_zT8<(pSKBnCaiIrV~YOWGk9{t{;9l4N>}H*TpNAX0Do{K0GV>ZizxTqcZ*d< zo8dN$0fGx>_chYx_(U^@)N~a3*me73;9JufR8AvaS){GH1b?%iyA*r8_JPiDw}VMHvh8TLv*aH!Jt>miJ!tn2L|nXCjQ#<@TxnDh>o zRcU2oTGlAgg=~Sb?Qchw^?P`+WM0kGwD0@?I`%im9F*YA+KiToV?&{(+)$8zppE*T zjPkPC!eYz}O;eiwfj)SwY-7!MBHgWy(fz?;bbyT^8kTsfJw;yN3F&)#$yo+w;$hTc z&0duJmPcMWso4Dm>Absx#fy-P$#S!9-WY|enQ{gP>ZO9ky7dCP?=E$wG#)qg8y>W# zNyu2+#t14_8t&yt%K5Kvk)jagF*=ii{&ofz^qG3=L`tj*!7;L6!vk2^@CRYpAR24i zGKXsNn$Dwry0TdWl!}wV&wGrG_Qknqu%|VymFJ@WSai2ow^#Yz9{$Ixv7vx&UI(AB z%(TMYQ}0yAPQ!v`Z!y5PVtx0+Evs;(F%*nDi*=!ylj{TjfJor|S5pX8WISH%i{-jTbgK<2vI;l4TbF`&o)6q?!c6cgag+8M ze0DrK?-RCEE(r2}aV@gM48r79Ykasu$Bt$|{+C#pQI_V{MNEP5kEXN;UA}@Y=h6EFSIrIcl4MzdRfnU zh?i0{+_!F+_Yp6#o7>%K6l{aVp;)Z8-^iVNXQ2Kgn9sK8?Ph**7qgLhY*ICD^iV(z zk)>EFO20QiVJ4f-%YHG1xXKcU$)k$J>3qI2f}*o_ey!N9b5*vKsJkVL3VOwzRcwM9&cH7)@&9e3j5w0k}a_!uf<i?+d8SfU#x`K=C8 zJyB_Iu4K14TayFkdt`7mvl|@8suPyyMg6nC&|7G%@FAS4Sq( zY_~?|T~*R|@%&u8@rXo?f8TG7*2V=H-QE8MCg|MJJ8dY1USv1MdrMausHc!|rvw zICQe$?>-kAI6Z6(2$D+MqN8CD5^xb4*UVO^+n!JAi1XkBOD}f5l#c2Ye>}bWKnLDB zqJq@HG<6VG+9DN`%&)`|f+W0|ATgYjlzvgSXxs{-SCV@|u{!WpN2hz{$C$3kSRBTNIsC9(`ZS6?&S?M8I1M%Ba z$sLw}u2T!9Yl7Kfr7$_Zik9tU@r_Wou1YHe`m_I?A<_?b@r`Bxnao$Yu@XYm9liC9G7wDRB^GgPLW*g^SxOQ z6SRqVwHoFt!6sL?Gx*;5OW`3Ir7HL<$tvjcKC0RB0{S{PGn3J0V&#Jpoy@={WstZa zx=8`ed`I3>Oz(A`yN8gy9?>SHi3*XHN!HLc=4 zHYKOlkEdD9zr`@SqYji&vpfOoW|hy{gPM4`+-DG|0ZKy@qXSi(itdKT$c9)lgN`3J zYg)E!%pWcI?k9u7b69A1Dky4xo>Z)^^?ahijZ@v< z6aiwCSj=641$M>oZZSlRb2T>b(u5bcJ2WT-kZu&KN$}~(u?an-KVS#R`Ri_2`6&FEm9Mb_N$pB&cs0F<;|jda4_Go~gvDrnx&bHJE25yfPx$TVp+t z?j=PE>TiCCSpFmD@$>zC#9d5F^Tp4AZDuT>y!$fuFUq@jX||AZjxm8IKdJoZUHrOT z)@aPU-E+(B#ye5n@VnpkFf@^egEs;pfk6EfJdlm*Imh2QJmkoESZ_=HVLaSyAQG<% zXQ@QEvB}rDCMBJEM=V0DXB0@rKA@|63R5wct5#Fw@~hvatmjIy>}KcOtZ^?O%C zj^rLRJ7*?2e!gCJmLW{!G_V?+zamFhb{|-cu-I7vN0%ai3uz5(T~Y%YHIp)9!Zh7l zA4H3X-K6`*^}nYT`}beJprL@?dgXu ziy82nYcPtdX>RihBkpf(hF91&`$K~haIszUCm(PE1?j#R0=iFt<@xiEfBG{0!=UN^ z@RwY`(AJ`|#-R`q?HaI?ltfoFn2uxVm~TL8YdXK4b#Cz58TK!&J-y9x0uMv}A|Qa# z0Q7;M=DRhMR9iS309nlNfFH0L&*wIQmQBznz|iU+z;G#%?uG{T(o5+TDd*m8bo$S- zn7@e$YyOjB!he74{~VeBv@rRh-o2y9={B26R!bn{farJxpd(+NPuwp61h^f^nm$?f zt;B_{tXLfKH1{harS|mjao;C=AEaJW3CS#`v<8pi+#DaVrMF&wk{TnT1n z`pfGlfAS!sGH<$?PRNInetJ&S7GEG>lrrl}??u*bTDP&jD5Bl(bccJNLqgCqgHDR| z--zk}&h1MNcD3JT_{$^rjhv7QZ;cZ%*95?M*|>&9=k+bGrpIUsMI>0V#ydnt-FLVc zmDO&gE_CV(*Y%-L53weo9E3i+@q37!_#q7Q+`pF>QyA>Xe4^fI1LS&thZ>GK^3=kB zgXmYf`E$$dz8E}xo>7b|!G*J#i$j1Bs<4)Cb^*1Lq>A_s4}BDZ=Hvu#)5pQc%!f_& zF$`!H(t6B-$Ps9@z_%Vd)+dBXUP2Zt9PI(D#JMa9L9TLzds*Ik8G$cz777^^ zcwN)$_|_DqN{TA1%t7VHHp6d**p1;@oL4!YKF#H`kh_?g=BgebI9@Gc4Ped9%gSBX z&`1HJbk|+ItBR^a;VHu)czJHS@}bRjpN~be_pK+ob@deuCtS88PG}lY*zt0TypO9^ z+JoZB+ka~UFO@oSXn2yLB;_irB$91;%#kdts0-q4;8Wy~>l|i3`(!@Qt1c%=P|2p; z7@Lh0WUd!@r81F|Zpc+#OdQrRh>oWzq|6EI##Z%7iHn}SR#$vAVFiz7ZtphaDBMsO zMPwvu9$NmI*e&*AH_&kJ(u*;iUXeWDrE9 zu)f#-q{3=QiS6u$Nn+p zHiWr&)aa@1E~6o$hjYLdBZ?G)PALtLQw>`0^OZxw_SP?zos0V;r@PI4Gy!`@OgCx7 z{l#hl!-$QoW8}~jOMPPW&hy)Rp()I~Vo{ACIOOR?R}c@e@KRh(T){2 z4Lwx!x=#4rP4W0$CQ;6~(sJ$HZrvfu$7LM*Lc=pS*PDfAF9mE5??|y;VQoRlpWXfR zhI!8V=8DA*8KByIn%-5J4DNQJ5JNc-|GLsr{?nMSygBXYbAsq*0cm_p47+^AYZ{iG z-nuJz!u4Ri6^z5UtCCx*7bZfqqHz(fKLy^mKZjCZkc(&COU|-3L59K`@4Da$$L2cQ zSqv|nij(5xj4?R9^Y25qn;F{%ubE6b+{{(0J!!JZk#7aOY z`F3>0eBm&=t;+thcHI3EhYFb9#Y}w}+H2`A`|`TY_atuAo&Vza=09L zCQnM~mk)3{5io)5>&kA~tni)qx!RwL$D3|e(b~~u69sa=2Y3#4mEP?Jn}A!5u>FFU zn!jHKnXd@Z~C?KH|||`Z!%$#yR+e}IjfB;Rdpw=Gysu6=#WwWDSHyZe$rgfwRVnX`RS~nA_B15EJ@9l_Ku*&!Oe<9EdCa%Jb>A zfXK!&pC>c51|NTIl0pg1u0Jizy0+_}$TBvH?KAWtSEm?0-tBqUcNqs67nXco;Qb{JfFG0?O zY<;zKK16k3q#0w{b8r2@%97_AEra`%%Z_eBWkA(C+L^)w7-~yL3p_WPRJw~kJK-Mk zsP~kv1~SN39`i%7$0x4V2J22m{?S502bT$cBTAXp8-9ws{D60v;G4jpXn1j7@*6rS z;r}_8^l;;wLG7#rq3J==xDraQ#3--^9X+y>d2YEDauj1puiDwjlB^QJr|5f7bv#ua z%1BkXr(`kHMrL>KmTz)Fw_d4S$BRvSp(!3Q&DHfyM3=F{I}5yW{2&$)tpEw(2ouKW z@JEH2tmioQ3Dczy6pxnixm%w0plxN}3h$sCPb zz;~Ebkhm%;W+B8Ba%*h4$z(TAbE-CFYq8E#GUqX8Oc58b&}?NLTd$2!96j4xZxN$l zpYOJj%!SXN_8N-3vuE}V{I=@EWX-xOqRFrq#oxvlU3^?-U_6waAXPrDbW}!tDP+>5 zy_vPkTatkYNAif#julZUi9g<{csS`k_7;S8J~O+P-vjPIf&*cf*S5S5EKnOmD5Aq|Su!*hoQPKhZ2rDnmILRjU$s zR2_yvyYr$35cScrG03ayhkI=FT|@nK7B~9ABC|(rce!XJWQmATS1f_TUa?bxLTx;1 z=maHkvm!Y>pOd#@q&th{3)zjFB3>Kl^~Jtk!JSP@di?2`-pAoTODKqm@iRHKPIkJ% z{y;;WW{W;UrM{Bg+ge>|N%gA=D>0ICxwKEre~Au5bvTVqpYBbTTO;4@GVnal8lalU zP9wPOaf4kG7wKj;*^G=XKGJU;e^BMc1U8l+96epP7$5uP-5bDjk}K>vO(-lWT`I<& z7QjQCkZF2AH*B2NvHw(~ff(wu{N5@?C{4jnqcw;`!NknZ+6NroIgkrww81Q2A1Ub< z7e7b}S)MtE2-T^&!v$Mi^xeHrdXj7&VZBK3R%z<$yjn7% z`{$fkq+8~^yix;6UK}6giA#Gu4h%uspBOn-pd*}+)7|koFef0x{{<;!814&R1B3^( zj~fdOOCMOZMLf%kE{YT^y1N0iQ{<-JH3>c*jppW4MS%Km1a+z?L=fmvXK9Fh1JCXL z{xMHz{fT-XL6)WDQd{lly{EEvDC&y`wt6CcT%qTHn9Galuj|9VEQhe>NlJSESP4~* zu2B57=nxaXRB%gf&t%N)#RjLD*KuLVn}8rXDRZE>yTI5X&V-B*Y2IVfH6IhG*qc?b zOgnzd5wu=fCF632?m-3r6}f~U(!7jwf2d0Qr>^&Z$JWPNOXoTs87VRKr|ojl4{at6 z!S|nK;Db@t!(RA~OrHfN=}5A2YeMM)7%^0Z8!GHD30Y^507NaA2xQn&1D{I}8)zrs z$wiKAq~9g|i>D50%Uu`T2D$M&ylS0rsUbJ>`%(Uj597!FONl(e0p(}1JUEPW`Egg! z)q5vdq)^`kzx)uQ_#RNcE&(sEWK=(QSCs%gPLyT(t^IO&$~9szYtWrvU>&rgBL zbe)6K$j2p?ByInf^l&Ui-G2_XTmV|Q=CB9XbFThLNKwGJVOE?5Z3;!ZyLvzranT}j zM74#dE6G*ixSzZ8gf5(-<|)WQ2?FAKePS#1b>T|zV;l0aQ>M)vffmXRO>@HKrK8^a zct_C7T|07Z%v_$Evb+|uH!N%)$$5o^wh}V}-VZ%CT|Ir-DOVi9{yHx1XO4Aa-u#O| zl+t;wH*-l^!ium!`w_lz+1@Jqij+Ie!v(%b=2hEN*`UAyVJmSHFDgcm+g7r>lEd__ zqG94Ey3)6R)~;~Op_9O=ndji&-f9d8Bn{lkjO0XJQ^ge+(jRzsW}NK?@`<1?&iTD@ zK8g_E9e0=60u;vG=3*#_IheH@X@1>^TS6Afz}zkOrfcL9YhSU0Ib<RVTS@W_bh5v#U!<=rPN7GNLU4mM{ zFSj$wD!B@0$;*vYym|Nx6l|m9yE2_(?sp#+3%JZe^=MmNX?i@e)H=?opG|bH8xNQ6 z_s0<~*gV=ctkb$dv20a>+wF`un*dDLR-RHebDF9yfcT~8fCcxf=bilJPVJ-CY8G~d zZ3a5of5VWzt8+DvEO}J{c>4~9Bz_H=+)Ui`vVjB(P z_LW{jRv?$YQQck6(HZ6gZ}z|KZ~XrSGWCB%*#CxJ&6kYlIPo9=)8Fj_dx!B z?jNNVpiPpC;iT4-*1U4Rbg_x$^iBrhhU?@)H3&OO3iti0{d*m;@|d-qn4 zNaH!6`ER6+mw$e9576~`)dUi-tPfs4I}tRNTEv~$GrZINefZRu^Bc4I5Fjxx^12a1 zR$x?7mM|ds)5du?OD;~0=gfY*OlZ0mUT-u5k?gkAI6UI~q%VsuiK!zt-8GyG(gOCY zX}ay#8fZaF`8=0#a8+aL5V%4qK6aPd=jMT!PH~^Tc|ffBqFl3D@uY!|?wId*{M7Ji ztpHcUCyrAaSxKepu2_7dv`*R!alWwxR`W^t9S&9|7Ld0URrLcg zb`HJpPaY+;vo=Q3{KNxRw*16)<<;5bf^={kT@Ex-r(rc|B)>_oSkc$mf)toC3N$jX zWLsfYFsmRIU}F;1|5+y&-5&xf8^h0R5TOh5Kn-L`>?^aR-=7sC zCm+>FZKpT2wyu%zFFrd4X|;-i6=|5q<`Yhp(`}v)=j(1dKI=x&ZGR2Cb1w&Sk;@Qg zf%^*|6>0GS#nyf-N?e8K#s&*20^R5XlGN$*$+$D$WOa9VLmGxXOWBIC7#w$ee*MpE zJfoHyl>2t4Sb2H$e4C9Yrs;tF`iD70IKV#ecp1Bp#N9DHCL;j{110N57+}Dkq)WNH zxyU8>ONgyJ@F|KnLl`b(MVvzuJ+%6ffo>cZg7AkM!{SZFP%U$L`Ev5hgzMVANG!(0DDm}Se2#o8!e%T6v=8eI}&*m z#AaM%{OZN(k0UN|u%T(@nA`Nv*Pt9|1geHdR(v}e{`@0dfrEb z?K{w}e*ERMufk!DVgtRDc>&SJLp4nK`*k&BbmnpZG)T%`$;;wkreyeyoo;s&BtR|3 zrXsq!_N=jw{>Ah9#$DZ8d!;9jm$(hR zcG3>mvz>KAUOoN&_vQT@$jCh%mHvS=rbJ=`FjJ^9e{bgr;kfk{_!0`X3k|{)RY6U{ zrrDl`8LiqK=}yzXGQ4+~HL{DW8=;3=Z5DqrFf z{dYAa<>%ef?6I35#>ZFH^)Fi0HrrG_#j}dnwB7?f>3pVT(ei|3f>+h%y*u&RYq!NG zYBc5YB{@YPgrBJ}p0p^@(K)rB<(5mJ1ev#97C~JI$!6*fa!e0xpk9VUUTZWc z-3+UO1`P$fR!zAlcjw{8TvV=uJTx=Bj~59!X>y*5GBCe6Xx?mWiQtJzJQue#KPRU( zI3xQa#<~ z0+HJ88XnKMlVk?e%;GuwgSgaIg5VVn3an8wam>SX6e7R$5y?pBVy3j0`a!Rc(Vf%h zYO>M|ix8=DD<1`wZ$xd56|NE3z=n{W8)a|If<(hi#IYZFp3mn_c3ZiS{%jVW-(er%gScI=toJ@-^cjx|44slq3(Dm;i*6kh(r2F_Y;mm1{V zA2z6Yq#`$ZZ$DTDmy1?|yU@6hYy{tCMM+YD%x1!KamS$o%%)g2dpivBvXzSCao^tF zJWAUM^t{OFZFn%xe>YH0hs)dVA~)D`Cj;5|+g}m~#~<~Cz`#l{957rivq9A&ha&3* z%s)Hb=hGpKn_+%3>O^~Vi4CAlmqzAjmjf(lwyg?(mW73wB9JloF@rB*>i%~k_blwV zLgTm)DoD>?bAwQ7YG`uCrC=9<4m*PoqY??X$1#oguXlw$iJ1;oIlVAcIQJw-zc4%} z1+an8vwj;H$;CY9(VuVeX+lDOY-`R3XdMS8QBUI{+ulrQvYto4TEm(^TSZEIF7eu* zJ4OUzpZ3Lnui4)GOHh@+BW!Z4+S>Hm#PsQ4<6RiBTn+UT85!mwSKw7_Z|2JFVp^xJ zdDyU$gI2+NaD{JpKop>ZIZbJ5%dHg--HkE$m{+=sTvnQ&c1kKF)V}xjh$c;nrPI7!%d2EWg^9-Ji(PbqWN~(v&Edc-1R7Feym10bQNt?zM-P zfju+R9xdhB+N75T<)rpQgX@%_IAfxB{DCk*_QsHzHRbmbGpO zT#z!U%=>2UtVpADki5IQtDSo!NFa6Y%iDOW87jUxQ~=$oXfGfHFf*h0T$7qLjpFN? z){a361#2U@OPpep)1&#p8u=if5#%xkZe+G6cfZ8z8ju_VnX{H;@$f5viH?K`K=Zf2 z9a&W>&Rm%>MTXgC(Tk-9%?=ciYr4ht7xdm$IE`2%Qtv6=sGGl-J-4}Q~CQCNZuEZ^=p7VpEOYsZSfv$0(-4?`Was4 z@J9ag&kXZ-*4>{tI(jOiz8ilw{Byh>LYz}_+Q%BY(3X9ad1^mqkk^n(rNQWRqIH_G z-4>w%3bnRVGNj4$<$n^vYExaxWS7F2i9HjW+|9F;mFZ*sen#spbVayXp>#|+*a7mLTdliO(I?_|4R{^cAjW#52=Mz$ zP@QUyeo}W#@da6&cv1n*yZE8|Kf_FC zoJb5bd`(p3tl#1YIh2!Wc1}Fu#(@99f09GUda(HZJFCX4^OmDr7A%3;$a8%=9&EJ%C!z<#WxhQTC zQ-+vEX3Zsxk)dCv{7Rp1eIM%f8yVzNL`RI0*>nT0iOIvk$O0qF$uu4n+;*77q zE7yG^E1vuU1-Ee0U2589Zr^_ULf48I`~y9F7=Rh>(>3f^-gNIiBhd9ovDttM%ieQ0 zHkXiXD4&En2_>ajW@q$Kj>4$;GP0OcC(axNcVs8R%S!_oE54(xoF~u`H>k8y-}$j_ zpdF13u+N2C-(3J54N|nF1Lpzhm{jSvWjVNRh8YUv-=r(a2oaMj>@I1gPI*R^wsPUa zg$l|8%c_^!uydu*PeoX_z7lFd`KC{4_1CGNH>egx1l;Uzl2)i~OsWWe=H>kUGHy}m zDagnAA`x=9-dbQYc_8gGR&TpE=I(JRJ6H!U)P{f7J@rK?`~KvHWXWNh9tQ0#QrUm1 z4OP3u*by;7>n`qGX5kK9qW4#esR&?>jwO+yKi!p=qghJZ>J!(;-XS2{!8eqoC+xkZ zS~EJu7MVXp%L^X~iq!VQy%ohGR`UE@&{g62lk1HPm5(y5(7#EVBe784BL(paKS7uH z&N^meblGYa1I~KKq#M|HMDd20v>SIe+RK+C)y&^(M(VnV`R95K7o;rQrL!8k6Xz;8 zE!u40Jm*F_e!Z3_zLS7LmE3S058R*rc5JClQ=hc{ehdO!DkLN92f?%fGIi2duDo(Y z)2Gwz&71v$a!gC|=wV`Qq%NfX*hgN0VH@Zfy7Yx#WvbOv_RE%v`|b4IpqH~pILxN@ zT4ya10)lz&eR%F(mnnTTe>}PgkJPAq5EIQj^|igZ60f@cS1v-`9mYqs1GH!3bq$Hm<^Ip?&$?a+lEk)bR?foP zEEADRFKlQG{RLr=j7dGn*xH6cDrHAC(|GjFoCg>=pt}opBF(*U-y=v+dlRdR7oMl0 z171vV<}y_FC@JP!@pJn3y(cOLcn{7ex8vu(xL|+ix_wUVbt|7YD}S>7@;TC~-@}sb zA(KYnAU=UWGwX^(w;!|6-CJQBS@7HZhAxT>0Dn37f34*XuE=lAK1Q~(XF8cjO~^Kyv)l7WmVl^F4r#IN+uU=ntt6I@0<OtnvJ7j8g$_O_XfHr5@+X$l#}beDOy($<+V zL?)0vqHRjq4s}4p9e4@VEE0)UnR(gSdbIxO3t&T@DN%=o`0+aYuehvi7$F#<5xYLqiRix$xLMEG1M;}q1|>b{oTL6KM+(Il~&u+kiJt`QGs znrJg{qm3e`NUr5on*(iGa-nUg2L`j|@7LPQ z(2T#gE(c9(hHtla; zo@G%ckNQixD9ECIP}DOJGsSj@q!a}0wi2zH1nOHrXVyuk;f)6jebB-CevQg8#c=;1 zYKGs&jRegKn`avs>N4VxmcKp3pa`S3j2RLunI1Wso1Lnak#8t$w{)=;qtFDnJG|LM zbev|OpqkZR6<3MpDfzqgEWq}J&)bF1=!5uc7MUH#NDtT`du-L&&Iw2)i{wDa3kmg4 z9Q@c3Jw{Tw@%)vhXJ>sKQkqTBi|pzk}OuJIkTx zbG4zjiDs=uR*<=x$I)jPvgyg$gR3(bY&#e(U3E083CpFD$nBT-{RO?$$m&5sI&&+E z=bIY%jSld-Z-MDZ@6JjZckTL;#Pa*|;GwKr+zN*&Y~FmOi3yp|Pqnc|tFh4zX;8%?v`SyGp}O4i2PY*nE#!5ng0>HDeUtxfElo%|C9_S^Uc z-$)tval`G({(O9NER)&pXP*My_9%@QGagIXcl291(<1YQD1Cp$&g;fOqkqY~XW7tQ`?@{vFs(MKuVbA} zuomgC-@Dl0HO$Q?{%2all%-r7{4=A}0}HY7$1!-KBPclpbZrw%@budcZ>LO!{c;U* zGO_H=TN9O7dV6q3iH6)tqDYYA=SYZcQ(#)3oWavE21Rifv{{CAU;k!Gu4vc!@$ zcqUJ`*VM~TL>~Vj779`udLbKKjzA;^$C74DMA=J3$KUf@lme`AvS#Yxf$P}&zxDs5 zd&oOOUAM#5Q&I1tM>~aQ%wW=3bAoAU6n6ic5_s}3rdNK`9B@&OOb7@XS2n%PYVU{} zFu}I=UE?01nQwkW+|+v(??bz(+jVWc*_^0oAj5F6>Kg$MwwjQV-6y{S+iSXdJVWBD zSoEzEvu>|@O`8pEL(5E!c@YCg`hSo~zp@=hO;+2?l!KRxK?(Aulfhlxt|?;un@mui z53~H+u86j}%PK)MzIA{{fB&O`aK#j#s3gbzZCBgx_Pt2m?dn(9O#0v3lVy~J>gARK zz$SZDr|9MS4SZNG-&}fAE8(IaH2CJHWDu^uGCe0gTE-{T)9X56_x{5nY5|dkYFL># z9LoJR4}8bF=djDAf>Sl?j^LRyyF1k@f8KJ6(!41#(?603O>aE{j~`RBOHf9oR5Z_e zkN`1#*Fz_DBYRQJ4aQF$`|>RixyRotiSFRGbT077s+!cjN{f{`=7%*6@iz2k{hJN6=W7cu_&Jr#Zr8ZpxTVJF)f}1G!eh=> zS2VBl*oHgjJVSCn#K@92Z`@}3oySU{;1r>5OrWO{25*2YXhJFi;#<91^}B!_>5Y0J zy3P;S5Pkf-iQ8Yro8!o$>9N&!-if}1_gUzq zx1-PKT538ax&pMd?&ZvMtp~lTh|R0u5Tu9(m@B=86q)0;X%eZL)U}nEa^3hj^jrU{i`eWMRKQiR+o1-S;W~~IpUFZu z+!Nlo7E+fqX;lyX#35v4Zhi~96c5hcWvHhx-e19U@7;BCo3 zEBfuu82@K6c!A`>4LB9eokE-A{)#hsew5TUw?(7rlJ!KczgSx|ARAB%oCfANZAS&e z__}XeDe+E_-YzzOeq9ddAhkcA>_=`N(9ZRJcRyc)Si~AoXxA0tW)DYCB4ksta+?`T z0_h|^N6u?bicu5EKWkAdDd>5TW=NSk5GORjQskH}c{_x^QO8&Gx(_fT%u7DbYhN5S z#J3QqKunhEuv-gaS;Ati#4-i4mEEX`#YG1TpNhzf^`}n@=*q$3A>ZqsFP53!#7)>> z`dmgSv#D6@_@k@r{XZA^8ibR$yXW~D#4>~~OsK#Iiybt$TXqgSbmOJ`Q(_A3)wI^~ zYenPx5lE2yCQ3rF*G5RzedF84ovXYu=O>DPD2&p9FX-@Py5(BMmZL=^r+Nqm{k991 zc3^aNcG5O{DaLH3hUBxFwQiNfVn2VAA|GBBfCa4#2#pD=d%EAUSWzSlLdg0cz&AT8RGgv**7u%IJ#H zyxpssbl!dJ*&>0@sGq(q3`7P9KDqBiRwAX8s1(nA2@rhZKBi#&$mC^eK=R9N0j0UP z{XoqmhoMY_IzcI;L6mQHO_zosBfYbWE)FZzzuKfH1em)e4Q7YWJSJ_NP3JpFPI;zU zC(j+mVv%A=Q}#&ycG!%e5`~{Ym^{G z?!Ha8&5k6wWmMU&Co9N0jJyOBSpA@g_}nixz)Ts@fhjKH7WOD^Y^+nni*%~GP4fZT ztv(+)9IV2|?4IPe8sXAf-)eF@k~9*{@AHZ3k(f6Fv8!MN4w^vQoOo)%i%tkwtQO1v zuG-v#?>}?U-O=F>Cke?;v>hE0@>}zggV$X4H@s2feP3vP`j%Pl?>QP# zimBjky}PRHO^W9yAml>SZBM7w#T#)49KstU7Iz@|Acn)&NX}^@9#%%QfZwkKO0;oi zCkY_aco<==%KqkoCN~A!E>r2k8oZ}FHCBXx$dHC7{g8yUpYQH@zeQt?$ckVPb{}gU zlU_Y-rCPEtfghUEjNUD#l6+wbac{LMZT;3b2$8kucE9b%xz2F{>uoty{DZ(_4q;l* z4t0y>WB1(PKz#mSC2&kAuV1{od!-P!O7fQOG{>3tFREQk$fgEWk@s3i{n2pk-@pS>CHm7z*Xf{Z(Ww| zduVN}rC+D0q!c1)MzCG5e73)8vFMk>4M-?MVo|I~OvlCc5w8?;@M9suMzJ`!jZ?R^ z=OH_t`i#+6T&GVzT9xBgu0$OYZl4v^Xu<=h_Cl&hp^uV2FbuP-Kzr(~MSEmzc`bsj zu%0`zOOmSlJ-3v`{${d>ucz%)C!w z$_AE;lpEl|hI%(+VU!p#xV1H}Jj2h+94*?=fGP!(zOhy3PGG>j`DdbF+-v7QH?HFS z1Si;YwAiz)G&gS`w4s7ezsGWOa2-2eyz8cbi%+Wn zK6+?OQN$yDKDV03#EC2AuKy5K%1*k^<|HJJ7sNaZ3~hIJQpHi?dm=2B{-0`R3hJ9| zpt9TZ$CwVz^cBVie|WmTR@9;d-2-zc*^AWH>H~^w?#S+R&HX8jr>9BWHU?Yzq4;hk8d^ z29LbQ@tKBgLrESl8mpR4T{UZEOH@CT;CSI`td-{WjY`}r{I)8+fjt}@03Me<*AwiI z6uWU#jZ0oV=m=|g->AJUd5u-3__G9FrvP`m8S`Z#$!NuaK01ChzNWim=Oa@-ZPz`@ zYQzs%)RlPaY*u1{HA#Nz(-11tcZUr;V}sU6cLTtek56=<y2FZ zDe}q51iW%hsww)T-J^22q87~K9g%mPFS)`6+mPIf)K;`CuB$xt&}M^YN*DIHd9#8B zf<3Z#mD3k(C7KhuPG$FpgJh?2rlcU+{#iaX0|9R`I3`%HtV)flFt-UeXo3ff55131 z&tSq8jvs1CO>vSenGe9)H+TD@XSS6rW4(^*EYyybO9L zx=Qm7DUq9F2GrdTQ<*NUwWjqxvMOC#0Z$7UTq9#sfDGoS_tG^qA`Iax-Or8MER*+AXHU zExB;*{!E*?eNMu@5a%i~W>Au9eGlQx(!Fy3MGIrVYWaoUp*nFI!fCaCK_~vX&p=YL zklNZ{djq?Ifn`=e&BYPL@Tsll^fTD%KKlmHvU$^CF{rPSX_YAt3lT{bXxl}tdIhg~ zkjx8)I+dx~Qmt#P(B3U*9}lD=iIm-BHrkUGf=z~+yZUbd3G&<}YGNyytY64cWtWd@ zA&j+Pp#k2BOfcvN1!@h|d+;$|D-c{qM@2?E$Uh0KlOHNh30Vw({q+*BoCg>U{_UZD zCh8wg++=?6cTplhgXs_dof!kpd-3T1z86%fwOP}2b_NZccC7yTFkkZJxArTJD(A!B z{B5I-lP7+)_Pzbr37>zv@i)>5IPg&L^*>K4{xb3>V|#Mq*WXnE_2S?Vl1D-lqtroZRBQ3bbe?ZI8e>55YiVEj&=)5KnTzr$h&+ts*a zTgai{OtpKS$)Y!nlCQkEG}?yO0Pi$8Xr@E(;{AVJeD44hk{OvoY~7e$WUzAL4WPos z`mMH=Br7TCe1TpcUAb}cr3dx=j-I~uqm?T$@Fpv29m>jEqgJer7?*MMp?_sZ+-UBv z0efd&Pqt|}fNg3Jx>@8`-k0je$1}LOCBfVFY}ov#ej$JkiJBmG;d46_<{FOIT2XR^ z$`*rf2&)8TyYC5`e(W3%+M+Fu;A-%bJ=*BLrBB0Dqyi5ZNdT*TZFx0~(RM5ev6@yB zJ@7#0wVF3IEt2hRf-}iFMA#IzD7tVskVgLOnPKjd&Ew^i+}E3z_4&NhE>3mwbreJM z$j_m_kGnx*jqq|w`Lxatbq4PQCQUFKADx7R<+Yv7g zDxQQ0{GG_lck;e5^ZPb4=J@vzLm7%?+ohXjrk|qx)#dED2&S9AZ_CH6&33Po9Clmdtbi+4V~`II%Y^iCbZ#ggHoU$wZkHKZzq(OaBL#< zSUy)yzUP7n{@&){{6~~Sz>-(%)e7!u#7pY%=}ccs1n0Zu6>;3z;*X>Jw-G!D)xf5z2#bwZf^%Yy zLiqWoOPqr-y+w>=vEq^wSj)BNck{lg+7aU4{&u$M0?2WTXEkD6Nr&AwoBknj)J0u) zPVJUjvK{?RQAe>0T#=5x_Y@Vl;;Jv@!`_|8u_6ukhNBo;NcU3Oyi8TsG2!3eo|5nP z_N%cjGKcqgx<8wJ3g<=&ewdpnd}uoVbo~9;ZK<`gvA2F*=?#_-be7xqs}px@uFt4g zCdS)NcxAZ^vWZH#ybZjp5qEg#!`fh~I#{)>wZnU%+fUH0RG=>-u5U-`jo?>gE_Rw6 z-4!#q>ReX1fc2BO=wtipOv1$X3{wInQtqD$uo8?rwX`di}4@+`M} zEGle9k3EBrXU3X)`C62hfoqsfCzzb;(b5=`#EL3Yn>18nQvJk%uF(~XYYOe zu50W1nsus@=Vz?Cz)nr5VeM}^Ozag~;gnJ~T-)lJ7veR8hB@q_X6I4@!$J>dUA1^O z&%4@y0;+k?_iHC)!)S5!gf5a(oeVh1xk^VLq-BxcP<+h;W8nB7ylX z*K+5B7Ic3Oo~-6=;RNq2s1eN$8QQpF#?xru9Aqq{4-=f0@w$9ntLZ;|F5TLX7Eh zkQ1?j`d)-t;vV(T9=&7swKG4_C4W_L7&l*k@TVpF;EBV8r;Vd}Ebl{&)E@6lIm1KZ z^qV)l$x7U}LYMAd6=SsB^~DpjFt>b(b8Xw26jeQICd$pqOaUo0Whuk@UZX511{rjH z1&Zz**NEwZZ%wJT$7b;A+PTT>+l(H&MVI7*p5!hL@}jHE-o4#1_UdoqSMdDYp`++k zPufYOnF?Q1_l1kl&Kg>6tYnOAb{y0sM2XX=rBnK-wD~(|Av5P%3`$qtFK8n(&DMI) zA&;MJDS9R~p<(4ZIx?s7w4&A7C%XBG*_`I;Xv1d|jN&Hkb5dLltFZ=vB#x#)D;>60 z;7P~3iokl|`Hlq?bqA zrn2XMKZs0={G_O!xzeRLLU0=3@Tih1pcs7-qyDX7`K%sr7HBUmT!D#25fO=wDt(C>l?D#TA8kMUAEp-+?C^I><~;{&A4* zubNoyPgC>MS?f>OO*LDf;@I5pyyodQkD5nTN^q#Y@7DXilK}ocDVK;jdIket-(ei} zjuNUUb#&VsQ@8CcI??66vN}1UiI5tULXUQ8C@_3q>O2f;E$$T4&LP=Iz3LoI`^p9A zoD&kW0Th=r`$tKrbP_6IyXxrEh9$FePN^8S1)Dcs6{la+@z$IQD}KMq9$TGLB+7Yw zDmM@9R7Kc9xzOi`yU5E3$mn_zWGG7*x2qPtBT!{63x2@S0)L79X5ncrZ|zNKqhXeI z^~7O5`8CT`9I6=VN4t*O8*E9Xn~d8(IYxjhR)DV2ZMAJ!hd8fqh0>j*#`vuPw^>1Sj zuc}393|FTT7*t1ndYrT!ZMbDqG;6t>*$R8*OYRwj-trPDB|Gc3Ifv56@!oY7e;8T< z-BPU2D1XdO(%(%Xwy&g=Z`DE-C-%F$i_5cOP5*YhtVy3P$kGm<{fpU=SlfNuR#Tz0 z{&*V_FP~p0?oMCR8QXe>TX(P`x6xuHq;rr9BAjTFMEiYvwd54wz3>}4D1k&f2}52W zU>)q)%;YY;R~_4s+7-bDO;ff`M=|S`+#NMdFa@amR1Ry6FwVok#Mt~+gJixRi(_Rsd5pd6S$nx(xkE>9j zxc2Vtj!d(|8dL2AqxzHZ4T?{&gxTlf#^%YOlY2?<*LOLU)W|2ZyS-D>40q!90lKG8 zG7TXr7ZfOi`RJ1u!}>QF2CHA@ao##g3M&H1d7WL6z?=ZkC&fcu@&YD>SwuHJ%ET~cBs>g1mC z>=&bAt7lI4YQ&{)G~w<+L(6ox6O>haNxgjb2JS(%NWALbFf=E{O~Bwtwkto|ZsYVo zJ)-jJlZZc{iFkj9y`Mr>jUaUj+^5<0THl4c=C${l;xIoM+N6WR(w`0T^sU_Jpwa5b zU?WwTyl}AqsT75|*rCoBH1(6Fl7n+?t%^Kc+rbcZd7FX4@-g4>*GnMK8t-z+mQ`IW z5&Q!@rZwb6TaFtXJE^KU<|bXtfZjpL|V6KLs1`#CDs8kFA4 zVZXI{lu@4SAW5m+{$&$cFJ58Qo}EUbE3Bk}U)gZH81@d+xq@!r=N; z&E7i5&ncmesicmKBH8DT*}|>!*c(@?SBZK6ikmGuqWt$QhqK)$OV9Y{*UD@p+Y|=y z6JPrx3VJg%_UB{IyCz>928y7Uf-Hp%0->*Wsr&Ig>6u==byz&Fn)}3FfI&!M6+epb z<41eoZX3i6rO%e1{^G_nE~J!FaXi(@H`FVtoGam-n^#8L_f0PX$Zso}BuRRoPc+?| zbgAC6sId7k>wp>7uw)-u`9-;<=#s_58m^K4%bPCTz?_M<8|;%XHHhz|Mr9c#n-AYs zF3yAI@OV6`_yGS>EEh{OZ?4ViP?GIQVO6OH_R)Q}-@2h+#AV8*BqGQBJYEY^m3Q_1 z`;lkqJ$`yqW-f<0o{D0yFHaTt2?!!*z-IR`qT)%jcdQw?y|kxG2H^Ro%h|No;%_qP zRMruXL#*n%5&$>}5yW#r=SZMVk@}O);&QMmVp8uCQfoKe(tUDFNc}t?$gKJbo^9*~ zrS5m%-vA(~r35rSgPj|anT%Q#<{J;5hDe?|F?;=TueWoJxNAjrcL8~NSdRMCT-fc` zYmj{HesF($Yd*^{Z+YKu>hoER#B$R(7K;5&kdTo>B1*D zhx{;3Wc#9c6EO3KDOYnMBxgV+XK; ze>v_zNzJgI#IIbv&O}fE=XKohI!i`W>g_`Ee~9MnwGzVVzf?RuK5XE%0C(Ddm}Re6 zfq7_S4>!aoc;3m|a62ZbV>ka6;}_2_rltN z4!Kryi+FJ4VDoz>| zL=e%)b`A_aMUTdFgHGmI0aZ$86W8v1EvF9ygJ?(uWMM2n<^JNGJAZqk8fvHo1=q<3$) z?Lc8BvJ@)vM2h7nuR}MU!Lml_9d#UQ^*n0NDcddzA=^Dmvpf3@lc`ZH5@Zw*Xj)XX zb4q9?FL~hhnbP2}wx`<D%<5S|=5c=5llY}tf9($U=)dpPGw)BLba`*Tou&4XLwhK_=|2|gcLY(+}s-Mx5( zQ>WU)gTbaS%Dh&tCy~^<)nnwO3OR5k(D1c4jo8dMm0ikvx-St1jB8sWoH&Us+xs!e^$* zu7c1#w*{>No^c7c4NAZF%uIyksJw3H^!XCTS}RRR_~orHM)duCO>)smm^{p=BRHfa zDPKFH-@N!Sbmkp&+JVj$2=MzX+rbu3G6NLaOKFAd8XTqmQ0%&@|+mDUfY7cw{mI z9ThJ1+U8TXCphW^Gmkdxo9zCQHc=6dCN39I zmx(u?pYolskWtja>iE8@_i=Pzd&*+Up1~Kv^}2b`+vfAqhm7fWn*>fXWlC0*$x?tH zy1!)y-s2mzfC~NnY{wL*-7+e1V-dR{6*}BB{7vE2?1<05dJ2&^cfbdMORYH7pjML>Oxv+fj~sEV ziBr<|CXf^qV@FMrXBU%--iw~Q6#QUWkNNDtzw}D(^{&p8P=Fi>{8F*^7I6R>ZBJfd zb9$*y1gpTk`1BTLS?YxLiy85$%v4yXY(Fw=4~Dqn6)i0iTSK zXXo1{2ZJd$-^k5mC`P+iO#6N`-}*@+K-ok~pbvu`_TDDXe41|}w|N*OrXh8c>T|+VtJw(Dpo6)yuRj z$0Dibw@7++v%e9I!%Y<}m|H4!A*1~G+Y=DejgTZzJM0(5La zgq=>vDd~ykTOTOg=^zoMr01k*Jg*7QOi~vnrig=nN9!{Od_`O!4m1ji2o-jv&TYQI zQB{D-4g;387W;> z5FE=-)+&ozODBAt)p9^msuV_k_(~s?`_YZbquZ<5#qXUTvS0P@a|xwT`g{3gZp@7@ z28(FkkfJh0+6_(RBV%oRX82zg11wR8(Os~KS`Yq=A9p3M!+8SWuu_P(P4@%E^#0>q zf!HUeJ7iN4dg?cn*8(RPP7>rNERu?0%LqIJ&lIz4_4E*zxIA(@$Hy@vX9o*XJ?USW zmd^Cw1XqR`sP7YfeN#Awu4WP-?*t``kA;5YLOB&Fe0sr}olbfiy+`5(H!i@%k?v2Y zPPXB>aa^0r3}0#Zn~AFvPEW=d#YaoWTVrp z0a*$cKc~Ee*dm0nFHa@&!h**fD5BKKW6lZ=w(5g^T-2#Qh!>N>lJgD~?PSontJ zFDbs2q>C3X@y(B?mT+%v*$!@rX(*AJVp!BWvb>wue-l3;AthceC%)8iW``Z)^ULNq zSW+8s9?JVtbo#h`ZLjfzrVhhZDWH~+!bUS?sk0+l2JHR>KLbIjfKh*I#)@g2qk5dRFA}vId%Z+KwKta?ePK zxZz{{tjJedgSZiReKYbk{ER?5^yh|~X>qo@v_*w~dOPn$Q6NF$o8|%`UAMfJSE5;V zPss&y#HpAd?6iP2OTNERx$3JVI5!FR4$Cq;`8{cw3hyS7_`h13sj zY>sqKwgodb9@lE(pvG1fUoWJbnZ=jdnz43Qv2Lh8E__3R60OT;xliNMnK(||et=|m z%oRVOe+fx%4Fg3xBa-6{%|(6cJZaqw<1P~f8nu|RCr7$*PichUZZ^i%G`%ryYE{ z4#ahL)0o>*VyAv3*@ivgMW7_~bx;SiiBR+tR0tJ+ByKgtFv;fk9fGeN?ugOHBDOsP zwb)$tegEwD1k@;CE>4LE{Gl#s{vm-Y9j;v$d@gxQ4V^JlpMB}ycuKyN=W}h)xW;88 znHJO6`GIs57~*ECi#Ve`Tf*5FIlMiMzfSFfkO&o;hLvKuu@{2A1liI5j*a%`+emO~ z0x~}46RsR5tb7j5R?gl&LJ92PdJpS;7*h@=uS){Qksb7d!!2Q^R{2dP?Zjb`Mx(}= z-z$R0V)gkkd;Cy}qFSfDpDB!HFaCshHh0zo`zV@3bqIgPQLbhtO@3wSanx;DBm!>R zMN3WC&1~sG-L$rxm|~S|+k-tg_SVP%eF+mQRWbPuZ+U7GaOhF%wRebvs964)Qyv6% zOsM21v;-n=7O9SkX`;JuWMJOuV*e1BEQ=5q!Jh9nz%a4rUCt(aZtn+y$nuec2DCuT28kOF4ro+}5N43Vwul8Pz=3u=wr2WUu zz^vMnXa4Q+KKz7Luo6oMfwE zScXBYz@SZj$W0d2IUl$ACe0Mri;sY1-aT3XF%%0)9ojBh7~Sjh<%y5DR5mf|d*ZWt z|9)M~MN?E9ObPa$0M1i+e@Bf~SQ4Elu;Dp-Q!KMFa*UV|m5LBckBB)7aDn>7iFRdW z6VdiqQq@t2V&0LK#v}TZMC0$y-6BCb?cb%`p>L{y+1i`t}bseg#ic&;)9JlvA;pFo(NwYR7f#0tv za$v8l)07jt<&;1tr-6pxG0Ic%M)y*e(ccKD@F-a~wxPoW9b}pWc@^H6Y|Jaxa|!*f zu&bh-F)-?1y0%w)nmq1~9=0tOI&Z)aPIhVXlZCJd%k)M)LdNZ(H%38_h%2{&*NRVz zhIt)hO^+Qj361d?TqD|UPoA6nt}L!2Q{ZzEC4)~$ip>f18ETt-BbaTIr4z3yZjr8W z`fV4))@-`=UBr+`dS1a9=*&r_bnC{Ku%hXL4Z2rkx=dy&!sLJB;D-%ivk?1pGV+lm zVf}&`Xo<93?hRbQ!%FLnxET`fg^8xv`}zsFhU}(T>+o^6%*eZz;F=-@j=dawMV2vP zCKG#;@X}*UIKhF zShFr=83u-r0}JMh25h?DoThU;o}P=|x*^kOU-9;_z*2WyB_?_1}AXv@tcx7{ztlP-y%xo|`GU%$SmnNxHd2`xOQ*W~_~ ze?~k)QFg7mobK76_V-|`Udlb;iO*)0^$2qqiv!l&4kH@rCZiA#Okj+MO2^@sQoa^) z*VnyAKbP|wvysXVllkd^UxMex55P1&ik{{C>C<)?liHEE3M|cMkCB`PdZtVF1pofO zwvUQ*P18N6W5wpfOh6Cd+HlEf@w6X#c$#!EzV5`oHy+JoL9vg<(o5VmQl~NBO;Abr zC3Bt|3poppLJ-~Eo-ZU#@Q_U*q?*DayGW=+Bb9UBJDZcjRmfnTsp}cG4C~Bcy zbKK$DAFhI0O(uVhkJVSJ&@r${dgNd3#>WrG0k1}RBj@+k%#)aM&P-`N&UU>2`NE#2 z^IR|TcDnfK;C}a$`>yZLZWs4LvUgl+uy4cGnq+XAow%7vqS2fFz7jNFMjJD*8iQV;Eyr^GWwcnsFWvv^tCNRrk(3l+~MVGT7mT!OK1J$?-~O-O-Ten ziVmJru|&PVD{~a!2<)xmej$0$DJb#JNjf8Ofeq)^t#TAEul;jBz&t+rR|~9Mfj-V} zhZk>c+hgxl7~>yKjHh4K-#X+A*W>?P>qa7^*cq*e{qB0v=|`{ef2~@kFZJVIq{=Cd zHBZ+18!=M{Cg%}PvO zF)6BGHlwipsQP2KQrWv7Z+fmh1BSM7EQX?9s)Q)txWW93szftRqT%k^@HTj)m_eGC0lAA(mvzc}RrbP5rFYcsTK;l^85?jM4ijMV`CLJ=~KT;yDynWVg}bZvgcCMkRxI zd0G~@_EP-1aK8RD0i}RfBC+U23*bt%PbL=p8Di}Gb0WEm=V-AeH9lXE%XezQcvCTSDZ*) zoc8dS^l5-qX`j#T9LmSiHdt>q8ex455GSj?I?{;J2VH*^$RN*t#*P}0uL-g8KyyhJ zi2Fdh<#2BZlc~~NkU`Ypo*21wx@L^GEDnhe0zgQKsB@EeYImFRoNb3s$|$fsbDsY} zps4$y`uS>p&W+>i&nMJv>%gjjcLIA973%`(+6?Q=T9DiuqotyGk&VI;zNE4wgsm;c-|Ey?Wz!7+? zmx+jF$Sb-`GPdx30-Qf_&ilHm z9_GIW)gS$RoNvD!&2XJ`{n%BnaM0`;pUP18DK*e1D;OU#AifCmLl4}ZZ9VAU^%amC z#!3r!e75Kg2x3Fr|MP1?3%&0}rF`HFA@e)ym~6Q&_?G%_z_Ve0Wp^Kxey=o5=63Msh zG7Msm%C`B8z}e1DSO7N>*rFptlnOr=1R--F-vY}9Ev1^ggo+Im?l zbse4R-bD<7aKq=lY><HTJ2RCs0oBT9I znL00Ajve%PC@9^}+!A?9O+NSBd)cC41?!7LPj(IV280=b$i z58Dq#w?Wwj{sD*sze~wyuGMEw!u~*%$69hHF03W76Zvd4EVT`Dk$F-NPg(Ugc-e~x zl(fH^`b>zj5RH#C6F&1QV~0o63=pe-Y{>JZV_OM`^EWx!+8);5FTfZ&Iaozv zU9r}1!jyZarMr933y%<3n(9Za$a3q0q|GbKFLyGsHu$~1tG4bwJ>7DqH=Ll`(}XZS zpHVOvRrS|GmjK@<1=^T32mQ!@)b{Lh1@N3xp_6F%N7w#Cb9jz;>7~rls~OvTmvkW3 zor_ldxLiK|3i4S&3fDb(1lIk4@)|8xBwlQl^wjuPBi&t$mbE5@j9B^Pa&&HcVzc5$ z4pMm@w%G@CU3%okFzR!KtQ^HI_*$jfPHdNX;#@K#$oKFZ(76T`5Oleg6}mr02k*$M zcF}{F%@22J9+i!A+4!@H|HVbl{}V3q9o-qV`g+oQfahUHb7FY`MH9Mdozt?Fhe9Vl zmA)@CTJ--HU9=mk5pTh6s_~=QPf{;@dFO!t+p0k(crG8A)1)qmTv7>Jgpnos70I1m zbT4`caF#w_;*fZ56#h^&8(dt;cetT;FpSxk{u&J@=2&0t%l66opNm=y?JBpcn%)0nu3 zB*#xbA3vT^yLy|xa6ww(aLwi++?05eUGXa6)TbuNe;G3p(B=PATzd12|IeOK{cddc z`OJs&G5dE@Ao&p|u`#J3{|&pE&-a3YU88acu-bVi#(cL{n6Cab>ufD)=Q6GZ3KI?x zw`7oJgS&U%5|cE;O&2TcVJ>}yYO@Dce9C8q)GJJr$RBM_VdBoyCuA0lpVlm$A1ql? z1DL#m=9tpA3riJNA}TMMn)ukDwn&%pw$}Y%KkpYjP(mM{#&Q$I5z}U_inyqE_?f2E zu2Pl-h@`P3TdI0`gIsFYexL^y;+3PE+@N2uahT;0FsgXLnGGA>SUb9C@2`9_D8tS< z;A?thEWlxV_`q|+F;SXeXhRf`82Z3;5$%ItnfipwLrSjNk_6W7*5d;zw*(n-Gq6WH z_36_W+&BUaf)FRQUXf4 zE0?$y48WP!4LFr{Bhxx6P;ZZ{zw@k&`MF2OoOYSdxkZ&1YlgNf?SG3Lvn7sOeR~=x z(5sqtna?iCf~e6Z?0g1O4256>HXe-=~jw^b*kR_?8q6oUg1`@G=? z+qJ3v%+5H}T6us21xGhP>4$kXoMYo2p}z8SpNko31edjbwXzE4$D=?pAu>Zr?7Mdm zxH_%XgZ9?R6PMmn1t<<5-+q$fuom?-pI$6I7tN*3=aRa{>b14u)kgP`pqr~$b)mN! zzBCGzu^>^SZxt%$_?#hkau%v_aXRt2 zg%?{+Z)^;w{B4@cgqfcTbsG9;n#p+iyVUDF8bsA)L2J)|3>9|=t`ISD4ZD%nr7|p$ zmTzLOI2bMXbvp?;+CAWBPkHVf14+`l4MpZPw}R1*4-&SY1NzO@YgB^=Z|EgkFh zM-;v>>X`j4((!qxrd5IBYJ;L5qMs5U6#Yh)3qy683#TZr?&b^@e>`X&%JOzP60JeI z{|idc!~a5n|?x41g z^R5r0JU8&^0AkVBW2r2lL-~7wcvO6HHM0)kv1EI@O{A|e!I@rPx zHG2ZzpNg;(LAMZH^_MYs-$dmL$iZ}>*^3&b_dHQQ058?hS>2%Ht+hLxN|lYHhLrhA zeM0J!4(7*NBxvV*2$zvU+>K%fjT-xfb-VqBfSU$+jAyqT=Gtj-qbUty82&k91RqKAabFU@jaeLhlo841O z_3`xx=l+c$VLsEBcf4%Lvw+o3u6G{ZAdYwQds=QuOY<96M2g5$E{~ZBn(5Yk8qA6G zwV$NMnCQe`QtiF=xXWMn*{Rsy7F$;3VGQRqwhEn~+6IHb57y)^PdcZKMfYz@w05%n zB^+%`pZwTFWT{@Q0=GzBH;0!~{kiWr6hXdxXIDF*qxS|J+i_I4S?XnC_1Wwqk6wgH zeT`*{^-hs_|DV-}fffk)^dsMUTPWnZ0ibHH_ zVBHWNKfjXi!uIX7E5fITPnr$l zMW6Gl1eWd2LYjWyuTFKk<+YLiGyCB-GV|kvi{V9I;SaEuAvIxuzDTkxB%s@QZi>n+ z+<&GuhlmFz0q65L!4`&@tM2%OmOjdaap@SkXs(a-GOZ_(uL>BX(sXpXNJ?5JJ0Rhb z2fm*|%yl;SqT%aYz?WLR#cO+0`)Y*F`~n>_ne~m^?|e6(fLDsvorIDG#8qZRhC-cs z4L>fB-QJ9M_Mc!AkdCbTs(D6-U;qT}>eQj+BbK7$V$o9>WiQ_k6irzUVPGdWe z5}vEBOYQlWWYGTL?TO)HvI!fHyf0jw7>Oe%(vzRKb-&2H_{k=@9NpMKUrZYl9coYy zB$j%C8~H_T!(uP+tZV`Z3BSAhGPR>EY+(4gGaw{m!*k5!hJ9dmnIOe!?m~MITf2#c z-#Aei6%PZuu9Bx}0cH6oI1?s=x%`b}FKG$A_ljbfg-cR#ex?JxTQ`|4WIE|HsD)A% z6Q^yfqtWO4P^HrcATP?XfF$9-JH*S*4-BO=b@c02sP-VUZ?Z>fJN-kldE+K0k50;mGI694SJ&eAWyxW z8N!_hICPZPlLO2g#{-l~m!zu$h(+-YeMa8h2^GgMrV+}>$Cy=(-e6$@zF7#%qQ}ot z>u=csmM8-Yyv8}nXlL8k2;4|SkI^3s_6}g zr2hR++%dTVJsh_ss2&5jl1)o(Nfxx#y=T7lsRP5dLuW%OX+?Wc(sltyQL4`-76DJ#3%_SC;m=r-t&tq{*=s zGA}Vjp&xyMg0u>s7lPTplMi9QZz})8bEaa-XzCcA@8lVGb_P{hzjgJbYBEEGg^OLw zj|*uH^5}}N+TMl@NBn3*p5;`!$e+wPC^nRQD^_nNX zCoK5(Kx=tJ3v0OH{6bWHt>Qd3Fzr`@lcL+eJc*|d#pO#IjrrbdD=tK|xJqtt-C8rS z^z3-*&F{Y#j{Gb&`mfN@4sPSD$^D&nE13;s%E@~23EZ{z&@X}@u}!m!c2AU2YMK=z ztx-zQD{00_#@qiq)OiUr(7(l&E<+ruiTs;EhS;Z z*nOk5SEl+KJE~1k!dQocdzdEI9H8UkepI4@;%3wBea1pi87{`>>8x{2W@Z$+W8w7U zt`S3PI8T1tGYRhG_Cazfqg8A=FBzdkab2vk*wB05YW25S;vZSswJebZU5o_Ia*C`{I>`FQf#kBO;*GcVy94{M?QwHQgho&Zmf zibL*Nk27+5q|I*)1a{v}-aLCHZW|&HE@MO`&koxaP_jY&0d#5dqZ7`%9n26@d20bx zoN{|A!Dw=t<%}5-L@B$fP`;DjOFmA_c2jP>F0;o=y?y3{73NU&1kG>h$}(${>b0@u zmMJydnb+V-bm>pv72hgr)IcGW9-6moMHeyBW)T!H&jK$Skwg;)ga}aQGr@%?Our%$A z85;(gv|6?va9aoM_}8Hv^k|9mCoq`AB@>q%~yU8F$pfip)GgZtaqDI4}@EB(v06*?(FuHYLeXK zPSee3Nfod6+PM~_jAMB(8vK3PgS>Y{hVZ;4ilcF1Nb(3x9j0m>#z?M0J-0IH6Rt`E z*e~Q-wr=ChIp@4N7b!K9@7>@Z8g7W1q0$g?TqItdno?68v%MhwMy{U_^AG(wtR*Qx zXlwYqKUl6w_soYm7pWo=A5@G$Ou5e8MrYuq6Fk46@(7U^;sv%Mft6MWS;TLEt9G<< zdcE-SGEvHhGur+aJT>*nflJQg`>zyr9&gQf2A(uSRd{2p|b4Zqp!H*zTZG zsZw$qbW*U1B|am`2pIa^;TD38qE!phHL#y1W+<}R449)9Ha zkzlZ3cuSE~cj>jWwyQEI*2GK2xQ*3gd~UrKPIoexSii zleze%JYZI>FW+ZEVudI;AV1TJo^o*LUVlneOwu-Z0>g;5EdhcUNlL=Aht~uS!gn2& z&%pK^Alwh`{xc<>~JNryldPb2!XZAZGC&YIPX zcugY&O?RlM4Gye+#sc0CV0&LU(u)PFQSd#ylof-RElF>NFF)bY4jqj^s1MuzjJIg6 zAVu{s`7Rg6dt{vi(EB`@`vf7r(dgQ)lx_DkZuke$9yYE*=FBDsp9VBjkFWzUKAjVg zr@*AV$fqgz;pv<(Fu?^snshJ@Fv7<=zxg`Ux3{Hz|Gm$ki-dopC;sfZ>~r*2P%Jah zJvot`M?d{ENIAjbu6|9>@}6DfE`{a&Jifwr=*B}|CZ0msk{*_Ud7>NNZgidBK-Hrq z2-~&F>SEJ;G(8GIZ+stfF2(L3UFv{;s~o(*dyJht4IH!0Y?5D5h|uog=uQM6e95+d z7M};d%(E>vq!vt7rZ-w^%sLRkvnOAXd>6f6?9lg;2>-~0Jrr^La89fm5C&)_{>w$oRVQwA ze#@ubhz|oTS_C+9#2#z?kka={AqVHUDYuBL-)=ypH8w5SU7F4 zie~U0B#fc*$2|-Bj7fs`;{l&a#zYg2|ALXBabZugG2(=sT}=rBxm!EXFeNtW?a4A% zO)eP^CbQvWc7W%^-ve6YpsSvioh73XmT=GR(8YpGlVT7Xu8@A=Ln5;ORPtzi61%*& zo^>)7h{~3hO7n5IleBBh>wVustMgC1{L7dbE^_;=@jH$1y|{ohqW(vH;5fd762UsHjo;QvV#jel{3 z$j&zV*sFgpqK4mLqo)$X+AmzHvG#x0FS#N6&r0w3KluN#X35{X&*h(!H0tn~59Frk zItFo@b(zgOUErCu@~>_4WlIY9iZdU4wjspCedN8nJgjEP(1`cHbq6>WyxYw~t=Z+A z|GFB5?&4U;^C}LU=YQ4l4{5PzsTIIi%(z06Z?+^0iG3waa3W>CyNbLpMRs46= zlEzQ?=)7q^sFBaE=s#cl)Fxb|$cGv{(^VY%pE@Qo(JlDr^jS@=i{Wy5HgyUOx9O2~?r~?{D(|yAsU5XyISS^LG>USKFasWlR)46j+!}U*ov;jS8%%-xt|u z#x8(1t~lh5%y~#9|Eak0jc_LR9))H@yqf(!iBbWF)iq$zQk92EB65W+m>~>#u z%02ZeZmpN51|?jqpWwZcBO?S!;bl3xt$3Iwng!VYS*jp*9|NL^S63-79`sR z8;-ac<`7G9#_3i4L_cXZigkCkLmA}L24lM)sS6&K2J zob)WSfchHYG<-RaLBU5Uqi?`NO8B_9F;CI1-l+fU{a1DI_^!26&J-DWh_$LpDB4e> zBqj;&eul4BavG-AJ^g;13pFyp$iH1U;Vs)txw(-INWFD9(|AJbQF2lTbO<*&aS}Cp zzM`hhzCco z`3Nfgzz*6o7rC$ag~Q#A?J0IcjUvUj<+kEyUl=96ascd9T;R0xJ(H9VSUqV2x9;rH z+ndF{T@q4*2}onyA4b1x?^#cSm4w)elrsZ?^1DurHS`k_)SK^Y^{_DOj+PB(9zIDv zTg`V)`5$XWP8M2*gI2{x33q*kGtZFNVd9!@HdZr!QhA&4WDW;RN`q$f9%W({wT|14 zXCh@PYAt7Drk{6Qrv}>gwmqg*ZA9&;ut(Qg2Wph*9`2-9p7TuC9y?TQ7m@>;ksCqk zLySCqJZmEVj=PT6)Le$cm7Z+b-Pz-o<8seW(Xh;w5cCOsBKZS4l>mu!e_$H-U)Qam zM?3q^6rVE>#h`cSuVa2?;W2bYN?+>$qDmLY>%EgaI);5&F$X{dC6SAS>(imZEhl?iY@q?gp}65BYBAa@}Iybuv1BeJuyq) z=1$2-TeQN(S$fZeTHH);iM+k_FMLi~kdCwGTXvw|6|3ll$mH>K}GOOwOxWGLCfu^d1#f);IaT?EF^IoLW!N2qzty8ftEtW`O3f}#F=}oD%gjrqFP%iAoTlp zO1RFZAjfOh-lWcwW{Yoq zE;a%m?%#D&9=xR>G+z-y_+LNd_~3M2K?Gyo?*EwlvbgU_AI_D(wv$ReB4s@Pux|dz zkLEk)FRpeHdB;^q056PW%lQGR8p`Tv94 zGuyH|>p$=(uiW$HTwT#0&x`gF#h2_qG=2$JuU+xmclx)L=bd3^Jz4jz`~2lh?rbaL zS3S}4t6!&;GJCu`*7!l-yVZfa|5m;b%(ScdJ5^0?;{)WUg+7;$u^Vi#U1=r{&JW9V~Yjum-;*}@y%gpUEO(4WaCzD=8?T{m}l;k zyKV)t6P^8jwaIMwSUK~{iu4m|wmY{-Z^&!U|CG1b(a$P0ZuX^MzN){jFDnjzKDWVZ z-Pidi**7gOu{~+GUC$!Hf1R4 zYw9=A>t2ze+Ci6W=Qb_``O9fWhLfZ07ZUNtHX4jz77SR$~nH zP==<}=?h)2m+rUGe{8FK?u?bi@ef}tWeScRy;Qhv_uSj5^X6!6PkR+}H9fX+)rsQm z>2}YTK4vc249;3Q>nko{uKfA)d|I^vm(usN+NCV_LiBVwhwjQLZhQW4;{%}d4CLq1K!uKs+rCPJ0mVbrs{{x{TSYt<`xTHF1df%(b$$}-gLgRJKGyx zZv5Ez#Xt8Stj&GkoRfe1vWpgohSnRWjFJqgm;CF22ckhhnK$APzNkI=Z#TC8&3=A+ z>NnL~Wbt!vziq02TZ7)pyS_Y~{rB~A+qK_%-$HID0uL#lfz23Yt9sv4=YKD&-S+uK z?SZ5gt_#rA^x$5hx8J9e?U4{9+7?WOmvMa;T@P KpUXO@geCx-a>YLY literal 23356 zcmbrk1ymegw=dWb2*E-U+zA?j(>RU0yK8WQJBb#}$5tIFYGkzoM<09*xmX-xp&DG~rc&3^Xe zk;8MXbN+b1bd@*o004*>{_ZFWn)D}+h&y#&UKtG14C|N+P0gj>*vbcYiny0 zzD^hqo*MN%Y~|>dm6tiTAf3P7@vipIXIVuJi{+OWx{et-)*URQ=`1IyxL3|f>E72N9F>Jpt(k}LH}=c{58l!_jTQcZY=&8;&h zbaS>6<5CBLWcW)Eyn|vEIeE;byZvCHDR0{M33XDL3o1#=on9c-#OZoZ#bo!Q5oZdA z@ErA+rY2|pD33(>C>YzvX&)aSx!}P{8(#j1HUrbQ}9fpPpv07ZD&QM;PiX;`F zwFM8cOIMK+s;`C;yX_}A!;jJOKvLTZV(S(%+af;0cslc3MGbczolllZO3w29^u`IA zYMR7`6|`n93_7XAMxV$H6M!m7IEIbhARw_}LZskJph66vqLZAQoQ4d)odD1o2o#Xj z0)o6zm5OxufKq(wKmi*Y7CIqeK}8-Qx>OeM5yGeAMThcAFbc?{00IJ4-!cJ#k4K;} zEf(!tJ6s+I239pr1~yT;XWFmOuo(>LXz2j7-U_GyUQ9HU7y2)8UZ7(0(xajP(3AkE zbWc&AJ>C}O1N`>@fZn!(w1l?r%E5fYd#!gQ!y6A#a;a=wX<t=IxNgb$M4NP?CV**e(7q}@hs2Lo$s+C zz&LVndU_n2-^Ig{GN!C*1VwhV_k za|44*8AXMK_zW8g@X~Wv=&U%6LEr!DWg`g>bEX_Z`CeSq(QOX#79;#1Wly1j@?1Ev zc<~!JnNsIG^Qmk><$T@uH}R)`+|NC#Z&U}ri#pTwbK=aBoKk|-)B@y~Jt>orTN-cG zU)Wx|_EgQRfNS+}S_S;{zHD&D7gD^^wJ!cjn9*jM9c^8UR5_fm22E||mcEJ!uZYFn zq5bG>WVNT~+DWH=5*xI0UA*H1@3VdW8W_>rn))0Eh^<%YwXYib zWw7^uXh&G$46LvW5{dqlHCTQwdtDskKf;OAe;Wr7#Fa3rk>H-MLpF+spGj+03A*IR zGd3gBItCP}-|zi-5Uwou$)DJ-lHxNVz8(k9M=kLS`&=4&kpf(A1wD{kWIvTw0%~N# zQ;Llk2{Jsj-dR_~6bc}RTy4zdW1p4uJ(GSlHbZVE`I}LLiz9#~rz2E_!m;aHQgJWo z%^jggkB7G>j4!dbetYN1Cg?_F(%UURj$`uru(db4mB-#pgt54+lkVp7SS-g#-3{Rz z-9oQYHSR+|cV~a^te~XhhwR(RgETm1sxKXfaitnt)q#`ga-~_ynzyY8;OH%p^J-)H{q6KY7Z1l6D0t6vdp-No zdA|ko0g=lue%cqAPx!i-$AJ3Fw10<>c5b^d>FErDP@8(!z?lw(#5nu&tj=qKqwT>u z@Lu@RX$JfL*!Ul#4cVux;f`c4^z0LYS}g%Y~;q7!%kh z{A>7}Oj*C<#g$G7-Fh6F!&n&Wdhj|rz2}47zuE>;9Fe7h9}>5@LVD_Qb$x!g>lA{m z{Y9Y}PJ7w5Oek$RbruSSj(1p-ioBb+L+HhJ*?uvrj*M-2%e@rIF;4?S#dH!=)r45r*HLZHG?wVphI zzm>snD&fAxMVlkPxL$K0bp!9JUZ>S`%(xv?+@3A;H61>kf^5t~BJva@Zoa^OQp#hw zuYP@9DUeEUf@CyNse`=i8~N!u$)Cm^d zA;pmSB!l;eP(uzqWIumiCrqH^ zE3)q-5Q0cwfqc5*b3x{E;mxx;$2))In`ecCb_(~XaZQjJLyP1@3#+J_Jg=pL4l~!KsLJ^&LPKH*c;q&v4QurOx<(4cJ0!yw$WjUy{lElo~Nk2cU8#cBPP+&25 zF1F~$(mZ9~0uu&O75KB4+3yw-cif7G2~s7JpW>M1cly67wMmZ9z2qB~IjV+?8okjC zTrht#%uy)Qs9QJ(N93(BEoKKO?_9X7zksFgR3aLD^naiLzIkQym+J=72CaF}!8l%~ zlr^2h8LN&3$qB92yP--|KS|fw1Y3@Cr@-IZ=p3~HfRGe9uDv!(b$QCN3?q@r@ud8* zi~&?NB^9^S4R$z${c9Hte{u)S-*(Al2%L95iU_2QiY|ucf7p8p5Jv{wKUd-kDg-YS zOUxzn>izW7%qD`dpwB?Elwh+hxd@Hm2*I(2QbdJUei`^rRd#1H3KAC(g1B~oD^iPS z`bY>9Uqz)Sre?G}JvUasY6Ev}#Zrv$QY<$7F*;{^o1>TSLc%x?T3oU<5IN8R{I$rV zM&<(_X&S0nPm>}g`_aGmEr*|`!<*z1lFz*8y3;g$S*GmEeAA*t1xGM{S7YHFqLk&@ z1OV*v3%anrL`X5JnGQ{P-1ZYB10#KRY2D{rDU6Yl)Yh{Ue;7C6DN6p{Z~I#qwH6w| zigj(~ggHb2z!ZoYhR^+OCPm?%DX^RWT}M*lFTsX`SuL$per8H-?)gYpr- zi!WP0U%%Kdj|XQeue$+Rk;hk-NjYSiMQ)pX%fNQg7Y_R%E9<_WoDNSHK<7cFUHEh} zLoHeLN|HWmMPTv?FcaOx&*N2NEo77Qk`vs3+J*uEfFY+rqi+e6CmZ~C6Q0h1&V{p0 zdwx!Ybv3?OLwjfysS5H~G41(8Vsh83f4)(I*vo;Maz{J6{O%2O)ccz>LmrM7o-&DQ zS&P%r{_82r>kjcZFBqMZ!A`z8Whwe%2tfjgf$%4fa|bcuCjXy@VC1fI1aF!p{VoR? z!z~$u1QKUisW^Kv;3c^c;bT4^7hhOr8FTZz&bu&*&$^RigiX2E3Z1})ULvxvNo2nE z`%|+1Oy|eg>$-LgJMd$qC(VZX*rKxSf0AW7{AC}WFg(7_Wn%z>m#T_h0mNyrLisp{ zygF$Rd|{t|gk?Ru`5Ll=@_(lv;Czgb9WWIje+LZkrTPytUf6FYA`KC1+D7@W`Sbtx ziPal`JkP{DS_tUhnffoAk0<~5kiUcS0}S}L~c6i=zFX;qT z$9W3b`LLPMc{qI23g*KDwV zf13YK9KSS!;@hdD@W?8C#r7|-8$HF>=M=2C3U+O=gGug#Utk_}f1C1>%o>eg3y*pp z`q!Atpd2PX3?->oDM_%e|BE?*Ft?YNeDw&!&j~Aejj1q#h=KJ={sVjDL`2flzy1$F zNl896$LAT5^x@%-`Ah#YK=yyo|0I^}lQ2b}G&{b~DfNz&*mX1b(Kbd>+Wfj3rb79m zJi9IOX+3xrZ{4ZO5X9E9PGPXl7Ooys7m;98<9<3(8<>adQa-I^F`&~|}eEq8M8 zwdxX2ek|=Stb*D48)n`#auMBs&Q6;j9_hMr8++B!&W(TPX>q-$yfQhZi40mY(q;=+ zG#(EJuD1+3!q=VQSKBbzz~(zvX$|jdzoyCSbmp8-nQPzz1$e>cF|p+8U|Ur#jzuiL z%O8c!PjXuJ>k!4Yj+a6SL9wlP^y7xC2@eZ4pcQ{2}R64&PKlQ%;aNNY0D*X1zx% zpJowE!wU?79mR>k%x?qMN~+uiqfN{V?*x9RFCk?Mj6k5*L7 zGv@5_hU+(v&91&B57zYrzjhNb+|ekT$hoV;oVW-;uR%(CrhFfy*~2s5!K|pl7JtLV zxn0M?XS@$$EP78)#OjqlSmzLs^hSh;8;AtAYzqDk8;XeygzJx9WJuBK3bQg zsrZ)G6wv4$5g|cqfUmoQ(vOw4>uHf@KvQu*bjnRkbKzqf#Q^oS&cu;qPzI*iV=6%6 zf1!$>)8xf#a*b)LNCI2O~eoCnbEX}h-=!{`oH>1MMveIP_qW^4wemk zBZg5FlE|lUPlb|_%;fvkTb*&zFHmd6e=J0#%i!}L!}6roua6EJVWzPn@#7QyE&dZe zN8@+D?(DX<} zAqf)>I9iIM_!NiarDrtMxlwZ=lxk-Wp&EO9!^bZxdH8g74@7#`7Sr4B(aN`#vm-Y3qknzm1>M~w@JlE)2MzAiR&c6pBy*V)z5@$ zv?O>qj>ED&O*^$z1#+_-O)MuIiuQwZ%RIQdp$ENkvRV^2iFcrPHLcHBv?q1Z62FUP zUd!vZWIy#bKXf)YapqXEeP5J|fq%P@!ZQ06ob-!ETC2V!@N@n`rA&v{uS{g5&h(&A zA|55_wu{*e-S!tn4~8br!C(|ti`>hgdCLMpv$nTT-ZZ>#ry_80Ew4j_b(jtzBU*6Y zMeZl6v|oZy6)BKMewO@ZWCG`&WfA*n|9Pm?j!smG&;nsOTLT)Miv8?*#g@e(lTc#x z4P7ZS?fh4g0tpNs{rzoyEm~Wk>!~20L1Zh%#y57z+Za}}XF%mpP|H#G+L zD#itH2l&^NN8Z+yq2~EVki6hAbzT{y1zc^=Mp7Vs-P|X05kA#FL%P6Ml;@+z7U}If z+;oxe(|`gawiiNx%CsN!c0_EH*sXxqEQjc{gN#JB zs4|G&L(IlQx(#rB`Io5EU)4T`rJ#yLFsZR8ux_3ay|78s#4oE6+hr3)%a1__DBy1Y!u6U6G+cGPw z_A;S!L@RsdUujqSsfsOHF~+f2XrX=2*e(juq@#-TnX4UBnZI(r6&=Z)VHz%XGLy!X z#9*2DW9yh+y_&)hYKN`M(0<_4ed+4mbr~B+l0h+f{QA<@BZ1@k^d=W6+_NrN!JU|L zs88~)2@MK#o;f4Q`oxrp5yj~BeEjo*jdi{&1v?#5-p@KW+}u=GnxC9f7z)bY^=zvv z_=&cruzh7ijS^9-Uc4{@8o_!0Q!xLOD{(~1L5S%FfbmUtPtjag&r3~_!g4m8 zb6~WNWA<}&6hy>IQ_28$b2Nv4n5=ikd*4d&Li}f%g=s7_4E)Aibc>I>Zt9_d4arFw z=c&`aZEc$T&vw1o@N>PDtI# z{go2V-wP^x;9VHdrOs?^OKB@_)qSUsGH(O*_trFPW0)Yxw54Jlz(y2KUK-bBvA^cT z&t1>B5&hIsF8(ApMg6Kz#*_V0o=Fzv4uljef%2;Y5v-j z1<7qJ`RLqRm0&{C(t7l34{xaO>Avyjm%41fh494Ibg<~MGWqku$4TdoPN=)3xm^6A zNEqnt_QadZS5C*29*fIBJatxT**~#X7GY(6YwBo;mNsy`7C}~vEIDUJme?8cml-SX zqUI^0Kz#2^YuS(|_qoMTsWBUFg=Cp(WM&mvIb2SK4!Lr{Vea5E;2J(z3iWtiD{5fk zxMKM$rkCiqVb-UOSFfN&XKB8zR4TDJ+Qgkf^_Fm@uRRn$i|B2rH2KaICqLeRCC2{9 z=+swEt}-HHA->w-!^livXdRjDaXd6^OaN(~pJO-5*n;x@_den=Nei5ky|x$Izf;1UyA>5zvNvIXEED z!I`~t_+e~6o4Gmq8R#>kSYdX>e3v;RQD;#iNYgFy-WlMeU<^GyJ~EfiQ7RFAf)Lp< z2)TVRR(2XS%H(G2`D(c*Uv&bM1`Yq*IL3)Ns}-KYdTP6E*2DB^sZGjV#V|AKk1z}J z>2v|Gp+6bd`^21#LRW=n;Se@$i53cOhy5mZhI}b5OWb`@$ikVpavLaN7G|W1AcUIv zxFX!p=4)~?hfiTbAIm57S-_zuf{%)tM~%Pa!6Evo!h$s4v!p^u&N(I|YTEC(%(g&_DrSxKHp@1yK2<|}Ma07fKK>RR0hX4k6fHNli2W6mkA0G# z4z3+7t9xAXHOiO-)CZAdzV57hgThkZbXrX-QS_0H`4Ob znHmZae)z9Fe;sVQbe-DS-RKPn#jSm@-h1}Vr0IZ6`0ge?Z2Dx(!g-1I-t^jrj@4`HN2Bzw35uWb!2CC90^yJN5;bmOO1uVFww;tbrZ7mUT=Aw*x}Ykcn4tEiY=&OEPeq4D8dns%bnR6AqaaaK=#h?)BkO8^k2>Y zg~0f`+VJ1#U(#h@fF0Gpr|iFd`F~CQU0MAv;xtE2d@2yK?VmHX;(iK%-F$JPKTe;{ zDb;4EP;0NWt?Q)RQ8)wexCA5FdtR$Gm)IgNJ@8>sCB8Vykfx8N!N4{?MyZ?x|#=#Cjd|ZT>R@J`!S~<@=?~tJ_BIxih(3}&ZvHZMh zwn^>@SqT5M9maRM5*3mNbb?h$hhwAPDzA| zBSL@76i#u4PRMYjmPZv8p)5N7^6kID8!g4^p#NK3;UERd3A6O$|?;-*s|R(sQtylf`gF9_ada4vAj#FAM% z8JRw!r{CRZOpK0mr;U`Bo`W#*Cu$%=T=o4EF?09H0dtc)1^>t(zavf;bHoFj8D2Gu zyqx?^%KI;VJGhz$kEYiUX@~x0LHtFtpeV1}U(>tFexMR_K>}>aS5>XGZP>OWq)LAX zYNMmG7ncwQYarl?n0Oo4(-y!4O8u24aF3SuJvJj#5OljxAg`AV3XtR?)TD1bw21Y;ie-26X$hG<3=!!3rFW;VP=}z zOki0&A+F;)l@0vHv9aNPQ%?-DY=Yw3if6$;NvK(Z)Zrx^n7BQr2;eDt)?0Xaf4Mvf zz1b7dw}w04eSP3rS`(a5MIy4&A3P>-LJW9jKl8Kxb@M&U-yga0T{v~$-W1i-X7+v) zs@4i^KjK8D>T24#MLa5IPKgDVD{72; z!#5amMr%~WFk!N-<(tMH;QhK!PLr`MqG$59l?cbvcjIf%-yuUFK`{J#oeCeR{`;_Z z+Z{97JX}fu4U<&@T`4D(MYn-7G@9rY{XDN>F&0JiXZ>R1jc>u`#4<_M4a%0*n{MwPc8gq2 zXgjXKbLdKbmzkyZ+1Yw9h;KtW4u{VGs1AI$=j1ul2H%pyLy#wD@XFTp7U5{r~31)U4L zeS-1@O(HuR9OTss9GU`2hUVDXAP|S8;KRa=_N`B&cXVJR(U4#1DMBQMgJH4gH@$u0 z1$A4~S750nU<^P%YB|2=!JR@cAA3|%mna|0QDEi(-zYI)PADN}k@}Gi0f$Q~eEFBs zFW}as#cC0u6Ps60@Q-VU>5zw_36o;v(BoAcjAq9=@C!gVrSTrhc^LIfda6}1&B`VB zov7RIUpEtu-p|L2CeD7GY`PSw=}rEGewxT!$S(VK^Z3aIzY8(UA@M@FX4r*WsEe8; zOKByr=JjV=T1?pZW#DRe6ax((g{dK><(|^#havau(yB{;yrBE(sQakA=9q*a#o0k@ zv&Y%}Iz33Y7Yc=~x*>lt7Oi5>A`9K>;EelJXUYfl;56yibN~_o)ljrF6zS)=yKG$= zE^T_R1Ow1$ka=Hr5m{O7VE^wBdadt^5g3FmH}?>6i|t@PS_Rtb*QL)w=q&-Ur!KV2 zX6et8QVJ%4Ko8`-Br-qzT*RJ=G*w!brsCAgjbdoO#zZ(qjxBd11y8e`3 zEnOFLuuYV>(n;&8!Fm5g@UP==zHI)~19*JP+3a?A%zAD zV0SpB^cAc%I)kC_&9yEK#Klz}RK}6E||HmXU&o`)|rd6@U91J9G(n zjj%hLdfoW9mo_8~FWKbc&)PGIkonE>031C>Q(AKOGikA z1AgX(S^DBZ!>w;X#&*jwU!dlxQ4e=UFh|srM3*H03&Ol~_uR^=Q%LH}!B!#k`@O>6 zq6w*SPr~tJ4%t~#US$uS<&^|;V$c5WjtX;`y(br5LG5{hfLCkU_*q}VIYbs0edE*N zjLi3O3%8Qcv$;6QJCrYRb2(+2XxO3k1jQmXzQ1YV2e8yG0=yDpj=mY%5vog?42rON zi-vFunyC{+-HCOs0)nAa#Vf8P={W6^6{0Ka+D0@5im2QUmAL8ysWkMrd?$cX{^$4n7+i7$YYf=QQf}Hz9HZKCG-zlURPtnpXI(K80TD_jy$JO2LB5f*j{hUJj=Zd-Y^eUZjRX7e{ZkH_OJaqPEH zc4j)}D6YodsbMF;crypOSkS;^4}KaNq^H9JQZ+(a;St3Xw2Vd3x_omsQLa+00NctT zZEoBA%T{`0tNF}?69bU1$Rt{AroGvxUY-kI^cq&O)=OOktEku{udU%AT{Q$-*PMCp zU%GYSVep^Gp)FesV|5GWe5Sig``&v`NMtz!VzwGy1d%q3klpXwqfZr?sWnwB*7LYD z;`Pu#`q9NXco-Fs3Bov6{_nzBl0!6+s?QQ7-0Xs3aNW@fu&?J0z7Tp?|u&Bh0(*zB{~S+&oERs>XIka=<}s{c1~8B8m#shNxjl0#iekOS;Wukp#=Pn!!e1QXHH-6)ztE6o}s) z72f@4JXzpdbL&`De<3#gI!i2JiVivu&3x z`pW{)UxnJ-4;g`|sJcWs5F3gnKc>c5rh*$5xcqXo@I0`E4-|5F8^$Tf=z2DMbE*n!HPP`l*X^b8Sxo_vSVtU@>5;A7F<2iTu z;UaF=RFvaOOOB{>L7&n=NW$NJR2k z;mgc`ZK(?Fs&~|nBa$Zytwx)(MItR3WuG#nO3d>cAOrZanGx)n0_J`y;_PZDsHM<9 z_8cjIF$mqSTz@-K=Uhm3d@YBQRFm+-UCb(OIG^y@JAY1dDxMO_5-^5dV_kh8HDOub zDdKkUCqj)1Q33Pj4Om!x#b<@6&qBQ|m&i!{qmJMPa=huZwam|LsLzf9iy(_bA0It) zg^5timNdO|zuDNQWJOu{VLreSc=@&AC>97Aj*x;zqkjxAzT4QQ_lq-31_=#=27bI5{=6CKir4@e zbDi0Fd7Uq61c+~a*8XRB-VaXF1#m30w#ojGe~uxV^6e{*6}jWp3HDENypAQ*zVri@ z>K~X|pFrcvaEk5Cwbyb*;~-Fr2=#(rKap&ElvxOMaZyENESwKXwf`Y76@-u6iZ7W5 zLHmKCvQZ)_5by^!Vjb09)Fv3jTBNj2wI4#ably?M^6qganO3sE?OgVK85ur)nnax+ zSr6Ob#4`&d`2-Ei*sr#Z0?W0!F$C;#)};_A${XPJXAKJ{5g{*J;ZCRv`~bb+T&1nr z3IpsyBIxGUwBX}lO=I5neug}#a791GcVW$;XcDFX9$NtGeEKOgE=4pncJp^W>TK&x z`kif?jCg-0J8+$Ae)eKrU}}W9@yFX!a6Uv(@h6o=?=YyV@@-w=r}hQ*cTZBE1Vy&& zPBQs{GZI|$ZDIO`uznEQ^_{t=Qg5aye~A3j=`T?>OMU_JL(t@*A{mX1>D-qO3ju^z zB9^3$(u(^ZZi&h>X7MQ5kx7^ykzmuuX;MDtSKmcpU_Qnf8FVD_T?DCB393kjdr!Qi zEns5@e06g{<3V_=Tq94FXPF-_kw~7aJE7h7bLQX|woQIs*iV5@R~b@mI;vScbJFPCA{EoZ1x?FX9PsvWani@BLJ04kP)T9Zwp?bc{txM4HD zJY62ki>)3Jf=WG)-8}e7C?KRS3Zt`$45HY`6aED5eNO35;zVOaDBL``K5K2N5WVSN z`N4`h4}1Z`Usr9pZ`OqmgNiA4oxZ5zan)Dpm@XG$>ZBxR+D`s+9iE?}x@O7E8bxUn zIoO~X^B~$ymY+sv5m(UM90#KMXGn*e$EaPm+%|@vCyj$xFL9B#hLHvJM4B@Vfp%z- z{E&}ed<^;0*P%kUm*BPA1)pl6gC50?0#Ba3qbi=5oRoi3DOTIXm?DRf#eXN}?{o4> zh5*Agz*}EmT}awSfej6vF+76l<#DJqRg=dH`6wL@lP^jyOlTJ_)O}xod<{-!O5zsH zCqpGkXnj}SA?ijhErXHp?rpBU$cc@c_NHQ_H#}$k_-?4R--sWh|5GnjiHYE^{jo1+ zuqv?k^Dl_>lyK9_@v|9KM*NGN>Q0S<0FQ;vIFa01@=d>Orsr0ui}fFSl$JyVrV|Ob z(zjaIhz{qQ5Q0u7jgQ~bO)~Bsc?QzZz%j5dDtye|9Hmzf!f z_wnGm;fZqe_xX(ASp%sIJ)w*`h8Rbf!<-orA}8EvV-*NgVSjXATVS=W$6bd&QO6+&_-9(?ilwMey}km`Gv=wpgw2G((^wi zF+W=s7Ce?N*Glyn`xO;hb=88EWrmcQ_MELdM7)}Z~mN7lM>!pqZnBT0=-4A(XH zX0TcQo>j#I(bL{+;?{{ogNd2M32N!Y;@jwr_i+BYVedIfUNz-RlWS3Hlka5*LlWM; zvkBW%ye{?3!GLmbzu;(4!cqhz^7)pVKODP990puSfgsQ=3^q+^OK*BRBTYj@;9M%j zhs?*~F?kjqdD1;Z;-46;y=E2k#iC>1oBr9?VRMHaFfnHMxX48cgN?Od4&c8b*w^|z?EyV5lbM4l51%1db~p5 z|EG829~?L5$Q9`q=&rZC2Fj=mFO;R`x6IQ+nrX_PB}+=gpj2egq9oH2g_~+;bonRc zryI|O`KiCedrSLtASYV(HQ`fqma|u^^a8;Vu)bo2)ndn4XZt^Qxm4q;S$PGC=>OfB zDFZA(NM7`-=l{Ly-*Ch^NXArG5-inhqB5}o;&|A$PG!9lky$SRyBee644p-EheGDa`1?A1>R z55I3s%U!;2=MZsUwCsVBYNUm=at1JKk55MvVIb_#<->?WJBMY~jf~GsG zO9$g_{uJ^U&xrlm)-MraOujC$Gm=46ZCapF?RCx!O^=cHRPJ};H4qB_X&)JFKaR4- zZJlqr9OPE(A`cKM)4uLtkmb(8aT?`fPv=nY=A+@%n*Os6Y;{M+ZZ5fU+BC)PW;djr zmW07Lm-B#YZGKGjwcX^r9?vH@>}rBPww#%iQ`4j_`&p<4&l_^UQ#u0AmzwN_7G#u+ z`MtR4hhoOopUgzsF9byF^|f6B7q}%;1Kqyk04q1pTYZqXiC~XG<4oluFT~~jg4aBk zfp@JgrHjuKFp=-)xwuSuSKW%syBYe^-yXxuIoIAYw|uwTF^=8wv$8ff@8Lh0lOGPU zAJnw;2)>yqVJEz5bguv6?97!AKa%k++BxA{2F!`9Y~1F_EN;t2BMGDWB{oV9dS+Jm zH3RcAF_WEL~=Xfv032f0Xi;30ng2bE-LHF*#J_4b{7 z|Ks)@+I0u!8#W=Gv={BR)+^#dDzYQHP1JLi=>r(cW*R=uErlBd=KZ|yr<-#~ z(Vq-eA+AMzCp?GgzLp;{ZrK=MQ;S1z#{o5>N~;x0!+n^NIF4WmQ;G)noRx|&BiO3A zEKFgIWkaAf9@b)e;C6RE8!p1$&9UnZhY7;X#n$674>c~LQ2#x`8fr_ek^vA>165<; zv*fqiA5*&e^NVAlWz=Hfx?3co?qat2g^t-8_C7DxH|%Eb-tt%CIUGwpz16rMm*l+0 zOeFU#{zKV>%X9HXl!($8f+y+x`M4T0VZ zP$TTon0>>U`PHAl^TAT{WaRHsK}1~|2&8zfR}eT))9>wiAV{An-L8$3%=^=9zp{Jd z$+goeMJsw^jw>Twa$jT0qUhi;EQMPw-v8|BjOLKV5N&(+ruDtXw_&# zVDqP~94POQcd+RsR8g)jJlJmwxGSBSqzn#0##e@HIi%r)e@YtV93~>^0ukw z0!C&OV6DKF%}~WBkFYCXQTKqUr#E>5RS76R4<$U~84t6@8B&~Wy%ogpT3Sz1`MvyO zinqifI6ZIt4LQYIAEL&o@$x9qIL{BU-$P#S-rj8rBu>V^5T;OEh*ZAk{SwCD=v}=5 zt#f6imdbi*?~F@>V)5a}*GQ#bwHC)g16m?&j_{f}G&CL-UKQj{R+}<27V=2ATv??8 zm~pteQQj(L4QJw~-YQoXUb2CL$QT@+vxhp#I+77&&VHOatBm;Iql()la?}aeW~t!z zwJ%yoR4*IdCSsg0rxW7Y=Vl?bL4F)f)(*ot6PN_MA-cA4(LjQVg4APdS@B?lqf*BN zE2%D#D%EG@_E$=EhHFz>Aq&E(--TZ2IxwDtRm0AiUAkO1Y@rMB z8@!lSUv4chNCIE0Y-2tB{`s85>Kwi(C{8J_LPc=4t~(6ezwUk)?0efUI!&D+#JX|= zv2BYYt}?N}qb3a{IqLcZE(jn7#!Y~hCcugy{@Rl0RZh}Q;^;9tZ@;iO^rtqZalOa;ma~%D-G{!X zQ1Vk;pWiRHuq>&9j9dEU^r%@AJ-tdANow+4(ZWD`<-Rq8_@XYu=(luz{eC)Ol$h3H zMyw5CHH?}0Fvzxq=7R(;k%VPQvO`S}r;%df(4rlc#k9;}%XNSM31X`wDb^>Cc704~ zPV?3>d>Eh*+f%Xw%*E1t*Pl=a zZ9`=)1Vg<<*>dj5LnSQQ>>?n=OV(y#gP};~ohcW$Tvr*76_o@kwWiq=hBZmCXY9pI zT9n*Kt@SKoVQTeB4DdK!h(Q?VC@2$AsgS;gruU751b4y9JEN!k27R1VD4E>qGkUDi z%xH|@F&|6}yKgi#bSeaVt0!>+j!;kT13B=g5nKz-(W8m)9}|>|(xPQUBwfgKkEsa5 zDa~QzSkDU8o`$CuNmijRc%;p>{@8tyzj9KxPxS2{H}5qugVAK6v=-wyyiqd*psoPYPEkVY=Z7G^1{uttOuQZm*Im8Ox`r&eZ(_1K(*>f{05^+o4DiyDbIAx(qNXQ57@q< z7|k!^&|m596IC_!C#a~=OrAk436wc)$fb$78(#|G_!hqu3_;OWQC`v84eiGIAs9YK z96pafXUi4!p%|&U6Km9glW%h#v)^DH{IV5?s(+;LeE=nw+Im`k$%E3wb@zZ*i5rDi z%IJF>=snp-*o3!_o7Y#X#hNyTW|ftum$5Y~Hqj+}Xbw*Z8HT{~OBpGp5ok&*^b%(D zjIpn$X0q?Ul+%|kKnaFI>0hETv!Ss9gJpUqeGu)J`SA8Ud!{Uc0P|drNs%4F9luGD z0&qSuchylKc$u-A3QGv%txz-%sGhrebvo~y&Y$c3p+eBkua&K>(-p3BjudxA3bODt z#cEw^jzT+pcgn^caOmc$UnKj_iiuRP&Xd{ocibh8Yd#yD%&WGNi_8nR+1$|8lXiLq zF78R>Uit!|rFH)(_|~!8prFBbnQ#+}nc-N{Vc}J&C<7_^&)kp-tnXu^kh?vb6}W!a z^)s&$X`UrHld?v{PX33Z=Sca-bz0|MeTdF1d0)^wswCoI_=VTR_>&>cz^&DxI0Jvj-~MDdufSe}hBO)e@9X}51t5s|-!#~E{f^;?0;+Rn8ykNMlP;s-`3$?<5D z-tLc2?@p_Gy?_D}gmS5PCJfZ}9Lr2usQ#})t}_}AZfh%1;}xQeI+5tT6AYq-=-m*# z_cBThQASThZ!>xqT_U1KCm4eeH3oxGqED0%@wxX~_upOXK7YEB`G=GIeJx4|+-qF<)^JJA#=k1Zk|0`byYN(IKD+8%ypF zn!@aqH?K2Xn$r8khcAbZc1r8EPv-Xh#E+i%5W_2^3BTx6Q*Vkfui<2ywG0qQ|5X96 z5+lCkNhEUc;U&&IBbgxnqq~H<0oE;I@X-Cw>Ft!vd`vocv-7rAzF4cr0=DGL9=W0K z8mJaLUI?j6v#fjbB=x+4W)@S|VP_d?E2@|HmVwYD7&TmRO()Q;pjuM)reimA80+!+ zty9#3zwa)>u~D5Y5G!hj!i612Y714_rf%6%drASB2lt8bss;TG+32tp}_MP!VJea2%>JdrA)B?C< zEeQ{1wUPU8lL3@(VV5zD0RjydKqO&`D|}D%$oRGDkJ9|Kc$es}g~#kVuG0durBu$d zsgAP|7RfI@DoD7wFe3@6O0u7IvqLzTt_BWu9;lafO3O15;NF$73tOK(#c ziN<#|W-MSfzs2sFdlUF?qVJ4i z_5n^J-Z?%2Di3zZeBcOVqotQg&WmUM>giMnZPv!xO?$e!y7KukMKFJgRAE#uQVd>l z5lJCxVAC0IQ1+B(dY#0E`k9CaSVlJ{y=Y`5m(0_)2UKLdRm&u9yu5LfL2SPt^Y_M5 z=TkWpe`Iu@`}Xr2D!Sra(A(yWd(=8f?*ohrD!Y=HI8+vsQ$VsP6UHANkR{$Ojnl4X z`aICuO1Y;@%t(94HxJ~dIZ=SrKdk72yR_M;1HTnmg zIv4U*T${2Eue^*3OtOUjqDhy(3AS1VP){c3{-;=;_ZHR7Wby)WQCf@cG>#P`Jqk7%|@#0Ob)Zu|zt+ z$;<|Vch0?Jv;0UxFa?ofdTH~;a_3AHSslW#g7aEQ7OfhRN8R-C%4PifPlV%!Xbl-> z-XZ;sw`2ggI;kXBM>wL28XiMe7jN3JOa*xFoHV@HxcHUXlnu_A-iOg1$Z!NoESCywrOq^I9N!?Nxot9!%X91Q*sH`@K9lI zyrZz{+eqzr9<+=3(1!hZol7x&yr6Ps9u6b7wZ`mo`e4)S$G9uA{QS)4jQsk&d|v+z zwun+3=n^c*&=>vb2vo3WUd)3ouTxcA;F3j!ukvr#SDaFwE6Hr^0K^;J>4(H9`OELy z0s%ESP6qS8yfA=l8QHfJpucr5(=H{FpN<#3nUMU`e(|yy2Uil}!R^_n>x}k+?tMYB zdZ4d9NaHA+o^8T-yO#R;x~^TE)RK`N8sa{9Rb#_?j(@86+r&~FO=I2H5XiD?BSd_< zMIv&hCImGEs?~8QZg`1B_~pGGWcx#>-pnO;`aFSL(2i{~VL2e9?g1`19LfK?c|h$d zw1|E#E`z^SHG5Z%1J@L5i&%w@c!^!5xhu|I(r%E`L0h!jG~0e5ILcy4pKpzH8TRak zI<-FEf7SG(luZhi4PLP94rl0Q27%zPo_6{?j{-ms^{GB`ekMe>;E{g;V9htHT3j|rq$?~$=&zMEORr;t^ zyLabrz4PJWKcCUP+Q9~ngZv{3pFj2<)R?=ZCCX)nnrks!PRS*Vy-^o1mIUz1*6Ty} zQa_)6ks+k(@8Ul@5cR=&Z8E)-MaQ@?JL`!_%qU<_mlNvRh#(>lI0}wC!}4Z}qM?=; z<{5hOY|0YLU+t$!lc`XwLA*5XbDVT1VuXW`?JCXM@v7*r%?PL=z5~wfP;LD#l=4l@ zQfPnIm>WYLi{EPk!gr>2m*VkjJvVAjK(jq2PVeSlAF%t#4OTll3m2zaRi_7&n;+-eT_>R#kpnUxYhJX+ zXlT`|Va-iiXZPCES?Px~FME{oX1yq8&&EKMFT)-rYBwBJ9Aq%#4_ASog-*agN#(zI zPD;;!^!|n1_e6BIozdB!mjYVv5!bq^DBm$gtg4S5hVSLjV%>7}_glW1 z^u~Hy%+nD-DfY_YoIkF#({~A6ys@BSOog4C5tjN*N zI9;FB%I9|WMD>6+<=kebz9E%ZX5ATLk0Hk-|JUbTh}IlQer@b%wZosB{bOffw951X zYdW_^`_2ZdfguVM(w_k(1wUQ42WsWZGXO_|1c~E{!aAH@fA~2snu2i##tlg0gYbh% zY%UlcC1J!Ip4!Bu!?s4|$`UFU35XC_vgKDF zMQk2tuYigy;DdP=cQ*Pahrx?1<<3>>ryS9SnC|Sa6~F$10<|%@;6$Xq>Cl-Wd!~cO zgvUzR-*ZkwzumFEY~VeQCBnckvB}DXv8mp`eIYs{UT8J5PfASE&?Rjc-R4-oVA`A0 z^j1R;ze<xW)pZ>u^E<{_2K03j_iVaxWAPhOp_^vNvW|!4dh{xH8ok>YkKGQx zM`D0Y&k7CMjH%p<%i5<6Q#@p)`0em->CLA$1D?dh8)L$Mn&v$G!Uj8}GFx1V`{A!7 z7vK}9#HuZkAddVLmbDzOrUDvv9Z4^JglCIae=f}|NGLx0rdU5Gd z>sfxY5>>x4fk2)N66 zb?$zbfhpXauzwA&5WiMlZe-^^v_lv&b$Hmx#6s0H@16VNHa*~`K`?;+l#!yt!tSX( z^LT5686YlA)-ZT|hwe#l$MCDFe#mWPNpm&4s(V&>y#`R~Wi0-l_Na~bpY|*35K^v` z<9SjUfWyJq)E9IbsG*v?aUY7-bJrkTC-(ULeZk{c;ADLqN?@e_9+1) zJpsi z`NR7t)IR4RP}z=27TOYQ_k@qF3*K4_Ty3Z?B!DMyjvroeq#Y8 zwYPh`Ll>1~TauNP`-F|&zOgqF=-ZQqx*Jf?f?eZ!TYa_8u zBRJYuN0hH7R{B#Gt^PlKW6L~2@C@+c>3>P){AVeme*V@-UXdQpYVPM&LVlS68nQ9p z&T^*uAX4b(c7p5j+_3jX{&?zjxDcLf-Kvxzpp4g$sf&If>#nGks{~qKblve8%A57C zX-9;Y`1b7KVcgPrg{#>C4i6rKZF$+wl1tLNxtC&?v&{P-#Zc8GtHm-|et@7iMoPHi zeN84rJT#6dl58sFhxNGS?L95sXsnuMSr&s4u2Og8b^$saLEPKJ%c{lO*qLZn{#aaENx_Kx|N|8f_CnR_hGM`XfkImf7l{S;O?M&fT$0jk7KG*%p9HM`w#&gj{nxze`> z8mjvt){T7XbB%ypY>Zj=pE>^DS7` z+rPbU2&X2nRtdvpSAL!_`J$W#GsT70h#V|TgmP_lJX8X@3J4+na(=+SV*SUff)%E~gRMw@1sBcN9BLzN1!tMBV;N?sbh!zSB#Ntg*1Am)SqB^RzrFLC~9*mgt< zOx`48`JMWM6KeU$$joBvL~N@EI@x@zgsy^8nsh9@`?*N}@o?kQqCZ2xJOwTj+*g3* z_!3Hu9nzKWRFn|D1`#zuQVazM7P8G)feRY@e`sz@)w}fujN6M74ZB{|Rc<(^4j_o$Pj_p&y^qMYegS z+&{T4&2^ho+@<*|fG72p+6jn>pvsMB{q6@!62>*1EmgZD-$D1zHpX)Ot6@)Se0{Ik-c2DuT&lEm|Iu zKZgAy7ZK~@TwlFdP6dw1x`6%3U7WBcR_JP7wcEOnw?>h*|Gn^6HKd$#+b*gC4Hbm| zm8fDO3Pyn0e9{?%6P@bUyW_VyR3VE_ZyrY$Tv|eQ5JW?^E5FUHJunndckuXjq8P#-Xzy3)br6mcm7U^tm#%*OULuLCg zkiz`pEETGI>#N=5S$5gg6t5n`2OnTPIP>;9`|t~LXqEH(_!;u=1C3D3Br#>)vVJk4Yh8y(E2w65w=JrBN|)2n z^Z2bTvlI$1MV$&gXgvy=OqjfC1vMIM=aqA7Vhm-8uTW_yYd@`X)DcNK+J>zu@5?o^ zHlpZ~aSV9dRqm+k)^42w+Y&UF64l`C%I4fHx}$ilKODS=;yv=Xvp}z{+lN->(spw_cx*k9Sk~ zdo)-2C@?bboCIs>HXuRrfCIer962)7n1M}&tnvx|>lP7m!gpkr_>gVQ*yNsqcsW{c z=dE07q*`>@-Nrc;mrpKN7E&)oM>Ly!E$!6&yHUjPhU|Z_U`-aWfzHhU9D%)N(fe zSODsADHi>DBJ>`*0`Cv?qnsS^$>+hVt&;RXmz|7Qx7Gl(UFN>E7Y7QkYrc7C5W-%XBoL{(=Z|f`Wv+9hJS2x*DFl^%=PGJ=UFBzH6{|K_>m@eI*oQDw_~B+G?CxiS{HM3bOwL; z=M9$=Ht{*om8w=b(lo!4oVW`=PMJUVP6z-R&-%p$@B}*h*2;sNK0tL$qhSL?y<*H1 plY5oX|D|T;KY`Q#9FHfj2pvUkmNFb3sr*a$g_^EvgR*VZ{{a(h^I!k~ diff --git a/docs/system-admin-guide/users-permissions/users/openproject_systemguide_filters_button.png b/docs/system-admin-guide/users-permissions/users/openproject_systemguide_filters_button.png new file mode 100644 index 0000000000000000000000000000000000000000..67ea6986047525cad22eaba5e3cc284db3b068c3 GIT binary patch literal 11389 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� zp)-$^OL)1Pu;7neFBu;4N$7~)Lnu>2F(>0^1{n6W<`EmE=9&3T=>E7T>Q!Tn>bst& zRa5@rmvG+~W)m$oZy-qW_1RHTQB20K>Uk?ry>xjGxp&E^2mywNiO(*FoI`!P8!rk=I1FqTPB=Ni{}s83BmFoWdqk^ z`1{|_Z8;D!^4m&Q6$%I<>}v&bz~CCb*lW_DVW4tDx9=JZvx9woL!KAQ2Qu@5?f%N; zm!ursL=rwAKxe`f z5LNsw_;xyLsqJ~`K|{w>hW(pmAgPI;LszM8#5Z%oQzB~2$n*e0q$pLPl9`olkuaqE zG2mp(2ZA3tJ$Oiqa@U|BLwqhKFthj|&r8{zXN|`LQL)P`@i3~tMg14S@tnQ-v=|+Z z#z(E*t%NhlFyEQGxEMdZ$_8xTi^GPi1>LlAK=T{%z;?{(3?}kL*Q!j7$2Q|K?vWp% z^;W_GAra6(@EXppmO3+E7&&u}8^MTnZyzY;-0E_;1jwa-Jh;7EDXuf`Mjc~1uiV$O zegz?~H~#W`R~LM+Xqa=mM?zLhQ{oT3bC^ZE5(ZN;6zaXW3D`OH;L;_%VESmq3W;q7 z4=}_hptN(2>WB7u!N0yWD8ORXU_(_~`1U-h7TIz~zG!Q!_l& zaw$(60Qvx2WJqi%*2TuQlpSP+EtOf~w}FoD`a|c>ML1=zEtEgV2l|wRFV@7LLl&#h z7}OBZHNRdWI0H%?5L;+lU(wNL0XR%ND=OA3aO}jW1=OhCm`4(wZ*)G4;&K61!$!K_ z*f!ljf@Ru26~nQSUv#bq5HwJ2L3heEWb-)wM|q}(6=4uo zLCp|f$SUeyo@gQFzdX|STh?W@LwCVR?OgmWX1Xp=uKl9poHUloIr7S9cdjQt8w`qH zSMN4*1IFP-8A!mrO-;dKAh{UE^9_3bEuCm5xbW7FJ# z2>@&&Vd@W0B?ddP;$n;V1PTrJ`c9qi3&E1>)`!k2n!nLHgW38pt~K~_cyPb_KXs(I zvZp_2%tOBd9Ihv-xZOKRO?UEn1*c=`M#_106{)F5b&V<>J;y`)NASJfz2m*~*7NyB z-}SuYii$6$>WyIKSa(k|mDqL35YPyFHsKGrou#FS5n39`y4VGQOIgB`({x=9)$`E5 z$l*!RNtJ!u2dzK^Kp_9c5xvr3qS<7GuFcN0Y-+l7F9pzAwDTx&gfp>d&S%ZQL1wrL zLXkTae^Bdm*fsiiDlKXEm@7f^-lwlOVK5S;3H7&r-uXryfEk~?Tk}BSp_WUg;Q1SP z>@90E!zUFE?{XTy1rIKrr_PWlW-YR^k-V+9r5CinAC)CUNyxoYclds#@|t|&grEUn zC!675=08l1StpD{g9vJWZPtme)k`lt0r>afoopp@xPGB>to&KM*!zc4cAV`OJh%i( z(*I64F^QfYe7v3WOfMj^XJ&oV2D)2x=Nj+!F^g^4kr#!aoY`vdQ($}DR#Z3ndnW3; zT9#mXsZHb3TY{4w+Q52kyD-z(j$FnI-E_bGK2i4yJF*m&RW>&5se Date: Thu, 21 May 2026 15:47:22 +0200 Subject: [PATCH 049/107] Allow serialization of safebuffer without encoding issues When caching a SafeBuffer, it is being returned as a binary string and using concat or similar on something that is cached like that will result in a => # error. we introduce a patch to ensure SafeBuffers are returned as utf-8 instead --- .../patches/message_pack_safe_buffer.rb | 62 ++++++++++++++++ .../message_pack_safe_buffer_fix_spec.rb | 70 +++++++++++++++++++ 2 files changed, 132 insertions(+) create mode 100644 lib/open_project/patches/message_pack_safe_buffer.rb create mode 100644 spec/lib/open_project/patches/message_pack_safe_buffer_fix_spec.rb diff --git a/lib/open_project/patches/message_pack_safe_buffer.rb b/lib/open_project/patches/message_pack_safe_buffer.rb new file mode 100644 index 00000000000..a5fc942b5fd --- /dev/null +++ b/lib/open_project/patches/message_pack_safe_buffer.rb @@ -0,0 +1,62 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +module OpenProject + module Patches + # Rails registers ActiveSupport::SafeBuffer as MessagePack ext type 18 with + # unpacker: :new. ActionView::OutputBuffer (a SafeBuffer subclass) uses "".b + # internally, so the ext payload bytes are BINARY. The default unpacker calls + # SafeBuffer.new(binary_bytes) which reconstructs with ASCII-8BIT encoding, + # causing Encoding::CompatibilityError when the cached HTML is later + # concatenated into a UTF-8 output buffer (e.g. via ActionView concat). + # + # We prepend to MessagePack::Factory so that when Extensions.install registers + # type 18, our override replaces the unpacker with one that force_encodes to + # UTF-8 before constructing the SafeBuffer. + module MessagePackSafeBufferFix + def register_type(type_id, klass = nil, **options, &) + if klass == ActiveSupport::SafeBuffer && options[:unpacker] == :new + options[:unpacker] = ->(bytes) { + retagged = bytes.force_encoding(Encoding::UTF_8) + raise EncodingError, "Cached SafeBuffer payload is not valid UTF-8" unless retagged.valid_encoding? + + ActiveSupport::SafeBuffer.new(retagged) + } + end + + super + end + end + end +end + +OpenProject::Patches.patch_gem_version "activesupport", "8.1.3" do + MessagePack::Factory.prepend OpenProject::Patches::MessagePackSafeBufferFix +end diff --git a/spec/lib/open_project/patches/message_pack_safe_buffer_fix_spec.rb b/spec/lib/open_project/patches/message_pack_safe_buffer_fix_spec.rb new file mode 100644 index 00000000000..91ee3e03810 --- /dev/null +++ b/spec/lib/open_project/patches/message_pack_safe_buffer_fix_spec.rb @@ -0,0 +1,70 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +require "spec_helper" + +# Rails registers ActiveSupport::SafeBuffer as MessagePack ext type 18 with +# unpacker: :new. MessagePack ext payloads are raw bytes (BINARY), so the default +# unpacker reconstructs SafeBuffer with ASCII-8BIT encoding, even when the +# original was UTF-8. This patch overrides the unpacker to force UTF-8. +RSpec.describe OpenProject::Patches::MessagePackSafeBufferFix do + # Use the same serializer the cache store uses to cover the real path. + let(:serializer) { ActiveSupport::MessagePack::CacheSerializer } + let(:html) { "

Héllo & wörld — «quoted»

" } + + def round_trip(value) + serializer.load(serializer.dump(value)) + end + + shared_examples "a correctly round-tripped SafeBuffer", :aggregate_failures do + it "returns a utf-8 SafeBuffer, preserving the original content and html safety" do + expect(round_trip(subject)).to be_a(ActiveSupport::SafeBuffer) + expect(round_trip(subject).to_s).to eq(subject.to_s.dup.force_encoding(Encoding::UTF_8)) + expect(round_trip(subject).encoding).to eq(Encoding::UTF_8) + expect(round_trip(subject)).to be_html_safe + end + end + + context "with a UTF-8 SafeBuffer (normal render output)" do + subject { ActiveSupport::SafeBuffer.new(html) } + + include_examples "a correctly round-tripped SafeBuffer" + end + + context "with a BINARY-encoded SafeBuffer (e.g. content assembled from binary bytes)" do + subject { ActiveSupport::SafeBuffer.new(html.b) } + + it "has BINARY encoding before round-trip (confirms precondition)" do + expect(subject.encoding).to eq(Encoding::BINARY) + end + + include_examples "a correctly round-tripped SafeBuffer" + end +end From 5caeb4214e62bf7d5e4f8f37d0d7dce9dfbc4677 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20G=C3=BCnther?= Date: Fri, 22 May 2026 09:26:05 +0200 Subject: [PATCH 050/107] Use upstream patch from rails --- .../patches/message_pack_safe_buffer.rb | 30 +++++++-------- .../message_pack_safe_buffer_fix_spec.rb | 38 ++++++++++--------- 2 files changed, 34 insertions(+), 34 deletions(-) diff --git a/lib/open_project/patches/message_pack_safe_buffer.rb b/lib/open_project/patches/message_pack_safe_buffer.rb index a5fc942b5fd..2656da497d0 100644 --- a/lib/open_project/patches/message_pack_safe_buffer.rb +++ b/lib/open_project/patches/message_pack_safe_buffer.rb @@ -30,25 +30,23 @@ module OpenProject module Patches - # Rails registers ActiveSupport::SafeBuffer as MessagePack ext type 18 with - # unpacker: :new. ActionView::OutputBuffer (a SafeBuffer subclass) uses "".b - # internally, so the ext payload bytes are BINARY. The default unpacker calls - # SafeBuffer.new(binary_bytes) which reconstructs with ASCII-8BIT encoding, - # causing Encoding::CompatibilityError when the cached HTML is later - # concatenated into a UTF-8 output buffer (e.g. via ActionView concat). + # Upstream fix: https://github.com/rails/rails/pull/57429 (merged, not yet released) # - # We prepend to MessagePack::Factory so that when Extensions.install registers - # type 18, our override replaces the unpacker with one that force_encodes to - # UTF-8 before constructing the SafeBuffer. + # Rails registers ActiveSupport::SafeBuffer as MessagePack ext type 18 with + # packer: :to_s, unpacker: :new. Ext payload bytes are always BINARY, so + # SafeBuffer.new(payload) reconstructs with ASCII-8BIT encoding, causing + # Encoding::CompatibilityError when cached HTML is later concatenated into a + # UTF-8 output buffer. + # + # The upstream fix switches to recursive: true with nested packer.write / + # unpacker.read so the MessagePack string codec preserves the original + # encoding across the round-trip. module MessagePackSafeBufferFix def register_type(type_id, klass = nil, **options, &) - if klass == ActiveSupport::SafeBuffer && options[:unpacker] == :new - options[:unpacker] = ->(bytes) { - retagged = bytes.force_encoding(Encoding::UTF_8) - raise EncodingError, "Cached SafeBuffer payload is not valid UTF-8" unless retagged.valid_encoding? - - ActiveSupport::SafeBuffer.new(retagged) - } + if klass == ActiveSupport::SafeBuffer + options[:packer] = ->(buffer, packer) { packer.write(buffer.to_str) } + options[:unpacker] = ->(unpacker) { ActiveSupport::SafeBuffer.new(unpacker.read) } + options[:recursive] = true end super diff --git a/spec/lib/open_project/patches/message_pack_safe_buffer_fix_spec.rb b/spec/lib/open_project/patches/message_pack_safe_buffer_fix_spec.rb index 91ee3e03810..3fc27dd7365 100644 --- a/spec/lib/open_project/patches/message_pack_safe_buffer_fix_spec.rb +++ b/spec/lib/open_project/patches/message_pack_safe_buffer_fix_spec.rb @@ -31,9 +31,11 @@ require "spec_helper" # Rails registers ActiveSupport::SafeBuffer as MessagePack ext type 18 with -# unpacker: :new. MessagePack ext payloads are raw bytes (BINARY), so the default -# unpacker reconstructs SafeBuffer with ASCII-8BIT encoding, even when the -# original was UTF-8. This patch overrides the unpacker to force UTF-8. +# packer: :to_s, unpacker: :new. Ext payloads are raw bytes (BINARY), so the +# default unpacker reconstructs SafeBuffer with ASCII-8BIT encoding even when +# the original was UTF-8. The patch (mirroring rails/rails#57429) switches to +# recursive: true with nested packer.write / unpacker.read so the MessagePack +# string codec preserves the original encoding across the round-trip. RSpec.describe OpenProject::Patches::MessagePackSafeBufferFix do # Use the same serializer the cache store uses to cover the real path. let(:serializer) { ActiveSupport::MessagePack::CacheSerializer } @@ -43,28 +45,28 @@ RSpec.describe OpenProject::Patches::MessagePackSafeBufferFix do serializer.load(serializer.dump(value)) end - shared_examples "a correctly round-tripped SafeBuffer", :aggregate_failures do - it "returns a utf-8 SafeBuffer, preserving the original content and html safety" do - expect(round_trip(subject)).to be_a(ActiveSupport::SafeBuffer) - expect(round_trip(subject).to_s).to eq(subject.to_s.dup.force_encoding(Encoding::UTF_8)) - expect(round_trip(subject).encoding).to eq(Encoding::UTF_8) - expect(round_trip(subject)).to be_html_safe - end - end - context "with a UTF-8 SafeBuffer (normal render output)" do subject { ActiveSupport::SafeBuffer.new(html) } - include_examples "a correctly round-tripped SafeBuffer" + it "roundtrips as a UTF-8 html_safe SafeBuffer and concatenates without error", :aggregate_failures do + result = round_trip(subject) + expect(result).to be_a(ActiveSupport::SafeBuffer) + expect(result).to be_html_safe + expect(result.encoding).to eq(Encoding::UTF_8) + expect(result.to_s).to eq(html) + expect("prefix " + result).to eq("prefix #{html}") + end end - context "with a BINARY-encoded SafeBuffer (e.g. content assembled from binary bytes)" do + context "with a BINARY-encoded SafeBuffer" do subject { ActiveSupport::SafeBuffer.new(html.b) } - it "has BINARY encoding before round-trip (confirms precondition)" do - expect(subject.encoding).to eq(Encoding::BINARY) + it "preserves BINARY encoding across the round-trip", :aggregate_failures do + result = round_trip(subject) + expect(result).to be_a(ActiveSupport::SafeBuffer) + expect(result).to be_html_safe + expect(result.encoding).to eq(Encoding::BINARY) + expect(result.to_str).to eq(html.b) end - - include_examples "a correctly round-tripped SafeBuffer" end end From d9fe91332693bb216782787160713f0c4e8b5124 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20G=C3=BCnther?= Date: Mon, 8 Jun 2026 15:31:16 +0200 Subject: [PATCH 051/107] Update security fixes --- docs/release-notes/17-3-4/README.md | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 docs/release-notes/17-3-4/README.md diff --git a/docs/release-notes/17-3-4/README.md b/docs/release-notes/17-3-4/README.md new file mode 100644 index 00000000000..0c91883b729 --- /dev/null +++ b/docs/release-notes/17-3-4/README.md @@ -0,0 +1,28 @@ +--- +title: OpenProject 17.3.4 +sidebar_navigation: + title: 17.3.4 +release_version: 17.3.4 +release_date: 2026-06-08 +--- + +# OpenProject 17.3.4 + +Release date: 2026-06-08 + +We released [OpenProject 17.3.4](https://community.openproject.org/versions/2305). +The release contains several bug fixes and we recommend updating to the newest version. +Below you will find a complete list of all changes and bug fixes. + + + + +## Bug fixes and changes + + + + +- Bugfix: Memcached serialization is broken in 17.3.3 \[[#75753](https://community.openproject.org/wp/75753)\] + + + From 3c055198c6ca11d362ea1245fc10df58079dabce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20G=C3=BCnther?= Date: Mon, 8 Jun 2026 15:31:17 +0200 Subject: [PATCH 052/107] Add release-notes file --- docs/release-notes/README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/release-notes/README.md b/docs/release-notes/README.md index 7e15b7308c4..71a9a34910c 100644 --- a/docs/release-notes/README.md +++ b/docs/release-notes/README.md @@ -13,6 +13,13 @@ Stay up to date and get an overview of the new features included in the releases +## 17.3.4 + +Release date: 2026-06-08 + +[Release Notes](17-3-4/) + + ## 17.3.3 Release date: 2026-06-08 From 04f51891429fef0a610e0d693998106d5f7cff7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20G=C3=BCnther?= Date: Mon, 8 Jun 2026 15:31:19 +0200 Subject: [PATCH 053/107] Update hocuspocus image to openproject/hocuspocus:17.3.4 --- docker/prod/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/prod/Dockerfile b/docker/prod/Dockerfile index 44bab1d60b9..a1f9bbd6143 100755 --- a/docker/prod/Dockerfile +++ b/docker/prod/Dockerfile @@ -141,7 +141,7 @@ ENV PGDATA=/var/openproject/pgdata COPY --from=openproject/gosu /go/bin/gosu /usr/local/bin/gosu RUN chmod +x /usr/local/bin/gosu && gosu nobody true -COPY --from=openproject/hocuspocus:17.3.3 --chown=$APP_USER:$APP_USER /app /opt/hocuspocus +COPY --from=openproject/hocuspocus:17.3.4 --chown=$APP_USER:$APP_USER /app /opt/hocuspocus # Keep node/npm in all-in-one for bundled hocuspocus even when BIM support is disabled. COPY --from=build-base /usr/local/bin/node /usr/local/bin/node COPY --from=build-base /usr/local/lib/node_modules /usr/local/lib/node_modules From 3f49de97180e16a929176fa93e1feda91750a843 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20G=C3=BCnther?= Date: Mon, 8 Jun 2026 15:31:19 +0200 Subject: [PATCH 054/107] Update publiccode.yml --- publiccode.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/publiccode.yml b/publiccode.yml index 27fdcd10f82..c263fddb490 100644 --- a/publiccode.yml +++ b/publiccode.yml @@ -8,7 +8,7 @@ applicationSuite: openDesk url: 'https://github.com/opf/openproject' roadmap: 'https://www.openproject.org/roadmap' releaseDate: '2026-06-08' -softwareVersion: '17.3.3' +softwareVersion: '17.3.4' developmentStatus: stable softwareType: standalone/web logo: 'publiccode_logo.svg' From bd243cfb395288039fa9cf870a3165a15d952830 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20G=C3=BCnther?= Date: Mon, 8 Jun 2026 15:31:22 +0200 Subject: [PATCH 055/107] Bumped version to 17.3.5 [ci skip] --- lib/open_project/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/open_project/version.rb b/lib/open_project/version.rb index 9dbcb9768d2..3a22b8fec57 100644 --- a/lib/open_project/version.rb +++ b/lib/open_project/version.rb @@ -33,7 +33,7 @@ module OpenProject module VERSION # :nodoc: MAJOR = 17 MINOR = 3 - PATCH = 4 + PATCH = 5 class << self def revision From 2ae44de6c66460ac6dfb0224c741719581d52442 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20G=C3=BCnther?= Date: Mon, 8 Jun 2026 15:53:02 +0200 Subject: [PATCH 056/107] Trigger tag-based flavour build --- .github/workflows/continuous-delivery.yml | 31 ++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/.github/workflows/continuous-delivery.yml b/.github/workflows/continuous-delivery.yml index 24d6f427c1b..aefdc7c153d 100644 --- a/.github/workflows/continuous-delivery.yml +++ b/.github/workflows/continuous-delivery.yml @@ -5,6 +5,8 @@ on: - dev - release/* - stable/* + tags: + - 'v*.*.*' permissions: contents: read @@ -12,7 +14,7 @@ jobs: trigger_downstream_workflow: permissions: contents: none - if: github.repository == 'opf/openproject' + if: github.repository == 'opf/openproject' && github.ref_type == 'branch' runs-on: ubuntu-latest steps: - name: Trigger Flavours workflow @@ -29,3 +31,30 @@ jobs: -XPOST -H"Accept: application/vnd.github.v3+json" \ https://api.github.com/repos/$REPOSITORY/actions/workflows/$WORKFLOW_ID/dispatches \ -d "$PAYLOAD" + + trigger_stable_tag_workflow: + permissions: + contents: none + if: github.repository == 'opf/openproject' && github.ref_type == 'tag' + runs-on: ubuntu-latest + steps: + - name: Trigger Flavours stable workflow for tag + env: + TOKEN: ${{ secrets.OPENPROJECTCI_FLAVOUR_TRIGGER_TOKEN }} + REPOSITORY: opf/openproject-flavours + WORKFLOW_ID: ci-stable.yml + TAG_NAME: ${{ github.ref_name }} + THIS_RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} + run: | + TAG="${TAG_NAME#v}" # strip leading 'v': 17.3.1 + MINOR="${TAG%.*}" # strip patch: 17.3 + BRANCH="release/$MINOR" # release/17.3 + PAYLOAD=$(jq -n \ + --arg ref "$BRANCH" \ + --arg tag "$TAG" \ + --arg triggered_by_url "$THIS_RUN_URL" \ + '{"ref": "dev", "inputs": {"ref": $ref, "tag": $tag, "triggered_by_url": $triggered_by_url}}') + curl -i --fail-with-body -H"authorization: Bearer $TOKEN" \ + -XPOST -H"Accept: application/vnd.github.v3+json" \ + https://api.github.com/repos/$REPOSITORY/actions/workflows/$WORKFLOW_ID/dispatches \ + -d "$PAYLOAD" From 684b7c7c5796d890a07139d4fce65db0c9b7e37f Mon Sep 17 00:00:00 2001 From: Ivan Kuchin Date: Wed, 3 Jun 2026 20:59:48 +0200 Subject: [PATCH 057/107] separate erb lint workflow --- .github/workflows/erb-lint-core.yml | 31 +++++++++++++++++++++++++++++ .github/workflows/rubocop-core.yml | 8 -------- 2 files changed, 31 insertions(+), 8 deletions(-) create mode 100644 .github/workflows/erb-lint-core.yml diff --git a/.github/workflows/erb-lint-core.yml b/.github/workflows/erb-lint-core.yml new file mode 100644 index 00000000000..09d63bc1550 --- /dev/null +++ b/.github/workflows/erb-lint-core.yml @@ -0,0 +1,31 @@ +name: ERB lint + +on: + pull_request: + paths: + - '**/*.erb' + - '.erb_lint.yml' + - '.erb_linters/**' + +jobs: + erb-lint: + name: ERB lint + runs-on: ubuntu-latest + permissions: + contents: read + checks: write + steps: + - name: Checkout code + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + with: + persist-credentials: false + - name: Set up Ruby + uses: ruby/setup-ruby@afeafc3d1ab54a631816aba4c914a0081c12ff2f # v1 + - name: Install erb_lint + run: gem install -N erb_lint erblint-github + - name: Run erb-lint + uses: tk0miya/action-erblint@44c5fe3552356fe8bff23f30d534aa4258aa3f7b # v1 + with: + github_token: ${{ secrets.github_token }} + reporter: github-pr-check + fail_on_error: true diff --git a/.github/workflows/rubocop-core.yml b/.github/workflows/rubocop-core.yml index 11e8d647c7f..7dad07c9459 100644 --- a/.github/workflows/rubocop-core.yml +++ b/.github/workflows/rubocop-core.yml @@ -34,11 +34,3 @@ jobs: rubocop-rspec_rails:gemfile reporter: github-pr-check only_changed: true - - name: Install erb_lint - run: gem install -N erb_lint erblint-github - - name: Run erb-lint - uses: tk0miya/action-erblint@44c5fe3552356fe8bff23f30d534aa4258aa3f7b # v1 - with: - github_token: ${{ secrets.github_token }} - reporter: github-pr-check - fail_on_error: true From bbca8a5c5c93f1cfebc4216d7736f74023be779f Mon Sep 17 00:00:00 2001 From: Ivan Kuchin Date: Thu, 4 Jun 2026 13:48:56 +0200 Subject: [PATCH 058/107] full version in comment of actions/checkout --- .github/workflows/erb-lint-core.yml | 2 +- .github/workflows/eslint-core.yml | 2 +- .github/workflows/rubocop-core.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/erb-lint-core.yml b/.github/workflows/erb-lint-core.yml index 09d63bc1550..e2fb8b58329 100644 --- a/.github/workflows/erb-lint-core.yml +++ b/.github/workflows/erb-lint-core.yml @@ -16,7 +16,7 @@ jobs: checks: write steps: - name: Checkout code - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: persist-credentials: false - name: Set up Ruby diff --git a/.github/workflows/eslint-core.yml b/.github/workflows/eslint-core.yml index 19e26516290..8219ad24b75 100644 --- a/.github/workflows/eslint-core.yml +++ b/.github/workflows/eslint-core.yml @@ -17,7 +17,7 @@ jobs: contents: read checks: write steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: fetch-depth: 0 persist-credentials: false diff --git a/.github/workflows/rubocop-core.yml b/.github/workflows/rubocop-core.yml index 7dad07c9459..c43990206af 100644 --- a/.github/workflows/rubocop-core.yml +++ b/.github/workflows/rubocop-core.yml @@ -14,7 +14,7 @@ jobs: checks: write steps: - name: Checkout code - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: persist-credentials: false - name: Set up Ruby From 46aa3fed2a0521312142bbbd3a62f24aa69e17e9 Mon Sep 17 00:00:00 2001 From: Ivan Kuchin Date: Wed, 3 Jun 2026 21:31:45 +0200 Subject: [PATCH 059/107] fix yamllint job name and workflow permissions (checks is needed) --- .github/workflows/yamllint-core.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/yamllint-core.yml b/.github/workflows/yamllint-core.yml index 496f8006a1a..cc3ba016993 100644 --- a/.github/workflows/yamllint-core.yml +++ b/.github/workflows/yamllint-core.yml @@ -9,12 +9,13 @@ on: - 'modules/*/config/locales/en.yml' - 'modules/*/config/locales/js-en.yml' -permissions: {} - jobs: - rubocop: + yamllint: name: yamllint runs-on: ubuntu-latest + permissions: + contents: read + checks: write steps: - name: Checkout code uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 From 5ea0c74f1deca064c182cc5bc5dcb4734454db03 Mon Sep 17 00:00:00 2001 From: Ivan Kuchin Date: Wed, 3 Jun 2026 21:09:02 +0200 Subject: [PATCH 060/107] cleanup options of all linters --- .github/workflows/erb-lint-core.yml | 2 -- .github/workflows/rubocop-core.yml | 3 +-- .github/workflows/yamllint-core.yml | 3 +-- 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/.github/workflows/erb-lint-core.yml b/.github/workflows/erb-lint-core.yml index e2fb8b58329..8a79ddac55c 100644 --- a/.github/workflows/erb-lint-core.yml +++ b/.github/workflows/erb-lint-core.yml @@ -26,6 +26,4 @@ jobs: - name: Run erb-lint uses: tk0miya/action-erblint@44c5fe3552356fe8bff23f30d534aa4258aa3f7b # v1 with: - github_token: ${{ secrets.github_token }} reporter: github-pr-check - fail_on_error: true diff --git a/.github/workflows/rubocop-core.yml b/.github/workflows/rubocop-core.yml index c43990206af..15aa735f6a4 100644 --- a/.github/workflows/rubocop-core.yml +++ b/.github/workflows/rubocop-core.yml @@ -22,7 +22,7 @@ jobs: - name: Run Rubocop uses: reviewdog/action-rubocop@b6d5e953a5fc0bf3ab65254e77730ea2174d6d6d # v2 with: - github_token: ${{ secrets.github_token }} + reporter: github-pr-check rubocop_version: gemfile rubocop_extensions: > rubocop-capybara:gemfile @@ -32,5 +32,4 @@ jobs: rubocop-rails:gemfile rubocop-rspec:gemfile rubocop-rspec_rails:gemfile - reporter: github-pr-check only_changed: true diff --git a/.github/workflows/yamllint-core.yml b/.github/workflows/yamllint-core.yml index cc3ba016993..04721f6765a 100644 --- a/.github/workflows/yamllint-core.yml +++ b/.github/workflows/yamllint-core.yml @@ -25,8 +25,7 @@ jobs: - name: Run Yamllint uses: reviewdog/action-yamllint@f01d8a48fd8d89f89895499fca2cff09f9e9e8c0 # v1.21.0 with: - github_token: ${{ secrets.github_token }} - fail_level: error + reporter: github-pr-check yamllint_flags: > .yamllint.yml config/locales/en.yml From c1c34cf8db3eb206961d25470296923153a731a7 Mon Sep 17 00:00:00 2001 From: Ivan Kuchin Date: Thu, 4 Jun 2026 16:07:35 +0200 Subject: [PATCH 061/107] use our fork of tk0miya/action-erblint --- .github/workflows/erb-lint-core.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/erb-lint-core.yml b/.github/workflows/erb-lint-core.yml index 8a79ddac55c..c80d19e1ee4 100644 --- a/.github/workflows/erb-lint-core.yml +++ b/.github/workflows/erb-lint-core.yml @@ -24,6 +24,6 @@ jobs: - name: Install erb_lint run: gem install -N erb_lint erblint-github - name: Run erb-lint - uses: tk0miya/action-erblint@44c5fe3552356fe8bff23f30d534aa4258aa3f7b # v1 + uses: opf/action-erblint@49c54b56c60d0c50885065468cf149b61d5c2a60 # main with: reporter: github-pr-check From 522c75e9b5ad2b4b281a93712c68d0a4378060ce Mon Sep 17 00:00:00 2001 From: Ivan Kuchin Date: Thu, 4 Jun 2026 16:22:16 +0200 Subject: [PATCH 062/107] rely on ruby/setup-ruby to install bundle for erb_lint action and use it --- .github/workflows/erb-lint-core.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/erb-lint-core.yml b/.github/workflows/erb-lint-core.yml index c80d19e1ee4..206b074fb07 100644 --- a/.github/workflows/erb-lint-core.yml +++ b/.github/workflows/erb-lint-core.yml @@ -21,9 +21,10 @@ jobs: persist-credentials: false - name: Set up Ruby uses: ruby/setup-ruby@afeafc3d1ab54a631816aba4c914a0081c12ff2f # v1 - - name: Install erb_lint - run: gem install -N erb_lint erblint-github + with: + bundler-cache: true - name: Run erb-lint uses: opf/action-erblint@49c54b56c60d0c50885065468cf149b61d5c2a60 # main with: reporter: github-pr-check + use_bundler: true From 370ae1826232f6914a4a9a0f900ba216bacc0f2f Mon Sep 17 00:00:00 2001 From: Ivan Kuchin Date: Thu, 4 Jun 2026 20:35:56 +0200 Subject: [PATCH 063/107] name and newline consistency --- .github/workflows/erb-lint-core.yml | 2 +- .github/workflows/eslint-core.yml | 14 +++++++++----- .github/workflows/rubocop-core.yml | 6 +++--- .github/workflows/yamllint-core.yml | 5 ++--- 4 files changed, 15 insertions(+), 12 deletions(-) diff --git a/.github/workflows/erb-lint-core.yml b/.github/workflows/erb-lint-core.yml index 206b074fb07..bb1d76d1389 100644 --- a/.github/workflows/erb-lint-core.yml +++ b/.github/workflows/erb-lint-core.yml @@ -23,7 +23,7 @@ jobs: uses: ruby/setup-ruby@afeafc3d1ab54a631816aba4c914a0081c12ff2f # v1 with: bundler-cache: true - - name: Run erb-lint + - name: Run ERB lint uses: opf/action-erblint@49c54b56c60d0c50885065468cf149b61d5c2a60 # main with: reporter: github-pr-check diff --git a/.github/workflows/eslint-core.yml b/.github/workflows/eslint-core.yml index 8219ad24b75..a159f046ca7 100644 --- a/.github/workflows/eslint-core.yml +++ b/.github/workflows/eslint-core.yml @@ -1,4 +1,5 @@ -name: eslint +name: ESLint + on: pull_request: branches: @@ -11,23 +12,26 @@ on: jobs: eslint: - name: eslint + name: ESLint runs-on: ubuntu-latest permissions: contents: read checks: write steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - name: Checkout code + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: fetch-depth: 0 persist-credentials: false - - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6 + - name: Set up Node + uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6 with: node-version: '22.15' package-manager-cache: false cache: npm cache-dependency-path: frontend/package-lock.json - - uses: reviewdog/action-eslint@556a3fdaf8b4201d4d74d406013386aa4f7dab96 # v1 + - name: Run ESLint + uses: reviewdog/action-eslint@556a3fdaf8b4201d4d74d406013386aa4f7dab96 # v1 with: reporter: github-pr-check workdir: 'frontend/' diff --git a/.github/workflows/rubocop-core.yml b/.github/workflows/rubocop-core.yml index 15aa735f6a4..ce3e1573adc 100644 --- a/.github/workflows/rubocop-core.yml +++ b/.github/workflows/rubocop-core.yml @@ -1,4 +1,4 @@ -name: rubocop +name: RuboCop on: pull_request: @@ -7,7 +7,7 @@ on: jobs: rubocop: - name: rubocop + name: RuboCop runs-on: ubuntu-latest permissions: contents: read @@ -19,7 +19,7 @@ jobs: persist-credentials: false - name: Set up Ruby uses: ruby/setup-ruby@afeafc3d1ab54a631816aba4c914a0081c12ff2f # v1 - - name: Run Rubocop + - name: Run RuboCop uses: reviewdog/action-rubocop@b6d5e953a5fc0bf3ab65254e77730ea2174d6d6d # v2 with: reporter: github-pr-check diff --git a/.github/workflows/yamllint-core.yml b/.github/workflows/yamllint-core.yml index 04721f6765a..47e3b757622 100644 --- a/.github/workflows/yamllint-core.yml +++ b/.github/workflows/yamllint-core.yml @@ -1,4 +1,4 @@ -name: yamllint +name: Yamllint on: pull_request: @@ -11,7 +11,7 @@ on: jobs: yamllint: - name: yamllint + name: Yamllint runs-on: ubuntu-latest permissions: contents: read @@ -21,7 +21,6 @@ jobs: uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: persist-credentials: false - - name: Run Yamllint uses: reviewdog/action-yamllint@f01d8a48fd8d89f89895499fca2cff09f9e9e8c0 # v1.21.0 with: From 595872727cbaba3e6053a1039c07a0d0653637ff Mon Sep 17 00:00:00 2001 From: Judith Roth Date: Mon, 8 Jun 2026 14:51:18 +0200 Subject: [PATCH 064/107] [STC-779] Add tests for CTRL-Z in documents https://community.openproject.org/wp/STC-779 --- .../spec/features/block_note_editor_spec.rb | 31 +++++++++++++++++++ .../primerized/block_note_editor_input.rb | 21 +++++++++++++ 2 files changed, 52 insertions(+) diff --git a/modules/documents/spec/features/block_note_editor_spec.rb b/modules/documents/spec/features/block_note_editor_spec.rb index dcb7689d0ae..1be052e1f78 100644 --- a/modules/documents/spec/features/block_note_editor_spec.rb +++ b/modules/documents/spec/features/block_note_editor_spec.rb @@ -182,6 +182,37 @@ RSpec.describe "BlockNote editor rendering", :js, :selenium, with_settings: { re editor.wait_for_autosave { document.reload.description&.include?("##{work_package.id}") } end + + describe "CTRL-Z undo behavior" do + it "undoes typed text with CTRL-Z" do + visit document_path(document) + expect(page).to have_test_selector("blocknote-document-description") + + editor.fill_in("X") + expect(editor.element).to have_text("X") + + editor.undo + + expect(editor.element).to have_no_text("X") + end + + it "undoes an inline work package chip inserted via # notation with CTRL-Z" do + visit document_path(document) + expect(page).to have_test_selector("blocknote-document-description") + + editor.element.send_keys("#tiger") + editor.wait_for_shadow_content("pet a tiger") + send_keys(:enter) + expect(editor.element).to have_no_text("#tiger") # chip replaced autocomplete text + + expect(editor.element).to have_no_text("…") # chip finished loading + expect(editor.element).to have_text(/##{work_package.display_id}/) + + editor.undo + + expect(editor.element).to have_no_text(/##{work_package.display_id}/) + end + end end end end diff --git a/spec/support/form_fields/primerized/block_note_editor_input.rb b/spec/support/form_fields/primerized/block_note_editor_input.rb index 5fd18077a33..830f369a716 100644 --- a/spec/support/form_fields/primerized/block_note_editor_input.rb +++ b/spec/support/form_fields/primerized/block_note_editor_input.rb @@ -118,6 +118,27 @@ module FormFields end end + # Triggers undo in the editor by dispatching a synthetic Ctrl-Z keydown event + # directly to the shadow-DOM contenteditable element. Selenium's send_keys does + # not reliably deliver modifier-key chords to elements inside a shadow DOM, so + # we use execute_script instead. ProseMirror processes all keydown events on + # its editor div regardless of isTrusted. + def undo + page.execute_script(<<~JS) + var shadowRoot = #{shadow_root_query} + var element = shadowRoot.querySelector('div[role="textbox"]'); + element.focus(); + element.dispatchEvent(new KeyboardEvent('keydown', { + key: 'z', + code: 'KeyZ', + ctrlKey: true, + bubbles: true, + cancelable: true, + composed: true + })); + JS + end + private # Attention: This only works with selenium, not with cuprite, From 551b1850bf5ff9aa18abb3ce7db8d41f111fdf6d Mon Sep 17 00:00:00 2001 From: Judith Roth Date: Mon, 8 Jun 2026 16:05:55 +0200 Subject: [PATCH 065/107] [STC-779] Update op-blocknote-extensions to fixed version https://community.openproject.org/wp/STC-779 --- extensions/op-blocknote-hocuspocus/package-lock.json | 8 ++++---- extensions/op-blocknote-hocuspocus/package.json | 2 +- frontend/package-lock.json | 12 ++++++------ frontend/package.json | 2 +- frontend/src/react/components/OpBlockNoteEditor.tsx | 3 ++- 5 files changed, 14 insertions(+), 13 deletions(-) diff --git a/extensions/op-blocknote-hocuspocus/package-lock.json b/extensions/op-blocknote-hocuspocus/package-lock.json index 329cfb9ba64..97072d676e5 100644 --- a/extensions/op-blocknote-hocuspocus/package-lock.json +++ b/extensions/op-blocknote-hocuspocus/package-lock.json @@ -12,7 +12,7 @@ "@blocknote/server-util": "^0.51.3", "@hocuspocus/extension-logger": "^3.4.4", "@hocuspocus/server": "^3.4.0", - "op-blocknote-extensions": "https://github.com/opf/op-blocknote-extensions/releases/download/v0.1.0/op-blocknote-extensions-0.1.0.tgz", + "op-blocknote-extensions": "https://github.com/opf/op-blocknote-extensions/releases/download/v0.1.1/op-blocknote-extensions-0.1.1.tgz", "tsx": "^4.21.0" }, "devDependencies": { @@ -3903,9 +3903,9 @@ "license": "MIT" }, "node_modules/op-blocknote-extensions": { - "version": "0.1.0", - "resolved": "https://github.com/opf/op-blocknote-extensions/releases/download/v0.1.0/op-blocknote-extensions-0.1.0.tgz", - "integrity": "sha512-JKwG2P5RXM0JDED0AzDeiVoxuamHtzqLO5fp88EoFig+YXlPsedJHc90zjTDqCFRilwTDamCq3jjzdFvl42kCA==", + "version": "0.1.1", + "resolved": "https://github.com/opf/op-blocknote-extensions/releases/download/v0.1.1/op-blocknote-extensions-0.1.1.tgz", + "integrity": "sha512-4VO5Qf51Z8WQGD24AYhNmGHGGwnfnB3q8KwL48hWTifZq/9IL5rKpwKB+QkxvVUCaT8iwFYwB6QPzGgLJKRVFA==", "dependencies": { "@primer/octicons-react": "^19.20.0", "i18next": "^25.6.3", diff --git a/extensions/op-blocknote-hocuspocus/package.json b/extensions/op-blocknote-hocuspocus/package.json index d0095610c39..b3f83f49d98 100644 --- a/extensions/op-blocknote-hocuspocus/package.json +++ b/extensions/op-blocknote-hocuspocus/package.json @@ -26,7 +26,7 @@ "@blocknote/server-util": "^0.51.3", "@hocuspocus/extension-logger": "^3.4.4", "@hocuspocus/server": "^3.4.0", - "op-blocknote-extensions": "https://github.com/opf/op-blocknote-extensions/releases/download/v0.1.0/op-blocknote-extensions-0.1.0.tgz", + "op-blocknote-extensions": "https://github.com/opf/op-blocknote-extensions/releases/download/v0.1.1/op-blocknote-extensions-0.1.1.tgz", "tsx": "^4.21.0" }, "devDependencies": { diff --git a/frontend/package-lock.json b/frontend/package-lock.json index f9b67a18075..99de7cb2064 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -107,7 +107,7 @@ "ng2-dragula": "^6.0.0", "ngx-cookie-service": "^21.1.0", "observable-array": "0.0.4", - "op-blocknote-extensions": "https://github.com/opf/op-blocknote-extensions/releases/download/v0.1.0/op-blocknote-extensions-0.1.0.tgz", + "op-blocknote-extensions": "https://github.com/opf/op-blocknote-extensions/releases/download/v0.1.1/op-blocknote-extensions-0.1.1.tgz", "openapi-explorer": "^2.4.793", "pako": "^2.0.3", "qr-creator": "^1.0.0", @@ -19205,9 +19205,9 @@ } }, "node_modules/op-blocknote-extensions": { - "version": "0.1.0", - "resolved": "https://github.com/opf/op-blocknote-extensions/releases/download/v0.1.0/op-blocknote-extensions-0.1.0.tgz", - "integrity": "sha512-JKwG2P5RXM0JDED0AzDeiVoxuamHtzqLO5fp88EoFig+YXlPsedJHc90zjTDqCFRilwTDamCq3jjzdFvl42kCA==", + "version": "0.1.1", + "resolved": "https://github.com/opf/op-blocknote-extensions/releases/download/v0.1.1/op-blocknote-extensions-0.1.1.tgz", + "integrity": "sha512-4VO5Qf51Z8WQGD24AYhNmGHGGwnfnB3q8KwL48hWTifZq/9IL5rKpwKB+QkxvVUCaT8iwFYwB6QPzGgLJKRVFA==", "dependencies": { "@primer/octicons-react": "^19.20.0", "i18next": "^25.6.3", @@ -37224,8 +37224,8 @@ } }, "op-blocknote-extensions": { - "version": "https://github.com/opf/op-blocknote-extensions/releases/download/v0.1.0/op-blocknote-extensions-0.1.0.tgz", - "integrity": "sha512-JKwG2P5RXM0JDED0AzDeiVoxuamHtzqLO5fp88EoFig+YXlPsedJHc90zjTDqCFRilwTDamCq3jjzdFvl42kCA==", + "version": "https://github.com/opf/op-blocknote-extensions/releases/download/v0.1.1/op-blocknote-extensions-0.1.1.tgz", + "integrity": "sha512-4VO5Qf51Z8WQGD24AYhNmGHGGwnfnB3q8KwL48hWTifZq/9IL5rKpwKB+QkxvVUCaT8iwFYwB6QPzGgLJKRVFA==", "requires": { "@primer/octicons-react": "^19.20.0", "i18next": "^25.6.3", diff --git a/frontend/package.json b/frontend/package.json index 985218c1ddc..4d35bb9a109 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -158,7 +158,7 @@ "ng2-dragula": "^6.0.0", "ngx-cookie-service": "^21.1.0", "observable-array": "0.0.4", - "op-blocknote-extensions": "https://github.com/opf/op-blocknote-extensions/releases/download/v0.1.0/op-blocknote-extensions-0.1.0.tgz", + "op-blocknote-extensions": "https://github.com/opf/op-blocknote-extensions/releases/download/v0.1.1/op-blocknote-extensions-0.1.1.tgz", "openapi-explorer": "^2.4.793", "pako": "^2.0.3", "qr-creator": "^1.0.0", diff --git a/frontend/src/react/components/OpBlockNoteEditor.tsx b/frontend/src/react/components/OpBlockNoteEditor.tsx index 60388ea1ca7..a2f7d8f5518 100644 --- a/frontend/src/react/components/OpBlockNoteEditor.tsx +++ b/frontend/src/react/components/OpBlockNoteEditor.tsx @@ -41,6 +41,7 @@ import { openProjectWorkPackageInlineSpec, workPackageSlashMenu, useOpBlockNoteExtensions, + PasteDeduplicateInstanceIdsExtension, useHashWpMenu, } from 'op-blocknote-extensions'; import { useCallback, useEffect, useMemo } from 'react'; @@ -119,7 +120,7 @@ export function OpBlockNoteEditor({ // When external link capture is enabled, intercept clicks on external // links via a ProseMirror plugin and route through /external_redirect. ...(captureExternalLinks && { - extensions: [ExternalLinkCaptureExtension], + extensions: [PasteDeduplicateInstanceIdsExtension, ExternalLinkCaptureExtension], }), }; }, [hocuspocusProvider, doc, activeUser, localeDictionary, attachmentsEnabled, uploadFile, captureExternalLinks]); From c25e8a15eac383904e5ae64d31af4dad8911f14b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20G=C3=BCnther?= Date: Mon, 8 Jun 2026 16:35:00 +0200 Subject: [PATCH 066/107] Test all paths with varying project memberships --- .../meeting_sections/create_contract_spec.rb | 9 ++ .../meeting_sections/delete_contract_spec.rb | 9 ++ .../meeting_sections/update_contract_spec.rb | 9 ++ .../sections_by_meeting_resource_spec.rb | 104 +++++++++++++++--- 4 files changed, 115 insertions(+), 16 deletions(-) diff --git a/modules/meeting/spec/contracts/meeting_sections/create_contract_spec.rb b/modules/meeting/spec/contracts/meeting_sections/create_contract_spec.rb index e088c011516..31465356c6e 100644 --- a/modules/meeting/spec/contracts/meeting_sections/create_contract_spec.rb +++ b/modules/meeting/spec/contracts/meeting_sections/create_contract_spec.rb @@ -35,6 +35,7 @@ RSpec.describe MeetingSections::CreateContract do include_context "ModelContract shared context" shared_let(:project) { create(:project) } + shared_let(:other_project) { create(:project) } let(:meeting) { create(:meeting, project:) } let(:section) { build(:meeting_section, meeting:) } let(:contract) { described_class.new(section, user) } @@ -79,6 +80,14 @@ RSpec.describe MeetingSections::CreateContract do it_behaves_like "contract is invalid", base: :does_not_exist end + context "with permission in another project" do + let(:user) do + create(:user, member_with_permissions: { other_project => %i[view_meetings manage_agendas] }) + end + + it_behaves_like "contract is invalid", base: :does_not_exist + end + include_examples "contract reuses the model errors" do let(:user) { build_stubbed(:user) } end diff --git a/modules/meeting/spec/contracts/meeting_sections/delete_contract_spec.rb b/modules/meeting/spec/contracts/meeting_sections/delete_contract_spec.rb index dfdcbcefa74..3f25dc9ed4a 100644 --- a/modules/meeting/spec/contracts/meeting_sections/delete_contract_spec.rb +++ b/modules/meeting/spec/contracts/meeting_sections/delete_contract_spec.rb @@ -35,6 +35,7 @@ RSpec.describe MeetingSections::DeleteContract do include_context "ModelContract shared context" shared_let(:project) { create(:project) } + shared_let(:other_project) { create(:project) } shared_let(:meeting) { create(:meeting, project:) } let(:section) { create(:meeting_section, meeting:) } let(:contract) { described_class.new(section, user) } @@ -69,6 +70,14 @@ RSpec.describe MeetingSections::DeleteContract do it_behaves_like "contract is invalid", base: :error_unauthorized end + context "with permission in another project" do + let(:user) do + create(:user, member_with_permissions: { other_project => %i[view_meetings manage_agendas] }) + end + + it_behaves_like "contract is invalid", base: :error_unauthorized + end + include_examples "contract reuses the model errors" do let(:user) { build_stubbed(:user) } end diff --git a/modules/meeting/spec/contracts/meeting_sections/update_contract_spec.rb b/modules/meeting/spec/contracts/meeting_sections/update_contract_spec.rb index 84a3653fbea..a68ebe145bb 100644 --- a/modules/meeting/spec/contracts/meeting_sections/update_contract_spec.rb +++ b/modules/meeting/spec/contracts/meeting_sections/update_contract_spec.rb @@ -35,6 +35,7 @@ RSpec.describe MeetingSections::UpdateContract do include_context "ModelContract shared context" shared_let(:project) { create(:project) } + shared_let(:other_project) { create(:project) } shared_let(:meeting) { create(:meeting, project:) } shared_let(:section) { create(:meeting_section, meeting:) } let(:contract) { described_class.new(section, user) } @@ -61,6 +62,14 @@ RSpec.describe MeetingSections::UpdateContract do it_behaves_like "contract is invalid", base: :error_unauthorized end + context "with permission in another project" do + let(:user) do + create(:user, member_with_permissions: { other_project => %i[view_meetings manage_agendas] }) + end + + it_behaves_like "contract is invalid", base: :error_unauthorized + end + include_examples "contract reuses the model errors" do let(:user) { build_stubbed(:user) } end diff --git a/modules/meeting/spec/requests/api/v3/meeting_sections/sections_by_meeting_resource_spec.rb b/modules/meeting/spec/requests/api/v3/meeting_sections/sections_by_meeting_resource_spec.rb index ebfd2190f65..3cdac775747 100644 --- a/modules/meeting/spec/requests/api/v3/meeting_sections/sections_by_meeting_resource_spec.rb +++ b/modules/meeting/spec/requests/api/v3/meeting_sections/sections_by_meeting_resource_spec.rb @@ -36,18 +36,40 @@ RSpec.describe "API v3 Meeting Sections sub-resource", content_type: :json do include API::V3::Utilities::PathHelper shared_let(:project) { create(:project, enabled_module_names: %w[meetings]) } + shared_let(:other_project) { create(:project, enabled_module_names: %w[meetings]) } + shared_let(:author) { create(:user) } let(:permissions) { %i[view_meetings manage_agendas] } let(:current_user) do create(:user, member_with_permissions: { project => permissions }) end - let(:meeting) { create(:meeting, project:, author: current_user) } + let(:meeting) { create(:meeting, project:, author:) } let!(:section) { create(:meeting_section, meeting:, title: "First Section") } before do login_as current_user end + shared_examples "not found without meeting visibility" do + context "without view_meetings permission" do + let(:permissions) { [] } + + it "returns 404" do + expect(last_response).to have_http_status(:not_found) + end + end + + context "with view_meetings permission in another project" do + let(:current_user) do + create(:user, member_with_permissions: { other_project => %i[view_meetings manage_agendas] }) + end + + it "returns 404" do + expect(last_response).to have_http_status(:not_found) + end + end + end + describe "GET /api/v3/meetings/:meeting_id/sections" do let(:path) { api_v3_paths.meeting_sections(meeting_id: meeting.id) } @@ -65,13 +87,7 @@ RSpec.describe "API v3 Meeting Sections sub-resource", content_type: :json do .at_path("_embedded/elements/0/_links/self/href") end - context "without view_meetings permission" do - let(:permissions) { [] } - - it "returns 404" do - expect(last_response).to have_http_status(:not_found) - end - end + it_behaves_like "not found without meeting visibility" end describe "POST /api/v3/meeting_sections" do @@ -115,6 +131,26 @@ RSpec.describe "API v3 Meeting Sections sub-resource", content_type: :json do expect(response).to have_http_status(:forbidden) end end + + context "without any permissions" do + let(:permissions) { [] } + + it "returns 422 and does not create a section" do + expect(response).to have_http_status(:unprocessable_entity) + expect(meeting.sections.find_by(title: "New Section")).to be_nil + end + end + + context "with manage_agendas permission in another project" do + let(:current_user) do + create(:user, member_with_permissions: { other_project => %i[view_meetings manage_agendas] }) + end + + it "returns 422 and does not create a section" do + expect(response).to have_http_status(:unprocessable_entity) + expect(meeting.sections.find_by(title: "New Section")).to be_nil + end + end end describe "GET /api/v3/meetings/:meeting_id/sections/:id" do @@ -135,13 +171,15 @@ RSpec.describe "API v3 Meeting Sections sub-resource", content_type: :json do end context "with a section from another meeting" do - let(:other_meeting) { create(:meeting, project:, author: current_user) } + let(:other_meeting) { create(:meeting, project:, author:) } let(:path) { api_v3_paths.meeting_section(section.id, meeting_id: other_meeting.id) } it "returns 404" do expect(last_response).to have_http_status(:not_found) end end + + it_behaves_like "not found without meeting visibility" end describe "GET /api/v3/meeting_sections/:id" do @@ -161,13 +199,7 @@ RSpec.describe "API v3 Meeting Sections sub-resource", content_type: :json do .at_path("_links/self/href") end - context "without view_meetings permission" do - let(:permissions) { [] } - - it "returns 404" do - expect(last_response).to have_http_status(:not_found) - end - end + it_behaves_like "not found without meeting visibility" end describe "PATCH /api/v3/meeting_sections/:id" do @@ -196,6 +228,26 @@ RSpec.describe "API v3 Meeting Sections sub-resource", content_type: :json do expect(response).to have_http_status(:forbidden) end end + + context "without any permissions" do + let(:permissions) { [] } + + it "returns 404 and does not update the section" do + expect(response).to have_http_status(:not_found) + expect(section.reload.title).to eq("First Section") + end + end + + context "with manage_agendas permission in another project" do + let(:current_user) do + create(:user, member_with_permissions: { other_project => %i[view_meetings manage_agendas] }) + end + + it "returns 404 and does not update the section" do + expect(response).to have_http_status(:not_found) + expect(section.reload.title).to eq("First Section") + end + end end describe "DELETE /api/v3/meeting_sections/:id" do @@ -220,5 +272,25 @@ RSpec.describe "API v3 Meeting Sections sub-resource", content_type: :json do it_behaves_like "unauthorized access" end + + context "without any permissions" do + let(:permissions) { [] } + + it "returns 404 and does not delete the section" do + expect(subject).to have_http_status(:not_found) + expect(MeetingSection).to exist(section.id) + end + end + + context "with manage_agendas permission in another project" do + let(:current_user) do + create(:user, member_with_permissions: { other_project => %i[view_meetings manage_agendas] }) + end + + it "returns 404 and does not delete the section" do + expect(subject).to have_http_status(:not_found) + expect(MeetingSection).to exist(section.id) + end + end end end From 892fc6a4d074645bd859cdf40a93deab02e00ea2 Mon Sep 17 00:00:00 2001 From: Eric Schubert Date: Mon, 8 Jun 2026 14:52:46 +0200 Subject: [PATCH 067/107] [#73352] consolidate controller actions - reorder yaml file to satisfy reviewdog? --- .../wikis/create_new_wiki_page_dialog.rb | 32 +++-- .../relation_page_links_component.html.erb | 2 +- .../wikis/relation_page_links_component.rb | 10 ++ .../app/controllers/wikis/pages_controller.rb | 10 -- modules/wikis/config/locales/en.yml | 120 +++++++++--------- modules/wikis/config/routes.rb | 1 - .../wikis/lib/open_project/wikis/engine.rb | 4 +- 7 files changed, 87 insertions(+), 92 deletions(-) diff --git a/modules/wikis/app/components/wikis/create_new_wiki_page_dialog.rb b/modules/wikis/app/components/wikis/create_new_wiki_page_dialog.rb index 4a53280b601..ca9ff5331fa 100644 --- a/modules/wikis/app/components/wikis/create_new_wiki_page_dialog.rb +++ b/modules/wikis/app/components/wikis/create_new_wiki_page_dialog.rb @@ -41,28 +41,26 @@ module Wikis end def form_options - { - id: form_id, - model:, - url: form_url, - data: { - turbo_frame: WorkPackageWikisTabComponent::TURBO_FRAME_ID + if show_first_step? + { + id: form_id, + model:, + method: :get, + url: create_new_page_dialog_wiki_pages_path, + data: { turbo_stream: true } } - } + else + { + id: form_id, + model:, + url: create_and_link_wiki_pages_path, + data: { turbo_frame: WorkPackageWikisTabComponent::TURBO_FRAME_ID } + } + end end def system_arguments options end - - private - - def form_url - if show_first_step? - continue_create_new_page_dialog_wiki_pages_path - else - create_and_link_wiki_pages_path - end - end end end diff --git a/modules/wikis/app/components/wikis/relation_page_links_component.html.erb b/modules/wikis/app/components/wikis/relation_page_links_component.html.erb index 9dcea1dc8d6..fc01ecf67e8 100644 --- a/modules/wikis/app/components/wikis/relation_page_links_component.html.erb +++ b/modules/wikis/app/components/wikis/relation_page_links_component.html.erb @@ -53,7 +53,7 @@ See COPYRIGHT and LICENSE files for more details. menu.with_item( label: t(".link_new"), tag: :a, - href: create_new_page_dialog_wiki_pages_path(linkable: work_package, provider:), + href: create_new_page_dialog_wiki_pages_path(create_new_page_parameters), content_arguments: { data: { controller: "async-dialog" } } ) end diff --git a/modules/wikis/app/components/wikis/relation_page_links_component.rb b/modules/wikis/app/components/wikis/relation_page_links_component.rb index bd9fe9f2cd3..6f1556eb437 100644 --- a/modules/wikis/app/components/wikis/relation_page_links_component.rb +++ b/modules/wikis/app/components/wikis/relation_page_links_component.rb @@ -50,6 +50,16 @@ module Wikis provider.user_connected?(User.current) end + def create_new_page_parameters + { + wikis_forms_create_new_wiki_page_form_model: { + linkable_id: work_package.id, + linkable_type: work_package.class.name, + provider_id: provider.id + } + } + end + private def page_link_service diff --git a/modules/wikis/app/controllers/wikis/pages_controller.rb b/modules/wikis/app/controllers/wikis/pages_controller.rb index 290b823eb68..d1c94680813 100644 --- a/modules/wikis/app/controllers/wikis/pages_controller.rb +++ b/modules/wikis/app/controllers/wikis/pages_controller.rb @@ -48,16 +48,6 @@ module Wikis end def create_new_page_dialog - linkable = WorkPackage.visible.find(params.expect(:linkable)) - provider = Provider.visible.find(params.expect(:provider)) - form_object = Forms::CreateNewWikiPageFormModel.new(linkable_id: linkable.id, - linkable_type: linkable.class.name, - provider_id: provider.id, - page_title: nil) - respond_with_dialog Wikis::CreateNewWikiPageDialog.new(form_object) - end - - def continue_create_new_page_dialog params = create_new_page_params form_object = Forms::CreateNewWikiPageFormModel.new(linkable_id: params[:linkable_id], linkable_type: params[:linkable_type], diff --git a/modules/wikis/config/locales/en.yml b/modules/wikis/config/locales/en.yml index 00311950146..288414cd0e4 100644 --- a/modules/wikis/config/locales/en.yml +++ b/modules/wikis/config/locales/en.yml @@ -34,71 +34,13 @@ en: permission_manage_wiki_page_links: Manage Wiki Page Links project_module_wiki_platforms: Wiki providers wikis: - buttons: - connect_account: Connect %{provider} account - done_continue: Done, continue - open_wiki: Open wiki - save_and_continue: Save and continue - wiki_page: Wiki page - create_new_wiki_page_dialog: - page_title: Title - parent_help_text: Select a parent for this new wiki page. - title: Create new wiki page - delete_relation_page_link_confirmation_dialog: - title: Delete related wiki page link - heading: Delete related wiki page link? - health_checks: - authentication: - existing_token: User token - header: Authentication - user_bound_request: User-based request authentication - base_configuration: - header: Configuration - provider_configured: Configuration complete - errors: - not_configured: The connection could not be validated. Please finish configuration first. - xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. - xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. - xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. - xwiki_oauth_unauthorized: The user token was not recognized by XWiki. - instructions: - xwiki: - integration: XWiki Administration - oauth_application_details_html: The client secret value will not be accessible again after you close this window. Please copy these values into the [XWiki OpenProject Integration settings](xwiki_admin_link). - link_existing_wiki_page_dialog: - title: Add existing wiki page - link_existing_wiki_page_form: - no_results: No wiki pages found - placeholder: Search for a wiki page - work_package_wikis_tab_component: - inline_page_links: Inline page links - referencing_pages: Referenced in - page_links: - errors: - page_not_found: Linked wiki page no longer available - page_access_forbidden: You do not have permission to access this wiki page - unexpected: An unexpected error occurred - page_link_component: - remove: Remove page link - provider_types: - xwiki: - name: XWiki - relation_page_links_component: - link_existing: Existing wiki page - link_new: New wiki page - empty_heading: No related pages - empty_text: Manually add links to other related wiki pages. - oauth_login_component: - heading: Not connected to %{provider} - description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. - connect_button: Connect %{provider} account admin: destroy_confirmation_dialog_component: - title: Delete wiki provider - heading: Permanently delete this wiki provider? description_html: >- The wiki provider %{wiki_provider} and all the related wiki page links will be deleted. In addition, every inline wiki page link will no longer be accessible. This action is irreversible. + heading: Permanently delete this wiki provider? + title: Delete wiki provider forms: general_info_form_component: provider_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. @@ -165,3 +107,61 @@ en: openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth. xwiki_oauth: XWiki OAuth xwiki_oauth_description: Allow OpenProject to access XWiki data using an OAuth. + buttons: + connect_account: Connect %{provider} account + done_continue: Done, continue + open_wiki: Open wiki + save_and_continue: Save and continue + wiki_page: Wiki page + create_new_wiki_page_dialog: + page_title: Title + parent_help_text: Select a parent for this new wiki page. + title: Create new wiki page + delete_relation_page_link_confirmation_dialog: + heading: Delete related wiki page link? + title: Delete related wiki page link + health_checks: + authentication: + existing_token: User token + header: Authentication + user_bound_request: User-based request authentication + base_configuration: + header: Configuration + provider_configured: Configuration complete + errors: + not_configured: The connection could not be validated. Please finish configuration first. + xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. + xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. + xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. + xwiki_oauth_unauthorized: The user token was not recognized by XWiki. + instructions: + xwiki: + integration: XWiki Administration + oauth_application_details_html: The client secret value will not be accessible again after you close this window. Please copy these values into the [XWiki OpenProject Integration settings](xwiki_admin_link). + link_existing_wiki_page_dialog: + title: Add existing wiki page + link_existing_wiki_page_form: + no_results: No wiki pages found + placeholder: Search for a wiki page + oauth_login_component: + connect_button: Connect %{provider} account + description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. + heading: Not connected to %{provider} + page_link_component: + remove: Remove page link + page_links: + errors: + page_access_forbidden: You do not have permission to access this wiki page + page_not_found: Linked wiki page no longer available + unexpected: An unexpected error occurred + provider_types: + xwiki: + name: XWiki + relation_page_links_component: + empty_heading: No related pages + empty_text: Manually add links to other related wiki pages. + link_existing: Existing wiki page + link_new: New wiki page + work_package_wikis_tab_component: + inline_page_links: Inline page links + referencing_pages: Referenced in diff --git a/modules/wikis/config/routes.rb b/modules/wikis/config/routes.rb index 3ed715835be..f4f4fb3c95e 100644 --- a/modules/wikis/config/routes.rb +++ b/modules/wikis/config/routes.rb @@ -76,7 +76,6 @@ Rails.application.routes.draw do resource :wiki_pages, controller: "wikis/pages", only: [] do get :search get :create_new_page_dialog - post :continue_create_new_page_dialog post :create_and_link end end diff --git a/modules/wikis/lib/open_project/wikis/engine.rb b/modules/wikis/lib/open_project/wikis/engine.rb index cb7ff2a78b1..a62eb83f189 100644 --- a/modules/wikis/lib/open_project/wikis/engine.rb +++ b/modules/wikis/lib/open_project/wikis/engine.rb @@ -73,9 +73,7 @@ module OpenProject::Wikis project_module :work_package_tracking do permission :manage_wiki_page_links, { - "wikis/pages": %i[create_and_link - create_new_page_dialog - continue_create_new_page_dialog], + "wikis/pages": %i[create_and_link create_new_page_dialog], "wikis/relation_page_links": %i[create destroy confirm_delete_dialog From 2e96f3379d8e000b80ba01b2051f6d3bba6daef7 Mon Sep 17 00:00:00 2001 From: OpenProject Actions CI Date: Tue, 9 Jun 2026 04:31:52 +0000 Subject: [PATCH 068/107] update locales from crowdin [ci skip] --- config/locales/crowdin/af.yml | 22 +++-- config/locales/crowdin/ar.yml | 22 +++-- config/locales/crowdin/az.yml | 22 +++-- config/locales/crowdin/be.yml | 22 +++-- config/locales/crowdin/bg.yml | 22 +++-- config/locales/crowdin/ca.yml | 22 +++-- config/locales/crowdin/ckb-IR.yml | 22 +++-- config/locales/crowdin/cs.yml | 22 +++-- config/locales/crowdin/da.yml | 22 +++-- config/locales/crowdin/de.yml | 44 ++++++---- config/locales/crowdin/el.yml | 22 +++-- config/locales/crowdin/eo.yml | 22 +++-- config/locales/crowdin/es.yml | 22 +++-- config/locales/crowdin/et.yml | 22 +++-- config/locales/crowdin/eu.yml | 22 +++-- config/locales/crowdin/fa.yml | 22 +++-- config/locales/crowdin/fi.yml | 22 +++-- config/locales/crowdin/fil.yml | 22 +++-- config/locales/crowdin/fr.yml | 22 +++-- config/locales/crowdin/he.yml | 22 +++-- config/locales/crowdin/hi.yml | 22 +++-- config/locales/crowdin/hr.yml | 22 +++-- config/locales/crowdin/hu.yml | 22 +++-- config/locales/crowdin/hy.yml | 22 +++-- config/locales/crowdin/id.yml | 22 +++-- config/locales/crowdin/it.yml | 22 +++-- config/locales/crowdin/ja.yml | 22 +++-- config/locales/crowdin/js-af.yml | 3 - config/locales/crowdin/js-ar.yml | 3 - config/locales/crowdin/js-az.yml | 3 - config/locales/crowdin/js-be.yml | 3 - config/locales/crowdin/js-bg.yml | 3 - config/locales/crowdin/js-ca.yml | 3 - config/locales/crowdin/js-ckb-IR.yml | 3 - config/locales/crowdin/js-cs.yml | 3 - config/locales/crowdin/js-da.yml | 3 - config/locales/crowdin/js-de.yml | 3 - config/locales/crowdin/js-el.yml | 3 - config/locales/crowdin/js-eo.yml | 3 - config/locales/crowdin/js-es.yml | 3 - config/locales/crowdin/js-et.yml | 3 - config/locales/crowdin/js-eu.yml | 3 - config/locales/crowdin/js-fa.yml | 3 - config/locales/crowdin/js-fi.yml | 3 - config/locales/crowdin/js-fil.yml | 3 - config/locales/crowdin/js-fr.yml | 3 - config/locales/crowdin/js-he.yml | 3 - config/locales/crowdin/js-hi.yml | 3 - config/locales/crowdin/js-hr.yml | 3 - config/locales/crowdin/js-hu.yml | 3 - config/locales/crowdin/js-hy.yml | 3 - config/locales/crowdin/js-id.yml | 3 - config/locales/crowdin/js-it.yml | 3 - config/locales/crowdin/js-ja.yml | 3 - config/locales/crowdin/js-ka.yml | 3 - config/locales/crowdin/js-kk.yml | 3 - config/locales/crowdin/js-ko.yml | 3 - config/locales/crowdin/js-lt.yml | 3 - config/locales/crowdin/js-lv.yml | 3 - config/locales/crowdin/js-mn.yml | 3 - config/locales/crowdin/js-ms.yml | 3 - config/locales/crowdin/js-ne.yml | 3 - config/locales/crowdin/js-nl.yml | 3 - config/locales/crowdin/js-no.yml | 3 - config/locales/crowdin/js-pl.yml | 3 - config/locales/crowdin/js-pt-BR.yml | 3 - config/locales/crowdin/js-pt-PT.yml | 3 - config/locales/crowdin/js-ro.yml | 3 - config/locales/crowdin/js-ru.yml | 3 - config/locales/crowdin/js-rw.yml | 3 - config/locales/crowdin/js-si.yml | 3 - config/locales/crowdin/js-sk.yml | 3 - config/locales/crowdin/js-sl.yml | 3 - config/locales/crowdin/js-sr.yml | 3 - config/locales/crowdin/js-sv.yml | 3 - config/locales/crowdin/js-th.yml | 3 - config/locales/crowdin/js-tr.yml | 3 - config/locales/crowdin/js-uk.yml | 3 - config/locales/crowdin/js-uz.yml | 3 - config/locales/crowdin/js-vi.yml | 3 - config/locales/crowdin/js-zh-CN.yml | 3 - config/locales/crowdin/js-zh-TW.yml | 3 - config/locales/crowdin/ka.yml | 22 +++-- config/locales/crowdin/kk.yml | 22 +++-- config/locales/crowdin/ko.yml | 22 +++-- config/locales/crowdin/lt.yml | 22 +++-- config/locales/crowdin/lv.yml | 22 +++-- config/locales/crowdin/mn.yml | 22 +++-- config/locales/crowdin/ms.yml | 22 +++-- config/locales/crowdin/ne.yml | 22 +++-- config/locales/crowdin/nl.yml | 22 +++-- config/locales/crowdin/no.yml | 22 +++-- config/locales/crowdin/pl.yml | 22 +++-- config/locales/crowdin/pt-BR.yml | 22 +++-- config/locales/crowdin/pt-PT.yml | 22 +++-- config/locales/crowdin/ro.yml | 22 +++-- config/locales/crowdin/ru.yml | 22 +++-- config/locales/crowdin/rw.yml | 22 +++-- config/locales/crowdin/si.yml | 22 +++-- config/locales/crowdin/sk.yml | 22 +++-- config/locales/crowdin/sl.yml | 22 +++-- config/locales/crowdin/sr.yml | 22 +++-- config/locales/crowdin/sv.yml | 22 +++-- config/locales/crowdin/th.yml | 22 +++-- config/locales/crowdin/tr.yml | 22 +++-- config/locales/crowdin/uk.yml | 22 +++-- config/locales/crowdin/uz.yml | 22 +++-- config/locales/crowdin/vi.yml | 22 +++-- config/locales/crowdin/zh-CN.yml | 22 +++-- config/locales/crowdin/zh-TW.yml | 22 +++-- .../auth_saml/config/locales/crowdin/nl.yml | 10 +-- .../backlogs/config/locales/crowdin/de.yml | 40 ++++----- .../backlogs/config/locales/crowdin/js-nl.yml | 4 +- .../backlogs/config/locales/crowdin/nl.yml | 2 +- modules/costs/config/locales/crowdin/de.yml | 30 +++---- .../grids/config/locales/crowdin/js-de.yml | 2 +- .../ldap_groups/config/locales/crowdin/de.yml | 20 ++--- modules/meeting/config/locales/crowdin/de.yml | 14 +-- .../config/locales/crowdin/de.yml | 86 +++++++++---------- 119 files changed, 885 insertions(+), 720 deletions(-) diff --git a/config/locales/crowdin/af.yml b/config/locales/crowdin/af.yml index d3fe58758d2..8557a331211 100644 --- a/config/locales/crowdin/af.yml +++ b/config/locales/crowdin/af.yml @@ -2107,17 +2107,14 @@ af: before: must be before %{date}. before_or_equal_to: must be before or equal to %{date}. blank: can't be blank. - not_before_start_date: must not be before the start date. - overlapping_range: overlaps with an existing non-working day range. blank_nested: needs to have the property '%{property}' set. cannot_delete_mapping: is required. Cannot be deleted. - is_for_all_cannot_modify: is for all projects and can therefore not be modified. cant_link_a_work_package_with_a_descendant: A work package cannot be linked to one of its subtasks. circular_dependency: This relation would create a circular dependency. confirmation: doesn't match %{attribute}. could_not_be_copied: "%{dependency} could not be (fully) copied." + datetime_must_be_in_future: must be in the future. does_not_exist: does not exist. - user_already_in_department: User %{user_id} is already a member of department %{department_id}. error_enterprise_only: "%{action} is only available in the OpenProject Enterprise edition." error_unauthorized: may not be accessed. error_readonly: was attempted to be written but is not writable. @@ -2138,36 +2135,38 @@ af: greater_than_or_equal_to: must be greater than or equal to %{count}. greater_than_or_equal_to_start_date: moet groter as of gelyk wees aan die begindatum. greater_than_start_date: moet groter wees as die begindatum. + hexcode_invalid: is not a valid 6-digit hexadecimal color code. inclusion: is not set to one of the allowed values. inclusion_nested: is not set to one of the allowed values at path '%{path}'. invalid: is invalid. invalid_uri: must be a valid URI. invalid_url: is ’n ongeldige bronadres. invalid_url_scheme: 'is not a supported protocol (allowed: %{allowed_schemes}).' + is_for_all_cannot_modify: is for all projects and can therefore not be modified. less_than_or_equal_to: must be less than or equal to %{count}. not_available: is not available due to a system configuration. + not_before_start_date: must not be before the start date. not_deletable: cannot be deleted. not_editable: cannot be edited because it is already in effect. not_current_user: is not the current user. - system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. not_found: not found. not_a_date: is not a valid date. not_a_datetime: is not a valid date time. not_a_number: is not a number. not_allowed: is invalid because of missing permissions. - host_not_allowed: is not an allowed host. not_json: is not parseable as JSON. not_json_object: is not a JSON object. not_an_integer: is not an integer. not_an_iso_date: 'is not a valid date. Required format: YYYY-MM-DD.' not_same_project: doesn't belong to the same project. - datetime_must_be_in_future: must be in the future. odd: must be odd. + overlapping_range: overlaps with an existing non-working day range. regex_match_failed: does not match the regular expression %{expression}. regex_invalid: could not be validated with the associated regular expression. regex_list_invalid: Lines %{invalid_lines} could not be parsed as regular expression. - hexcode_invalid: is not a valid 6-digit hexadecimal color code. smaller_than_or_equal_to_max_length: must be smaller than or equal to maximum length. + ssrf_filtered: violates the SSRF policy of this OpenProject instance. + system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. taken: has already been taken. too_long: is too long (maximum is %{count} characters). too_short: is too short (minimum is %{count} characters). @@ -2180,6 +2179,7 @@ af: url_not_secure_context: 'is not providing a "Secure Context". Either use HTTPS or a loopback address, such as localhost. ' + user_already_in_department: User %{user_id} is already a member of department %{department_id}. wrong_length: is the wrong length (should be %{count} characters). models: group: @@ -3475,6 +3475,12 @@ af: selected: Selected include_sub_items: Include sub-items no_results_text: No results + header: + project_select_component: + all_projects: All projects + favorites: Favorites + leave_project: Leave project + title: Projects toggle_switch: label_on: 'On' label_off: 'Off' diff --git a/config/locales/crowdin/ar.yml b/config/locales/crowdin/ar.yml index c9e2fcdfdc1..c28e9747df2 100644 --- a/config/locales/crowdin/ar.yml +++ b/config/locales/crowdin/ar.yml @@ -2191,17 +2191,14 @@ ar: before: يجب أن يكون قبل %{date}. before_or_equal_to: يجب أن يكون قبل أو يساوي %{date}. blank: لا يمكن أن يكون فارغا. - not_before_start_date: must not be before the start date. - overlapping_range: overlaps with an existing non-working day range. blank_nested: needs to have the property '%{property}' set. cannot_delete_mapping: is required. Cannot be deleted. - is_for_all_cannot_modify: is for all projects and can therefore not be modified. cant_link_a_work_package_with_a_descendant: حزمة العمل لا يمكن أن تكون مرتبطة إلى واحدة من المهام الفرعية. circular_dependency: ان هذه العلاقة خلق تبعية دائرية. confirmation: لا يتطابق مع %{attribute}. could_not_be_copied: "%{dependency} could not be (fully) copied." + datetime_must_be_in_future: must be in the future. does_not_exist: غير موجود. - user_already_in_department: User %{user_id} is already a member of department %{department_id}. error_enterprise_only: "%{action} is only available in the OpenProject Enterprise edition." error_unauthorized: may not be accessed. error_readonly: was attempted to be written but is not writable. @@ -2222,36 +2219,38 @@ ar: greater_than_or_equal_to: يجب أن يكون أكبر أو يساوي%{count}. greater_than_or_equal_to_start_date: يجب أن يكون أكبر أو يساوي تاريخ البدء. greater_than_start_date: يجب أن يكون أكبر من تاريخ البدء. + hexcode_invalid: is not a valid 6-digit hexadecimal color code. inclusion: لم يتم تعيين إلى واحدة من القيم المسموح بها. inclusion_nested: is not set to one of the allowed values at path '%{path}'. invalid: غير صالح. invalid_uri: must be a valid URI. invalid_url: is not a valid URL. invalid_url_scheme: 'is not a supported protocol (allowed: %{allowed_schemes}).' + is_for_all_cannot_modify: is for all projects and can therefore not be modified. less_than_or_equal_to: يجب أن يكون أقل من أو يساوي %{count}. not_available: is not available due to a system configuration. + not_before_start_date: must not be before the start date. not_deletable: cannot be deleted. not_editable: cannot be edited because it is already in effect. not_current_user: is not the current user. - system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. not_found: not found. not_a_date: is not a valid date. not_a_datetime: is not a valid date time. not_a_number: ليس رقماً. not_allowed: is invalid because of missing permissions. - host_not_allowed: is not an allowed host. not_json: is not parseable as JSON. not_json_object: is not a JSON object. not_an_integer: ليس عدداً صحيحاً. not_an_iso_date: 'ليس تاريخًا صالحًا. الشكل المطلوب: YYYY-MM-DD.' not_same_project: لا ينتمي إلى نفس المشروع. - datetime_must_be_in_future: must be in the future. odd: يجب أن يكون فردي. + overlapping_range: overlaps with an existing non-working day range. regex_match_failed: does not match the regular expression %{expression}. regex_invalid: could not be validated with the associated regular expression. regex_list_invalid: Lines %{invalid_lines} could not be parsed as regular expression. - hexcode_invalid: is not a valid 6-digit hexadecimal color code. smaller_than_or_equal_to_max_length: يجب أن يكون أصغر أو يساوي الطول الأعظم. + ssrf_filtered: violates the SSRF policy of this OpenProject instance. + system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. taken: قد اتخذت بالفعل. too_long: طويل جداً (الحد الأقصى من الأحرف %{count}). too_short: قصيرة جداً (الحد الأدنى هو الأحرف %{count}). @@ -2264,6 +2263,7 @@ ar: url_not_secure_context: 'is not providing a "Secure Context". Either use HTTPS or a loopback address, such as localhost. ' + user_already_in_department: User %{user_id} is already a member of department %{department_id}. wrong_length: هو طول خاطئ (يجب أن تكون الأحرف %{count}). models: group: @@ -3721,6 +3721,12 @@ ar: selected: Selected include_sub_items: Include sub-items no_results_text: No results + header: + project_select_component: + all_projects: All projects + favorites: Favorites + leave_project: Leave project + title: Projects toggle_switch: label_on: 'On' label_off: 'Off' diff --git a/config/locales/crowdin/az.yml b/config/locales/crowdin/az.yml index 67fdec3d498..b0692eb5478 100644 --- a/config/locales/crowdin/az.yml +++ b/config/locales/crowdin/az.yml @@ -2107,17 +2107,14 @@ az: before: must be before %{date}. before_or_equal_to: must be before or equal to %{date}. blank: can't be blank. - not_before_start_date: must not be before the start date. - overlapping_range: overlaps with an existing non-working day range. blank_nested: needs to have the property '%{property}' set. cannot_delete_mapping: is required. Cannot be deleted. - is_for_all_cannot_modify: is for all projects and can therefore not be modified. cant_link_a_work_package_with_a_descendant: A work package cannot be linked to one of its subtasks. circular_dependency: This relation would create a circular dependency. confirmation: doesn't match %{attribute}. could_not_be_copied: "%{dependency} could not be (fully) copied." + datetime_must_be_in_future: must be in the future. does_not_exist: does not exist. - user_already_in_department: User %{user_id} is already a member of department %{department_id}. error_enterprise_only: "%{action} is only available in the OpenProject Enterprise edition." error_unauthorized: may not be accessed. error_readonly: was attempted to be written but is not writable. @@ -2138,36 +2135,38 @@ az: greater_than_or_equal_to: must be greater than or equal to %{count}. greater_than_or_equal_to_start_date: must be greater than or equal to the start date. greater_than_start_date: must be greater than the start date. + hexcode_invalid: is not a valid 6-digit hexadecimal color code. inclusion: is not set to one of the allowed values. inclusion_nested: is not set to one of the allowed values at path '%{path}'. invalid: is invalid. invalid_uri: must be a valid URI. invalid_url: is not a valid URL. invalid_url_scheme: 'is not a supported protocol (allowed: %{allowed_schemes}).' + is_for_all_cannot_modify: is for all projects and can therefore not be modified. less_than_or_equal_to: must be less than or equal to %{count}. not_available: is not available due to a system configuration. + not_before_start_date: must not be before the start date. not_deletable: cannot be deleted. not_editable: cannot be edited because it is already in effect. not_current_user: is not the current user. - system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. not_found: not found. not_a_date: is not a valid date. not_a_datetime: is not a valid date time. not_a_number: is not a number. not_allowed: is invalid because of missing permissions. - host_not_allowed: is not an allowed host. not_json: is not parseable as JSON. not_json_object: is not a JSON object. not_an_integer: is not an integer. not_an_iso_date: 'is not a valid date. Required format: YYYY-MM-DD.' not_same_project: doesn't belong to the same project. - datetime_must_be_in_future: must be in the future. odd: must be odd. + overlapping_range: overlaps with an existing non-working day range. regex_match_failed: does not match the regular expression %{expression}. regex_invalid: could not be validated with the associated regular expression. regex_list_invalid: Lines %{invalid_lines} could not be parsed as regular expression. - hexcode_invalid: is not a valid 6-digit hexadecimal color code. smaller_than_or_equal_to_max_length: must be smaller than or equal to maximum length. + ssrf_filtered: violates the SSRF policy of this OpenProject instance. + system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. taken: has already been taken. too_long: is too long (maximum is %{count} characters). too_short: is too short (minimum is %{count} characters). @@ -2180,6 +2179,7 @@ az: url_not_secure_context: 'is not providing a "Secure Context". Either use HTTPS or a loopback address, such as localhost. ' + user_already_in_department: User %{user_id} is already a member of department %{department_id}. wrong_length: is the wrong length (should be %{count} characters). models: group: @@ -3475,6 +3475,12 @@ az: selected: Selected include_sub_items: Include sub-items no_results_text: No results + header: + project_select_component: + all_projects: All projects + favorites: Favorites + leave_project: Leave project + title: Projects toggle_switch: label_on: 'On' label_off: 'Off' diff --git a/config/locales/crowdin/be.yml b/config/locales/crowdin/be.yml index f391eec0147..8c990a5f2f3 100644 --- a/config/locales/crowdin/be.yml +++ b/config/locales/crowdin/be.yml @@ -2149,17 +2149,14 @@ be: before: must be before %{date}. before_or_equal_to: must be before or equal to %{date}. blank: can't be blank. - not_before_start_date: must not be before the start date. - overlapping_range: overlaps with an existing non-working day range. blank_nested: needs to have the property '%{property}' set. cannot_delete_mapping: is required. Cannot be deleted. - is_for_all_cannot_modify: is for all projects and can therefore not be modified. cant_link_a_work_package_with_a_descendant: A work package cannot be linked to one of its subtasks. circular_dependency: This relation would create a circular dependency. confirmation: doesn't match %{attribute}. could_not_be_copied: "%{dependency} could not be (fully) copied." + datetime_must_be_in_future: must be in the future. does_not_exist: does not exist. - user_already_in_department: User %{user_id} is already a member of department %{department_id}. error_enterprise_only: "%{action} is only available in the OpenProject Enterprise edition." error_unauthorized: may not be accessed. error_readonly: was attempted to be written but is not writable. @@ -2180,36 +2177,38 @@ be: greater_than_or_equal_to: must be greater than or equal to %{count}. greater_than_or_equal_to_start_date: must be greater than or equal to the start date. greater_than_start_date: must be greater than the start date. + hexcode_invalid: is not a valid 6-digit hexadecimal color code. inclusion: is not set to one of the allowed values. inclusion_nested: is not set to one of the allowed values at path '%{path}'. invalid: is invalid. invalid_uri: must be a valid URI. invalid_url: is not a valid URL. invalid_url_scheme: 'is not a supported protocol (allowed: %{allowed_schemes}).' + is_for_all_cannot_modify: is for all projects and can therefore not be modified. less_than_or_equal_to: must be less than or equal to %{count}. not_available: is not available due to a system configuration. + not_before_start_date: must not be before the start date. not_deletable: cannot be deleted. not_editable: cannot be edited because it is already in effect. not_current_user: is not the current user. - system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. not_found: not found. not_a_date: is not a valid date. not_a_datetime: is not a valid date time. not_a_number: is not a number. not_allowed: is invalid because of missing permissions. - host_not_allowed: is not an allowed host. not_json: is not parseable as JSON. not_json_object: is not a JSON object. not_an_integer: is not an integer. not_an_iso_date: 'is not a valid date. Required format: YYYY-MM-DD.' not_same_project: doesn't belong to the same project. - datetime_must_be_in_future: must be in the future. odd: must be odd. + overlapping_range: overlaps with an existing non-working day range. regex_match_failed: does not match the regular expression %{expression}. regex_invalid: could not be validated with the associated regular expression. regex_list_invalid: Lines %{invalid_lines} could not be parsed as regular expression. - hexcode_invalid: is not a valid 6-digit hexadecimal color code. smaller_than_or_equal_to_max_length: must be smaller than or equal to maximum length. + ssrf_filtered: violates the SSRF policy of this OpenProject instance. + system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. taken: has already been taken. too_long: is too long (maximum is %{count} characters). too_short: is too short (minimum is %{count} characters). @@ -2222,6 +2221,7 @@ be: url_not_secure_context: 'is not providing a "Secure Context". Either use HTTPS or a loopback address, such as localhost. ' + user_already_in_department: User %{user_id} is already a member of department %{department_id}. wrong_length: is the wrong length (should be %{count} characters). models: group: @@ -3599,6 +3599,12 @@ be: selected: Selected include_sub_items: Include sub-items no_results_text: No results + header: + project_select_component: + all_projects: All projects + favorites: Favorites + leave_project: Leave project + title: Projects toggle_switch: label_on: 'On' label_off: 'Off' diff --git a/config/locales/crowdin/bg.yml b/config/locales/crowdin/bg.yml index ee767431afb..1feb53c06b4 100644 --- a/config/locales/crowdin/bg.yml +++ b/config/locales/crowdin/bg.yml @@ -2107,17 +2107,14 @@ bg: before: трябва да бъде преди %{date}. before_or_equal_to: трябва да бъде преди или е равно на %{date}. blank: не може да бъде празно. - not_before_start_date: must not be before the start date. - overlapping_range: overlaps with an existing non-working day range. blank_nested: трябва да бъде зададено свойството '%{property}'. cannot_delete_mapping: е необходимо. Не може да бъде изтрит. - is_for_all_cannot_modify: is for all projects and can therefore not be modified. cant_link_a_work_package_with_a_descendant: Работния пакет не може да бъде свързан с една от неговите подзадачи. circular_dependency: Тази връзка ще доведе до циклична зависимост. confirmation: не съвпада с %{attribute}. could_not_be_copied: "%{dependency} не може да бъде (напълно) копирана." + datetime_must_be_in_future: must be in the future. does_not_exist: не съществува. - user_already_in_department: User %{user_id} is already a member of department %{department_id}. error_enterprise_only: "%{action} is only available in the OpenProject Enterprise edition." error_unauthorized: не може да бъде осъществен достъп. error_readonly: направен е неуспешен опит за запис @@ -2138,36 +2135,38 @@ bg: greater_than_or_equal_to: трябва да бъде по-голямо от или равно на %{count}. greater_than_or_equal_to_start_date: трябва да бъде по-голяма от или равна на началната дата. greater_than_start_date: трябва да бъде по-голяма от началната дата. + hexcode_invalid: is not a valid 6-digit hexadecimal color code. inclusion: не е зададена, като позволена стойност. inclusion_nested: не е зададена на една от разрешените стойности в пътя '%{path}'. invalid: е невалиден. invalid_uri: must be a valid URI. invalid_url: невалиден URL адрес. invalid_url_scheme: 'не е поддържан протокол (разрешен: %{allowed_schemes}).' + is_for_all_cannot_modify: is for all projects and can therefore not be modified. less_than_or_equal_to: трябва да бъде по-малка или равна на %{count}. not_available: не е наличен поради системна конфигурация. + not_before_start_date: must not be before the start date. not_deletable: не може да бъде изтрито. not_editable: cannot be edited because it is already in effect. not_current_user: не е текущият потребител. - system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. not_found: not found. not_a_date: е невалидна дата not_a_datetime: не е валидна дата и час. not_a_number: не е число. not_allowed: е невалиден поради липса на достъп. - host_not_allowed: is not an allowed host. not_json: is not parseable as JSON. not_json_object: is not a JSON object. not_an_integer: не е цяло число. not_an_iso_date: 'не е валидна дата. Изискван формат: ГГГГ-ММ-ДД.' not_same_project: не принадлежат към един и същ проект. - datetime_must_be_in_future: must be in the future. odd: трябва да бъде нечетен. + overlapping_range: overlaps with an existing non-working day range. regex_match_failed: не съответства на регулярния израз %{expression}. regex_invalid: не може да бъде валидиран със съответния регулярен израз. regex_list_invalid: Lines %{invalid_lines} could not be parsed as regular expression. - hexcode_invalid: is not a valid 6-digit hexadecimal color code. smaller_than_or_equal_to_max_length: трябва да бъде по-малка от или равна на максималната дължина. + ssrf_filtered: violates the SSRF policy of this OpenProject instance. + system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. taken: вече съществува. too_long: е твърде дълго (максимума е %{count} знаци). too_short: е твърде кратък (минимум е %{count} знаци). @@ -2180,6 +2179,7 @@ bg: url_not_secure_context: 'is not providing a "Secure Context". Either use HTTPS or a loopback address, such as localhost. ' + user_already_in_department: User %{user_id} is already a member of department %{department_id}. wrong_length: е грешна дължина (трябва да бъде %{count} знаци). models: group: @@ -3473,6 +3473,12 @@ bg: selected: Selected include_sub_items: Include sub-items no_results_text: No results + header: + project_select_component: + all_projects: All projects + favorites: Favorites + leave_project: Leave project + title: Projects toggle_switch: label_on: 'On' label_off: 'Off' diff --git a/config/locales/crowdin/ca.yml b/config/locales/crowdin/ca.yml index 4be4f3ee57a..843bb7ac093 100644 --- a/config/locales/crowdin/ca.yml +++ b/config/locales/crowdin/ca.yml @@ -2106,17 +2106,14 @@ ca: before: ha de ser abans de %{date}. before_or_equal_to: ha de ser igual o abans de %{date}. blank: no pot estar en blanc. - not_before_start_date: must not be before the start date. - overlapping_range: overlaps with an existing non-working day range. blank_nested: és necessari de definir la propietat '%{property}' . cannot_delete_mapping: is required. Cannot be deleted. - is_for_all_cannot_modify: is for all projects and can therefore not be modified. cant_link_a_work_package_with_a_descendant: Un paquet de treball no es pot enllaçar a una de les seves subtasques. circular_dependency: Aquesta relació crearia una dependència circular. confirmation: no coincideix amb el %{attribute}. could_not_be_copied: "%{dependency} no s'ha pogut copiar (completament)." + datetime_must_be_in_future: must be in the future. does_not_exist: no existeix. - user_already_in_department: User %{user_id} is already a member of department %{department_id}. error_enterprise_only: "%{action} is only available in the OpenProject Enterprise edition." error_unauthorized: no és possible accedir. error_readonly: es va intentar d'escriure-hi però no és modificable. @@ -2137,36 +2134,38 @@ ca: greater_than_or_equal_to: ha de ser més gran o igual a %{count}. greater_than_or_equal_to_start_date: ha de ser major o igual a la data d'inici. greater_than_start_date: ha de ser major que la data d'inici. + hexcode_invalid: is not a valid 6-digit hexadecimal color code. inclusion: no està establert a un dels valors permesos. inclusion_nested: no correspon a un dels valors permesos a la ruta '%{path}'. invalid: no és vàlid. invalid_uri: must be a valid URI. invalid_url: no és una URL vàlida. invalid_url_scheme: 'no és un protocal suportat (permès: %{allowed_schemes}).' + is_for_all_cannot_modify: is for all projects and can therefore not be modified. less_than_or_equal_to: ha de ser menor o igual a %{count}. not_available: no és disponible degut a la configuració del sistema. + not_before_start_date: must not be before the start date. not_deletable: no es pot eliminar. not_editable: cannot be edited because it is already in effect. not_current_user: no és l'usuari actual. - system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. not_found: not found. not_a_date: no és una data vàlida. not_a_datetime: no és una data-i-hora vàlida. not_a_number: no és un número. not_allowed: és invàlid perquè falten permisos. - host_not_allowed: is not an allowed host. not_json: is not parseable as JSON. not_json_object: is not a JSON object. not_an_integer: no és un enter. not_an_iso_date: 'no és una data vàlida. Format requerit: AAAA-MM-DD.' not_same_project: no pertany al mateix projecte. - datetime_must_be_in_future: must be in the future. odd: ha de ser senar. + overlapping_range: overlaps with an existing non-working day range. regex_match_failed: no coincideix amb l'expressió regular %{expression}. regex_invalid: no s'ha pogut validar amb l'expressió regular associada. regex_list_invalid: Lines %{invalid_lines} could not be parsed as regular expression. - hexcode_invalid: is not a valid 6-digit hexadecimal color code. smaller_than_or_equal_to_max_length: ha de ser inferior o igual a la longitud màxima. + ssrf_filtered: violates the SSRF policy of this OpenProject instance. + system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. taken: ja s'està utilitzant. too_long: és massa llarg (el màxim són %{count} caràcters). too_short: és massa curt (el mínim són %{count} caràcters). @@ -2179,6 +2178,7 @@ ca: url_not_secure_context: 'no està proveint un "Context Segur". Utilitza HTTPS o bé una adreça de retroalimentació, com un host local. ' + user_already_in_department: User %{user_id} is already a member of department %{department_id}. wrong_length: la longitud és incorrecta (haurien de ser %{count} caràcters). models: group: @@ -3472,6 +3472,12 @@ ca: selected: Selected include_sub_items: Include sub-items no_results_text: No results + header: + project_select_component: + all_projects: All projects + favorites: Favorites + leave_project: Leave project + title: Projects toggle_switch: label_on: 'On' label_off: 'Off' diff --git a/config/locales/crowdin/ckb-IR.yml b/config/locales/crowdin/ckb-IR.yml index ec73a7a7ed8..d0de29dc59a 100644 --- a/config/locales/crowdin/ckb-IR.yml +++ b/config/locales/crowdin/ckb-IR.yml @@ -2107,17 +2107,14 @@ ckb-IR: before: must be before %{date}. before_or_equal_to: must be before or equal to %{date}. blank: can't be blank. - not_before_start_date: must not be before the start date. - overlapping_range: overlaps with an existing non-working day range. blank_nested: needs to have the property '%{property}' set. cannot_delete_mapping: is required. Cannot be deleted. - is_for_all_cannot_modify: is for all projects and can therefore not be modified. cant_link_a_work_package_with_a_descendant: A work package cannot be linked to one of its subtasks. circular_dependency: This relation would create a circular dependency. confirmation: doesn't match %{attribute}. could_not_be_copied: "%{dependency} could not be (fully) copied." + datetime_must_be_in_future: must be in the future. does_not_exist: does not exist. - user_already_in_department: User %{user_id} is already a member of department %{department_id}. error_enterprise_only: "%{action} is only available in the OpenProject Enterprise edition." error_unauthorized: may not be accessed. error_readonly: was attempted to be written but is not writable. @@ -2138,36 +2135,38 @@ ckb-IR: greater_than_or_equal_to: must be greater than or equal to %{count}. greater_than_or_equal_to_start_date: must be greater than or equal to the start date. greater_than_start_date: must be greater than the start date. + hexcode_invalid: is not a valid 6-digit hexadecimal color code. inclusion: is not set to one of the allowed values. inclusion_nested: is not set to one of the allowed values at path '%{path}'. invalid: is invalid. invalid_uri: must be a valid URI. invalid_url: is not a valid URL. invalid_url_scheme: 'is not a supported protocol (allowed: %{allowed_schemes}).' + is_for_all_cannot_modify: is for all projects and can therefore not be modified. less_than_or_equal_to: must be less than or equal to %{count}. not_available: is not available due to a system configuration. + not_before_start_date: must not be before the start date. not_deletable: cannot be deleted. not_editable: cannot be edited because it is already in effect. not_current_user: is not the current user. - system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. not_found: not found. not_a_date: is not a valid date. not_a_datetime: is not a valid date time. not_a_number: is not a number. not_allowed: is invalid because of missing permissions. - host_not_allowed: is not an allowed host. not_json: is not parseable as JSON. not_json_object: is not a JSON object. not_an_integer: is not an integer. not_an_iso_date: 'is not a valid date. Required format: YYYY-MM-DD.' not_same_project: doesn't belong to the same project. - datetime_must_be_in_future: must be in the future. odd: must be odd. + overlapping_range: overlaps with an existing non-working day range. regex_match_failed: does not match the regular expression %{expression}. regex_invalid: could not be validated with the associated regular expression. regex_list_invalid: Lines %{invalid_lines} could not be parsed as regular expression. - hexcode_invalid: is not a valid 6-digit hexadecimal color code. smaller_than_or_equal_to_max_length: must be smaller than or equal to maximum length. + ssrf_filtered: violates the SSRF policy of this OpenProject instance. + system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. taken: has already been taken. too_long: is too long (maximum is %{count} characters). too_short: is too short (minimum is %{count} characters). @@ -2180,6 +2179,7 @@ ckb-IR: url_not_secure_context: 'is not providing a "Secure Context". Either use HTTPS or a loopback address, such as localhost. ' + user_already_in_department: User %{user_id} is already a member of department %{department_id}. wrong_length: is the wrong length (should be %{count} characters). models: group: @@ -3475,6 +3475,12 @@ ckb-IR: selected: Selected include_sub_items: Include sub-items no_results_text: No results + header: + project_select_component: + all_projects: All projects + favorites: Favorites + leave_project: Leave project + title: Projects toggle_switch: label_on: 'On' label_off: 'Off' diff --git a/config/locales/crowdin/cs.yml b/config/locales/crowdin/cs.yml index fb4378b22f0..78858599318 100644 --- a/config/locales/crowdin/cs.yml +++ b/config/locales/crowdin/cs.yml @@ -2151,17 +2151,14 @@ cs: before: musí být před %{date}. before_or_equal_to: musí být před nebo rovno %{date}. blank: nemůže být prázdné. - not_before_start_date: nesmí být před datem zahájení. - overlapping_range: se překrývá se stávajícím rozsahem nepracovního dne. blank_nested: musí mít nastavenou vlastnost '%{property}'. cannot_delete_mapping: je povinné. Nelze odstranit. - is_for_all_cannot_modify: je pro všechny projekty, a proto je nelze měnit. cant_link_a_work_package_with_a_descendant: Pracovní balíček nemůže být propojen s jedním z jeho podúkolů. circular_dependency: Tento vztah by vytvořil kruhovou závislost. confirmation: neshoduje se s %{attribute}. could_not_be_copied: "%{dependency} nemůže být (zcela) zkopírován." + datetime_must_be_in_future: musí být v budoucnosti. does_not_exist: neexistuje. - user_already_in_department: User %{user_id} is already a member of department %{department_id}. error_enterprise_only: "%{action} is only available in the OpenProject Enterprise edition." error_unauthorized: není přístupný. error_readonly: se pokusil být napsán, ale není zapisovatelný. @@ -2182,36 +2179,38 @@ cs: greater_than_or_equal_to: musí být větší než nebo rovno %{count}. greater_than_or_equal_to_start_date: musí být větší nebo rovno počátečnímu datu. greater_than_start_date: musí být větší než počáteční datum. + hexcode_invalid: není platným 6-místným hexadecimálním barevným kódem. inclusion: není nastavena na jednu z povolených hodnot. inclusion_nested: není nastavena na jednu z povolených hodnot na cestě '%{path}'. invalid: je neplatné. invalid_uri: must be a valid URI. invalid_url: není platná adresa URL. invalid_url_scheme: 'není podporovaný protokol (povoleny: %{allowed_schemes}).' + is_for_all_cannot_modify: je pro všechny projekty, a proto je nelze měnit. less_than_or_equal_to: musí být menší než nebo rovno %{count}. not_available: není k dispozici kvůli konfiguraci systému. + not_before_start_date: nesmí být před datem zahájení. not_deletable: nelze odstranit not_editable: nelze upravit, protože již platí. not_current_user: není aktuální uživatel. - system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. not_found: nenalezeno. not_a_date: není platné datum. not_a_datetime: není platný čas. not_a_number: není číslo. not_allowed: je neplatný z důvodu chybějících oprávnění. - host_not_allowed: is not an allowed host. not_json: nelze přečíst jako JSON. not_json_object: není platným JSON objektem. not_an_integer: není celé číslo. not_an_iso_date: 'není platné datum. Požadovaný formát: RRRR-MM-DD.' not_same_project: nepatří do stejného projektu. - datetime_must_be_in_future: musí být v budoucnosti. odd: musí být liché. + overlapping_range: se překrývá se stávajícím rozsahem nepracovního dne. regex_match_failed: neodpovídá regulárnímu výrazu %{expression}. regex_invalid: nelze ověřit s přidruženým regulárním výrazem. regex_list_invalid: Lines %{invalid_lines} could not be parsed as regular expression. - hexcode_invalid: není platným 6-místným hexadecimálním barevným kódem. smaller_than_or_equal_to_max_length: musí být menší než nebo rovno maximální délce. + ssrf_filtered: violates the SSRF policy of this OpenProject instance. + system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. taken: je již použito. too_long: je příliš dlouhý (maximum je %{count} znaků). too_short: je příliš krátký (minimum je %{count} znaků). @@ -2224,6 +2223,7 @@ cs: url_not_secure_context: 'neposkytuje "bezpečný kontext". Buď použijte HTTPS nebo adresu pro smyčku, jako je localhost. ' + user_already_in_department: User %{user_id} is already a member of department %{department_id}. wrong_length: má chybnou délku (měla by být %{count} znaků). models: group: @@ -3601,6 +3601,12 @@ cs: selected: Vybráno include_sub_items: Zahrnout dílčí položky no_results_text: Žádné výsledky + header: + project_select_component: + all_projects: All projects + favorites: Favorites + leave_project: Leave project + title: Projects toggle_switch: label_on: Zap. label_off: Vyp. diff --git a/config/locales/crowdin/da.yml b/config/locales/crowdin/da.yml index b2016dab9c7..ff143f322ce 100644 --- a/config/locales/crowdin/da.yml +++ b/config/locales/crowdin/da.yml @@ -2106,17 +2106,14 @@ da: before: skal være før %{date}. before_or_equal_to: skal være senest %{date}. blank: må ikke være tomt. - not_before_start_date: must not be before the start date. - overlapping_range: overlaps with an existing non-working day range. blank_nested: needs to have the property '%{property}' set. cannot_delete_mapping: is required. Cannot be deleted. - is_for_all_cannot_modify: is for all projects and can therefore not be modified. cant_link_a_work_package_with_a_descendant: En arbejdspakke kan ikke knyttes til en af dens underopgaver. circular_dependency: Denne relation vil skabe en cirkulær afhængighed. confirmation: matcher ikke %{attribute}. could_not_be_copied: "%{dependency} could not be (fully) copied." + datetime_must_be_in_future: must be in the future. does_not_exist: findes ikke. - user_already_in_department: User %{user_id} is already a member of department %{department_id}. error_enterprise_only: "%{action} is only available in the OpenProject Enterprise edition." error_unauthorized: kan muligvis ikke tilgås. error_readonly: was attempted to be written but is not writable. @@ -2137,36 +2134,38 @@ da: greater_than_or_equal_to: skal være større end eller lig med %{count}. greater_than_or_equal_to_start_date: must be greater than or equal to the start date. greater_than_start_date: must be greater than the start date. + hexcode_invalid: is not a valid 6-digit hexadecimal color code. inclusion: er ikke sat til en tilladt værdi. inclusion_nested: is not set to one of the allowed values at path '%{path}'. invalid: er ugyldig. invalid_uri: must be a valid URI. invalid_url: is not a valid URL. invalid_url_scheme: 'is not a supported protocol (allowed: %{allowed_schemes}).' + is_for_all_cannot_modify: is for all projects and can therefore not be modified. less_than_or_equal_to: skal være mindre end eller lig med %{count}. not_available: is not available due to a system configuration. + not_before_start_date: must not be before the start date. not_deletable: Kan ikke slettes not_editable: cannot be edited because it is already in effect. not_current_user: er ikke den aktuelle bruger. - system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. not_found: not found. not_a_date: is not a valid date. not_a_datetime: is not a valid date time. not_a_number: er ikke et tal. not_allowed: is invalid because of missing permissions. - host_not_allowed: is not an allowed host. not_json: is not parseable as JSON. not_json_object: is not a JSON object. not_an_integer: er ikke et heltal. not_an_iso_date: 'is not a valid date. Required format: YYYY-MM-DD.' not_same_project: hører ikke til samme projekt. - datetime_must_be_in_future: must be in the future. odd: skal være ulige. + overlapping_range: overlaps with an existing non-working day range. regex_match_failed: does not match the regular expression %{expression}. regex_invalid: could not be validated with the associated regular expression. regex_list_invalid: Lines %{invalid_lines} could not be parsed as regular expression. - hexcode_invalid: is not a valid 6-digit hexadecimal color code. smaller_than_or_equal_to_max_length: skal være mindre end eller lig den maksimale længde. + ssrf_filtered: violates the SSRF policy of this OpenProject instance. + system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. taken: er allerede taget. too_long: 'er for lang (maks.: %{count} tegn).' too_short: 'er for kort (min.: %{count} tegn).' @@ -2179,6 +2178,7 @@ da: url_not_secure_context: 'is not providing a "Secure Context". Either use HTTPS or a loopback address, such as localhost. ' + user_already_in_department: User %{user_id} is already a member of department %{department_id}. wrong_length: har forkert længde (burde være %{count} tegn). models: group: @@ -3474,6 +3474,12 @@ da: selected: Selected include_sub_items: Include sub-items no_results_text: No results + header: + project_select_component: + all_projects: All projects + favorites: Favorites + leave_project: Leave project + title: Projects toggle_switch: label_on: 'On' label_off: 'Off' diff --git a/config/locales/crowdin/de.yml b/config/locales/crowdin/de.yml index ffe4404868e..9e098c82f4b 100644 --- a/config/locales/crowdin/de.yml +++ b/config/locales/crowdin/de.yml @@ -460,7 +460,7 @@ de: dialog: title: Arbeitspaket-Kennungen ändern heading: Aktivieren Sie projektspezifische Arbeitspaket-Kennungen? - description: 'This will change IDs for all work packages in all projects in this instance. Previous identifiers and URLs will continue to work. This change will take some time to complete. + description: 'Dadurch werden die IDs für alle Arbeitspakete in allen Projekten in diesem Fall geändert. Die bisherigen Identifikatoren und URLs werden weiterhin funktionieren. Diese Änderung wird einige Zeit in Anspruch nehmen. ' confirm_button: Kennungen ändern @@ -940,7 +940,7 @@ de: change_identifier_dialog_title: Projektkennung ändern change_identifier_format_hint_semantic: Nur Großbuchstaben (A-Z), Zahlen oder Unterstriche erlaubt. Maximal 10 Zeichen. Muss mit einem Buchstaben beginnen. change_identifier_format_hint_legacy: Nur Kleinbuchstaben (a-z), Zahlen, Bindestriche oder Unterstriche erlaubt. - change_identifier_warning: 'This will permanently change identifiers and URLs of all work packages in this project. The previous identifiers and URLs will nevertheless continue to work. + change_identifier_warning: 'Dies wird die Kennungen und URLs aller Arbeitspakete in diesem Projekt dauerhaft ändern. Die bisherigen Werte werden jedoch weiterhin funktionieren. ' subitems: @@ -2103,17 +2103,14 @@ de: before: muss vor %{date} sein. before_or_equal_to: muss vor oder gleich %{date} sein. blank: muss ausgefüllt werden. - not_before_start_date: darf nicht vor dem Startdatum liegen. - overlapping_range: überschneidet sich mit einem bereits existierenden arbeitsfreien Zeitraum. blank_nested: muss die Eigenschaft '%{property}' gesetzt haben. cannot_delete_mapping: ist erforderlich. Kann nicht gelöscht werden. - is_for_all_cannot_modify: gilt für alle Projekte und kann daher nicht geändert werden. cant_link_a_work_package_with_a_descendant: Ein Arbeitspaket kann nicht mit einer seiner Unteraufgaben verlinkt werden. circular_dependency: Diese Beziehung würde eine zyklische Abhängigkeit erzeugen. confirmation: stimmt nicht mit %{attribute} überein. could_not_be_copied: "%{dependency} konnte nicht (vollständig) kopiert werden." + datetime_must_be_in_future: muss in der Zukunft liegen. does_not_exist: existiert nicht. - user_already_in_department: Der Benutzer %{user_id} ist bereits Mitglied der Abteilung %{department_id}. error_enterprise_only: "%{action} ist nur in der OpenProject Enterprise Edition verfügbar." error_unauthorized: kann nicht zugegriffen werden. error_readonly: wurde versucht zu beschreiben, ist aber nicht beschreibbar. @@ -2134,36 +2131,38 @@ de: greater_than_or_equal_to: muss größer oder gleich %{count} sein. greater_than_or_equal_to_start_date: muss größer als oder gleich dem Anfangsdatum sein. greater_than_start_date: muss größer als das Anfangsdatum sein. + hexcode_invalid: ist kein gültiger 6-stelliger hexadezimaler Farbcode. inclusion: ist nicht auf einen erlaubten Wert gesetzt. inclusion_nested: ist nicht auf einen der erlaubten Werte im Pfad '%{path} ' gesetzt. invalid: ist ungültig. invalid_uri: muss eine gültige URI sein. invalid_url: ist keine gültige URL. invalid_url_scheme: 'ist kein unterstütztes Protokoll (erlaubt: %{allowed_schemes}).' + is_for_all_cannot_modify: gilt für alle Projekte und kann daher nicht geändert werden. less_than_or_equal_to: muss kleiner oder gleich %{count} sein. not_available: ist aufgrund einer Systemkonfiguration nicht verfügbar. + not_before_start_date: darf nicht vor dem Startdatum liegen. not_deletable: kann nicht entfernt werden. not_editable: kann nicht bearbeitet werden, da sie bereits in Kraft ist. not_current_user: ist nicht der aktuelle Benutzer. - system_wide_non_working_day_exists: widerspricht einem systemweiten Nicht-Arbeitstag für dieses Datum. not_found: nicht gefunden. not_a_date: ist kein gültiges Datum. not_a_datetime: ist kein gültiges Datum. not_a_number: ist keine Zahl. not_allowed: ist ungültig aufgrund fehlender Berechtigungen. - host_not_allowed: ist kein erlaubter Host. not_json: konnte nicht als JSON gelsen werden. not_json_object: ist kein gültiges JSON-Objekt. not_an_integer: ist keine ganzzahlige Zahl. not_an_iso_date: 'ist kein gültiges Datum - Erwartetes Format: YYY-MM-DD.' not_same_project: gehört nicht zum selben Projekt. - datetime_must_be_in_future: muss in der Zukunft liegen. odd: muss ungerade sein. + overlapping_range: überschneidet sich mit einem bereits existierenden arbeitsfreien Zeitraum. regex_match_failed: stimmt nicht mit dem regulären Ausdruck %{expression} überein. regex_invalid: konnte nicht mit dem zugehörigen regulären Ausdruck überprüft werden. regex_list_invalid: Die Zeilen %{invalid_lines} konnten nicht als regulärer Ausdruck gelesen werden. - hexcode_invalid: ist kein gültiger 6-stelliger hexadezimaler Farbcode. smaller_than_or_equal_to_max_length: muss kleiner als oder gleich der maximalen Länge sein. + ssrf_filtered: violates the SSRF policy of this OpenProject instance. + system_wide_non_working_day_exists: widerspricht einem systemweiten Nicht-Arbeitstag für dieses Datum. taken: ist bereits vergeben. too_long: ist zu lang (nicht mehr als %{count} Zeichen). too_short: ist zu kurz (nicht weniger als %{count} Zeichen). @@ -2176,6 +2175,7 @@ de: url_not_secure_context: 'stellt keinen "Secure Context" zur Verfügung: Benutzen Sie entweder HTTPS oder eine Loopback-Adresse, wie z.B. localhost. ' + user_already_in_department: Der Benutzer %{user_id} ist bereits Mitglied der Abteilung %{department_id}. wrong_length: hat die falsche Länge (muss genau %{count} Zeichen haben). models: group: @@ -3158,8 +3158,8 @@ de: edit_attribute_groups: description: 'Anpassen der Form-Konfiguration mit diesen zusätzlichen Add-ons:' features: - groups: Add new attribute sections - rename: Rename attribute sections + groups: Neue Attributabschnitte hinzufügen + rename: Attributabschnitte umbenennen related: Tabelle mit zugehörigen Arbeitspaketen hinzufügen readonly_work_packages: description: Arbeitspakete in bestimmten Status als schreibgeschützt markieren. @@ -3469,6 +3469,12 @@ de: selected: Ausgewählt include_sub_items: Unterelemente einbeziehen no_results_text: Keine Ergebnisse + header: + project_select_component: + all_projects: All projects + favorites: Favorites + leave_project: Leave project + title: Projects toggle_switch: label_on: Ein label_off: Aus @@ -3528,12 +3534,12 @@ de: new_features_list: line_0: Project-based work package identifiers for clearer references. line_1: Jira Migrator support for Jira identifiers, due dates, and more. - line_2: Option to exclude work package types from Backlogs. - line_3: Redesigned sprint views. - line_4: Improved work package linking across Documents and text editors. - line_5: More flexible meeting schedules and reduced email notification noise. - line_6: Nested groups for organizational structures and inherited permissions. - line_7: Improved administration interfaces for workflows, users, and type configuration. + line_2: Option Arbeitspakettypen und -status in Backlogs auszuschließen. + line_3: Neu gestaltete Sprint-Ansichten. + line_4: Verbesserte Verknüpfung von Arbeitspaketen zwischen dem Dokumenten-Modul und Texteditoren. + line_5: Flexiblere Besprechungspläne und weniger E-Mail-Benachrichtigungen. + line_6: Verschachtelte Gruppen für Organisationsstrukturen und vererbte Berechtigungen. + line_7: Verbesserte Verwaltungsoberflächen für Workflows, Benutzer und Typkonfiguration. links: upgrade_enterprise_edition: Auf Enterprise Edition upgraden postgres_migration: Migration Ihrer Installation zu PostgreSQL @@ -5369,7 +5375,7 @@ de: setting_welcome_on_homescreen: Willkommens-Block auf Startseite anzeigen setting_work_packages_identifier_classic: Instanzweite numerische Sequenz (Standard) setting_work_packages_identifier_classic_caption: 'Every work package gets a sequential number starting with 1 (for example, #1234). The numbers are unique within the instance and remain the same even if work packages are moved between projects.' - setting_work_packages_identifier_semantic: Project-based semantic identifiers (Beta) + setting_work_packages_identifier_semantic: Projektspezifische semantische Kennungen (Beta) setting_work_packages_identifier_semantic_caption: Every project has a unique project identifier prefixed to a number (for example, PROJ-11). The numbering of each project starts at 1. If a work package is moved to another project, a new identifier is generated but the old one will continue to function. setting_work_package_list_default_highlighting_mode: Standard Hervorhebung setting_work_package_list_default_highlighted_attributes: Voreinstellung Inline Hervorherbung diff --git a/config/locales/crowdin/el.yml b/config/locales/crowdin/el.yml index 2a38bd0ade8..cf2213f4065 100644 --- a/config/locales/crowdin/el.yml +++ b/config/locales/crowdin/el.yml @@ -2106,17 +2106,14 @@ el: before: πρέπει να είναι πριν από %{date}. before_or_equal_to: πρέπει να είναι πριν ή ίσο με %{date}. blank: δεν πρέπει να είναι κενό. - not_before_start_date: must not be before the start date. - overlapping_range: overlaps with an existing non-working day range. blank_nested: needs to have the property '%{property}' set. cannot_delete_mapping: is required. Cannot be deleted. - is_for_all_cannot_modify: is for all projects and can therefore not be modified. cant_link_a_work_package_with_a_descendant: Ένα πακέτο εργασίας δεν μπορεί να συνδεθεί με μια από τις υποεργασίες του. circular_dependency: Αυτή η σχέση θα δημιουργήσει κυκλική εξάρτηση. confirmation: δεν ταιριάζει με %{attribute}. could_not_be_copied: "%{dependency} δεν μπόρεσε να αντιγραφεί (πλήρως)." + datetime_must_be_in_future: must be in the future. does_not_exist: δεν υπάρχει. - user_already_in_department: User %{user_id} is already a member of department %{department_id}. error_enterprise_only: "%{action} is only available in the OpenProject Enterprise edition." error_unauthorized: δεν είναι δυνατή η πρόσβαση. error_readonly: επιχειρήθηκε να εγγραφεί αλλά δεν ήταν εγγράψιμο. @@ -2137,36 +2134,38 @@ el: greater_than_or_equal_to: πρέπει να είναι μεγαλύτερο ή ίσο με %{count}. greater_than_or_equal_to_start_date: πρέπει να είναι μεγαλύτερη ή ίση με τη ημερομηνία έναρξης. greater_than_start_date: πρέπει να είναι μεγαλύτερη από τη ημερομηνία έναρξης. + hexcode_invalid: is not a valid 6-digit hexadecimal color code. inclusion: δεν έχει οριστεί σε μια από τις επιτρεπόμενες τιμές. inclusion_nested: is not set to one of the allowed values at path '%{path}'. invalid: δεν είναι έγκυρο. invalid_uri: must be a valid URI. invalid_url: δεν είναι μια έγκυρη διεύθυνση URL. invalid_url_scheme: 'δεν είναι υποστηριζόμενο πρωτόκολλο (επιτρεπόμενα: %{allowed_schemes}).' + is_for_all_cannot_modify: is for all projects and can therefore not be modified. less_than_or_equal_to: πρέπει να είναι μικρότερο ή ίσο με %{count}. not_available: is not available due to a system configuration. + not_before_start_date: must not be before the start date. not_deletable: δεν μπορεί να διαγραφεί. not_editable: cannot be edited because it is already in effect. not_current_user: δεν είναι ο τρέχων χρήστης. - system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. not_found: not found. not_a_date: δεν είναι έγκυρη ημερομηνία. not_a_datetime: δεν είναι έγκυρη ημερομηνία και ώρα. not_a_number: δεν είναι αριθμός. not_allowed: δεν είναι έγκυρο επειδή λείπουν δικαιώματα. - host_not_allowed: is not an allowed host. not_json: is not parseable as JSON. not_json_object: is not a JSON object. not_an_integer: δεν είναι ακέραιος αριθμός. not_an_iso_date: 'δεν είναι έγκυρη ημερομηνία. Απαιτούμενη μορφοποίηση: ΕΕΕΕ-ΜΜ-ΗΗ.' not_same_project: δεν ανήκει στο ίδιο έργο. - datetime_must_be_in_future: must be in the future. odd: πρέπει να είναι μονός. + overlapping_range: overlaps with an existing non-working day range. regex_match_failed: does not match the regular expression %{expression}. regex_invalid: δεν ήταν δυνατή η επικύρωση με τη συσχετιζόμενη κανονική έκφραση. regex_list_invalid: Lines %{invalid_lines} could not be parsed as regular expression. - hexcode_invalid: is not a valid 6-digit hexadecimal color code. smaller_than_or_equal_to_max_length: πρέπει να είναι μικρότερο ή ίσο με το μέγιστο μήκος. + ssrf_filtered: violates the SSRF policy of this OpenProject instance. + system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. taken: έχει ήδη κατοχυρωθεί. too_long: είναι πολύ μεγάλο (το μέγιστο είναι %{count} χαρακτήρες). too_short: είναι πολύ μικρό (το ελάχιστο είναι %{count} χαρακτήρες). @@ -2179,6 +2178,7 @@ el: url_not_secure_context: 'is not providing a "Secure Context". Either use HTTPS or a loopback address, such as localhost. ' + user_already_in_department: User %{user_id} is already a member of department %{department_id}. wrong_length: έχει λάθος μέγεθος (πρέπει να είναι %{count} χαρακτήρες). models: group: @@ -3474,6 +3474,12 @@ el: selected: Selected include_sub_items: Include sub-items no_results_text: No results + header: + project_select_component: + all_projects: All projects + favorites: Favorites + leave_project: Leave project + title: Projects toggle_switch: label_on: 'On' label_off: 'Off' diff --git a/config/locales/crowdin/eo.yml b/config/locales/crowdin/eo.yml index bfc989c284e..cbe73069ad6 100644 --- a/config/locales/crowdin/eo.yml +++ b/config/locales/crowdin/eo.yml @@ -2107,17 +2107,14 @@ eo: before: devas esti antaŭ la %{date}. before_or_equal_to: devas esti antaŭ aŭ egale al %{date}. blank: ne povas esti malplena. - not_before_start_date: must not be before the start date. - overlapping_range: overlaps with an existing non-working day range. blank_nested: needs to have the property '%{property}' set. cannot_delete_mapping: is required. Cannot be deleted. - is_for_all_cannot_modify: is for all projects and can therefore not be modified. cant_link_a_work_package_with_a_descendant: Laborpakaĵo ne povis esti ligita al unu el siaj subtaskoj. circular_dependency: Tiu ĉi rilato povus krei cirklan dependon. confirmation: ne kongruas kun %{attribute} could_not_be_copied: "%{dependency} could not be (fully) copied." + datetime_must_be_in_future: must be in the future. does_not_exist: ne ekzistas. - user_already_in_department: User %{user_id} is already a member of department %{department_id}. error_enterprise_only: "%{action} is only available in the OpenProject Enterprise edition." error_unauthorized: ne povas esti atingita. error_readonly: was attempted to be written but is not writable. @@ -2138,36 +2135,38 @@ eo: greater_than_or_equal_to: devas esti pli granda aŭ egala al %{count}. greater_than_or_equal_to_start_date: devas esti pli granda aŭ egala al la startdato. greater_than_start_date: devas esti pli granda ol la startdato. + hexcode_invalid: is not a valid 6-digit hexadecimal color code. inclusion: is not set to one of the allowed values. inclusion_nested: is not set to one of the allowed values at path '%{path}'. invalid: Ĝi ne estas valida. invalid_uri: must be a valid URI. invalid_url: Ĝi ne estas valida URL. invalid_url_scheme: 'ne estas subtenita protokolo (permesitaj: %{allowed_schemes}).' + is_for_all_cannot_modify: is for all projects and can therefore not be modified. less_than_or_equal_to: devas esti malpli aŭ egala al %{count}. not_available: is not available due to a system configuration. + not_before_start_date: must not be before the start date. not_deletable: cannot be deleted. not_editable: cannot be edited because it is already in effect. not_current_user: ne estas la nuna uzanto. - system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. not_found: not found. not_a_date: Ĝi ne estas valida dato. not_a_datetime: Ĝi ne estas valida dato/horo. not_a_number: Ĝi ne estas numero. not_allowed: nevalida pro manko de permesoj. - host_not_allowed: is not an allowed host. not_json: is not parseable as JSON. not_json_object: is not a JSON object. not_an_integer: ĝi ne estas entjero. not_an_iso_date: 'Ĝi ne estas valida dato. Deviga datumo estas: JJJJ-MM-TT.' not_same_project: doesn't belong to the same project. - datetime_must_be_in_future: must be in the future. odd: devas esti nepara. + overlapping_range: overlaps with an existing non-working day range. regex_match_failed: does not match the regular expression %{expression}. regex_invalid: could not be validated with the associated regular expression. regex_list_invalid: Lines %{invalid_lines} could not be parsed as regular expression. - hexcode_invalid: is not a valid 6-digit hexadecimal color code. smaller_than_or_equal_to_max_length: must be smaller than or equal to maximum length. + ssrf_filtered: violates the SSRF policy of this OpenProject instance. + system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. taken: jam prenita. too_long: is too long (maximum is %{count} characters). too_short: is too short (minimum is %{count} characters). @@ -2180,6 +2179,7 @@ eo: url_not_secure_context: 'is not providing a "Secure Context". Either use HTTPS or a loopback address, such as localhost. ' + user_already_in_department: User %{user_id} is already a member of department %{department_id}. wrong_length: la longeco estas malĝusta (devus esti %{count} signoj). models: group: @@ -3475,6 +3475,12 @@ eo: selected: Selected include_sub_items: Include sub-items no_results_text: No results + header: + project_select_component: + all_projects: All projects + favorites: Favorites + leave_project: Leave project + title: Projects toggle_switch: label_on: 'On' label_off: 'Off' diff --git a/config/locales/crowdin/es.yml b/config/locales/crowdin/es.yml index 1902d4efce4..9604569f0ca 100644 --- a/config/locales/crowdin/es.yml +++ b/config/locales/crowdin/es.yml @@ -2102,17 +2102,14 @@ es: before: debe ser antes de %{date}. before_or_equal_to: debe ser antes o igual a %{date}. blank: no puede estar en blanco. - not_before_start_date: no debe ser anterior a la fecha de inicio. - overlapping_range: se solapa con un intervalo de días no laborables ya existente. blank_nested: necesita tener la propiedad '%{property}' definida. cannot_delete_mapping: es obligatorio. No se puede eliminar. - is_for_all_cannot_modify: es para todos los proyectos y, por tanto, no puede modificarse. cant_link_a_work_package_with_a_descendant: Un paquete de trabajo no puede ser vinculado a una de sus subtareas. circular_dependency: Esta relación podría crear una dependencia circular. confirmation: no coincide con %{attribute}. could_not_be_copied: "%{dependency} no se pudo copiar (en su totalidad)." + datetime_must_be_in_future: debe ser en el futuro. does_not_exist: no existe. - user_already_in_department: El usuario %{user_id} ya es miembro del departamento %{department_id}. error_enterprise_only: "%{action} solo está disponible en OpenProject Enterprise." error_unauthorized: no se puede acceder. error_readonly: se intentó escribir pero no se puede escribir. @@ -2133,36 +2130,38 @@ es: greater_than_or_equal_to: debe ser mayor o igual a %{count}. greater_than_or_equal_to_start_date: debe ser mayor o igual a la fecha de inicio. greater_than_start_date: debe ser mayor que la fecha de inicio. + hexcode_invalid: no es un código de color hexadecimal válido de 6 dígitos. inclusion: no está establecido a uno de los valores permitidos. inclusion_nested: no está establecido en uno de los valores permitidos en la ruta '%{path}'. invalid: no es válido. invalid_uri: debe ser un URI válido. invalid_url: no es una URL válida. invalid_url_scheme: 'no es un protocolo admitido (permitidos: %{allowed_schemes}).' + is_for_all_cannot_modify: es para todos los proyectos y, por tanto, no puede modificarse. less_than_or_equal_to: debe ser menor o igual a %{count}. not_available: no está disponible debido a una configuración del sistema. + not_before_start_date: no debe ser anterior a la fecha de inicio. not_deletable: no se puede eliminar. not_editable: no se puede editar porque ya está en vigor. not_current_user: no es el usuario actual. - system_wide_non_working_day_exists: entra en conflicto con un día no laborable ya establecido para todo el sistema en esta fecha. not_found: no encontrado. not_a_date: no es una fecha válida. not_a_datetime: no es una fecha/hora válida. not_a_number: No es un número. not_allowed: no es válido porque faltan permisos. - host_not_allowed: no es un host permitido. not_json: no se puede analizar como JSON. not_json_object: no es un objeto JSON. not_an_integer: No es un entero. not_an_iso_date: 'no es una fecha válida. Requiere formato: AAAA-MM-DD.' not_same_project: no pertenecen a un mismo proyecto. - datetime_must_be_in_future: debe ser en el futuro. odd: debe ser impar. + overlapping_range: se solapa con un intervalo de días no laborables ya existente. regex_match_failed: no coincide con la expresión regular %{expression}. regex_invalid: no se pudo validar con la expresión regular asociada. regex_list_invalid: Las líneas %{invalid_lines} no se pudieron analizar como expresión regular. - hexcode_invalid: no es un código de color hexadecimal válido de 6 dígitos. smaller_than_or_equal_to_max_length: Debe ser menor o igual que el tamaño maximo. + ssrf_filtered: violates the SSRF policy of this OpenProject instance. + system_wide_non_working_day_exists: entra en conflicto con un día no laborable ya establecido para todo el sistema en esta fecha. taken: Ya se ha tomado. too_long: es demasiado largo (el máximo de caracteres es %{count}). too_short: es demasiado corto (el mínimo de caracteres es %{count}). @@ -2175,6 +2174,7 @@ es: url_not_secure_context: 'no está proveyendo un "Contexto Seguro". Utiliza HTTPS o una dirección loopack, como un localhost. ' + user_already_in_department: El usuario %{user_id} ya es miembro del departamento %{department_id}. wrong_length: la longitud es incorrecta (debe ser %{count} caracteres). models: group: @@ -3466,6 +3466,12 @@ es: selected: Seleccionado include_sub_items: Incluir subelementos no_results_text: No hay resultados + header: + project_select_component: + all_projects: All projects + favorites: Favorites + leave_project: Leave project + title: Projects toggle_switch: label_on: Encendido label_off: Apagado diff --git a/config/locales/crowdin/et.yml b/config/locales/crowdin/et.yml index 3f5bcc206eb..c17c1c1c667 100644 --- a/config/locales/crowdin/et.yml +++ b/config/locales/crowdin/et.yml @@ -2107,17 +2107,14 @@ et: before: must be before %{date}. before_or_equal_to: must be before or equal to %{date}. blank: ei tohi olla tühi. - not_before_start_date: must not be before the start date. - overlapping_range: overlaps with an existing non-working day range. blank_nested: needs to have the property '%{property}' set. cannot_delete_mapping: is required. Cannot be deleted. - is_for_all_cannot_modify: is for all projects and can therefore not be modified. cant_link_a_work_package_with_a_descendant: A work package cannot be linked to one of its subtasks. circular_dependency: This relation would create a circular dependency. confirmation: doesn't match %{attribute}. could_not_be_copied: "%{dependency} could not be (fully) copied." + datetime_must_be_in_future: must be in the future. does_not_exist: pole olemas. - user_already_in_department: User %{user_id} is already a member of department %{department_id}. error_enterprise_only: "%{action} is only available in the OpenProject Enterprise edition." error_unauthorized: may not be accessed. error_readonly: was attempted to be written but is not writable. @@ -2138,36 +2135,38 @@ et: greater_than_or_equal_to: must be greater than or equal to %{count}. greater_than_or_equal_to_start_date: must be greater than or equal to the start date. greater_than_start_date: must be greater than the start date. + hexcode_invalid: is not a valid 6-digit hexadecimal color code. inclusion: is not set to one of the allowed values. inclusion_nested: is not set to one of the allowed values at path '%{path}'. invalid: on vigane. invalid_uri: must be a valid URI. invalid_url: is not a valid URL. invalid_url_scheme: 'is not a supported protocol (allowed: %{allowed_schemes}).' + is_for_all_cannot_modify: is for all projects and can therefore not be modified. less_than_or_equal_to: must be less than or equal to %{count}. not_available: is not available due to a system configuration. + not_before_start_date: must not be before the start date. not_deletable: cannot be deleted. not_editable: cannot be edited because it is already in effect. not_current_user: is not the current user. - system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. not_found: ei leitud. not_a_date: pole korrektne kuupäev. not_a_datetime: is not a valid date time. not_a_number: pole arv. not_allowed: is invalid because of missing permissions. - host_not_allowed: is not an allowed host. not_json: is not parseable as JSON. not_json_object: is not a JSON object. not_an_integer: pole täisarv. not_an_iso_date: 'is not a valid date. Required format: YYYY-MM-DD.' not_same_project: doesn't belong to the same project. - datetime_must_be_in_future: must be in the future. odd: peab olema paaritu arv. + overlapping_range: overlaps with an existing non-working day range. regex_match_failed: does not match the regular expression %{expression}. regex_invalid: could not be validated with the associated regular expression. regex_list_invalid: Lines %{invalid_lines} could not be parsed as regular expression. - hexcode_invalid: is not a valid 6-digit hexadecimal color code. smaller_than_or_equal_to_max_length: must be smaller than or equal to maximum length. + ssrf_filtered: violates the SSRF policy of this OpenProject instance. + system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. taken: on juba kasutusel. too_long: is too long (maximum is %{count} characters). too_short: is too short (minimum is %{count} characters). @@ -2180,6 +2179,7 @@ et: url_not_secure_context: 'is not providing a "Secure Context". Either use HTTPS or a loopback address, such as localhost. ' + user_already_in_department: User %{user_id} is already a member of department %{department_id}. wrong_length: is the wrong length (should be %{count} characters). models: group: @@ -3475,6 +3475,12 @@ et: selected: Selected include_sub_items: Include sub-items no_results_text: No results + header: + project_select_component: + all_projects: All projects + favorites: Favorites + leave_project: Leave project + title: Projects toggle_switch: label_on: 'On' label_off: 'Off' diff --git a/config/locales/crowdin/eu.yml b/config/locales/crowdin/eu.yml index 3a8b16bdb50..983dee910ca 100644 --- a/config/locales/crowdin/eu.yml +++ b/config/locales/crowdin/eu.yml @@ -2107,17 +2107,14 @@ eu: before: must be before %{date}. before_or_equal_to: must be before or equal to %{date}. blank: can't be blank. - not_before_start_date: must not be before the start date. - overlapping_range: overlaps with an existing non-working day range. blank_nested: needs to have the property '%{property}' set. cannot_delete_mapping: is required. Cannot be deleted. - is_for_all_cannot_modify: is for all projects and can therefore not be modified. cant_link_a_work_package_with_a_descendant: A work package cannot be linked to one of its subtasks. circular_dependency: This relation would create a circular dependency. confirmation: doesn't match %{attribute}. could_not_be_copied: "%{dependency} could not be (fully) copied." + datetime_must_be_in_future: must be in the future. does_not_exist: does not exist. - user_already_in_department: User %{user_id} is already a member of department %{department_id}. error_enterprise_only: "%{action} is only available in the OpenProject Enterprise edition." error_unauthorized: may not be accessed. error_readonly: was attempted to be written but is not writable. @@ -2138,36 +2135,38 @@ eu: greater_than_or_equal_to: must be greater than or equal to %{count}. greater_than_or_equal_to_start_date: must be greater than or equal to the start date. greater_than_start_date: must be greater than the start date. + hexcode_invalid: is not a valid 6-digit hexadecimal color code. inclusion: is not set to one of the allowed values. inclusion_nested: is not set to one of the allowed values at path '%{path}'. invalid: is invalid. invalid_uri: must be a valid URI. invalid_url: is not a valid URL. invalid_url_scheme: 'is not a supported protocol (allowed: %{allowed_schemes}).' + is_for_all_cannot_modify: is for all projects and can therefore not be modified. less_than_or_equal_to: must be less than or equal to %{count}. not_available: is not available due to a system configuration. + not_before_start_date: must not be before the start date. not_deletable: cannot be deleted. not_editable: cannot be edited because it is already in effect. not_current_user: is not the current user. - system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. not_found: not found. not_a_date: is not a valid date. not_a_datetime: is not a valid date time. not_a_number: is not a number. not_allowed: is invalid because of missing permissions. - host_not_allowed: is not an allowed host. not_json: is not parseable as JSON. not_json_object: is not a JSON object. not_an_integer: is not an integer. not_an_iso_date: 'is not a valid date. Required format: YYYY-MM-DD.' not_same_project: doesn't belong to the same project. - datetime_must_be_in_future: must be in the future. odd: must be odd. + overlapping_range: overlaps with an existing non-working day range. regex_match_failed: does not match the regular expression %{expression}. regex_invalid: could not be validated with the associated regular expression. regex_list_invalid: Lines %{invalid_lines} could not be parsed as regular expression. - hexcode_invalid: is not a valid 6-digit hexadecimal color code. smaller_than_or_equal_to_max_length: must be smaller than or equal to maximum length. + ssrf_filtered: violates the SSRF policy of this OpenProject instance. + system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. taken: has already been taken. too_long: is too long (maximum is %{count} characters). too_short: is too short (minimum is %{count} characters). @@ -2180,6 +2179,7 @@ eu: url_not_secure_context: 'is not providing a "Secure Context". Either use HTTPS or a loopback address, such as localhost. ' + user_already_in_department: User %{user_id} is already a member of department %{department_id}. wrong_length: is the wrong length (should be %{count} characters). models: group: @@ -3475,6 +3475,12 @@ eu: selected: Selected include_sub_items: Include sub-items no_results_text: No results + header: + project_select_component: + all_projects: All projects + favorites: Favorites + leave_project: Leave project + title: Projects toggle_switch: label_on: 'On' label_off: 'Off' diff --git a/config/locales/crowdin/fa.yml b/config/locales/crowdin/fa.yml index 87c926447a7..34e68b2a10f 100644 --- a/config/locales/crowdin/fa.yml +++ b/config/locales/crowdin/fa.yml @@ -2107,17 +2107,14 @@ fa: before: must be before %{date}. before_or_equal_to: must be before or equal to %{date}. blank: can't be blank. - not_before_start_date: must not be before the start date. - overlapping_range: overlaps with an existing non-working day range. blank_nested: needs to have the property '%{property}' set. cannot_delete_mapping: is required. Cannot be deleted. - is_for_all_cannot_modify: is for all projects and can therefore not be modified. cant_link_a_work_package_with_a_descendant: A work package cannot be linked to one of its subtasks. circular_dependency: This relation would create a circular dependency. confirmation: doesn't match %{attribute}. could_not_be_copied: "%{dependency} could not be (fully) copied." + datetime_must_be_in_future: must be in the future. does_not_exist: does not exist. - user_already_in_department: User %{user_id} is already a member of department %{department_id}. error_enterprise_only: "%{action} is only available in the OpenProject Enterprise edition." error_unauthorized: may not be accessed. error_readonly: was attempted to be written but is not writable. @@ -2138,36 +2135,38 @@ fa: greater_than_or_equal_to: must be greater than or equal to %{count}. greater_than_or_equal_to_start_date: must be greater than or equal to the start date. greater_than_start_date: must be greater than the start date. + hexcode_invalid: is not a valid 6-digit hexadecimal color code. inclusion: is not set to one of the allowed values. inclusion_nested: is not set to one of the allowed values at path '%{path}'. invalid: is invalid. invalid_uri: must be a valid URI. invalid_url: ساختار آدرس صحیح نیست. invalid_url_scheme: 'این پروتکل مجاز نیست (موارد مجاز: %{allowed_schemes}).' + is_for_all_cannot_modify: is for all projects and can therefore not be modified. less_than_or_equal_to: must be less than or equal to %{count}. not_available: is not available due to a system configuration. + not_before_start_date: must not be before the start date. not_deletable: cannot be deleted. not_editable: cannot be edited because it is already in effect. not_current_user: is not the current user. - system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. not_found: not found. not_a_date: is not a valid date. not_a_datetime: is not a valid date time. not_a_number: is not a number. not_allowed: is invalid because of missing permissions. - host_not_allowed: is not an allowed host. not_json: is not parseable as JSON. not_json_object: is not a JSON object. not_an_integer: is not an integer. not_an_iso_date: 'is not a valid date. Required format: YYYY-MM-DD.' not_same_project: doesn't belong to the same project. - datetime_must_be_in_future: must be in the future. odd: must be odd. + overlapping_range: overlaps with an existing non-working day range. regex_match_failed: does not match the regular expression %{expression}. regex_invalid: could not be validated with the associated regular expression. regex_list_invalid: Lines %{invalid_lines} could not be parsed as regular expression. - hexcode_invalid: is not a valid 6-digit hexadecimal color code. smaller_than_or_equal_to_max_length: must be smaller than or equal to maximum length. + ssrf_filtered: violates the SSRF policy of this OpenProject instance. + system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. taken: has already been taken. too_long: is too long (maximum is %{count} characters). too_short: is too short (minimum is %{count} characters). @@ -2180,6 +2179,7 @@ fa: url_not_secure_context: 'is not providing a "Secure Context". Either use HTTPS or a loopback address, such as localhost. ' + user_already_in_department: User %{user_id} is already a member of department %{department_id}. wrong_length: is the wrong length (should be %{count} characters). models: group: @@ -3475,6 +3475,12 @@ fa: selected: Selected include_sub_items: Include sub-items no_results_text: No results + header: + project_select_component: + all_projects: All projects + favorites: Favorites + leave_project: Leave project + title: Projects toggle_switch: label_on: 'On' label_off: 'Off' diff --git a/config/locales/crowdin/fi.yml b/config/locales/crowdin/fi.yml index 977e64726f5..2c8ccb73ea5 100644 --- a/config/locales/crowdin/fi.yml +++ b/config/locales/crowdin/fi.yml @@ -2107,17 +2107,14 @@ fi: before: on oltava ennen %{date}. before_or_equal_to: on oltava %{date} tai sitä ennen. blank: ei voi olla sisällötön. - not_before_start_date: must not be before the start date. - overlapping_range: overlaps with an existing non-working day range. blank_nested: needs to have the property '%{property}' set. cannot_delete_mapping: is required. Cannot be deleted. - is_for_all_cannot_modify: is for all projects and can therefore not be modified. cant_link_a_work_package_with_a_descendant: Tehtävää ei voida yhdistää alitehtäviin. circular_dependency: Tämä riippuvuus loisi kehän. confirmation: ei vastaa %{attribute}. could_not_be_copied: "%{dependency} could not be (fully) copied." + datetime_must_be_in_future: must be in the future. does_not_exist: ei ole olemassa. - user_already_in_department: User %{user_id} is already a member of department %{department_id}. error_enterprise_only: "%{action} is only available in the OpenProject Enterprise edition." error_unauthorized: may not be accessed. error_readonly: was attempted to be written but is not writable. @@ -2138,36 +2135,38 @@ fi: greater_than_or_equal_to: täytyy olla suurempi tai yhtä suuri kuin%{count}. greater_than_or_equal_to_start_date: on oltava suurempi tai yhtä suuri kuin alkamispäivä. greater_than_start_date: tulee olla aloituspäivän jälkeinen. + hexcode_invalid: is not a valid 6-digit hexadecimal color code. inclusion: ei löydy listauksesta. inclusion_nested: is not set to one of the allowed values at path '%{path}'. invalid: ei kelpaa. invalid_uri: must be a valid URI. invalid_url: ei ole kelvollinen URL. invalid_url_scheme: 'is not a supported protocol (allowed: %{allowed_schemes}).' + is_for_all_cannot_modify: is for all projects and can therefore not be modified. less_than_or_equal_to: täytyy olla pienempi tai yhtä suuri kuin %{count}. not_available: is not available due to a system configuration. + not_before_start_date: must not be before the start date. not_deletable: cannot be deleted. not_editable: cannot be edited because it is already in effect. not_current_user: is not the current user. - system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. not_found: not found. not_a_date: ei ole kelvollinen päivämäärä. not_a_datetime: ei ole kelvollinen aika. not_a_number: ei ole numero. not_allowed: is invalid because of missing permissions. - host_not_allowed: is not an allowed host. not_json: is not parseable as JSON. not_json_object: is not a JSON object. not_an_integer: ei ole kokonaisluku. not_an_iso_date: 'ei ole kelvollinen päivämäärä. Vaadittava muoto: VVVV-KK-PP.' not_same_project: ei kuulu samaan projektiin. - datetime_must_be_in_future: must be in the future. odd: täytyy olla pariton. + overlapping_range: overlaps with an existing non-working day range. regex_match_failed: does not match the regular expression %{expression}. regex_invalid: could not be validated with the associated regular expression. regex_list_invalid: Lines %{invalid_lines} could not be parsed as regular expression. - hexcode_invalid: is not a valid 6-digit hexadecimal color code. smaller_than_or_equal_to_max_length: on oltava pienempi tai yhtä suuri kuin suurin sallittu pituus. + ssrf_filtered: violates the SSRF policy of this OpenProject instance. + system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. taken: on jo käytössä. too_long: on liian pitkä (maksimi on %{count} merkkiä). too_short: on liian lyhyt (minimi on %{count} merkkiä). @@ -2180,6 +2179,7 @@ fi: url_not_secure_context: 'is not providing a "Secure Context". Either use HTTPS or a loopback address, such as localhost. ' + user_already_in_department: User %{user_id} is already a member of department %{department_id}. wrong_length: on väärän pituinen (täytyy olla täsmälleen %{count} merkkiä). models: group: @@ -3473,6 +3473,12 @@ fi: selected: Selected include_sub_items: Include sub-items no_results_text: No results + header: + project_select_component: + all_projects: All projects + favorites: Favorites + leave_project: Leave project + title: Projects toggle_switch: label_on: 'On' label_off: 'Off' diff --git a/config/locales/crowdin/fil.yml b/config/locales/crowdin/fil.yml index 591f42ee60f..11411632098 100644 --- a/config/locales/crowdin/fil.yml +++ b/config/locales/crowdin/fil.yml @@ -2107,17 +2107,14 @@ fil: before: dapat ay bago ang %{date}. before_or_equal_to: dapat ay bago o katumbas sa %{date}. blank: hindi pwedeng blanko. - not_before_start_date: must not be before the start date. - overlapping_range: overlaps with an existing non-working day range. blank_nested: needs to have the property '%{property}' set. cannot_delete_mapping: is required. Cannot be deleted. - is_for_all_cannot_modify: is for all projects and can therefore not be modified. cant_link_a_work_package_with_a_descendant: Ang isang package ng pagawaan ay hindi maaring mai-ugnay sa isa sa mga substak. circular_dependency: Itong pakikipag-ugnayan ay lilikha ng kabilugang dependecia. confirmation: hindi tugma %{attribute}. could_not_be_copied: "%{dependency} could not be (fully) copied." + datetime_must_be_in_future: must be in the future. does_not_exist: hindi umiiral. - user_already_in_department: User %{user_id} is already a member of department %{department_id}. error_enterprise_only: "%{action} is only available in the OpenProject Enterprise edition." error_unauthorized: may not be accessed. error_readonly: was attempted to be written but is not writable. @@ -2138,36 +2135,38 @@ fil: greater_than_or_equal_to: dapat ay mas malaki o kapareho sa %{count}. greater_than_or_equal_to_start_date: dapat ay mas malaki kaysa o katumbas sa petsa ng pagsisimula. greater_than_start_date: dapat ay mas malaki kaysa sa petsa ng pagsisiimula. + hexcode_invalid: is not a valid 6-digit hexadecimal color code. inclusion: ay hindi nakatakda sa isa ng mga pinahintulutan halaga. inclusion_nested: is not set to one of the allowed values at path '%{path}'. invalid: ay hindi balido. invalid_uri: must be a valid URI. invalid_url: ay hindi balidong URL. invalid_url_scheme: 'ay hindi suportado ng protocol (pinahintulutan: %{allowed_schemes}).' + is_for_all_cannot_modify: is for all projects and can therefore not be modified. less_than_or_equal_to: dapat ay hindi baba o katumbas sa %{count}. not_available: is not available due to a system configuration. + not_before_start_date: must not be before the start date. not_deletable: cannot be deleted. not_editable: cannot be edited because it is already in effect. not_current_user: is not the current user. - system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. not_found: not found. not_a_date: ay hindi balido ang petsa. not_a_datetime: ay hindi balido ang petsa ng oras. not_a_number: ay hindi numero. not_allowed: is invalid because of missing permissions. - host_not_allowed: is not an allowed host. not_json: is not parseable as JSON. not_json_object: is not a JSON object. not_an_integer: ay hindi integer. not_an_iso_date: 'ay hindi balido ang petsa. Ang kinakailangan format: YYYY-MM-DD.' not_same_project: ay hindi nabibilang sa parehong proyekto. - datetime_must_be_in_future: must be in the future. odd: dapat ay kakaiba. + overlapping_range: overlaps with an existing non-working day range. regex_match_failed: does not match the regular expression %{expression}. regex_invalid: hindi pwedeng mapatunayan sa nauugnay na mga regular na ekspresyon. regex_list_invalid: Lines %{invalid_lines} could not be parsed as regular expression. - hexcode_invalid: is not a valid 6-digit hexadecimal color code. smaller_than_or_equal_to_max_length: dapat ay mas maliit kaysa o katumbas sa pinakamataas na haba. + ssrf_filtered: violates the SSRF policy of this OpenProject instance. + system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. taken: ay nakuha na. too_long: ay masyadong mahaba (pinakamataas ay ang mga %{count} karakter). too_short: ay masyadong mababa (pinakamaliit ay ang mga %{count} karakter. @@ -2180,6 +2179,7 @@ fil: url_not_secure_context: 'is not providing a "Secure Context". Either use HTTPS or a loopback address, such as localhost. ' + user_already_in_department: User %{user_id} is already a member of department %{department_id}. wrong_length: ay ang maling haba (dapat ay %{count} ang mga karakter). models: group: @@ -3475,6 +3475,12 @@ fil: selected: Selected include_sub_items: Include sub-items no_results_text: No results + header: + project_select_component: + all_projects: All projects + favorites: Favorites + leave_project: Leave project + title: Projects toggle_switch: label_on: 'On' label_off: 'Off' diff --git a/config/locales/crowdin/fr.yml b/config/locales/crowdin/fr.yml index 0c4aa066012..293167807de 100644 --- a/config/locales/crowdin/fr.yml +++ b/config/locales/crowdin/fr.yml @@ -2100,17 +2100,14 @@ fr: before: doit être antérieur(e) à %{date}. before_or_equal_to: doit être antérieur(e) ou égal(e) à %{date}. blank: ne peut pas être vide. - not_before_start_date: ne doit pas être avant la date de début. - overlapping_range: chevauche une plage de jours non ouvrables existante. blank_nested: doit avoir la propriété « %{property} » définie. cannot_delete_mapping: est requis. Ne peut être supprimé. - is_for_all_cannot_modify: s'applique à tous les projets et ne peut donc pas être modifié. cant_link_a_work_package_with_a_descendant: Un lot de travaux ne peut pas être lié à l'une de ses sous-tâches. circular_dependency: Cette relation créerait une dépendance circulaire. confirmation: ne correspond pas à %{attribute}. could_not_be_copied: "%{dependency} n'a pas pu être copié (entièrement)." + datetime_must_be_in_future: doit se situer dans le futur. does_not_exist: n'existe pas. - user_already_in_department: L'utilisateur %{user_id} est déjà membre du service %{department_id}. error_enterprise_only: "%{action} n'est disponible que dans l'édition Enterprise d'OpenProject." error_unauthorized: est interdit d'accès. error_readonly: a tenté d'être écrit mais n'est pas accessible en écriture. @@ -2131,36 +2128,38 @@ fr: greater_than_or_equal_to: doit être supérieur ou égal à %{count}. greater_than_or_equal_to_start_date: doit être supérieur ou égal à la date de début. greater_than_start_date: doit être postérieure à la date de début. + hexcode_invalid: n'est pas un code couleur hexadécimal valide à 6 chiffres. inclusion: ne correspond à aucune des valeurs autorisées. inclusion_nested: ne correspond à aucune des valeurs autorisées dans le chemin « %{path} ». invalid: est invalide. invalid_uri: doit être une URI valide. invalid_url: n'est pas une URL valide. invalid_url_scheme: 'n''est pas un protocole pris en charge (autorisés : %{allowed_schemes}).' + is_for_all_cannot_modify: s'applique à tous les projets et ne peut donc pas être modifié. less_than_or_equal_to: doit être inférieur ou égal à %{count}. not_available: n'est pas disponible en raison d'une configuration système. + not_before_start_date: ne doit pas être avant la date de début. not_deletable: ne peut pas être supprimé not_editable: ne peut pas être modifiée car elle est déjà en vigueur. not_current_user: n'est pas l'utilisateur actuel. - system_wide_non_working_day_exists: entre en conflit avec un jour chômé existant dans le système pour cette date. not_found: introuvable. not_a_date: n'est pas une date valide. not_a_datetime: n'est pas une heure valide. not_a_number: n'est pas un nombre. not_allowed: est invalide en raison d'autorisations insuffisantes. - host_not_allowed: n'est pas un hôte autorisé. not_json: ne peut pas être analysé en tant que JSON. not_json_object: n'est pas un objet JSON. not_an_integer: n'est pas un entier. not_an_iso_date: 'n''est pas une date valide. Format requis : AAAA-MM-JJ.' not_same_project: n'appartient pas au même projet. - datetime_must_be_in_future: doit se situer dans le futur. odd: doit être impair. + overlapping_range: chevauche une plage de jours non ouvrables existante. regex_match_failed: ne correspond pas à l'expression régulière %{expression}. regex_invalid: n'a pas pu être validé avec l'expression régulière associée. regex_list_invalid: Les lignes %{invalid_lines} n'ont pas pu être analysées comme des expressions régulières. - hexcode_invalid: n'est pas un code couleur hexadécimal valide à 6 chiffres. smaller_than_or_equal_to_max_length: doit être inférieur ou égal à la longueur maximale. + ssrf_filtered: violates the SSRF policy of this OpenProject instance. + system_wide_non_working_day_exists: entre en conflit avec un jour chômé existant dans le système pour cette date. taken: a déjà été pris. too_long: est trop long (le maximum est de %{count} caractères). too_short: est trop court (le minimum est de %{count} caractères). @@ -2173,6 +2172,7 @@ fr: url_not_secure_context: 'ne fournit pas de « Contexte sécurisé ». Utilisez soit HTTPS, soit une adresse de bouclage, comme localhost. ' + user_already_in_department: L'utilisateur %{user_id} est déjà membre du service %{department_id}. wrong_length: est de mauvaise longueur (devrait être %{count} caractères). models: group: @@ -3468,6 +3468,12 @@ fr: selected: Sélectionné include_sub_items: Inclure les sous-projets no_results_text: Aucun résultat + header: + project_select_component: + all_projects: All projects + favorites: Favorites + leave_project: Leave project + title: Projects toggle_switch: label_on: Activé label_off: Désactivé diff --git a/config/locales/crowdin/he.yml b/config/locales/crowdin/he.yml index 98dc57bd609..7885a81edd6 100644 --- a/config/locales/crowdin/he.yml +++ b/config/locales/crowdin/he.yml @@ -2149,17 +2149,14 @@ he: before: must be before %{date}. before_or_equal_to: must be before or equal to %{date}. blank: can't be blank. - not_before_start_date: must not be before the start date. - overlapping_range: overlaps with an existing non-working day range. blank_nested: needs to have the property '%{property}' set. cannot_delete_mapping: is required. Cannot be deleted. - is_for_all_cannot_modify: is for all projects and can therefore not be modified. cant_link_a_work_package_with_a_descendant: A work package cannot be linked to one of its subtasks. circular_dependency: This relation would create a circular dependency. confirmation: doesn't match %{attribute}. could_not_be_copied: "%{dependency} could not be (fully) copied." + datetime_must_be_in_future: must be in the future. does_not_exist: does not exist. - user_already_in_department: User %{user_id} is already a member of department %{department_id}. error_enterprise_only: "%{action} is only available in the OpenProject Enterprise edition." error_unauthorized: may not be accessed. error_readonly: was attempted to be written but is not writable. @@ -2180,36 +2177,38 @@ he: greater_than_or_equal_to: must be greater than or equal to %{count}. greater_than_or_equal_to_start_date: must be greater than or equal to the start date. greater_than_start_date: must be greater than the start date. + hexcode_invalid: is not a valid 6-digit hexadecimal color code. inclusion: is not set to one of the allowed values. inclusion_nested: is not set to one of the allowed values at path '%{path}'. invalid: is invalid. invalid_uri: must be a valid URI. invalid_url: is not a valid URL. invalid_url_scheme: 'is not a supported protocol (allowed: %{allowed_schemes}).' + is_for_all_cannot_modify: is for all projects and can therefore not be modified. less_than_or_equal_to: must be less than or equal to %{count}. not_available: is not available due to a system configuration. + not_before_start_date: must not be before the start date. not_deletable: cannot be deleted. not_editable: cannot be edited because it is already in effect. not_current_user: זה לא המשתמש הנכון. - system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. not_found: not found. not_a_date: is not a valid date. not_a_datetime: is not a valid date time. not_a_number: is not a number. not_allowed: is invalid because of missing permissions. - host_not_allowed: is not an allowed host. not_json: is not parseable as JSON. not_json_object: is not a JSON object. not_an_integer: is not an integer. not_an_iso_date: 'is not a valid date. Required format: YYYY-MM-DD.' not_same_project: doesn't belong to the same project. - datetime_must_be_in_future: must be in the future. odd: must be odd. + overlapping_range: overlaps with an existing non-working day range. regex_match_failed: does not match the regular expression %{expression}. regex_invalid: could not be validated with the associated regular expression. regex_list_invalid: Lines %{invalid_lines} could not be parsed as regular expression. - hexcode_invalid: is not a valid 6-digit hexadecimal color code. smaller_than_or_equal_to_max_length: must be smaller than or equal to maximum length. + ssrf_filtered: violates the SSRF policy of this OpenProject instance. + system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. taken: has already been taken. too_long: is too long (maximum is %{count} characters). too_short: is too short (minimum is %{count} characters). @@ -2222,6 +2221,7 @@ he: url_not_secure_context: 'is not providing a "Secure Context". Either use HTTPS or a loopback address, such as localhost. ' + user_already_in_department: User %{user_id} is already a member of department %{department_id}. wrong_length: is the wrong length (should be %{count} characters). models: group: @@ -3599,6 +3599,12 @@ he: selected: Selected include_sub_items: Include sub-items no_results_text: No results + header: + project_select_component: + all_projects: All projects + favorites: Favorites + leave_project: Leave project + title: Projects toggle_switch: label_on: 'On' label_off: 'Off' diff --git a/config/locales/crowdin/hi.yml b/config/locales/crowdin/hi.yml index 35a32f69ca6..16fec7582bc 100644 --- a/config/locales/crowdin/hi.yml +++ b/config/locales/crowdin/hi.yml @@ -2107,17 +2107,14 @@ hi: before: must be before %{date}. before_or_equal_to: must be before or equal to %{date}. blank: can't be blank. - not_before_start_date: must not be before the start date. - overlapping_range: overlaps with an existing non-working day range. blank_nested: needs to have the property '%{property}' set. cannot_delete_mapping: is required. Cannot be deleted. - is_for_all_cannot_modify: is for all projects and can therefore not be modified. cant_link_a_work_package_with_a_descendant: A work package cannot be linked to one of its subtasks. circular_dependency: This relation would create a circular dependency. confirmation: doesn't match %{attribute}. could_not_be_copied: "%{dependency} could not be (fully) copied." + datetime_must_be_in_future: must be in the future. does_not_exist: does not exist. - user_already_in_department: User %{user_id} is already a member of department %{department_id}. error_enterprise_only: "%{action} is only available in the OpenProject Enterprise edition." error_unauthorized: may not be accessed. error_readonly: was attempted to be written but is not writable. @@ -2138,36 +2135,38 @@ hi: greater_than_or_equal_to: must be greater than or equal to %{count}. greater_than_or_equal_to_start_date: must be greater than or equal to the start date. greater_than_start_date: must be greater than the start date. + hexcode_invalid: is not a valid 6-digit hexadecimal color code. inclusion: is not set to one of the allowed values. inclusion_nested: is not set to one of the allowed values at path '%{path}'. invalid: is invalid. invalid_uri: must be a valid URI. invalid_url: is not a valid URL. invalid_url_scheme: 'is not a supported protocol (allowed: %{allowed_schemes}).' + is_for_all_cannot_modify: is for all projects and can therefore not be modified. less_than_or_equal_to: must be less than or equal to %{count}. not_available: is not available due to a system configuration. + not_before_start_date: must not be before the start date. not_deletable: cannot be deleted. not_editable: cannot be edited because it is already in effect. not_current_user: is not the current user. - system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. not_found: not found. not_a_date: is not a valid date. not_a_datetime: is not a valid date time. not_a_number: is not a number. not_allowed: अनुपलब्ध अनुमतियों के कारण अमांय है । - host_not_allowed: is not an allowed host. not_json: is not parseable as JSON. not_json_object: is not a JSON object. not_an_integer: is not an integer. not_an_iso_date: 'is not a valid date. Required format: YYYY-MM-DD.' not_same_project: doesn't belong to the same project. - datetime_must_be_in_future: must be in the future. odd: must be odd. + overlapping_range: overlaps with an existing non-working day range. regex_match_failed: does not match the regular expression %{expression}. regex_invalid: could not be validated with the associated regular expression. regex_list_invalid: Lines %{invalid_lines} could not be parsed as regular expression. - hexcode_invalid: is not a valid 6-digit hexadecimal color code. smaller_than_or_equal_to_max_length: must be smaller than or equal to maximum length. + ssrf_filtered: violates the SSRF policy of this OpenProject instance. + system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. taken: has already been taken. too_long: is too long (maximum is %{count} characters). too_short: is too short (minimum is %{count} characters). @@ -2180,6 +2179,7 @@ hi: url_not_secure_context: 'is not providing a "Secure Context". Either use HTTPS or a loopback address, such as localhost. ' + user_already_in_department: User %{user_id} is already a member of department %{department_id}. wrong_length: is the wrong length (should be %{count} characters). models: group: @@ -3475,6 +3475,12 @@ hi: selected: Selected include_sub_items: Include sub-items no_results_text: No results + header: + project_select_component: + all_projects: All projects + favorites: Favorites + leave_project: Leave project + title: Projects toggle_switch: label_on: 'On' label_off: 'Off' diff --git a/config/locales/crowdin/hr.yml b/config/locales/crowdin/hr.yml index a9065e2e865..edbe3c546c1 100644 --- a/config/locales/crowdin/hr.yml +++ b/config/locales/crowdin/hr.yml @@ -2128,17 +2128,14 @@ hr: before: mora biti prije %{date}. before_or_equal_to: mora biti prije ili jednako %{date}. blank: ne može biti prazan unos. - not_before_start_date: must not be before the start date. - overlapping_range: overlaps with an existing non-working day range. blank_nested: needs to have the property '%{property}' set. cannot_delete_mapping: is required. Cannot be deleted. - is_for_all_cannot_modify: is for all projects and can therefore not be modified. cant_link_a_work_package_with_a_descendant: Radni paket ne može biti pridružen podređenim radnim zadacima. circular_dependency: Ova relacija izraditi će skupnu odnosno cirkularnu ovisnost. confirmation: ne odgovara %{attribute}. could_not_be_copied: "%{dependency} could not be (fully) copied." + datetime_must_be_in_future: must be in the future. does_not_exist: ne postoji. - user_already_in_department: User %{user_id} is already a member of department %{department_id}. error_enterprise_only: "%{action} is only available in the OpenProject Enterprise edition." error_unauthorized: may not be accessed. error_readonly: was attempted to be written but is not writable. @@ -2159,36 +2156,38 @@ hr: greater_than_or_equal_to: mora biti veće od ili jednako %{count}. greater_than_or_equal_to_start_date: must be greater than or equal to the start date. greater_than_start_date: must be greater than the start date. + hexcode_invalid: is not a valid 6-digit hexadecimal color code. inclusion: nije postavljeno na jednu od dozvoljenih vrijednosti. inclusion_nested: is not set to one of the allowed values at path '%{path}'. invalid: je nevažeće. invalid_uri: must be a valid URI. invalid_url: nije valjani URL. invalid_url_scheme: 'nije podržani protokol (dozvoljeno: %{allowed_schemes}).' + is_for_all_cannot_modify: is for all projects and can therefore not be modified. less_than_or_equal_to: mora biti manji od ili jednak %{count}. not_available: is not available due to a system configuration. + not_before_start_date: must not be before the start date. not_deletable: cannot be deleted. not_editable: cannot be edited because it is already in effect. not_current_user: is not the current user. - system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. not_found: not found. not_a_date: is not a valid date. not_a_datetime: is not a valid date time. not_a_number: nije tip podataka number. not_allowed: is invalid because of missing permissions. - host_not_allowed: is not an allowed host. not_json: is not parseable as JSON. not_json_object: is not a JSON object. not_an_integer: nije tip podatka integer. not_an_iso_date: 'is not a valid date. Required format: YYYY-MM-DD.' not_same_project: ne pripada istom projektu. - datetime_must_be_in_future: must be in the future. odd: mora biti neparan. + overlapping_range: overlaps with an existing non-working day range. regex_match_failed: does not match the regular expression %{expression}. regex_invalid: could not be validated with the associated regular expression. regex_list_invalid: Lines %{invalid_lines} could not be parsed as regular expression. - hexcode_invalid: is not a valid 6-digit hexadecimal color code. smaller_than_or_equal_to_max_length: mora biti manje od ili jednako maksimalnom trajanju. + ssrf_filtered: violates the SSRF policy of this OpenProject instance. + system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. taken: već je zauzeto. too_long: je predugo (maksimalno %{count} znakova). too_short: je prekratko (minimalno %{count} znakova). @@ -2201,6 +2200,7 @@ hr: url_not_secure_context: 'is not providing a "Secure Context". Either use HTTPS or a loopback address, such as localhost. ' + user_already_in_department: User %{user_id} is already a member of department %{department_id}. wrong_length: je krive duljine (mora biti %{count} znakova). models: group: @@ -3535,6 +3535,12 @@ hr: selected: Selected include_sub_items: Include sub-items no_results_text: No results + header: + project_select_component: + all_projects: All projects + favorites: Favorites + leave_project: Leave project + title: Projects toggle_switch: label_on: 'On' label_off: 'Off' diff --git a/config/locales/crowdin/hu.yml b/config/locales/crowdin/hu.yml index efdbee53010..68bb905805b 100644 --- a/config/locales/crowdin/hu.yml +++ b/config/locales/crowdin/hu.yml @@ -2131,19 +2131,16 @@ hu: before: korábbinak kell lennie, mint %{date}. before_or_equal_to: korábbinak vagy egyenlőnek kell lennie, mint %{date}. blank: nem lehet üres. - not_before_start_date: must not be before the start date. - overlapping_range: overlaps with an existing non-working day range. blank_nested: 'be kell állítani a ''%{property}'' tulajdonságot. ' cannot_delete_mapping: is required. Cannot be deleted. - is_for_all_cannot_modify: is for all projects and can therefore not be modified. cant_link_a_work_package_with_a_descendant: A feladatcsoport nem kapcsolható saját részfeladatához. circular_dependency: Ez a kapcsolat egy körkörös függőséget eredményezne. confirmation: "%{attribute} nem egyezik." could_not_be_copied: A (z) %{dependency} nem másolható (teljesen). + datetime_must_be_in_future: must be in the future. does_not_exist: nem létezik. - user_already_in_department: User %{user_id} is already a member of department %{department_id}. error_enterprise_only: "%{action} is only available in the OpenProject Enterprise edition." error_unauthorized: lehet, hogy nem érhető el. error_readonly: írása megkísérelve, de nem írható. @@ -2164,38 +2161,40 @@ hu: greater_than_or_equal_to: nagyobbnak vagy egyenlőnek kell lennie mint %{count}. greater_than_or_equal_to_start_date: nagyobbnak vagy egyenlőnek kell lennie, mint a kezdő dátum. greater_than_start_date: nagyobbnak kell lennie, mint a kezdő dátum. + hexcode_invalid: is not a valid 6-digit hexadecimal color code. inclusion: nem a megengedett értékek egyike lett beállítva. inclusion_nested: nincs beállítva az '%{path}' elérési útvonalon a megengedett értékek egyikére. invalid: érvénytelen. invalid_uri: must be a valid URI. invalid_url: nem érvényes URL. invalid_url_scheme: 'nem támogatott protokoll (támogatott: %{allowed_schemes}).' + is_for_all_cannot_modify: is for all projects and can therefore not be modified. less_than_or_equal_to: kisebbnek vagy egyenlőnek kell lennie mint, %{count}. not_available: 'nem érhető el a rendszer konfigurációja miatt. ' + not_before_start_date: must not be before the start date. not_deletable: nem törölhető not_editable: cannot be edited because it is already in effect. not_current_user: nem az aktuális felhasználó - system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. not_found: not found. not_a_date: nem érvényes dátum. not_a_datetime: ez nem érvényes dátum. not_a_number: ez nem egy szám. not_allowed: hiányzó engedélyek miatt érvénytelen. - host_not_allowed: is not an allowed host. not_json: is not parseable as JSON. not_json_object: is not a JSON object. not_an_integer: ez nem egy szám. not_an_iso_date: nem érvényes dátum. A szükséges formátum ÉÉÉÉ-HH-NN. not_same_project: nem azonos projekthez tartozik. - datetime_must_be_in_future: must be in the future. odd: páratlan kell legyen. + overlapping_range: overlaps with an existing non-working day range. regex_match_failed: does not match the regular expression %{expression}. regex_invalid: nem lehet a hozzárendelt reguláris kifejezéssel ellenőrizni. regex_list_invalid: Lines %{invalid_lines} could not be parsed as regular expression. - hexcode_invalid: is not a valid 6-digit hexadecimal color code. smaller_than_or_equal_to_max_length: a maximális hossznak kisebbnek vagy egyenlőnek kell lennie. + ssrf_filtered: violates the SSRF policy of this OpenProject instance. + system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. taken: már foglalt. too_long: túl hosszú (nem lehet több %{count} karakternél). too_short: túl rövid (legalább %{count} karakter kell legyen). @@ -2210,6 +2209,7 @@ hu: url_not_secure_context: 'is not providing a "Secure Context". Either use HTTPS or a loopback address, such as localhost. ' + user_already_in_department: User %{user_id} is already a member of department %{department_id}. wrong_length: nem megfelelő hosszúságú (%{count} karakter szükséges). models: group: @@ -3537,6 +3537,12 @@ hu: selected: Selected include_sub_items: Include sub-items no_results_text: No results + header: + project_select_component: + all_projects: All projects + favorites: Favorites + leave_project: Leave project + title: Projects toggle_switch: label_on: 'On' label_off: 'Off' diff --git a/config/locales/crowdin/hy.yml b/config/locales/crowdin/hy.yml index 6570305efa7..82286797ff6 100644 --- a/config/locales/crowdin/hy.yml +++ b/config/locales/crowdin/hy.yml @@ -2107,17 +2107,14 @@ hy: before: must be before %{date}. before_or_equal_to: must be before or equal to %{date}. blank: can't be blank. - not_before_start_date: must not be before the start date. - overlapping_range: overlaps with an existing non-working day range. blank_nested: needs to have the property '%{property}' set. cannot_delete_mapping: is required. Cannot be deleted. - is_for_all_cannot_modify: is for all projects and can therefore not be modified. cant_link_a_work_package_with_a_descendant: A work package cannot be linked to one of its subtasks. circular_dependency: This relation would create a circular dependency. confirmation: doesn't match %{attribute}. could_not_be_copied: "%{dependency} could not be (fully) copied." + datetime_must_be_in_future: must be in the future. does_not_exist: does not exist. - user_already_in_department: User %{user_id} is already a member of department %{department_id}. error_enterprise_only: "%{action} is only available in the OpenProject Enterprise edition." error_unauthorized: may not be accessed. error_readonly: was attempted to be written but is not writable. @@ -2138,36 +2135,38 @@ hy: greater_than_or_equal_to: must be greater than or equal to %{count}. greater_than_or_equal_to_start_date: must be greater than or equal to the start date. greater_than_start_date: must be greater than the start date. + hexcode_invalid: is not a valid 6-digit hexadecimal color code. inclusion: is not set to one of the allowed values. inclusion_nested: is not set to one of the allowed values at path '%{path}'. invalid: is invalid. invalid_uri: must be a valid URI. invalid_url: is not a valid URL. invalid_url_scheme: 'is not a supported protocol (allowed: %{allowed_schemes}).' + is_for_all_cannot_modify: is for all projects and can therefore not be modified. less_than_or_equal_to: must be less than or equal to %{count}. not_available: is not available due to a system configuration. + not_before_start_date: must not be before the start date. not_deletable: cannot be deleted. not_editable: cannot be edited because it is already in effect. not_current_user: is not the current user. - system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. not_found: not found. not_a_date: is not a valid date. not_a_datetime: is not a valid date time. not_a_number: is not a number. not_allowed: is invalid because of missing permissions. - host_not_allowed: is not an allowed host. not_json: is not parseable as JSON. not_json_object: is not a JSON object. not_an_integer: is not an integer. not_an_iso_date: 'is not a valid date. Required format: YYYY-MM-DD.' not_same_project: doesn't belong to the same project. - datetime_must_be_in_future: must be in the future. odd: must be odd. + overlapping_range: overlaps with an existing non-working day range. regex_match_failed: does not match the regular expression %{expression}. regex_invalid: could not be validated with the associated regular expression. regex_list_invalid: Lines %{invalid_lines} could not be parsed as regular expression. - hexcode_invalid: is not a valid 6-digit hexadecimal color code. smaller_than_or_equal_to_max_length: must be smaller than or equal to maximum length. + ssrf_filtered: violates the SSRF policy of this OpenProject instance. + system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. taken: has already been taken. too_long: is too long (maximum is %{count} characters). too_short: is too short (minimum is %{count} characters). @@ -2180,6 +2179,7 @@ hy: url_not_secure_context: 'is not providing a "Secure Context". Either use HTTPS or a loopback address, such as localhost. ' + user_already_in_department: User %{user_id} is already a member of department %{department_id}. wrong_length: is the wrong length (should be %{count} characters). models: group: @@ -3475,6 +3475,12 @@ hy: selected: Selected include_sub_items: Include sub-items no_results_text: No results + header: + project_select_component: + all_projects: All projects + favorites: Favorites + leave_project: Leave project + title: Projects toggle_switch: label_on: 'On' label_off: 'Off' diff --git a/config/locales/crowdin/id.yml b/config/locales/crowdin/id.yml index fdce041aab8..0bda858cae8 100644 --- a/config/locales/crowdin/id.yml +++ b/config/locales/crowdin/id.yml @@ -2090,17 +2090,14 @@ id: before: harus sebelum %{date}. before_or_equal_to: harus sebelum atau maksimal %{date}. blank: harus di isi. - not_before_start_date: must not be before the start date. - overlapping_range: overlaps with an existing non-working day range. blank_nested: harus menyetel properti '%{property}'. cannot_delete_mapping: is required. Cannot be deleted. - is_for_all_cannot_modify: is for all projects and can therefore not be modified. cant_link_a_work_package_with_a_descendant: Work package tidak dapat dihubungkan dengan subtask-nya. circular_dependency: Relasi ini menyebabkan dependensi circular. confirmation: tidak sesuai dengan %{attribute}. could_not_be_copied: "%{dependency} tidak dapat (sepenuhnya) disalin." + datetime_must_be_in_future: must be in the future. does_not_exist: tidak ditemukan. - user_already_in_department: User %{user_id} is already a member of department %{department_id}. error_enterprise_only: "%{action} is only available in the OpenProject Enterprise edition." error_unauthorized: mungkin tidak dapat diakses. error_readonly: Mencoba untuk ditulis tetapi tidak dapat ditulis. @@ -2121,36 +2118,38 @@ id: greater_than_or_equal_to: harus lebih besar atau sama dengan %{count}. greater_than_or_equal_to_start_date: must be greater than or equal to the start date. greater_than_start_date: must be greater than the start date. + hexcode_invalid: is not a valid 6-digit hexadecimal color code. inclusion: belum di set dengan nilai yang diperbolehkan. inclusion_nested: tidak disetel ke salah satu nilai yang diizinkan di jalur '%{path}'. invalid: tidak valid. invalid_uri: must be a valid URI. invalid_url: bukanlah URL yang Valid. invalid_url_scheme: 'bukanlah sebuah protokol yang didukung (diperbolehkan: %{allowed_schemes}).' + is_for_all_cannot_modify: is for all projects and can therefore not be modified. less_than_or_equal_to: harus kurang dari atau sama dengan %{count}. not_available: tidak tersedia karena konfigurasi sistem. + not_before_start_date: must not be before the start date. not_deletable: tidak dapat dihapus. not_editable: cannot be edited because it is already in effect. not_current_user: bukan pengguna saat ini. - system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. not_found: not found. not_a_date: bukan tanggal yang valid. not_a_datetime: bukan tanggal waktu yang valid. not_a_number: harus diisi angka. not_allowed: tidak valid karena tidak ada izin. - host_not_allowed: is not an allowed host. not_json: is not parseable as JSON. not_json_object: is not a JSON object. not_an_integer: harus bilangan bulat. not_an_iso_date: 'is not a valid date. Required format: YYYY-MM-DD.' not_same_project: harus berasal dari proyek yang sama. - datetime_must_be_in_future: must be in the future. odd: harus ganjil. + overlapping_range: overlaps with an existing non-working day range. regex_match_failed: does not match the regular expression %{expression}. regex_invalid: tidak dapat divalidasi dengan ekspresi reguler terkait. regex_list_invalid: Lines %{invalid_lines} could not be parsed as regular expression. - hexcode_invalid: is not a valid 6-digit hexadecimal color code. smaller_than_or_equal_to_max_length: harus lebih kecil atau sama dengan panjang maksimum. + ssrf_filtered: violates the SSRF policy of this OpenProject instance. + system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. taken: sudah dipakai. too_long: panjang karakter maksimal %{count}. too_short: minimal %{count} karakter. @@ -2163,6 +2162,7 @@ id: url_not_secure_context: 'is not providing a "Secure Context". Either use HTTPS or a loopback address, such as localhost. ' + user_already_in_department: User %{user_id} is already a member of department %{department_id}. wrong_length: panjang tidak sesuai (harus %{count} karakter). models: group: @@ -3424,6 +3424,12 @@ id: selected: Selected include_sub_items: Include sub-items no_results_text: No results + header: + project_select_component: + all_projects: All projects + favorites: Favorites + leave_project: Leave project + title: Projects toggle_switch: label_on: 'On' label_off: 'Off' diff --git a/config/locales/crowdin/it.yml b/config/locales/crowdin/it.yml index bc2b09182ba..3a00b71e210 100644 --- a/config/locales/crowdin/it.yml +++ b/config/locales/crowdin/it.yml @@ -2105,17 +2105,14 @@ it: before: deve essere precedente al %{date}. before_or_equal_to: deve essere precedente o uguale al %{date}. blank: non può essere lasciato vuoto. - not_before_start_date: non deve essere prima della data di inizio. - overlapping_range: si sovrappone a un intervallo di giorni non lavorativi esistente. blank_nested: deve avere la proprietà '%{property}' impostata. cannot_delete_mapping: è necessario. Non può essere cancellato. - is_for_all_cannot_modify: è per tutti i progetti e non può quindi essere modificato. cant_link_a_work_package_with_a_descendant: Una macro-attività non può essere collegato a una delle sue sottoattività. circular_dependency: Questa relazione creerebbe una dipendenza circolare. confirmation: non coincide con %{attribute}. could_not_be_copied: "%{dependency} non può essere (completamente) copiato." + datetime_must_be_in_future: deve essere nel futuro. does_not_exist: non esiste. - user_already_in_department: L'utente %{user_id} è già membro del reparto %{department_id}. error_enterprise_only: "%{action} è disponibile solo in OpenProject Enterprise edition." error_unauthorized: potrebbe non essere accessibile. error_readonly: è in sola lettura, pertanto non è stato possibile modificarlo. @@ -2136,36 +2133,38 @@ it: greater_than_or_equal_to: deve essere maggiore o uguale di %{count}. greater_than_or_equal_to_start_date: deve essere successivo o uguale alla data di inizio. greater_than_start_date: deve essere successivo alla data di inizio. + hexcode_invalid: non è un codice colore esadecimale a 6 cifre valido. inclusion: non è impostata su uno dei valori consentiti. inclusion_nested: non è impostato su uno dei valori consentiti al percorso '%{path}'. invalid: non è valido. invalid_uri: deve essere un URI valido. invalid_url: non è un URL valido. invalid_url_scheme: 'non è un protocollo supportato (ammessi: %{allowed_schemes}).' + is_for_all_cannot_modify: è per tutti i progetti e non può quindi essere modificato. less_than_or_equal_to: deve essere inferiore o uguale a %{count}. not_available: non è disponibile a causa di una configurazione di sistema. + not_before_start_date: non deve essere prima della data di inizio. not_deletable: non può essere eliminato. not_editable: non può essere modificato perché è già in vigore. not_current_user: non è l'utente attuale. - system_wide_non_working_day_exists: È in conflitto con un giorno non lavorativo già definito a livello di sistema per questa data. not_found: non trovato. not_a_date: non è una data valida. not_a_datetime: non è un'orario valido. not_a_number: non è un numero. not_allowed: non è valido a causa di autorizzazioni assenti. - host_not_allowed: non è un host consentito. not_json: non è analizzabile come JSON. not_json_object: non è un oggetto JSON. not_an_integer: non è un numero intero. not_an_iso_date: 'non è una data valida. Formato richiesto: AAAA-MM-GG.' not_same_project: non appartiene allo stesso progetto. - datetime_must_be_in_future: deve essere nel futuro. odd: deve essere dispari. + overlapping_range: si sovrappone a un intervallo di giorni non lavorativi esistente. regex_match_failed: non corrisponde all'espressione regolare %{expression}. regex_invalid: non può essere convalidato con l'espressione regolare associata. regex_list_invalid: Le righe %{invalid_lines} non possono essere analizzate come espressione regolare. - hexcode_invalid: non è un codice colore esadecimale a 6 cifre valido. smaller_than_or_equal_to_max_length: deve essere minore o uguale alla lunghezza massima. + ssrf_filtered: violates the SSRF policy of this OpenProject instance. + system_wide_non_working_day_exists: È in conflitto con un giorno non lavorativo già definito a livello di sistema per questa data. taken: è già stato usato. too_long: è troppo lungo (il massimo è %{count} caratteri). too_short: è troppo breve (il minimo è %{count} caratteri). @@ -2178,6 +2177,7 @@ it: url_not_secure_context: 'non fornisce un "Contesto sicuro". Usa HTTPS o un indirizzo di loopback, come localhost. ' + user_already_in_department: L'utente %{user_id} è già membro del reparto %{department_id}. wrong_length: è della lunghezza sbagliata (dovrebbe essere %{count} caratteri). models: group: @@ -3475,6 +3475,12 @@ it: selected: Selezionati include_sub_items: Includi sottovoci no_results_text: Nessun risultato + header: + project_select_component: + all_projects: All projects + favorites: Favorites + leave_project: Leave project + title: Projects toggle_switch: label_on: 'On' label_off: 'Off' diff --git a/config/locales/crowdin/ja.yml b/config/locales/crowdin/ja.yml index c0d04c3859c..b0a5bad9dbd 100644 --- a/config/locales/crowdin/ja.yml +++ b/config/locales/crowdin/ja.yml @@ -2089,17 +2089,14 @@ ja: before: は%{date}の前にしてください。 before_or_equal_to: は%{date}より以前にしてください。 blank: は空白にすることができません。 - not_before_start_date: must not be before the start date. - overlapping_range: overlaps with an existing non-working day range. blank_nested: プロパティ '%{property}' が設定されている必要があります。 cannot_delete_mapping: 必須です。削除できません。 - is_for_all_cannot_modify: はすべてのプロジェクトで使用されているため、変更できません。 cant_link_a_work_package_with_a_descendant: 親子関係にあるワークパッケージ間で関係の設定はできません。 circular_dependency: この関係は循環依存になります。 confirmation: は%{attribute} と一致しません。 could_not_be_copied: "%{dependency} を(完全に)コピーできませんでした。" + datetime_must_be_in_future: 未来に違いないわ。 does_not_exist: は存在しません。 - user_already_in_department: User %{user_id} is already a member of department %{department_id}. error_enterprise_only: "%{action} is only available in the OpenProject Enterprise edition." error_unauthorized: アクセスできません。 error_readonly: 書けませんでした。 @@ -2120,36 +2117,38 @@ ja: greater_than_or_equal_to: は%{count}以上の値にしてください。 greater_than_or_equal_to_start_date: は開始日以後にしてください。 greater_than_start_date: は開始日より後にしてください。 + hexcode_invalid: は有効な6桁の16進カラーコードではない。 inclusion: は許可されている値ではありません。 inclusion_nested: はパス '%{path}' で許可されている値のいずれかに設定されていません。 invalid: は不正な値です。 invalid_uri: must be a valid URI. invalid_url: は有効な URL ではありません。 invalid_url_scheme: 'はサポートされたプロトコルではありません (可能: %{allowed_schemes})。' + is_for_all_cannot_modify: はすべてのプロジェクトで使用されているため、変更できません。 less_than_or_equal_to: は%{count}以下の値にしてください。 not_available: はシステム構成のため使用できません。 + not_before_start_date: must not be before the start date. not_deletable: 削除できません。 not_editable: cannot be edited because it is already in effect. not_current_user: 現在のユーザーではありません。 - system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. not_found: 見つかりません。 not_a_date: は有効な日付ではありません。 not_a_datetime: は有効な日時ではありません。 not_a_number: は数値にしてください。 not_allowed: 権限がないため無効です。 - host_not_allowed: is not an allowed host. not_json: is not parseable as JSON. not_json_object: is not a JSON object. not_an_integer: は整数にしてください。 not_an_iso_date: 'は有効な日付ではありません。必要な形式: YYYY-MM-dd。' not_same_project: は同じプロジェクトに属していません。 - datetime_must_be_in_future: 未来に違いないわ。 odd: は奇数にしてください。 + overlapping_range: overlaps with an existing non-working day range. regex_match_failed: 正規表現 %{expression}と一致しません。 regex_invalid: 関連付けられた正規表現を検証できませんでした。 regex_list_invalid: "%{invalid_lines}行は正規表現として解析できませんでした。" - hexcode_invalid: は有効な6桁の16進カラーコードではない。 smaller_than_or_equal_to_max_length: は最大長さより以下でなければなりません。 + ssrf_filtered: violates the SSRF policy of this OpenProject instance. + system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. taken: は既に使用されています。 too_long: は%{count}文字以内を入力してください。 too_short: は%{count}文字以上を入力してください。 @@ -2162,6 +2161,7 @@ ja: url_not_secure_context: 'は「セキュアコンテキスト」を提供していません。HTTPSを使用するか、localhostのようなループバックアドレスを使用してください。 ' + user_already_in_department: User %{user_id} is already a member of department %{department_id}. wrong_length: は%{count}文字を入力してください。 models: group: @@ -3416,6 +3416,12 @@ ja: selected: 選択済み include_sub_items: サブアイテムを含める no_results_text: 結果がありません + header: + project_select_component: + all_projects: All projects + favorites: Favorites + leave_project: Leave project + title: Projects toggle_switch: label_on: 'On' label_off: 'Off' diff --git a/config/locales/crowdin/js-af.yml b/config/locales/crowdin/js-af.yml index c28091b37c3..d0abb9e18b9 100644 --- a/config/locales/crowdin/js-af.yml +++ b/config/locales/crowdin/js-af.yml @@ -1045,16 +1045,13 @@ af: all: All projects selected: Only selected search_placeholder: Search projects... - search_placeholder_favorites: Search favorites... include_subprojects: Include all sub-projects tooltip: include_all_selected: Project already included since Include all sub-projects is enabled. current_project: This is the current project you are in. does_not_match_search: Project does not match the search criteria. no_results: No project matches your search criteria. - no_favorite_results: No favorite project matches your search criteria. include_workspaces: - search_placeholder: Search... types: program: Program portfolio: Portfolio diff --git a/config/locales/crowdin/js-ar.yml b/config/locales/crowdin/js-ar.yml index c3844f3a4d6..a21b6b2260a 100644 --- a/config/locales/crowdin/js-ar.yml +++ b/config/locales/crowdin/js-ar.yml @@ -1061,16 +1061,13 @@ ar: all: All projects selected: Only selected search_placeholder: Search projects... - search_placeholder_favorites: Search favorites... include_subprojects: Include all sub-projects tooltip: include_all_selected: Project already included since Include all sub-projects is enabled. current_project: This is the current project you are in. does_not_match_search: Project does not match the search criteria. no_results: No project matches your search criteria. - no_favorite_results: No favorite project matches your search criteria. include_workspaces: - search_placeholder: Search... types: program: Program portfolio: Portfolio diff --git a/config/locales/crowdin/js-az.yml b/config/locales/crowdin/js-az.yml index 6856dd03690..9ddb74d8330 100644 --- a/config/locales/crowdin/js-az.yml +++ b/config/locales/crowdin/js-az.yml @@ -1045,16 +1045,13 @@ az: all: All projects selected: Only selected search_placeholder: Search projects... - search_placeholder_favorites: Search favorites... include_subprojects: Include all sub-projects tooltip: include_all_selected: Project already included since Include all sub-projects is enabled. current_project: This is the current project you are in. does_not_match_search: Project does not match the search criteria. no_results: No project matches your search criteria. - no_favorite_results: No favorite project matches your search criteria. include_workspaces: - search_placeholder: Search... types: program: Program portfolio: Portfolio diff --git a/config/locales/crowdin/js-be.yml b/config/locales/crowdin/js-be.yml index 4884b50b2f4..93a7ad7d890 100644 --- a/config/locales/crowdin/js-be.yml +++ b/config/locales/crowdin/js-be.yml @@ -1053,16 +1053,13 @@ be: all: All projects selected: Only selected search_placeholder: Search projects... - search_placeholder_favorites: Search favorites... include_subprojects: Include all sub-projects tooltip: include_all_selected: Project already included since Include all sub-projects is enabled. current_project: This is the current project you are in. does_not_match_search: Project does not match the search criteria. no_results: No project matches your search criteria. - no_favorite_results: No favorite project matches your search criteria. include_workspaces: - search_placeholder: Search... types: program: Program portfolio: Portfolio diff --git a/config/locales/crowdin/js-bg.yml b/config/locales/crowdin/js-bg.yml index 00f9a2c8e21..c1e6a8165fe 100644 --- a/config/locales/crowdin/js-bg.yml +++ b/config/locales/crowdin/js-bg.yml @@ -1045,16 +1045,13 @@ bg: all: All projects selected: Only selected search_placeholder: Search projects... - search_placeholder_favorites: Search favorites... include_subprojects: Include all sub-projects tooltip: include_all_selected: Project already included since Include all sub-projects is enabled. current_project: This is the current project you are in. does_not_match_search: Project does not match the search criteria. no_results: No project matches your search criteria. - no_favorite_results: No favorite project matches your search criteria. include_workspaces: - search_placeholder: Search... types: program: Program portfolio: Portfolio diff --git a/config/locales/crowdin/js-ca.yml b/config/locales/crowdin/js-ca.yml index 7cf16d34bf3..da2d83984a6 100644 --- a/config/locales/crowdin/js-ca.yml +++ b/config/locales/crowdin/js-ca.yml @@ -1045,16 +1045,13 @@ ca: all: Tots els projectes selected: Només seleccionats search_placeholder: Search projects... - search_placeholder_favorites: Search favorites... include_subprojects: Inclou tots els subprojectes tooltip: include_all_selected: Projecte ja inclòs, ja que "Inclou tots els subprojectes" està activat. current_project: Aquest és el projecte actual. does_not_match_search: El projecte no coincideix amb la cerca. no_results: Cap projecte s'ajusta a la teva cerca. - no_favorite_results: No favorite project matches your search criteria. include_workspaces: - search_placeholder: Search... types: program: Program portfolio: Portfolio diff --git a/config/locales/crowdin/js-ckb-IR.yml b/config/locales/crowdin/js-ckb-IR.yml index ca666133659..03a8be8b075 100644 --- a/config/locales/crowdin/js-ckb-IR.yml +++ b/config/locales/crowdin/js-ckb-IR.yml @@ -1045,16 +1045,13 @@ ckb-IR: all: All projects selected: Only selected search_placeholder: Search projects... - search_placeholder_favorites: Search favorites... include_subprojects: Include all sub-projects tooltip: include_all_selected: Project already included since Include all sub-projects is enabled. current_project: This is the current project you are in. does_not_match_search: Project does not match the search criteria. no_results: No project matches your search criteria. - no_favorite_results: No favorite project matches your search criteria. include_workspaces: - search_placeholder: Search... types: program: Program portfolio: Portfolio diff --git a/config/locales/crowdin/js-cs.yml b/config/locales/crowdin/js-cs.yml index 85b8f01ef80..b14e714cce6 100644 --- a/config/locales/crowdin/js-cs.yml +++ b/config/locales/crowdin/js-cs.yml @@ -1057,16 +1057,13 @@ cs: all: Všechny projekty selected: Pouze vybrané search_placeholder: Search projects... - search_placeholder_favorites: Search favorites... include_subprojects: Zahrnout všechny podprojekty tooltip: include_all_selected: Projekt je již zahrnut, protože Zahrnout všechny podprojekty je povoleno. current_project: Toto je aktuální projekt, ve kterém se nacházíte. does_not_match_search: Projekt neodpovídá kritériím vyhledávání. no_results: Žádný projekt neodpovídá vašim kritériím vyhledávání. - no_favorite_results: No favorite project matches your search criteria. include_workspaces: - search_placeholder: Hledat... types: program: Program portfolio: Portfolio diff --git a/config/locales/crowdin/js-da.yml b/config/locales/crowdin/js-da.yml index 40875955062..e4b985dba20 100644 --- a/config/locales/crowdin/js-da.yml +++ b/config/locales/crowdin/js-da.yml @@ -1045,16 +1045,13 @@ da: all: All projects selected: Only selected search_placeholder: Search projects... - search_placeholder_favorites: Search favorites... include_subprojects: Include all sub-projects tooltip: include_all_selected: Project already included since Include all sub-projects is enabled. current_project: This is the current project you are in. does_not_match_search: Project does not match the search criteria. no_results: No project matches your search criteria. - no_favorite_results: No favorite project matches your search criteria. include_workspaces: - search_placeholder: Search... types: program: Program portfolio: Portfolio diff --git a/config/locales/crowdin/js-de.yml b/config/locales/crowdin/js-de.yml index 57b3d76dde2..5d240541200 100644 --- a/config/locales/crowdin/js-de.yml +++ b/config/locales/crowdin/js-de.yml @@ -1047,16 +1047,13 @@ de: all: Alle Projekte selected: Nur ausgewählte search_placeholder: Projekte durchsuchen... - search_placeholder_favorites: Favoriten durchsuchen... include_subprojects: Alle Unterprojekte einbeziehen tooltip: include_all_selected: Das Projekt ist bereits enthalten, da alle Unterprojekte einbezogen sind. current_project: Dies ist das aktuelle Projekt, in dem Sie sich befinden. does_not_match_search: Projekt entspricht nicht den Suchkriterien. no_results: Kein Projekt entspricht Ihren Suchkriterien. - no_favorite_results: Kein favorisiertes Projekt entspricht Ihren Suchkriterien. include_workspaces: - search_placeholder: Suchen... types: program: Programm portfolio: Portfolio diff --git a/config/locales/crowdin/js-el.yml b/config/locales/crowdin/js-el.yml index 062a6b2f1bb..aed5bee410a 100644 --- a/config/locales/crowdin/js-el.yml +++ b/config/locales/crowdin/js-el.yml @@ -1045,16 +1045,13 @@ el: all: Όλα τα έργα selected: Only selected search_placeholder: Search projects... - search_placeholder_favorites: Search favorites... include_subprojects: Include all sub-projects tooltip: include_all_selected: Project already included since Include all sub-projects is enabled. current_project: This is the current project you are in. does_not_match_search: Project does not match the search criteria. no_results: No project matches your search criteria. - no_favorite_results: No favorite project matches your search criteria. include_workspaces: - search_placeholder: Search... types: program: Program portfolio: Portfolio diff --git a/config/locales/crowdin/js-eo.yml b/config/locales/crowdin/js-eo.yml index 83e7d94d518..5b1b626fe46 100644 --- a/config/locales/crowdin/js-eo.yml +++ b/config/locales/crowdin/js-eo.yml @@ -1045,16 +1045,13 @@ eo: all: All projects selected: Only selected search_placeholder: Search projects... - search_placeholder_favorites: Search favorites... include_subprojects: Include all sub-projects tooltip: include_all_selected: Project already included since Include all sub-projects is enabled. current_project: This is the current project you are in. does_not_match_search: Project does not match the search criteria. no_results: No project matches your search criteria. - no_favorite_results: No favorite project matches your search criteria. include_workspaces: - search_placeholder: Search... types: program: Program portfolio: Portfolio diff --git a/config/locales/crowdin/js-es.yml b/config/locales/crowdin/js-es.yml index 0308f4cf8e7..b1b9acf29f1 100644 --- a/config/locales/crowdin/js-es.yml +++ b/config/locales/crowdin/js-es.yml @@ -1043,16 +1043,13 @@ es: all: Todos los proyectos selected: Solo seleccionados search_placeholder: Buscar proyectos... - search_placeholder_favorites: Buscar favoritos... include_subprojects: Incluir todos los subproyectos tooltip: include_all_selected: Proyecto ya incluido, ya que "Incluir todos los subproyectos" está activada. current_project: Este es el proyecto actual. does_not_match_search: El proyecto no coincide con los criterios de búsqueda. no_results: Ningún producto coincide con tu criterio de búsqueda - no_favorite_results: Ningún proyecto favorito coincide con sus criterios de búsqueda. include_workspaces: - search_placeholder: Buscar… types: program: Programa portfolio: Cartera diff --git a/config/locales/crowdin/js-et.yml b/config/locales/crowdin/js-et.yml index 5e9b5c80811..016a5346156 100644 --- a/config/locales/crowdin/js-et.yml +++ b/config/locales/crowdin/js-et.yml @@ -1045,16 +1045,13 @@ et: all: Kõik projektid selected: Only selected search_placeholder: Search projects... - search_placeholder_favorites: Search favorites... include_subprojects: Include all sub-projects tooltip: include_all_selected: Project already included since Include all sub-projects is enabled. current_project: This is the current project you are in. does_not_match_search: Project does not match the search criteria. no_results: No project matches your search criteria. - no_favorite_results: No favorite project matches your search criteria. include_workspaces: - search_placeholder: Search... types: program: Program portfolio: Portfolio diff --git a/config/locales/crowdin/js-eu.yml b/config/locales/crowdin/js-eu.yml index a73d5ea0df0..aeff6a9f655 100644 --- a/config/locales/crowdin/js-eu.yml +++ b/config/locales/crowdin/js-eu.yml @@ -1045,16 +1045,13 @@ eu: all: All projects selected: Only selected search_placeholder: Search projects... - search_placeholder_favorites: Search favorites... include_subprojects: Include all sub-projects tooltip: include_all_selected: Project already included since Include all sub-projects is enabled. current_project: This is the current project you are in. does_not_match_search: Project does not match the search criteria. no_results: No project matches your search criteria. - no_favorite_results: No favorite project matches your search criteria. include_workspaces: - search_placeholder: Search... types: program: Program portfolio: Portfolio diff --git a/config/locales/crowdin/js-fa.yml b/config/locales/crowdin/js-fa.yml index ce6e219c1b4..06ef0e48f7d 100644 --- a/config/locales/crowdin/js-fa.yml +++ b/config/locales/crowdin/js-fa.yml @@ -1045,16 +1045,13 @@ fa: all: همه پروژه‌ها selected: Only selected search_placeholder: Search projects... - search_placeholder_favorites: Search favorites... include_subprojects: Include all sub-projects tooltip: include_all_selected: Project already included since Include all sub-projects is enabled. current_project: This is the current project you are in. does_not_match_search: Project does not match the search criteria. no_results: No project matches your search criteria. - no_favorite_results: No favorite project matches your search criteria. include_workspaces: - search_placeholder: Search... types: program: Program portfolio: Portfolio diff --git a/config/locales/crowdin/js-fi.yml b/config/locales/crowdin/js-fi.yml index 0b9f4e39015..d9998e17719 100644 --- a/config/locales/crowdin/js-fi.yml +++ b/config/locales/crowdin/js-fi.yml @@ -1045,16 +1045,13 @@ fi: all: All projects selected: Only selected search_placeholder: Search projects... - search_placeholder_favorites: Search favorites... include_subprojects: Include all sub-projects tooltip: include_all_selected: Project already included since Include all sub-projects is enabled. current_project: This is the current project you are in. does_not_match_search: Project does not match the search criteria. no_results: No project matches your search criteria. - no_favorite_results: No favorite project matches your search criteria. include_workspaces: - search_placeholder: Search... types: program: Program portfolio: Portfolio diff --git a/config/locales/crowdin/js-fil.yml b/config/locales/crowdin/js-fil.yml index 4763736396d..15ab2ac20e9 100644 --- a/config/locales/crowdin/js-fil.yml +++ b/config/locales/crowdin/js-fil.yml @@ -1045,16 +1045,13 @@ fil: all: All projects selected: Only selected search_placeholder: Search projects... - search_placeholder_favorites: Search favorites... include_subprojects: Include all sub-projects tooltip: include_all_selected: Project already included since Include all sub-projects is enabled. current_project: This is the current project you are in. does_not_match_search: Project does not match the search criteria. no_results: No project matches your search criteria. - no_favorite_results: No favorite project matches your search criteria. include_workspaces: - search_placeholder: Search... types: program: Program portfolio: Portfolio diff --git a/config/locales/crowdin/js-fr.yml b/config/locales/crowdin/js-fr.yml index 57906649c56..e00a7c4837d 100644 --- a/config/locales/crowdin/js-fr.yml +++ b/config/locales/crowdin/js-fr.yml @@ -1045,16 +1045,13 @@ fr: all: Tous les projets selected: Uniquement la sélection search_placeholder: Recherche de projets... - search_placeholder_favorites: Recherche de favoris... include_subprojects: inclure tous les sous-projets tooltip: include_all_selected: Projet déjà inclus puisque Include tous les sous-projets sont activés. current_project: Ceci est le projet dans lequel vous vous trouvez actuellement. does_not_match_search: Le projet ne correspond pas aux critères de recherche. no_results: Aucun projet ne correspond à vos critères de recherche. - no_favorite_results: Aucun projet favori ne correspond à vos critères de recherche. include_workspaces: - search_placeholder: Rechercher... types: program: Programme portfolio: Portefeuille diff --git a/config/locales/crowdin/js-he.yml b/config/locales/crowdin/js-he.yml index fcc1fa5b5b2..daa000539dd 100644 --- a/config/locales/crowdin/js-he.yml +++ b/config/locales/crowdin/js-he.yml @@ -1053,16 +1053,13 @@ he: all: All projects selected: Only selected search_placeholder: Search projects... - search_placeholder_favorites: Search favorites... include_subprojects: Include all sub-projects tooltip: include_all_selected: Project already included since Include all sub-projects is enabled. current_project: This is the current project you are in. does_not_match_search: Project does not match the search criteria. no_results: No project matches your search criteria. - no_favorite_results: No favorite project matches your search criteria. include_workspaces: - search_placeholder: Search... types: program: Program portfolio: Portfolio diff --git a/config/locales/crowdin/js-hi.yml b/config/locales/crowdin/js-hi.yml index 41abb4824f1..fa72e3876c3 100644 --- a/config/locales/crowdin/js-hi.yml +++ b/config/locales/crowdin/js-hi.yml @@ -1045,16 +1045,13 @@ hi: all: All projects selected: Only selected search_placeholder: Search projects... - search_placeholder_favorites: Search favorites... include_subprojects: Include all sub-projects tooltip: include_all_selected: Project already included since Include all sub-projects is enabled. current_project: This is the current project you are in. does_not_match_search: Project does not match the search criteria. no_results: No project matches your search criteria. - no_favorite_results: No favorite project matches your search criteria. include_workspaces: - search_placeholder: Search... types: program: Program portfolio: Portfolio diff --git a/config/locales/crowdin/js-hr.yml b/config/locales/crowdin/js-hr.yml index 2bb6ea97065..c13e059f768 100644 --- a/config/locales/crowdin/js-hr.yml +++ b/config/locales/crowdin/js-hr.yml @@ -1049,16 +1049,13 @@ hr: all: All projects selected: Only selected search_placeholder: Search projects... - search_placeholder_favorites: Search favorites... include_subprojects: Include all sub-projects tooltip: include_all_selected: Project already included since Include all sub-projects is enabled. current_project: This is the current project you are in. does_not_match_search: Project does not match the search criteria. no_results: No project matches your search criteria. - no_favorite_results: No favorite project matches your search criteria. include_workspaces: - search_placeholder: Search... types: program: Program portfolio: Portfolio diff --git a/config/locales/crowdin/js-hu.yml b/config/locales/crowdin/js-hu.yml index 1df25f173f9..0173a0b88bc 100644 --- a/config/locales/crowdin/js-hu.yml +++ b/config/locales/crowdin/js-hu.yml @@ -1087,16 +1087,13 @@ hu: all: Minden projekt selected: Csak a kijelölt search_placeholder: Search projects... - search_placeholder_favorites: Search favorites... include_subprojects: Összes alprojekt bevonása tooltip: include_all_selected: Project already included since Include all sub-projects is enabled. current_project: Ez a jelenlegi projekt, amiben vagyunk. does_not_match_search: Project does not match the search criteria. no_results: No project matches your search criteria. - no_favorite_results: No favorite project matches your search criteria. include_workspaces: - search_placeholder: Search... types: program: Program portfolio: Portfolio diff --git a/config/locales/crowdin/js-hy.yml b/config/locales/crowdin/js-hy.yml index 541f2ba4634..988e4acb589 100644 --- a/config/locales/crowdin/js-hy.yml +++ b/config/locales/crowdin/js-hy.yml @@ -1045,16 +1045,13 @@ hy: all: All projects selected: Only selected search_placeholder: Search projects... - search_placeholder_favorites: Search favorites... include_subprojects: Include all sub-projects tooltip: include_all_selected: Project already included since Include all sub-projects is enabled. current_project: This is the current project you are in. does_not_match_search: Project does not match the search criteria. no_results: No project matches your search criteria. - no_favorite_results: No favorite project matches your search criteria. include_workspaces: - search_placeholder: Search... types: program: Program portfolio: Portfolio diff --git a/config/locales/crowdin/js-id.yml b/config/locales/crowdin/js-id.yml index c0cb9375ff0..a23fab7b403 100644 --- a/config/locales/crowdin/js-id.yml +++ b/config/locales/crowdin/js-id.yml @@ -1041,16 +1041,13 @@ id: all: Semua proyek selected: Only selected search_placeholder: Cari proyek... - search_placeholder_favorites: Search favorites... include_subprojects: Include all sub-projects tooltip: include_all_selected: Project already included since Include all sub-projects is enabled. current_project: This is the current project you are in. does_not_match_search: Project does not match the search criteria. no_results: No project matches your search criteria. - no_favorite_results: No favorite project matches your search criteria. include_workspaces: - search_placeholder: Search... types: program: Program portfolio: Portfolio diff --git a/config/locales/crowdin/js-it.yml b/config/locales/crowdin/js-it.yml index 44392815e7f..8fa03fc0c34 100644 --- a/config/locales/crowdin/js-it.yml +++ b/config/locales/crowdin/js-it.yml @@ -1045,16 +1045,13 @@ it: all: Tutti i progetti selected: Solo selezionati search_placeholder: Cerca progetti... - search_placeholder_favorites: Cerca tra i preferiti... include_subprojects: Includi tutti i sotto-progetti tooltip: include_all_selected: Il progetto già stato incluso poiché è abilitata l'opzione Includi tutti i sotto-progetti. current_project: Questo è il progetto corrente in cui ti trovi. does_not_match_search: Il progetto non corrisponde ai criteri di ricerca. no_results: Nessun progetto corrisponde ai tuoi criteri di ricerca - no_favorite_results: Nessun progetto preferito corrisponde ai tuoi criteri di ricerca. include_workspaces: - search_placeholder: Cerca... types: program: Programma portfolio: Portfolio diff --git a/config/locales/crowdin/js-ja.yml b/config/locales/crowdin/js-ja.yml index 617bb4fd770..5bcd96f7a7a 100644 --- a/config/locales/crowdin/js-ja.yml +++ b/config/locales/crowdin/js-ja.yml @@ -1041,16 +1041,13 @@ ja: all: すべてのプロジェクト selected: 選択したもののみ search_placeholder: プロジェクトを検索… - search_placeholder_favorites: Search favorites... include_subprojects: すべての子プロジェクトを含む tooltip: include_all_selected: すべての子プロジェクトを含める」が有効になっているため、プロジェクトはすでに含まれている。 current_project: これが現在あなたが参加しているプロジェクトです。 does_not_match_search: プロジェクトが検索条件に一致しません。 no_results: 検索条件に一致するプロジェクトはありません。 - no_favorite_results: No favorite project matches your search criteria. include_workspaces: - search_placeholder: Search... types: program: Program portfolio: Portfolio diff --git a/config/locales/crowdin/js-ka.yml b/config/locales/crowdin/js-ka.yml index 92414a02439..928696072fc 100644 --- a/config/locales/crowdin/js-ka.yml +++ b/config/locales/crowdin/js-ka.yml @@ -1045,16 +1045,13 @@ ka: all: ყველა პროექტი selected: მხოლოდ მონიშნული search_placeholder: Search projects... - search_placeholder_favorites: Search favorites... include_subprojects: Include all sub-projects tooltip: include_all_selected: Project already included since Include all sub-projects is enabled. current_project: This is the current project you are in. does_not_match_search: Project does not match the search criteria. no_results: No project matches your search criteria. - no_favorite_results: No favorite project matches your search criteria. include_workspaces: - search_placeholder: Search... types: program: Program portfolio: Portfolio diff --git a/config/locales/crowdin/js-kk.yml b/config/locales/crowdin/js-kk.yml index 6f4d65d8003..e71172d8d76 100644 --- a/config/locales/crowdin/js-kk.yml +++ b/config/locales/crowdin/js-kk.yml @@ -1045,16 +1045,13 @@ kk: all: All projects selected: Only selected search_placeholder: Search projects... - search_placeholder_favorites: Search favorites... include_subprojects: Include all sub-projects tooltip: include_all_selected: Project already included since Include all sub-projects is enabled. current_project: This is the current project you are in. does_not_match_search: Project does not match the search criteria. no_results: No project matches your search criteria. - no_favorite_results: No favorite project matches your search criteria. include_workspaces: - search_placeholder: Search... types: program: Program portfolio: Portfolio diff --git a/config/locales/crowdin/js-ko.yml b/config/locales/crowdin/js-ko.yml index b4b34070827..29b20d7bb18 100644 --- a/config/locales/crowdin/js-ko.yml +++ b/config/locales/crowdin/js-ko.yml @@ -1041,16 +1041,13 @@ ko: all: 모든 프로젝트 selected: 선택한 항목만 search_placeholder: 프로젝트 검색... - search_placeholder_favorites: 즐겨찾기 검색... include_subprojects: 모든 하위 프로젝트 포함 tooltip: include_all_selected: "'모든 하위 프로젝트 포함'이 활성화되어 있으므로 프로젝트가 이미 포함되어 있습니다." current_project: 작업 중인 현재 프로젝트입니다. does_not_match_search: 프로젝트가 검색 기준과 일치하지 않습니다. no_results: 검색 기준과 일치하는 프로젝트가 없습니다. - no_favorite_results: 검색 기준과 일치하는 프로젝트 즐겨찾기가 없습니다. include_workspaces: - search_placeholder: 검색... types: program: 프로그램 portfolio: 포트폴리오 diff --git a/config/locales/crowdin/js-lt.yml b/config/locales/crowdin/js-lt.yml index bcb1f979a73..56ff8424376 100644 --- a/config/locales/crowdin/js-lt.yml +++ b/config/locales/crowdin/js-lt.yml @@ -1053,16 +1053,13 @@ lt: all: Visi projektai selected: Tik pasirinktus search_placeholder: Search projects... - search_placeholder_favorites: Search favorites... include_subprojects: Įtraukti visus sub-projektus tooltip: include_all_selected: Projektas jau įtrauktas, nes įjungta parinktis įtraukti visus sub-projektus. current_project: Tai dabartinis projektas, kuriame jūs esate. does_not_match_search: Projektas neatitinka paieškos kriterijaus. no_results: Nei vienas projektas neatitinka jūsų paieškos kriterijaus. - no_favorite_results: No favorite project matches your search criteria. include_workspaces: - search_placeholder: Search... types: program: Program portfolio: Portfolio diff --git a/config/locales/crowdin/js-lv.yml b/config/locales/crowdin/js-lv.yml index 7ffc20e177b..072e956c76b 100644 --- a/config/locales/crowdin/js-lv.yml +++ b/config/locales/crowdin/js-lv.yml @@ -1049,16 +1049,13 @@ lv: all: All projects selected: Only selected search_placeholder: Search projects... - search_placeholder_favorites: Search favorites... include_subprojects: Include all sub-projects tooltip: include_all_selected: Project already included since Include all sub-projects is enabled. current_project: This is the current project you are in. does_not_match_search: Project does not match the search criteria. no_results: No project matches your search criteria. - no_favorite_results: No favorite project matches your search criteria. include_workspaces: - search_placeholder: Search... types: program: Program portfolio: Portfolio diff --git a/config/locales/crowdin/js-mn.yml b/config/locales/crowdin/js-mn.yml index 2f810420bcc..b65505d6d58 100644 --- a/config/locales/crowdin/js-mn.yml +++ b/config/locales/crowdin/js-mn.yml @@ -1045,16 +1045,13 @@ mn: all: All projects selected: Only selected search_placeholder: Search projects... - search_placeholder_favorites: Search favorites... include_subprojects: Include all sub-projects tooltip: include_all_selected: Project already included since Include all sub-projects is enabled. current_project: This is the current project you are in. does_not_match_search: Project does not match the search criteria. no_results: No project matches your search criteria. - no_favorite_results: No favorite project matches your search criteria. include_workspaces: - search_placeholder: Search... types: program: Program portfolio: Portfolio diff --git a/config/locales/crowdin/js-ms.yml b/config/locales/crowdin/js-ms.yml index 7db1ebdef63..4c2c6502a02 100644 --- a/config/locales/crowdin/js-ms.yml +++ b/config/locales/crowdin/js-ms.yml @@ -1041,16 +1041,13 @@ ms: all: Semua projek selected: Hanya terpilih search_placeholder: Search projects... - search_placeholder_favorites: Search favorites... include_subprojects: Termasuk semua sub-projek tooltip: include_all_selected: Projek sudah disertakan sejak Sertakan semua sub-projek didayakan. current_project: Ini adalah projek yang anda terlibat dalam sekarang. does_not_match_search: Projek tidak sepadan dengan kriteria carian. no_results: Tiada projek yang sepadan dengan kriteria carian anda. - no_favorite_results: No favorite project matches your search criteria. include_workspaces: - search_placeholder: Search... types: program: Program portfolio: Portfolio diff --git a/config/locales/crowdin/js-ne.yml b/config/locales/crowdin/js-ne.yml index c92b11dfeab..cd5f8d3808e 100644 --- a/config/locales/crowdin/js-ne.yml +++ b/config/locales/crowdin/js-ne.yml @@ -1045,16 +1045,13 @@ ne: all: All projects selected: Only selected search_placeholder: Search projects... - search_placeholder_favorites: Search favorites... include_subprojects: Include all sub-projects tooltip: include_all_selected: Project already included since Include all sub-projects is enabled. current_project: This is the current project you are in. does_not_match_search: Project does not match the search criteria. no_results: No project matches your search criteria. - no_favorite_results: No favorite project matches your search criteria. include_workspaces: - search_placeholder: Search... types: program: Program portfolio: Portfolio diff --git a/config/locales/crowdin/js-nl.yml b/config/locales/crowdin/js-nl.yml index 43025229479..eaba6e5f537 100644 --- a/config/locales/crowdin/js-nl.yml +++ b/config/locales/crowdin/js-nl.yml @@ -1045,16 +1045,13 @@ nl: all: Alle projecten selected: Alleen geselecteerd search_placeholder: Search projects... - search_placeholder_favorites: Search favorites... include_subprojects: Inclusief alle sub-projecten tooltip: include_all_selected: Project al opgenomen omdat alle subprojecten zijn ingeschakeld. current_project: Dit is het huidige project waarin u zich bevindt. does_not_match_search: Het project komt niet overeen met de zoekcriteria. no_results: Geen enkel project komt overeen met uw zoekcriteria. - no_favorite_results: No favorite project matches your search criteria. include_workspaces: - search_placeholder: Search... types: program: Program portfolio: Portfolio diff --git a/config/locales/crowdin/js-no.yml b/config/locales/crowdin/js-no.yml index 063d0be6710..1341e0f51bf 100644 --- a/config/locales/crowdin/js-no.yml +++ b/config/locales/crowdin/js-no.yml @@ -1045,16 +1045,13 @@ all: Alle prosjekter selected: Kun valgte search_placeholder: Search projects... - search_placeholder_favorites: Search favorites... include_subprojects: Inkluder alle underprosjekter tooltip: include_all_selected: Prosjektet er allerede inkludert siden det alle underprosjekter er aktivert. current_project: Dette er det nåværende prosjektet du er i. does_not_match_search: Prosjektet samsvarer ikke med søkekriteriene. no_results: Ingen treff på dine søkekriterier. - no_favorite_results: No favorite project matches your search criteria. include_workspaces: - search_placeholder: Search... types: program: Program portfolio: Portfolio diff --git a/config/locales/crowdin/js-pl.yml b/config/locales/crowdin/js-pl.yml index 5e3db337ec0..d05ff916750 100644 --- a/config/locales/crowdin/js-pl.yml +++ b/config/locales/crowdin/js-pl.yml @@ -1053,16 +1053,13 @@ pl: all: Wszystkie projekty selected: Tylko zaznaczone search_placeholder: Wyszukaj projekty... - search_placeholder_favorites: Wyszukaj ulubione... include_subprojects: Uwzględnij wszystkie podprojekty tooltip: include_all_selected: Projekt już uwzględniony, ponieważ włączenie wszystkich podprojektów jest włączone. current_project: To jest bieżący projekt, w którym jesteś. does_not_match_search: Projekt nie spełnia kryteriów wyszukiwania. no_results: Żaden projekt nie spełnia kryteriów wyszukiwania. - no_favorite_results: Żaden ulubiony projekt nie spełnia kryteriów wyszukiwania. include_workspaces: - search_placeholder: Wyszukaj... types: program: Program portfolio: Portfolio diff --git a/config/locales/crowdin/js-pt-BR.yml b/config/locales/crowdin/js-pt-BR.yml index 116fe8bae04..31d0bf2f31e 100644 --- a/config/locales/crowdin/js-pt-BR.yml +++ b/config/locales/crowdin/js-pt-BR.yml @@ -1045,16 +1045,13 @@ pt-BR: all: Todos os projetos selected: Somente selecionados search_placeholder: Buscar projetos... - search_placeholder_favorites: Pesquisar favoritos... include_subprojects: Incluir todos os subprojetos tooltip: include_all_selected: Como a opção Incluir todos os sub-projetos está habilitada, o projeto já foi incluído. current_project: Este é o projeto atual em que você está. does_not_match_search: O projeto não corresponde ao critério de pesquisa no_results: Nenhum projeto corresponde ao seu critério de busca. - no_favorite_results: Nenhum projeto favorito corresponde aos seus critérios de busca. include_workspaces: - search_placeholder: Pesquisar... types: program: Programa portfolio: Portfólio diff --git a/config/locales/crowdin/js-pt-PT.yml b/config/locales/crowdin/js-pt-PT.yml index bb7ba35f39d..e79ad0ce3ed 100644 --- a/config/locales/crowdin/js-pt-PT.yml +++ b/config/locales/crowdin/js-pt-PT.yml @@ -1045,16 +1045,13 @@ pt-PT: all: Todos os projetos selected: Apenas os selecionados search_placeholder: Procurar projetos... - search_placeholder_favorites: Procurar favoritos... include_subprojects: Incluir todos os subprojetos tooltip: include_all_selected: Projeto já incluído porque todos os subprojetos estão ativados. current_project: Este é o projeto atual em que está. does_not_match_search: O projeto não corresponde aos critérios de pesquisa. no_results: Nenhum projeto corresponde aos seus critérios de pesquisa. - no_favorite_results: Nenhum projeto favorito corresponde aos seus critérios de pesquisa. include_workspaces: - search_placeholder: Pesquisar... types: program: Programa portfolio: Carteira diff --git a/config/locales/crowdin/js-ro.yml b/config/locales/crowdin/js-ro.yml index 2d997ab634f..e6a521ca06d 100644 --- a/config/locales/crowdin/js-ro.yml +++ b/config/locales/crowdin/js-ro.yml @@ -1049,16 +1049,13 @@ ro: all: Toate Proiectele selected: Numai selecția search_placeholder: Caută proiecte... - search_placeholder_favorites: Caută favorite... include_subprojects: Include toate subproiectele tooltip: include_all_selected: Proiectul este deja inclus, din moment ce opțiunea Include toate subproiectele este activată. current_project: Acesta este proiectul curent în care vă aflați. does_not_match_search: Proiectul nu corespunde criteriilor de căutare. no_results: Niciun proiect nu corespunde criteriilor de căutare. - no_favorite_results: No favorite project matches your search criteria. include_workspaces: - search_placeholder: Search... types: program: Program portfolio: Portfolio diff --git a/config/locales/crowdin/js-ru.yml b/config/locales/crowdin/js-ru.yml index 6fbb81dc9a1..bff82cf6790 100644 --- a/config/locales/crowdin/js-ru.yml +++ b/config/locales/crowdin/js-ru.yml @@ -1055,16 +1055,13 @@ ru: all: Все проекты selected: Только выбранные search_placeholder: Поиск проектов... - search_placeholder_favorites: Поиск в избранном... include_subprojects: Включить все подпроекты tooltip: include_all_selected: Проект уже включен, поскольку разрешено включение всех подпроектов. current_project: Это текущий проект, в котором вы находитесь. does_not_match_search: Ни один проект не соответствует критериям поиска. no_results: Ни один проект не соответствует критериям поиска. - no_favorite_results: Ни один избранный проект не соответствует критериям поиска. include_workspaces: - search_placeholder: Поиск... types: program: Программа portfolio: Портфолио diff --git a/config/locales/crowdin/js-rw.yml b/config/locales/crowdin/js-rw.yml index a2594894b22..41882fae9cf 100644 --- a/config/locales/crowdin/js-rw.yml +++ b/config/locales/crowdin/js-rw.yml @@ -1045,16 +1045,13 @@ rw: all: All projects selected: Only selected search_placeholder: Search projects... - search_placeholder_favorites: Search favorites... include_subprojects: Include all sub-projects tooltip: include_all_selected: Project already included since Include all sub-projects is enabled. current_project: This is the current project you are in. does_not_match_search: Project does not match the search criteria. no_results: No project matches your search criteria. - no_favorite_results: No favorite project matches your search criteria. include_workspaces: - search_placeholder: Search... types: program: Program portfolio: Portfolio diff --git a/config/locales/crowdin/js-si.yml b/config/locales/crowdin/js-si.yml index dc9e6c2fd0e..660e6115c86 100644 --- a/config/locales/crowdin/js-si.yml +++ b/config/locales/crowdin/js-si.yml @@ -1045,16 +1045,13 @@ si: all: All projects selected: Only selected search_placeholder: Search projects... - search_placeholder_favorites: Search favorites... include_subprojects: Include all sub-projects tooltip: include_all_selected: Project already included since Include all sub-projects is enabled. current_project: This is the current project you are in. does_not_match_search: Project does not match the search criteria. no_results: No project matches your search criteria. - no_favorite_results: No favorite project matches your search criteria. include_workspaces: - search_placeholder: Search... types: program: Program portfolio: Portfolio diff --git a/config/locales/crowdin/js-sk.yml b/config/locales/crowdin/js-sk.yml index d365d9e7cbc..8bdb21d9e17 100644 --- a/config/locales/crowdin/js-sk.yml +++ b/config/locales/crowdin/js-sk.yml @@ -1053,16 +1053,13 @@ sk: all: All projects selected: Only selected search_placeholder: Search projects... - search_placeholder_favorites: Search favorites... include_subprojects: Include all sub-projects tooltip: include_all_selected: Project already included since Include all sub-projects is enabled. current_project: This is the current project you are in. does_not_match_search: Project does not match the search criteria. no_results: No project matches your search criteria. - no_favorite_results: No favorite project matches your search criteria. include_workspaces: - search_placeholder: Search... types: program: Program portfolio: Portfolio diff --git a/config/locales/crowdin/js-sl.yml b/config/locales/crowdin/js-sl.yml index 9a0ef6f0851..b1fd06e2610 100644 --- a/config/locales/crowdin/js-sl.yml +++ b/config/locales/crowdin/js-sl.yml @@ -1071,16 +1071,13 @@ sl: all: Vsi projekti selected: Only selected search_placeholder: Search projects... - search_placeholder_favorites: Search favorites... include_subprojects: Include all sub-projects tooltip: include_all_selected: Project already included since Include all sub-projects is enabled. current_project: This is the current project you are in. does_not_match_search: Project does not match the search criteria. no_results: No project matches your search criteria. - no_favorite_results: No favorite project matches your search criteria. include_workspaces: - search_placeholder: Search... types: program: Program portfolio: Portfolio diff --git a/config/locales/crowdin/js-sr.yml b/config/locales/crowdin/js-sr.yml index 810e923470d..a75ec3dac15 100644 --- a/config/locales/crowdin/js-sr.yml +++ b/config/locales/crowdin/js-sr.yml @@ -1049,16 +1049,13 @@ sr: all: All projects selected: Only selected search_placeholder: Search projects... - search_placeholder_favorites: Search favorites... include_subprojects: Include all sub-projects tooltip: include_all_selected: Project already included since Include all sub-projects is enabled. current_project: This is the current project you are in. does_not_match_search: Project does not match the search criteria. no_results: No project matches your search criteria. - no_favorite_results: No favorite project matches your search criteria. include_workspaces: - search_placeholder: Search... types: program: Program portfolio: Portfolio diff --git a/config/locales/crowdin/js-sv.yml b/config/locales/crowdin/js-sv.yml index 1879a829834..9822b62bc97 100644 --- a/config/locales/crowdin/js-sv.yml +++ b/config/locales/crowdin/js-sv.yml @@ -1045,16 +1045,13 @@ sv: all: Alla projekt selected: Only selected search_placeholder: Sök projekt... - search_placeholder_favorites: Search favorites... include_subprojects: Include all sub-projects tooltip: include_all_selected: Projekt som redan ingår sedan Inkludera alla delprojekt är aktiverat. current_project: Detta är det aktuella projektet du befinner dig i. does_not_match_search: Projektet matchar inte sökkriterierna. no_results: Inget projekt matchar dina sökkriterier. - no_favorite_results: Inget favoritprojekt matchar dina sökkriterier. include_workspaces: - search_placeholder: Sök... types: program: Program portfolio: Portfölj diff --git a/config/locales/crowdin/js-th.yml b/config/locales/crowdin/js-th.yml index 4a8d537293e..fea2483c3b3 100644 --- a/config/locales/crowdin/js-th.yml +++ b/config/locales/crowdin/js-th.yml @@ -1041,16 +1041,13 @@ th: all: All projects selected: Only selected search_placeholder: Search projects... - search_placeholder_favorites: Search favorites... include_subprojects: Include all sub-projects tooltip: include_all_selected: Project already included since Include all sub-projects is enabled. current_project: This is the current project you are in. does_not_match_search: Project does not match the search criteria. no_results: No project matches your search criteria. - no_favorite_results: No favorite project matches your search criteria. include_workspaces: - search_placeholder: Search... types: program: Program portfolio: Portfolio diff --git a/config/locales/crowdin/js-tr.yml b/config/locales/crowdin/js-tr.yml index 1dec81a6398..ea663176b15 100644 --- a/config/locales/crowdin/js-tr.yml +++ b/config/locales/crowdin/js-tr.yml @@ -1045,16 +1045,13 @@ tr: all: Tüm projeler selected: Sadece seçilen search_placeholder: Projeleri ara... - search_placeholder_favorites: Favorileri ara... include_subprojects: Tüm alt projeleri dahil et tooltip: include_all_selected: Tüm alt projeleri dahil et etkinleştirildiğinden, proje zaten dahil edilmiştir. current_project: Bu, içinde bulunduğunuz mevcut projedir. does_not_match_search: Proje arama kriterleriyle eşleşmiyor. no_results: Arama kriterleriniz ile eşleşen proje yok - no_favorite_results: Arama kriterleriniz ile eşleşen favori proje yok. include_workspaces: - search_placeholder: Arama... types: program: Program portfolio: Portföy diff --git a/config/locales/crowdin/js-uk.yml b/config/locales/crowdin/js-uk.yml index d51448dafb7..95b6846bf9e 100644 --- a/config/locales/crowdin/js-uk.yml +++ b/config/locales/crowdin/js-uk.yml @@ -1053,16 +1053,13 @@ uk: all: Усі проєкти selected: Тільки вибране search_placeholder: Пошук проєктів… - search_placeholder_favorites: Пошук серед вибраного… include_subprojects: Включити всі підпроєкти tooltip: include_all_selected: Проєкт уже включено, оскільки ввімкнено параметр «Включати всі вкладені проєкти». current_project: Це поточний проєкт, який зараз відкрито. does_not_match_search: Проєкт не відповідає критеріям пошуку. no_results: Жоден проєкт не відповідає вашим критеріям пошуку. - no_favorite_results: Немає вибраних проєктів, які відповідають критеріям пошуку. include_workspaces: - search_placeholder: Пошук… types: program: Програма portfolio: Портфель diff --git a/config/locales/crowdin/js-uz.yml b/config/locales/crowdin/js-uz.yml index cad7dde0a08..ac3714d80b5 100644 --- a/config/locales/crowdin/js-uz.yml +++ b/config/locales/crowdin/js-uz.yml @@ -1045,16 +1045,13 @@ uz: all: All projects selected: Only selected search_placeholder: Search projects... - search_placeholder_favorites: Search favorites... include_subprojects: Include all sub-projects tooltip: include_all_selected: Project already included since Include all sub-projects is enabled. current_project: This is the current project you are in. does_not_match_search: Project does not match the search criteria. no_results: No project matches your search criteria. - no_favorite_results: No favorite project matches your search criteria. include_workspaces: - search_placeholder: Search... types: program: Program portfolio: Portfolio diff --git a/config/locales/crowdin/js-vi.yml b/config/locales/crowdin/js-vi.yml index 4c2cff2803d..f6003009978 100644 --- a/config/locales/crowdin/js-vi.yml +++ b/config/locales/crowdin/js-vi.yml @@ -1041,16 +1041,13 @@ vi: all: Tất cả dự án selected: Chỉ được chọn search_placeholder: Tìm kiếm dự án... - search_placeholder_favorites: Tìm kiếm yêu thích... include_subprojects: Bao gồm tất cả các tiểu dự án tooltip: include_all_selected: Dự án đã được đưa vào kể từ khi tính năng Bao gồm tất cả các dự án con được bật. current_project: Đây là dự án hiện tại bạn đang tham gia. does_not_match_search: Dự án không phù hợp với tiêu chí tìm kiếm. no_results: Không có dự án nào phù hợp với tiêu chí tìm kiếm của bạn. - no_favorite_results: Không có dự án yêu thích nào phù hợp với tiêu chí tìm kiếm của bạn. include_workspaces: - search_placeholder: Tìm kiếm... types: program: chương trình portfolio: danh mục đầu tư diff --git a/config/locales/crowdin/js-zh-CN.yml b/config/locales/crowdin/js-zh-CN.yml index 9cb486d1314..1dfc6960dee 100644 --- a/config/locales/crowdin/js-zh-CN.yml +++ b/config/locales/crowdin/js-zh-CN.yml @@ -1041,16 +1041,13 @@ zh-CN: all: 所有项目 selected: 仅限所选 search_placeholder: 搜索项目… - search_placeholder_favorites: 搜索收藏夹… include_subprojects: 包含所有子项目 tooltip: include_all_selected: 自启用“包含所有子项目”后已包含的项目。 current_project: 这是您当前所在的项目。 does_not_match_search: 项目不符合搜索条件。 no_results: 没有项目符合您的搜索条件。 - no_favorite_results: 没有收藏的项目符合您的搜索条件。 include_workspaces: - search_placeholder: 搜索… types: program: 项目群 portfolio: 项目组合 diff --git a/config/locales/crowdin/js-zh-TW.yml b/config/locales/crowdin/js-zh-TW.yml index c774aaa6bd0..43c2168e54e 100644 --- a/config/locales/crowdin/js-zh-TW.yml +++ b/config/locales/crowdin/js-zh-TW.yml @@ -1041,16 +1041,13 @@ zh-TW: all: 所有專案 selected: 僅所選專案 search_placeholder: 搜尋專案... - search_placeholder_favorites: 搜尋我的收藏... include_subprojects: 包含子專案 tooltip: include_all_selected: 自啓用“包含所有子項目”後已包含的項目。 current_project: 這是您當前所在的專案。 does_not_match_search: 沒有符合搜尋條件 no_results: 沒有符合搜尋條件 - no_favorite_results: 沒有符合您搜尋條件的收藏專案。 include_workspaces: - search_placeholder: 搜尋…… types: program: 方案 portfolio: 專案組合 diff --git a/config/locales/crowdin/ka.yml b/config/locales/crowdin/ka.yml index f4633b16363..f80e7425c21 100644 --- a/config/locales/crowdin/ka.yml +++ b/config/locales/crowdin/ka.yml @@ -2107,17 +2107,14 @@ ka: before: must be before %{date}. before_or_equal_to: must be before or equal to %{date}. blank: can't be blank. - not_before_start_date: must not be before the start date. - overlapping_range: overlaps with an existing non-working day range. blank_nested: needs to have the property '%{property}' set. cannot_delete_mapping: is required. Cannot be deleted. - is_for_all_cannot_modify: is for all projects and can therefore not be modified. cant_link_a_work_package_with_a_descendant: A work package cannot be linked to one of its subtasks. circular_dependency: This relation would create a circular dependency. confirmation: doesn't match %{attribute}. could_not_be_copied: "%{dependency} could not be (fully) copied." + datetime_must_be_in_future: must be in the future. does_not_exist: does not exist. - user_already_in_department: User %{user_id} is already a member of department %{department_id}. error_enterprise_only: "%{action} is only available in the OpenProject Enterprise edition." error_unauthorized: may not be accessed. error_readonly: was attempted to be written but is not writable. @@ -2138,36 +2135,38 @@ ka: greater_than_or_equal_to: must be greater than or equal to %{count}. greater_than_or_equal_to_start_date: must be greater than or equal to the start date. greater_than_start_date: must be greater than the start date. + hexcode_invalid: is not a valid 6-digit hexadecimal color code. inclusion: is not set to one of the allowed values. inclusion_nested: is not set to one of the allowed values at path '%{path}'. invalid: არასწორია. invalid_uri: must be a valid URI. invalid_url: is not a valid URL. invalid_url_scheme: 'is not a supported protocol (allowed: %{allowed_schemes}).' + is_for_all_cannot_modify: is for all projects and can therefore not be modified. less_than_or_equal_to: must be less than or equal to %{count}. not_available: is not available due to a system configuration. + not_before_start_date: must not be before the start date. not_deletable: cannot be deleted. not_editable: cannot be edited because it is already in effect. not_current_user: is not the current user. - system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. not_found: not found. not_a_date: is not a valid date. not_a_datetime: is not a valid date time. not_a_number: is not a number. not_allowed: is invalid because of missing permissions. - host_not_allowed: is not an allowed host. not_json: is not parseable as JSON. not_json_object: is not a JSON object. not_an_integer: is not an integer. not_an_iso_date: 'is not a valid date. Required format: YYYY-MM-DD.' not_same_project: doesn't belong to the same project. - datetime_must_be_in_future: must be in the future. odd: კენტი უნდა იყოს. + overlapping_range: overlaps with an existing non-working day range. regex_match_failed: does not match the regular expression %{expression}. regex_invalid: could not be validated with the associated regular expression. regex_list_invalid: Lines %{invalid_lines} could not be parsed as regular expression. - hexcode_invalid: is not a valid 6-digit hexadecimal color code. smaller_than_or_equal_to_max_length: must be smaller than or equal to maximum length. + ssrf_filtered: violates the SSRF policy of this OpenProject instance. + system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. taken: has already been taken. too_long: is too long (maximum is %{count} characters). too_short: is too short (minimum is %{count} characters). @@ -2180,6 +2179,7 @@ ka: url_not_secure_context: 'is not providing a "Secure Context". Either use HTTPS or a loopback address, such as localhost. ' + user_already_in_department: User %{user_id} is already a member of department %{department_id}. wrong_length: is the wrong length (should be %{count} characters). models: group: @@ -3475,6 +3475,12 @@ ka: selected: Selected include_sub_items: Include sub-items no_results_text: No results + header: + project_select_component: + all_projects: All projects + favorites: Favorites + leave_project: Leave project + title: Projects toggle_switch: label_on: 'On' label_off: 'Off' diff --git a/config/locales/crowdin/kk.yml b/config/locales/crowdin/kk.yml index 536515a600c..02d1b9dec41 100644 --- a/config/locales/crowdin/kk.yml +++ b/config/locales/crowdin/kk.yml @@ -2107,17 +2107,14 @@ kk: before: must be before %{date}. before_or_equal_to: must be before or equal to %{date}. blank: can't be blank. - not_before_start_date: must not be before the start date. - overlapping_range: overlaps with an existing non-working day range. blank_nested: needs to have the property '%{property}' set. cannot_delete_mapping: is required. Cannot be deleted. - is_for_all_cannot_modify: is for all projects and can therefore not be modified. cant_link_a_work_package_with_a_descendant: A work package cannot be linked to one of its subtasks. circular_dependency: This relation would create a circular dependency. confirmation: doesn't match %{attribute}. could_not_be_copied: "%{dependency} could not be (fully) copied." + datetime_must_be_in_future: must be in the future. does_not_exist: does not exist. - user_already_in_department: User %{user_id} is already a member of department %{department_id}. error_enterprise_only: "%{action} is only available in the OpenProject Enterprise edition." error_unauthorized: may not be accessed. error_readonly: was attempted to be written but is not writable. @@ -2138,36 +2135,38 @@ kk: greater_than_or_equal_to: must be greater than or equal to %{count}. greater_than_or_equal_to_start_date: must be greater than or equal to the start date. greater_than_start_date: must be greater than the start date. + hexcode_invalid: is not a valid 6-digit hexadecimal color code. inclusion: is not set to one of the allowed values. inclusion_nested: is not set to one of the allowed values at path '%{path}'. invalid: is invalid. invalid_uri: must be a valid URI. invalid_url: is not a valid URL. invalid_url_scheme: 'is not a supported protocol (allowed: %{allowed_schemes}).' + is_for_all_cannot_modify: is for all projects and can therefore not be modified. less_than_or_equal_to: must be less than or equal to %{count}. not_available: is not available due to a system configuration. + not_before_start_date: must not be before the start date. not_deletable: cannot be deleted. not_editable: cannot be edited because it is already in effect. not_current_user: is not the current user. - system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. not_found: not found. not_a_date: is not a valid date. not_a_datetime: is not a valid date time. not_a_number: is not a number. not_allowed: is invalid because of missing permissions. - host_not_allowed: is not an allowed host. not_json: is not parseable as JSON. not_json_object: is not a JSON object. not_an_integer: is not an integer. not_an_iso_date: 'is not a valid date. Required format: YYYY-MM-DD.' not_same_project: doesn't belong to the same project. - datetime_must_be_in_future: must be in the future. odd: must be odd. + overlapping_range: overlaps with an existing non-working day range. regex_match_failed: does not match the regular expression %{expression}. regex_invalid: could not be validated with the associated regular expression. regex_list_invalid: Lines %{invalid_lines} could not be parsed as regular expression. - hexcode_invalid: is not a valid 6-digit hexadecimal color code. smaller_than_or_equal_to_max_length: must be smaller than or equal to maximum length. + ssrf_filtered: violates the SSRF policy of this OpenProject instance. + system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. taken: has already been taken. too_long: is too long (maximum is %{count} characters). too_short: is too short (minimum is %{count} characters). @@ -2180,6 +2179,7 @@ kk: url_not_secure_context: 'is not providing a "Secure Context". Either use HTTPS or a loopback address, such as localhost. ' + user_already_in_department: User %{user_id} is already a member of department %{department_id}. wrong_length: is the wrong length (should be %{count} characters). models: group: @@ -3475,6 +3475,12 @@ kk: selected: Selected include_sub_items: Include sub-items no_results_text: No results + header: + project_select_component: + all_projects: All projects + favorites: Favorites + leave_project: Leave project + title: Projects toggle_switch: label_on: 'On' label_off: 'Off' diff --git a/config/locales/crowdin/ko.yml b/config/locales/crowdin/ko.yml index 9fbaa047b9f..da84903ee29 100644 --- a/config/locales/crowdin/ko.yml +++ b/config/locales/crowdin/ko.yml @@ -2084,17 +2084,14 @@ ko: before: 은(는) %{date} 보다 전이어야 합니다. before_or_equal_to: 은(는) %{date} 이전이어야 합니다. blank: 내용을 입력해주세요 - not_before_start_date: "- 시작 날짜 전이 아니어야 합니다." - overlapping_range: "- 기존 휴무일 범위와 겹칩니다." blank_nested: "- '%{property}' 속성이 설정되어 있어야 합니다." cannot_delete_mapping: "- 필수입니다. 삭제할 수 없습니다." - is_for_all_cannot_modify: "- 모든 프로젝트용므로 수정할 수 없습니다." cant_link_a_work_package_with_a_descendant: 작업 패키지는 하위 작업패키지들 중 하나에 연결 될 수 없습니다. circular_dependency: 이 연계는 순환 종속관계를 만듭니다. confirmation: "%{attribute} 속성에 부합하지 않습니다." could_not_be_copied: "%{dependency}을(를) (완전히) 복사할 수 없습니다." + datetime_must_be_in_future: "- 미래여야 합니다." does_not_exist: 존재하지 않음 - user_already_in_department: "%{user_id} 사용자는 이미 %{department_id} 부서의 멤버입니다." error_enterprise_only: "%{action}은(는) OpenProject Enterprise Edition에서만 사용할 수 있습니다." error_unauthorized: 액세스하지 못할 수 있습니다. error_readonly: "- 쓰려고 했지만 쓸 수 없습니다." @@ -2115,36 +2112,38 @@ ko: greater_than_or_equal_to: 은(는) %{count}보다 크거야 같아야 합니다 greater_than_or_equal_to_start_date: 은(는) 시작 날짜 이후이거나 같아야 합니다. greater_than_start_date: 은(는) 시작 날짜 이후이어야 합니다. + hexcode_invalid: "- 유효한 6자리 16진수 색상 코드가 아닙니다." inclusion: 은(는) 허용되는 값이 아닙니다. inclusion_nested: "- 경로 '%{path}'에서 허용되는 값 중 하나로 설정되지 않았습니다." invalid: 은(는) 올바르지 않은 값입니다 invalid_uri: "- 유효한 URI여야 합니다." invalid_url: 은(는) 올바른 URL이 아닙니다. invalid_url_scheme: '은(는) 지원되는 프로토콜(허용: %{allowed_schemes})이 아닙니다.' + is_for_all_cannot_modify: "- 모든 프로젝트용므로 수정할 수 없습니다." less_than_or_equal_to: 은(는) %{count} 보다 작거나 같아야 합니다 not_available: "- 시스템 구성으로 인해 사용 가능하지 않습니다." + not_before_start_date: "- 시작 날짜 전이 아니어야 합니다." not_deletable: "- 삭제할 수 없습니다." not_editable: "- 이미 적용 중이므로 편집할 수 없습니다." not_current_user: 은(는) 현재 유효한 사용자가 아닙니다. - system_wide_non_working_day_exists: "- 이 날짜의 기존 시스템 전체 휴무일과 충돌합니다." not_found: "- 찾을 수 없습니다." not_a_date: 은(는) 유효한 날짜가 아닙니다. not_a_datetime: 은(는) 유효한 날짜가 아닙니다. not_a_number: 은(는) 숫자가 아닙니다. not_allowed: "- 사용 권한이 없어 유효하지 않습니다." - host_not_allowed: "- 허용되는 호스트가 아닙니다." not_json: "- JSON으로 구문 분석할 수 없습니다." not_json_object: "- JSON 개체가 아닙니다." not_an_integer: 은(는) 정수가 아닙니다. not_an_iso_date: '은(는) 유효한 날짜가 아닙니다. 필요한 형식: YYYY-MM-DD.' not_same_project: 은(는) 동일한 프로젝트에 속하지 않습니다. - datetime_must_be_in_future: "- 미래여야 합니다." odd: 에 홀수를 입력해 주세요 + overlapping_range: "- 기존 휴무일 범위와 겹칩니다." regex_match_failed: "%{expression} 정규 표현식과 일치하지 않습니다." regex_invalid: 관련 정규 표현식으로 유효성을 확인할 수 없습니다. regex_list_invalid: "%{invalid_lines} 라인을 정규 표현식으로 구문 분석할 수 없습니다." - hexcode_invalid: "- 유효한 6자리 16진수 색상 코드가 아닙니다." smaller_than_or_equal_to_max_length: 은(는) 최대 길이보다 같거나 작아야 합니다. + ssrf_filtered: violates the SSRF policy of this OpenProject instance. + system_wide_non_working_day_exists: "- 이 날짜의 기존 시스템 전체 휴무일과 충돌합니다." taken: 은(는) 이미 존재합니다. too_long: 은(는) 너무 깁니다 (최대 %{count}자까지 가능합니다) too_short: 은(는) 너무 짧습니다. (최소 %{count} 자 이상이어야 합니다) @@ -2157,6 +2156,7 @@ ko: url_not_secure_context: '"보안 컨텍스트"를 제공하지 않습니다. HTTPS 또는 localhost 같은 루프백 주소를 사용하세요. ' + user_already_in_department: "%{user_id} 사용자는 이미 %{department_id} 부서의 멤버입니다." wrong_length: 너무 짧습니다 (최소 %{count} 자 이상이어야 합니다). models: group: @@ -3429,6 +3429,12 @@ ko: selected: 선택됨 include_sub_items: 하위 항목 포함 no_results_text: 결과 없음 + header: + project_select_component: + all_projects: All projects + favorites: Favorites + leave_project: Leave project + title: Projects toggle_switch: label_on: 켜기 label_off: 끄기 diff --git a/config/locales/crowdin/lt.yml b/config/locales/crowdin/lt.yml index b62e955f605..026e125ce62 100644 --- a/config/locales/crowdin/lt.yml +++ b/config/locales/crowdin/lt.yml @@ -2148,17 +2148,14 @@ lt: before: turi eiti prieš %{date}. before_or_equal_to: turi eiti prieš arba būti lygu %{date}. blank: negali būti tuščia. - not_before_start_date: must not be before the start date. - overlapping_range: overlaps with an existing non-working day range. blank_nested: reikalauja, kad savybė '%{property}' būtų nustatyta. cannot_delete_mapping: is required. Cannot be deleted. - is_for_all_cannot_modify: is for all projects and can therefore not be modified. cant_link_a_work_package_with_a_descendant: Darbų paketas negali būti susietas su viena iš savo vidinių užduočių. circular_dependency: Šis ryšys sukurtų ciklinę priklausomybę. confirmation: nesutampa su %{attribute}. could_not_be_copied: "%{dependency} negali (pilnai) būti nukopijuota(s)." + datetime_must_be_in_future: must be in the future. does_not_exist: neegzistuoja. - user_already_in_department: User %{user_id} is already a member of department %{department_id}. error_enterprise_only: "%{action} is only available in the OpenProject Enterprise edition." error_unauthorized: negali būti pasiektas. error_readonly: bandytas įrašyti, bet įrašyti nebuvo galima. @@ -2179,36 +2176,38 @@ lt: greater_than_or_equal_to: turi būti didesnis arba lygus %{count}. greater_than_or_equal_to_start_date: turi būti didesnis arba lygus už pradžios datą. greater_than_start_date: turi būti didesnis už pradžios datą. + hexcode_invalid: is not a valid 6-digit hexadecimal color code. inclusion: nenustatyta kaip viena iš leidžiamų reikšmių. inclusion_nested: nėra nustatytas į vieną iš leidžiamų reikšmių kelyje „%{path}“. invalid: " neteisingas." invalid_uri: must be a valid URI. invalid_url: nėra tinkamas URL. invalid_url_scheme: 'nėra palaikomos protokolas (leidžiamas: %{allowed_schemes}).' + is_for_all_cannot_modify: is for all projects and can therefore not be modified. less_than_or_equal_to: turi būti mažesnis arba lygus %{count}. not_available: yra nepasiekiamas dėl sistemos konfigūracijos + not_before_start_date: must not be before the start date. not_deletable: negali būti pašalintas. not_editable: cannot be edited because it is already in effect. not_current_user: nėra dabartinis naudotojas - system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. not_found: not found. not_a_date: nėra tinkama data. not_a_datetime: nėra tinkama data ir laikas. not_a_number: nėra skaičius. not_allowed: netinkamas dėl trūkstamų teisių. - host_not_allowed: is not an allowed host. not_json: is not parseable as JSON. not_json_object: is not a JSON object. not_an_integer: nėra sveikasis skaičius. not_an_iso_date: 'nėra tinkama data. Reikalingas formatas: YYYY-MM-DD.' not_same_project: nepriklauso tam pačiam projektui. - datetime_must_be_in_future: must be in the future. odd: turi būti nelyginis. + overlapping_range: overlaps with an existing non-working day range. regex_match_failed: neatitinka reguliariosios išraiškos %{expression}. regex_invalid: negalėjo būti patvirtintas su susieta reguliaria išraiška. regex_list_invalid: Lines %{invalid_lines} could not be parsed as regular expression. - hexcode_invalid: is not a valid 6-digit hexadecimal color code. smaller_than_or_equal_to_max_length: turi būti mažesnis arba lygus didžiausiam ilgiui. + ssrf_filtered: violates the SSRF policy of this OpenProject instance. + system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. taken: jau užimtas. too_long: yra per ilgas (daugiausiai galima %{count} simbolių). too_short: yra per trumpas (mažiausiai %{count} simbolių). @@ -2221,6 +2220,7 @@ lt: url_not_secure_context: 'neteikia „Saugaus konteksto“. Arba naudokite HTTPS, arba atgalinį adresą, tokį kaip localhost. ' + user_already_in_department: User %{user_id} is already a member of department %{department_id}. wrong_length: yra neteisingo ilgio (turi būti %{count} simbolių). models: group: @@ -3598,6 +3598,12 @@ lt: selected: Selected include_sub_items: Include sub-items no_results_text: No results + header: + project_select_component: + all_projects: All projects + favorites: Favorites + leave_project: Leave project + title: Projects toggle_switch: label_on: 'On' label_off: 'Off' diff --git a/config/locales/crowdin/lv.yml b/config/locales/crowdin/lv.yml index 7459ab0d505..5f6ef219a24 100644 --- a/config/locales/crowdin/lv.yml +++ b/config/locales/crowdin/lv.yml @@ -2128,17 +2128,14 @@ lv: before: jābūt pirms %{date}. before_or_equal_to: jābūt pirms vai vienādam ar %{date}. blank: nevar būt tukšs. - not_before_start_date: must not be before the start date. - overlapping_range: overlaps with an existing non-working day range. blank_nested: needs to have the property '%{property}' set. cannot_delete_mapping: is required. Cannot be deleted. - is_for_all_cannot_modify: is for all projects and can therefore not be modified. cant_link_a_work_package_with_a_descendant: Darbu kompleksu nevar saistīt vienu no tā apakšuzdevumiem. circular_dependency: Šī attiecība radītu riņķveida saistību. confirmation: neatbilst %{attribute}. could_not_be_copied: "%{dependency} could not be (fully) copied." + datetime_must_be_in_future: must be in the future. does_not_exist: nepastāv. - user_already_in_department: User %{user_id} is already a member of department %{department_id}. error_enterprise_only: "%{action} is only available in the OpenProject Enterprise edition." error_unauthorized: may not be accessed. error_readonly: was attempted to be written but is not writable. @@ -2159,36 +2156,38 @@ lv: greater_than_or_equal_to: jābūt lielākam vai vienādam ar %{count}. greater_than_or_equal_to_start_date: must be greater than or equal to the start date. greater_than_start_date: must be greater than the start date. + hexcode_invalid: is not a valid 6-digit hexadecimal color code. inclusion: nav iestatīts uz vienu no atļautajām vērtībām. inclusion_nested: is not set to one of the allowed values at path '%{path}'. invalid: nav derīgs. invalid_uri: must be a valid URI. invalid_url: nederīgs URL vietrādis. invalid_url_scheme: 'is not a supported protocol (allowed: %{allowed_schemes}).' + is_for_all_cannot_modify: is for all projects and can therefore not be modified. less_than_or_equal_to: jābūt mazākam vai vienādam ar %{count}. not_available: is not available due to a system configuration. + not_before_start_date: must not be before the start date. not_deletable: cannot be deleted. not_editable: cannot be edited because it is already in effect. not_current_user: is not the current user. - system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. not_found: not found. not_a_date: is not a valid date. not_a_datetime: is not a valid date time. not_a_number: nav skaitlis. not_allowed: is invalid because of missing permissions. - host_not_allowed: is not an allowed host. not_json: is not parseable as JSON. not_json_object: is not a JSON object. not_an_integer: nav vesels skaitlis. not_an_iso_date: 'is not a valid date. Required format: YYYY-MM-DD.' not_same_project: neietilpst vienā un tai pašā projektā. - datetime_must_be_in_future: must be in the future. odd: jābūt nepāra. + overlapping_range: overlaps with an existing non-working day range. regex_match_failed: does not match the regular expression %{expression}. regex_invalid: could not be validated with the associated regular expression. regex_list_invalid: Lines %{invalid_lines} could not be parsed as regular expression. - hexcode_invalid: is not a valid 6-digit hexadecimal color code. smaller_than_or_equal_to_max_length: jābūt mazākam vai vienādam ar maksimālo garumu. + ssrf_filtered: violates the SSRF policy of this OpenProject instance. + system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. taken: jau tika aizņemts. too_long: ir pārāk garš (maksimums ir %{count} rakstzīmes). too_short: ir pārāk īss (minimums ir %{count} rakstzīmes). @@ -2201,6 +2200,7 @@ lv: url_not_secure_context: 'is not providing a "Secure Context". Either use HTTPS or a loopback address, such as localhost. ' + user_already_in_department: User %{user_id} is already a member of department %{department_id}. wrong_length: ir nepareizs garums (vajadzētu būt %{count} rakstzīmes). models: group: @@ -3537,6 +3537,12 @@ lv: selected: Selected include_sub_items: Include sub-items no_results_text: No results + header: + project_select_component: + all_projects: All projects + favorites: Favorites + leave_project: Leave project + title: Projects toggle_switch: label_on: 'On' label_off: 'Off' diff --git a/config/locales/crowdin/mn.yml b/config/locales/crowdin/mn.yml index 6f832b06c26..d6e9dc22098 100644 --- a/config/locales/crowdin/mn.yml +++ b/config/locales/crowdin/mn.yml @@ -2107,17 +2107,14 @@ mn: before: must be before %{date}. before_or_equal_to: must be before or equal to %{date}. blank: can't be blank. - not_before_start_date: must not be before the start date. - overlapping_range: overlaps with an existing non-working day range. blank_nested: needs to have the property '%{property}' set. cannot_delete_mapping: is required. Cannot be deleted. - is_for_all_cannot_modify: is for all projects and can therefore not be modified. cant_link_a_work_package_with_a_descendant: A work package cannot be linked to one of its subtasks. circular_dependency: This relation would create a circular dependency. confirmation: doesn't match %{attribute}. could_not_be_copied: "%{dependency} could not be (fully) copied." + datetime_must_be_in_future: must be in the future. does_not_exist: does not exist. - user_already_in_department: User %{user_id} is already a member of department %{department_id}. error_enterprise_only: "%{action} is only available in the OpenProject Enterprise edition." error_unauthorized: may not be accessed. error_readonly: was attempted to be written but is not writable. @@ -2138,36 +2135,38 @@ mn: greater_than_or_equal_to: must be greater than or equal to %{count}. greater_than_or_equal_to_start_date: must be greater than or equal to the start date. greater_than_start_date: must be greater than the start date. + hexcode_invalid: is not a valid 6-digit hexadecimal color code. inclusion: is not set to one of the allowed values. inclusion_nested: is not set to one of the allowed values at path '%{path}'. invalid: is invalid. invalid_uri: must be a valid URI. invalid_url: is not a valid URL. invalid_url_scheme: 'is not a supported protocol (allowed: %{allowed_schemes}).' + is_for_all_cannot_modify: is for all projects and can therefore not be modified. less_than_or_equal_to: must be less than or equal to %{count}. not_available: is not available due to a system configuration. + not_before_start_date: must not be before the start date. not_deletable: cannot be deleted. not_editable: cannot be edited because it is already in effect. not_current_user: is not the current user. - system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. not_found: not found. not_a_date: is not a valid date. not_a_datetime: is not a valid date time. not_a_number: is not a number. not_allowed: is invalid because of missing permissions. - host_not_allowed: is not an allowed host. not_json: is not parseable as JSON. not_json_object: is not a JSON object. not_an_integer: is not an integer. not_an_iso_date: 'is not a valid date. Required format: YYYY-MM-DD.' not_same_project: doesn't belong to the same project. - datetime_must_be_in_future: must be in the future. odd: must be odd. + overlapping_range: overlaps with an existing non-working day range. regex_match_failed: does not match the regular expression %{expression}. regex_invalid: could not be validated with the associated regular expression. regex_list_invalid: Lines %{invalid_lines} could not be parsed as regular expression. - hexcode_invalid: is not a valid 6-digit hexadecimal color code. smaller_than_or_equal_to_max_length: must be smaller than or equal to maximum length. + ssrf_filtered: violates the SSRF policy of this OpenProject instance. + system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. taken: has already been taken. too_long: is too long (maximum is %{count} characters). too_short: is too short (minimum is %{count} characters). @@ -2180,6 +2179,7 @@ mn: url_not_secure_context: 'is not providing a "Secure Context". Either use HTTPS or a loopback address, such as localhost. ' + user_already_in_department: User %{user_id} is already a member of department %{department_id}. wrong_length: is the wrong length (should be %{count} characters). models: group: @@ -3475,6 +3475,12 @@ mn: selected: Selected include_sub_items: Include sub-items no_results_text: No results + header: + project_select_component: + all_projects: All projects + favorites: Favorites + leave_project: Leave project + title: Projects toggle_switch: label_on: 'On' label_off: 'Off' diff --git a/config/locales/crowdin/ms.yml b/config/locales/crowdin/ms.yml index 26a8bc6f60b..add3b321d2d 100644 --- a/config/locales/crowdin/ms.yml +++ b/config/locales/crowdin/ms.yml @@ -2086,17 +2086,14 @@ ms: before: mesti sebelum %{date}. before_or_equal_to: mesti sebelum atau sama dengan %{date}. blank: tidak boleh dibiarkan kosong. - not_before_start_date: must not be before the start date. - overlapping_range: overlaps with an existing non-working day range. blank_nested: perlu ada ciri-ciri '%{property}' yang ditetapkan. cannot_delete_mapping: diperlukan. Tidak boleh dipadam. - is_for_all_cannot_modify: adalah untuk semua projek dan oleh itu tidak boleh diubah suai. cant_link_a_work_package_with_a_descendant: Pakej kerja tidak boleh dipautkan ke salah satu subtugasnya. circular_dependency: Hubungan ini akan mencipta kebergantungan bulat. confirmation: tidak sepadan dengan %{attribute}. could_not_be_copied: "%{dependency} tidak dapat disalin (sepenuhnya)." + datetime_must_be_in_future: mestilah pada masa hadapan. does_not_exist: tidak wujud. - user_already_in_department: User %{user_id} is already a member of department %{department_id}. error_enterprise_only: "%{action} is only available in the OpenProject Enterprise edition." error_unauthorized: tidak boleh diakses. error_readonly: telah cuba untuk menulis tetapi tidak dapat ditulis. @@ -2117,36 +2114,38 @@ ms: greater_than_or_equal_to: perlu lebih besar atau sama dengan %{count}. greater_than_or_equal_to_start_date: perlu lebih besar atau sama dengan tarikh mula. greater_than_start_date: perlu lebih besar dari tarikh mula. + hexcode_invalid: is not a valid 6-digit hexadecimal color code. inclusion: tidak ditetapkan pada salah satu nilai yang dibenarkan. inclusion_nested: tidak ditetapkan pada salah satu nilai yang dibenarkan pada laluan '%{path}'. invalid: adalah tidak sah. invalid_uri: must be a valid URI. invalid_url: bukan URL yang sah. invalid_url_scheme: 'adalah bukan protokol yang disokong (dibenarkan: %{allowed_schemes}).' + is_for_all_cannot_modify: adalah untuk semua projek dan oleh itu tidak boleh diubah suai. less_than_or_equal_to: perlu kurang daripada atau sama dengan %{count}. not_available: adalah tidak tersedia kerana konfigurasi sistem. + not_before_start_date: must not be before the start date. not_deletable: tidak dapat dipadamkan. not_editable: cannot be edited because it is already in effect. not_current_user: adalah bukan pengguna semasa. - system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. not_found: tidak dijumpai. not_a_date: bukan tarikh yang sah. not_a_datetime: bukan tarikh masa yang sah. not_a_number: bukan nombor. not_allowed: adalah tidak sah kerana kekurangan kebenaran. - host_not_allowed: is not an allowed host. not_json: is not parseable as JSON. not_json_object: is not a JSON object. not_an_integer: bukan sebuah integer. not_an_iso_date: 'bukan tarikh yang sah. Format yang diperlukan: TTTT-BB-HH.' not_same_project: tidak tergolong dalam projek yang sama. - datetime_must_be_in_future: mestilah pada masa hadapan. odd: mesti ganjil. + overlapping_range: overlaps with an existing non-working day range. regex_match_failed: tidak padan dengan ungkapan biasa %{expression}. regex_invalid: tidak dapat disahkan dengan ungkapan biasa yang berkaitan. regex_list_invalid: Lines %{invalid_lines} could not be parsed as regular expression. - hexcode_invalid: is not a valid 6-digit hexadecimal color code. smaller_than_or_equal_to_max_length: perlu kurang daripada atau sama dengan panjang maksima. + ssrf_filtered: violates the SSRF policy of this OpenProject instance. + system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. taken: sudah diguna pakai. too_long: adalah terlalu panjang (maksimum adalah %{count} karakter). too_short: adalah terlalu pendek (minimum adalah %{count} karakter). @@ -2159,6 +2158,7 @@ ms: url_not_secure_context: 'tidak menyediakan "Konteks Selamat". Gunakan antara HTTPS atau alamat gelung-balik, seperti localhost. ' + user_already_in_department: User %{user_id} is already a member of department %{department_id}. wrong_length: adalah panjang yang salah (sepatutnya %{count} karakter). models: group: @@ -3421,6 +3421,12 @@ ms: selected: Selected include_sub_items: Include sub-items no_results_text: No results + header: + project_select_component: + all_projects: All projects + favorites: Favorites + leave_project: Leave project + title: Projects toggle_switch: label_on: 'On' label_off: 'Off' diff --git a/config/locales/crowdin/ne.yml b/config/locales/crowdin/ne.yml index a3b248f8c1f..090bb4fd8f8 100644 --- a/config/locales/crowdin/ne.yml +++ b/config/locales/crowdin/ne.yml @@ -2107,17 +2107,14 @@ ne: before: must be before %{date}. before_or_equal_to: must be before or equal to %{date}. blank: can't be blank. - not_before_start_date: must not be before the start date. - overlapping_range: overlaps with an existing non-working day range. blank_nested: needs to have the property '%{property}' set. cannot_delete_mapping: is required. Cannot be deleted. - is_for_all_cannot_modify: is for all projects and can therefore not be modified. cant_link_a_work_package_with_a_descendant: A work package cannot be linked to one of its subtasks. circular_dependency: This relation would create a circular dependency. confirmation: doesn't match %{attribute}. could_not_be_copied: "%{dependency} could not be (fully) copied." + datetime_must_be_in_future: must be in the future. does_not_exist: does not exist. - user_already_in_department: User %{user_id} is already a member of department %{department_id}. error_enterprise_only: "%{action} is only available in the OpenProject Enterprise edition." error_unauthorized: may not be accessed. error_readonly: was attempted to be written but is not writable. @@ -2138,36 +2135,38 @@ ne: greater_than_or_equal_to: must be greater than or equal to %{count}. greater_than_or_equal_to_start_date: must be greater than or equal to the start date. greater_than_start_date: must be greater than the start date. + hexcode_invalid: is not a valid 6-digit hexadecimal color code. inclusion: is not set to one of the allowed values. inclusion_nested: is not set to one of the allowed values at path '%{path}'. invalid: is invalid. invalid_uri: must be a valid URI. invalid_url: is not a valid URL. invalid_url_scheme: 'is not a supported protocol (allowed: %{allowed_schemes}).' + is_for_all_cannot_modify: is for all projects and can therefore not be modified. less_than_or_equal_to: must be less than or equal to %{count}. not_available: is not available due to a system configuration. + not_before_start_date: must not be before the start date. not_deletable: cannot be deleted. not_editable: cannot be edited because it is already in effect. not_current_user: is not the current user. - system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. not_found: not found. not_a_date: is not a valid date. not_a_datetime: is not a valid date time. not_a_number: is not a number. not_allowed: is invalid because of missing permissions. - host_not_allowed: is not an allowed host. not_json: is not parseable as JSON. not_json_object: is not a JSON object. not_an_integer: is not an integer. not_an_iso_date: 'is not a valid date. Required format: YYYY-MM-DD.' not_same_project: doesn't belong to the same project. - datetime_must_be_in_future: must be in the future. odd: must be odd. + overlapping_range: overlaps with an existing non-working day range. regex_match_failed: does not match the regular expression %{expression}. regex_invalid: could not be validated with the associated regular expression. regex_list_invalid: Lines %{invalid_lines} could not be parsed as regular expression. - hexcode_invalid: is not a valid 6-digit hexadecimal color code. smaller_than_or_equal_to_max_length: must be smaller than or equal to maximum length. + ssrf_filtered: violates the SSRF policy of this OpenProject instance. + system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. taken: has already been taken. too_long: is too long (maximum is %{count} characters). too_short: is too short (minimum is %{count} characters). @@ -2180,6 +2179,7 @@ ne: url_not_secure_context: 'is not providing a "Secure Context". Either use HTTPS or a loopback address, such as localhost. ' + user_already_in_department: User %{user_id} is already a member of department %{department_id}. wrong_length: is the wrong length (should be %{count} characters). models: group: @@ -3475,6 +3475,12 @@ ne: selected: Selected include_sub_items: Include sub-items no_results_text: No results + header: + project_select_component: + all_projects: All projects + favorites: Favorites + leave_project: Leave project + title: Projects toggle_switch: label_on: 'On' label_off: 'Off' diff --git a/config/locales/crowdin/nl.yml b/config/locales/crowdin/nl.yml index 6911777bb38..59005313298 100644 --- a/config/locales/crowdin/nl.yml +++ b/config/locales/crowdin/nl.yml @@ -2105,17 +2105,14 @@ nl: before: moet voor %{date} zijn. before_or_equal_to: moet voor of gelijk zijn aan %{date}. blank: mag niet leeg zijn. - not_before_start_date: must not be before the start date. - overlapping_range: overlaps with an existing non-working day range. blank_nested: moet de eigenschap '%{property}' ingesteld hebben. cannot_delete_mapping: is vereist. Kan niet worden verwijderd. - is_for_all_cannot_modify: is for all projects and can therefore not be modified. cant_link_a_work_package_with_a_descendant: Een werkpakket kan niet worden gekoppeld aan een van de bijbehorende subtaken. circular_dependency: Deze relatie zou een circulaire afhankelijkheid creëren. confirmation: komt niet overeen met %{attribute}. could_not_be_copied: "%{dependency} kon niet (volledig) worden gekopieerd." + datetime_must_be_in_future: must be in the future. does_not_exist: bestaat niet. - user_already_in_department: User %{user_id} is already a member of department %{department_id}. error_enterprise_only: "%{action} is only available in the OpenProject Enterprise edition." error_unauthorized: geen toegang. error_readonly: werd geprobeerd te schrijven maar is niet schrijfbaar. @@ -2136,36 +2133,38 @@ nl: greater_than_or_equal_to: moet groter dan of gelijk zijn aan %{count}. greater_than_or_equal_to_start_date: moet groter of gelijk zijn aan startdatum. greater_than_start_date: moet groter zijn dan startdatum. + hexcode_invalid: is not a valid 6-digit hexadecimal color code. inclusion: is niet ingesteld op één van de toegestane waarden. inclusion_nested: is niet ingesteld op een van de toegestane waarden op pad '%{path}'. invalid: is ongeldig. invalid_uri: must be a valid URI. invalid_url: is geen geldige URL. invalid_url_scheme: 'is geen ondersteunde protocol (toegestaan: %{allowed_schemes}).' + is_for_all_cannot_modify: is for all projects and can therefore not be modified. less_than_or_equal_to: moet kleiner zijn dan of gelijk aan %{count}. not_available: is niet beschikbaar vanwege een systeemconfiguratie. + not_before_start_date: must not be before the start date. not_deletable: kan niet worden verwijderd. not_editable: cannot be edited because it is already in effect. not_current_user: is niet de huidige gebruiker. - system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. not_found: niet gevonden. not_a_date: is geen geldige datum. not_a_datetime: is geen geldige datum tijd. not_a_number: is geen getal. not_allowed: is ongeldig vanwege ontbrekende machtigingen. - host_not_allowed: is not an allowed host. not_json: is not parseable as JSON. not_json_object: is not a JSON object. not_an_integer: is niet een geheel getal. not_an_iso_date: 'is geen geldige datum. Vereist formaat: JJJJ-MM-DD.' not_same_project: hoort niet bij hetzelfde project. - datetime_must_be_in_future: must be in the future. odd: moet oneven zijn. + overlapping_range: overlaps with an existing non-working day range. regex_match_failed: does not match the regular expression %{expression}. regex_invalid: kon niet worden gevalideerd met de bijbehorende reguliere expressie. regex_list_invalid: Lines %{invalid_lines} could not be parsed as regular expression. - hexcode_invalid: is not a valid 6-digit hexadecimal color code. smaller_than_or_equal_to_max_length: moet kleiner zijn dan of even groot zijn als de maximale lengte. + ssrf_filtered: violates the SSRF policy of this OpenProject instance. + system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. taken: is al in gebruik. too_long: is te lang (maximaal %{count} karakters). too_short: is te kort (minimum is %{count} karakters). @@ -2178,6 +2177,7 @@ nl: url_not_secure_context: 'bevat geen "Secure Context". Gebruik HTTPS of een loopbackadres, zoals localhost. ' + user_already_in_department: User %{user_id} is already a member of department %{department_id}. wrong_length: is de verkeerde lengte (dient %{count} karakters te zijn). models: group: @@ -3471,6 +3471,12 @@ nl: selected: Selected include_sub_items: Include sub-items no_results_text: No results + header: + project_select_component: + all_projects: All projects + favorites: Favorites + leave_project: Leave project + title: Projects toggle_switch: label_on: 'On' label_off: 'Off' diff --git a/config/locales/crowdin/no.yml b/config/locales/crowdin/no.yml index 7dae744b6db..a17e7ec393b 100644 --- a/config/locales/crowdin/no.yml +++ b/config/locales/crowdin/no.yml @@ -2105,17 +2105,14 @@ before: må være før %{date}. before_or_equal_to: må være før eller lik %{date}. blank: kan ikke være blank. - not_before_start_date: must not be before the start date. - overlapping_range: overlaps with an existing non-working day range. blank_nested: må ha egenskapen '%{property}' aktivert. cannot_delete_mapping: er påkrevd. Kan ikke slettes. - is_for_all_cannot_modify: er for alle prosjekter og kan derfor ikke modifiseres. cant_link_a_work_package_with_a_descendant: En arbeidspakke kan ikke knyttes til en av sine deloppgaver. circular_dependency: En slik relasjon ville lage en sirkulær avhengighet. confirmation: samsvarer ikke med %{attribute}. could_not_be_copied: "%{dependency} kunne ikke kopieres (fullstendig)." + datetime_must_be_in_future: must be in the future. does_not_exist: finnes ikke. - user_already_in_department: User %{user_id} is already a member of department %{department_id}. error_enterprise_only: "%{action} is only available in the OpenProject Enterprise edition." error_unauthorized: kan ikke nås error_readonly: ble forsøkt skrevet til, men er skrivebeskyttet @@ -2136,36 +2133,38 @@ greater_than_or_equal_to: 'må være større enn eller lik: %{count}.' greater_than_or_equal_to_start_date: må være lenger frem eller lik startdato. greater_than_start_date: må være lenger frem enn startdato. + hexcode_invalid: is not a valid 6-digit hexadecimal color code. inclusion: ikke er satt til en av de tillatte verdiene. inclusion_nested: er ikke satt til en av de tillatte verdiene i stien%{path}'. invalid: er ugyldig. invalid_uri: must be a valid URI. invalid_url: er ikke en gyldig URL. invalid_url_scheme: 'er ikke en støttet protokoll (tillatt: %{allowed_schemes}).' + is_for_all_cannot_modify: er for alle prosjekter og kan derfor ikke modifiseres. less_than_or_equal_to: må være mindre enn eller lik %{count}. not_available: er ikke tilgjengelig på grunn av en systemkonfigurasjon. + not_before_start_date: must not be before the start date. not_deletable: kan ikke slettes. not_editable: cannot be edited because it is already in effect. not_current_user: er ikke gjeldende bruker. - system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. not_found: not found. not_a_date: er ikke en gyldig dato. not_a_datetime: er ikke et gyldig tidspunkt for datoen. not_a_number: er ikke et tall. not_allowed: er ugyldig på grunn av manglende tillatelser. - host_not_allowed: is not an allowed host. not_json: is not parseable as JSON. not_json_object: is not a JSON object. not_an_integer: er ikke et heltall. not_an_iso_date: 'er ikke en gyldig dato. Påkrevd format: ÅÅÅÅ-MM-DD.' not_same_project: hører ikke til samme prosjekt. - datetime_must_be_in_future: must be in the future. odd: må være oddetall. + overlapping_range: overlaps with an existing non-working day range. regex_match_failed: samsvarer ikke med det regulære uttrykket %{expression}. regex_invalid: kunne ikke valideres med det tilhørende regulære uttrykket. regex_list_invalid: Lines %{invalid_lines} could not be parsed as regular expression. - hexcode_invalid: is not a valid 6-digit hexadecimal color code. smaller_than_or_equal_to_max_length: må være mindre enn eller lik maksimumslengden. + ssrf_filtered: violates the SSRF policy of this OpenProject instance. + system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. taken: er allerede tatt. too_long: er for lang (maks antall tegn er %{count}). too_short: er for kort (minimum er %{count} tegn). @@ -2178,6 +2177,7 @@ url_not_secure_context: 'Ikke oppgi en "Secure Context". Enten bruk HTTPS eller en loopback address, som localhost. ' + user_already_in_department: User %{user_id} is already a member of department %{department_id}. wrong_length: har feil lengde (skal være %{count} tegn). models: group: @@ -3473,6 +3473,12 @@ selected: Selected include_sub_items: Include sub-items no_results_text: No results + header: + project_select_component: + all_projects: All projects + favorites: Favorites + leave_project: Leave project + title: Projects toggle_switch: label_on: 'On' label_off: 'Off' diff --git a/config/locales/crowdin/pl.yml b/config/locales/crowdin/pl.yml index 02fc318a8fb..cde8bc3e5ce 100644 --- a/config/locales/crowdin/pl.yml +++ b/config/locales/crowdin/pl.yml @@ -2145,17 +2145,14 @@ pl: before: musi być przed %{date}. before_or_equal_to: musi być przed lub równe %{date}. blank: nie może być puste. - not_before_start_date: nie może być wcześniejsza niż data rozpoczęcia. - overlapping_range: pokrywa się z istniejącym zakresem dni wolnych od pracy. blank_nested: musi mieć ustawioną właściwość '%{property}'. cannot_delete_mapping: jest wymagane. Nie można usunąć. - is_for_all_cannot_modify: dotyczy wszystkich projektów i dlatego nie można zmodyfikować. cant_link_a_work_package_with_a_descendant: Zestaw zadań nie może być powiązany z jego podzadaniami. circular_dependency: Ta relacja może wytworzyć zależność cykliczną. confirmation: nie pasuje do %{attribute}. could_not_be_copied: Nie można było (w pełni) skopiować %{dependency}. + datetime_must_be_in_future: musi przypadać w przyszłości. does_not_exist: nie istnieje. - user_already_in_department: Użytkownik %{user_id} jest już członkiem działu %{department_id}. error_enterprise_only: "%{action} – dostępne tylko w OpenProject Enterprise edition." error_unauthorized: "— nie można uzyskac dostępu." error_readonly: "— podjęto próbę zapisu, ale nie jest zapisywalny." @@ -2176,36 +2173,38 @@ pl: greater_than_or_equal_to: musi być większe niż lub równe %{count}. greater_than_or_equal_to_start_date: musi być późniejsza niż data początku albo równa jej. greater_than_start_date: musi być późniejsza niż data początku. + hexcode_invalid: nie jest prawidłowym 6-cyfrowym szesnastkowym kodem koloru. inclusion: jest niezgodne z jednym z dozwolonych wartości. inclusion_nested: nie jest ustawione na jedną z dozwolonych wartości na ścieżce '%{path}'. invalid: jest nieprawidłowe. invalid_uri: musi być prawidłowym adres URI. invalid_url: nie jest poprawnym adresem URL. invalid_url_scheme: 'nie jest obsługiwanym protokołem (dozwolone: %{allowed_schemes}).' + is_for_all_cannot_modify: dotyczy wszystkich projektów i dlatego nie można zmodyfikować. less_than_or_equal_to: musi być mniejsze niż lub równe %{count}. not_available: jest niedostępne z powodu konfiguracji systemu. + not_before_start_date: nie może być wcześniejsza niż data rozpoczęcia. not_deletable: "— nie można usunąć." not_editable: nie można edytować, ponieważ jest już w użyciu. not_current_user: nie jest bieżącym użytkownikiem. - system_wide_non_working_day_exists: koliduje z istniejącym dniem wolnym od pracy w całym systemie dla tej daty. not_found: nie znaleziono. not_a_date: nie jest poprawną datą. not_a_datetime: nie jest poprawną datą i czasem. not_a_number: nie jest liczbą. not_allowed: jest nieprawidłowy ze względu na brak uprawnień. - host_not_allowed: nie jest dozwolonym hostem. not_json: nie może być analizowany jako kod JSON. not_json_object: nie jest obiektem JSON. not_an_integer: nie jest liczbą całkowitą. not_an_iso_date: 'wprowadzono nieprawidłową datę. Wymagany format: RRRR-MM-DD.' not_same_project: nie należy do tego samego projektu. - datetime_must_be_in_future: musi przypadać w przyszłości. odd: musi być nieparzyste. + overlapping_range: pokrywa się z istniejącym zakresem dni wolnych od pracy. regex_match_failed: nie pasuje do wyrażenia regularnego %{expression}. regex_invalid: nie może być zastosowany z zastosowanym wyrażeniem regularnym. regex_list_invalid: Nie można przeanalizować %{invalid_lines} wierszy jako wyrażenia regularnego. - hexcode_invalid: nie jest prawidłowym 6-cyfrowym szesnastkowym kodem koloru. smaller_than_or_equal_to_max_length: musi być mniejsze niż lub równe z maksymalnej długości. + ssrf_filtered: violates the SSRF policy of this OpenProject instance. + system_wide_non_working_day_exists: koliduje z istniejącym dniem wolnym od pracy w całym systemie dla tej daty. taken: zostały już podjęte. too_long: jest zbyt długi (maksymalnie %{count} znaków). too_short: jest zbyt krótkie (min. %{count} znaków). @@ -2218,6 +2217,7 @@ pl: url_not_secure_context: 'nie zapewnia „bezpiecznego kontekstu”. Użyj protokołu HTTPS albo adresu pętli zwrotnej, takiej jak localhost. ' + user_already_in_department: Użytkownik %{user_id} jest już członkiem działu %{department_id}. wrong_length: ma nieprawidłową długość (powinno mieć %{count} znaków). models: group: @@ -3591,6 +3591,12 @@ pl: selected: Wybrany include_sub_items: Uwzględnij elementy podrzędne no_results_text: Brak wyników + header: + project_select_component: + all_projects: All projects + favorites: Favorites + leave_project: Leave project + title: Projects toggle_switch: label_on: Wł. label_off: Wył. diff --git a/config/locales/crowdin/pt-BR.yml b/config/locales/crowdin/pt-BR.yml index 426980d544c..8dfcbae57bf 100644 --- a/config/locales/crowdin/pt-BR.yml +++ b/config/locales/crowdin/pt-BR.yml @@ -2104,17 +2104,14 @@ pt-BR: before: deve ser antes de %{date}. before_or_equal_to: deve ser antes ou igual a %{date}. blank: não pode ficar em branco. - not_before_start_date: não pode ser anterior à data de início. - overlapping_range: sobrepõe-se a um período já existente de dias não úteis. blank_nested: 'precisa ter a propriedade ''%{property}'' definida. ' cannot_delete_mapping: é obrigatório. Não pode ser excluído. - is_for_all_cannot_modify: é aplicável a todos os projetos e, portanto, não pode ser modificado. cant_link_a_work_package_with_a_descendant: Um pacote de trabalho não pode ser vinculado a uma das suas subtarefas. circular_dependency: Esta relação vai criar uma dependência circular. confirmation: não coincide com %{attribute}. could_not_be_copied: "%{dependency} não pôde ser copiado (completamente)." + datetime_must_be_in_future: deve ser no futuro. does_not_exist: não existe. - user_already_in_department: Usuário %{user_id} já é membro do departamento %{department_id}. error_enterprise_only: "%{action} só está disponível na edição OpenProject Enterprise." error_unauthorized: não pode ser acessado. error_readonly: tentou escrever, mas não é gravável. @@ -2135,36 +2132,38 @@ pt-BR: greater_than_or_equal_to: deve ser maior ou igual a %{count}. greater_than_or_equal_to_start_date: deve ser maior ou igual a data de início. greater_than_start_date: deve ser maior que a data de início. + hexcode_invalid: não é um código de cor hexadecimal válido de 6 dígitos. inclusion: Não está definido como um dos valores permitidos. inclusion_nested: 'não foi definido para um dos valores permitidos no caminho ''%{path}''. ' invalid: é inválido. invalid_uri: deve ser um URI válido. invalid_url: não é um URL válido. invalid_url_scheme: 'não é um protocolo suportado (permitidos: %{allowed_schemes}).' + is_for_all_cannot_modify: é aplicável a todos os projetos e, portanto, não pode ser modificado. less_than_or_equal_to: deve ser menor ou igual a %{count}. not_available: não está disponível devido a uma configuração do sistema. + not_before_start_date: não pode ser anterior à data de início. not_deletable: não pode ser excluído. not_editable: não pode ser editado porque já está em vigor. not_current_user: não é o usuário atual. - system_wide_non_working_day_exists: conflita com um dia não útil já existente em todo o sistema para esta data. not_found: não encontrado. not_a_date: não é uma data válida. not_a_datetime: não é uma data/hora válida. not_a_number: não é um número. not_allowed: é inválido devido à falta de permissões. - host_not_allowed: não é um host permitido. not_json: não pode ser analisado como JSON. not_json_object: não é um objeto JSON. not_an_integer: não é um número inteiro. not_an_iso_date: 'não é uma data válida. Formato exigido: AAAA-MM-DD.' not_same_project: não pertence ao mesmo projeto. - datetime_must_be_in_future: deve ser no futuro. odd: deve ser ímpar. + overlapping_range: sobrepõe-se a um período já existente de dias não úteis. regex_match_failed: não corresponde à expressão regular %{expression}. regex_invalid: não pode ser validado com a expressão regular associada. regex_list_invalid: As linhas %{invalid_lines} não puderam ser interpretadas como expressão regular. - hexcode_invalid: não é um código de cor hexadecimal válido de 6 dígitos. smaller_than_or_equal_to_max_length: deve ser menor ou igual ao tamanho máximo. + ssrf_filtered: violates the SSRF policy of this OpenProject instance. + system_wide_non_working_day_exists: conflita com um dia não útil já existente em todo o sistema para esta data. taken: já está sendo utilizado. too_long: é muito longo (o máximo é %{count} caracteres). too_short: é muito curto (mínimo é %{count} caracteres). @@ -2177,6 +2176,7 @@ pt-BR: url_not_secure_context: 'não está fornecendo um "Secure Context". Você pode tanto usar HTTPS ou um endereço loopback. ' + user_already_in_department: Usuário %{user_id} já é membro do departamento %{department_id}. wrong_length: é o tamanho errado (deve ser %{count} caracteres). models: group: @@ -3472,6 +3472,12 @@ pt-BR: selected: Selecionado include_sub_items: Incluir subitens no_results_text: Sem resultados + header: + project_select_component: + all_projects: All projects + favorites: Favorites + leave_project: Leave project + title: Projects toggle_switch: label_on: Ativado label_off: Desativado diff --git a/config/locales/crowdin/pt-PT.yml b/config/locales/crowdin/pt-PT.yml index 4397d5c7c23..f21b3314d2f 100644 --- a/config/locales/crowdin/pt-PT.yml +++ b/config/locales/crowdin/pt-PT.yml @@ -2105,17 +2105,14 @@ pt-PT: before: tem de ser anterior a %{date}. before_or_equal_to: deve ser antes ou igual a %{date}. blank: não pode ficar em branco. - not_before_start_date: não deve ser antes da data de início. - overlapping_range: sobrepõe-se a um intervalo de dias não úteis já existente. blank_nested: precisa de ter a propriedade '%{property}' configurada. cannot_delete_mapping: é necessário. Não pode ser eliminado. - is_for_all_cannot_modify: é para todos os projetos e, por conseguinte, não pode ser alterado. cant_link_a_work_package_with_a_descendant: Um pacote de trabalho não pode ser ligado a uma das suas sub-tarefas. circular_dependency: Esta relação vai criar uma dependência circular. confirmation: não coincide %{attribute}. could_not_be_copied: "%{dependency} não pode ser copiado (completamente)." + datetime_must_be_in_future: tem de estar no futuro. does_not_exist: não existe. - user_already_in_department: O utilizador %{user_id} já é membro do departamento %{department_id}. error_enterprise_only: "%{action} só está disponível na edição OpenProject Enterprise." error_unauthorized: não pode ser acedido. error_readonly: tentou escrever, mas não é gravável. @@ -2136,36 +2133,38 @@ pt-PT: greater_than_or_equal_to: deve ser maior ou igual a %{count}. greater_than_or_equal_to_start_date: deve ser maior ou igual à data de início. greater_than_start_date: deve ser superior à data de inicio. + hexcode_invalid: não é um código de cor hexadecimal de 6 dígitos válido. inclusion: não está definido como um dos valores permitidos. inclusion_nested: não está definido como um dos valores permitidos no caminho '%{path}'. invalid: é inválido. invalid_uri: deve ser uma URI válida. invalid_url: não é um URL válido. invalid_url_scheme: 'não é um protocolo suportado (permitido: %{allowed_schemes}).' + is_for_all_cannot_modify: é para todos os projetos e, por conseguinte, não pode ser alterado. less_than_or_equal_to: deve ser menor ou igual a %{count}. not_available: não está disponível devido a uma configuração do sistema. + not_before_start_date: não deve ser antes da data de início. not_deletable: não pode ser eliminado not_editable: não pode ser editado porque já está em vigor. not_current_user: não é o utilizador atual. - system_wide_non_working_day_exists: entra em conflito com um dia não útil existente em todo o sistema para esta data. not_found: não encontrado. not_a_date: não é uma data válida. not_a_datetime: não é uma data/hora válida. not_a_number: não é um número. not_allowed: é inválido devido a permissões em falta. - host_not_allowed: não é um anfitrião permitido. not_json: não é analisável como JSON. not_json_object: não é um objeto JSON. not_an_integer: não é um número inteiro. not_an_iso_date: 'não é uma data válida. Formato exigido: AAAA-MM-DD.' not_same_project: não pertence ao mesmo projeto. - datetime_must_be_in_future: tem de estar no futuro. odd: deve ser ímpar. + overlapping_range: sobrepõe-se a um intervalo de dias não úteis já existente. regex_match_failed: não corresponde à expressão regular %{expression}. regex_invalid: não pode ser validado com a expressão regular associada. regex_list_invalid: Não foi possível analisar as linhas %{invalid_lines} como expressão regular. - hexcode_invalid: não é um código de cor hexadecimal de 6 dígitos válido. smaller_than_or_equal_to_max_length: deve ser menor ou igual ao comprimento máximo. + ssrf_filtered: violates the SSRF policy of this OpenProject instance. + system_wide_non_working_day_exists: entra em conflito com um dia não útil existente em todo o sistema para esta data. taken: já está a ser utilizado. too_long: é muito longo (o máximo é %{count} caracteres). too_short: é muito curto (o mínimo é de %{count} carateres). @@ -2178,6 +2177,7 @@ pt-PT: url_not_secure_context: 'não está a fornecer um "Contexto Seguro". Use HTTPS ou um endereço de loopback, como localhost. ' + user_already_in_department: O utilizador %{user_id} já é membro do departamento %{department_id}. wrong_length: tamanho errado (deve ser %{count} caracteres). models: group: @@ -3473,6 +3473,12 @@ pt-PT: selected: Selecionado include_sub_items: Incluir sub-elementos no_results_text: Sem resultados + header: + project_select_component: + all_projects: All projects + favorites: Favorites + leave_project: Leave project + title: Projects toggle_switch: label_on: Ligar label_off: Desligar diff --git a/config/locales/crowdin/ro.yml b/config/locales/crowdin/ro.yml index b39507d7393..aea59c1242f 100644 --- a/config/locales/crowdin/ro.yml +++ b/config/locales/crowdin/ro.yml @@ -2128,17 +2128,14 @@ ro: before: trebuie să fie înainte de %{date}. before_or_equal_to: trebuie să fie înainte sau în %{date}. blank: nu poate fi gol. - not_before_start_date: must not be before the start date. - overlapping_range: overlaps with an existing non-working day range. blank_nested: trebuie să aibă setul '%{property}' al proprietății. cannot_delete_mapping: is required. Cannot be deleted. - is_for_all_cannot_modify: is for all projects and can therefore not be modified. cant_link_a_work_package_with_a_descendant: Un pachet de lucru nu poate fi legat de una din sub-activitățile sale. circular_dependency: Această relație ar crea o dependință circulară. confirmation: nu se potrivește cu %{attribute}. could_not_be_copied: "%{dependency} nu a putut fi copiat (integral)." + datetime_must_be_in_future: must be in the future. does_not_exist: nu există. - user_already_in_department: User %{user_id} is already a member of department %{department_id}. error_enterprise_only: "%{action} is only available in the OpenProject Enterprise edition." error_unauthorized: nu pot fi accesate. error_readonly: a fost încercat să fie scris, dar nu este inscriptibil. @@ -2159,36 +2156,38 @@ ro: greater_than_or_equal_to: trebuie să fie mai mare sau egal cu %{count}. greater_than_or_equal_to_start_date: trebuie să fie mai mare sau egală cu dată început. greater_than_start_date: trebuie să fie mai mare decât dată început + hexcode_invalid: is not a valid 6-digit hexadecimal color code. inclusion: nu este setată la una din valorile permise. inclusion_nested: nu este setată la una dintre valorile permise la calea '%{path}'. invalid: este invalid. invalid_uri: must be a valid URI. invalid_url: nu este o adresa URL validă. invalid_url_scheme: 'nu este un protocol permis (allowed: %{allowed_schemes}).' + is_for_all_cannot_modify: is for all projects and can therefore not be modified. less_than_or_equal_to: trebuie să fie mai mic sau egal cu %{count}. not_available: nu este disponibil din cauza unei configurații a sistemului. + not_before_start_date: must not be before the start date. not_deletable: "%s nu poate fi șters." not_editable: cannot be edited because it is already in effect. not_current_user: nu este utilizatorul curent. - system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. not_found: nu a fost găsit. not_a_date: Acest câmp trebuie să conțină o dată validă. not_a_datetime: nu este o dată-ora validă. not_a_number: nu este un număr. not_allowed: nu este valabilă din cauza lipsei de permisiuni. - host_not_allowed: is not an allowed host. not_json: is not parseable as JSON. not_json_object: is not a JSON object. not_an_integer: nu este un întreg. not_an_iso_date: 'nu este o dată validă. Formatul necesar: AAAA-MM-ZZ.' not_same_project: nu aparține aceluiași proiect. - datetime_must_be_in_future: must be in the future. odd: trebuie să fie impar. + overlapping_range: overlaps with an existing non-working day range. regex_match_failed: does not match the regular expression %{expression}. regex_invalid: nu a putut fi validată cu expresia regulată asociată. regex_list_invalid: Lines %{invalid_lines} could not be parsed as regular expression. - hexcode_invalid: is not a valid 6-digit hexadecimal color code. smaller_than_or_equal_to_max_length: trebuie să fie mai mic sau egal cu lungimea maximă. + ssrf_filtered: violates the SSRF policy of this OpenProject instance. + system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. taken: este deja utilizat too_long: este prea lung (maximul admis este de %{count} caractere). too_short: este prea scurt (minimum admis este de %{count} caractere). @@ -2201,6 +2200,7 @@ ro: url_not_secure_context: 'nu oferă un "Context securizat". Folosește fie HTTPS sau o adresă de tip buclă, cum ar fi localhost. ' + user_already_in_department: User %{user_id} is already a member of department %{department_id}. wrong_length: nu are lungimea corectă (ar trebui să fie de %{count} characters). models: group: @@ -3537,6 +3537,12 @@ ro: selected: Selected include_sub_items: Include sub-items no_results_text: No results + header: + project_select_component: + all_projects: All projects + favorites: Favorites + leave_project: Leave project + title: Projects toggle_switch: label_on: 'On' label_off: 'Off' diff --git a/config/locales/crowdin/ru.yml b/config/locales/crowdin/ru.yml index df7bde12f5d..fce7da33edd 100644 --- a/config/locales/crowdin/ru.yml +++ b/config/locales/crowdin/ru.yml @@ -2152,17 +2152,14 @@ ru: before: должны быть до %{date}. before_or_equal_to: должны быть до или ровно %{date}. blank: не может быть пустым. - not_before_start_date: должно быть после даты начала. - overlapping_range: пересекается с существующим диапазоном нерабочих дней. blank_nested: должно быть установлено свойство '%{property}'. cannot_delete_mapping: требуется. Невозможно удалить. - is_for_all_cannot_modify: предназначено для всех проектов и поэтому не может быть изменено. cant_link_a_work_package_with_a_descendant: Пакет работ не может быть связан с одной из своих подзадач. circular_dependency: Это отношение создаст циклическую зависимость. confirmation: не совпадает со значением поля %{attribute}. could_not_be_copied: "%{dependency} не может быть скопировано (полностью)." + datetime_must_be_in_future: должно быть в будущем. does_not_exist: не существует. - user_already_in_department: Пользователь %{user_id} уже является членом департамента %{department_id}. error_enterprise_only: "%{action} доступно только в корпоративной версии OpenProject." error_unauthorized: не доступен. error_readonly: запись не разрешена. @@ -2183,36 +2180,38 @@ ru: greater_than_or_equal_to: должен быть больше или равно %{count}. greater_than_or_equal_to_start_date: должна быть позднее даты начала или совпадать с ней. greater_than_start_date: должна быть позднее даты начала. + hexcode_invalid: неверный 6-значный шестнадцатеричный код цвета. inclusion: не задано ни одно из допустимых значений. inclusion_nested: не задано одно из допустимых значений в пути '%{path}'. invalid: неверно. invalid_uri: должен быть допустимым URI. invalid_url: не является допустимым URL-адресом. invalid_url_scheme: 'не является поддерживаемым протоколом (разрешены следующие: %{allowed_schemes}).' + is_for_all_cannot_modify: предназначено для всех проектов и поэтому не может быть изменено. less_than_or_equal_to: должно быть меньше или равно %{count}. not_available: недоступно из-за конфигурации системы. + not_before_start_date: должно быть после даты начала. not_deletable: не может быть удален. not_editable: не может быть отредактирован, поскольку он уже действует. not_current_user: не является текущим пользователем. - system_wide_non_working_day_exists: конфликтует с существующим общесистемным нерабочим днем для этой даты. not_found: не найдено. not_a_date: не является допустимой датой. not_a_datetime: дата и время не являются допустимыми. not_a_number: не является числом. not_allowed: неверно, ввиду отсутствия прав. - host_not_allowed: не является разрешенным хостом. not_json: не может быть разобран как JSON. not_json_object: не является объектом JSON. not_an_integer: не является целым числом. not_an_iso_date: 'недопустимая дата. Требуемый формат: гггг-мм-дд.' not_same_project: не принадлежит тому же проекту. - datetime_must_be_in_future: должно быть в будущем. odd: должно быть нечетным. + overlapping_range: пересекается с существующим диапазоном нерабочих дней. regex_match_failed: не соответствует регулярному выражению %{expression}. regex_invalid: не может быть проверен связанным регулярным выражением. regex_list_invalid: Строки %{invalid_lines} не могут быть проанализированы как регулярное выражение. - hexcode_invalid: неверный 6-значный шестнадцатеричный код цвета. smaller_than_or_equal_to_max_length: должно быть меньше или равно максимальной длине. + ssrf_filtered: violates the SSRF policy of this OpenProject instance. + system_wide_non_working_day_exists: конфликтует с существующим общесистемным нерабочим днем для этой даты. taken: уже принято. too_long: слишком длинно (максимум — %{count} знаков). too_short: слишком коротко (минимум — %{count} знаков). @@ -2225,6 +2224,7 @@ ru: url_not_secure_context: 'не предоставляет "Secure Context". Используйте HTTPS или обратный адрес, например localhost. ' + user_already_in_department: Пользователь %{user_id} уже является членом департамента %{department_id}. wrong_length: неправильная длина (должно быть %{count} знаков). models: group: @@ -3602,6 +3602,12 @@ ru: selected: Выбрано include_sub_items: Включить подпроекты no_results_text: Нет результатов + header: + project_select_component: + all_projects: All projects + favorites: Favorites + leave_project: Leave project + title: Projects toggle_switch: label_on: Включено label_off: Выключено diff --git a/config/locales/crowdin/rw.yml b/config/locales/crowdin/rw.yml index c3b570af8e5..c61e27cc323 100644 --- a/config/locales/crowdin/rw.yml +++ b/config/locales/crowdin/rw.yml @@ -2107,17 +2107,14 @@ rw: before: must be before %{date}. before_or_equal_to: must be before or equal to %{date}. blank: can't be blank. - not_before_start_date: must not be before the start date. - overlapping_range: overlaps with an existing non-working day range. blank_nested: needs to have the property '%{property}' set. cannot_delete_mapping: is required. Cannot be deleted. - is_for_all_cannot_modify: is for all projects and can therefore not be modified. cant_link_a_work_package_with_a_descendant: A work package cannot be linked to one of its subtasks. circular_dependency: This relation would create a circular dependency. confirmation: doesn't match %{attribute}. could_not_be_copied: "%{dependency} could not be (fully) copied." + datetime_must_be_in_future: must be in the future. does_not_exist: does not exist. - user_already_in_department: User %{user_id} is already a member of department %{department_id}. error_enterprise_only: "%{action} is only available in the OpenProject Enterprise edition." error_unauthorized: may not be accessed. error_readonly: was attempted to be written but is not writable. @@ -2138,36 +2135,38 @@ rw: greater_than_or_equal_to: must be greater than or equal to %{count}. greater_than_or_equal_to_start_date: must be greater than or equal to the start date. greater_than_start_date: must be greater than the start date. + hexcode_invalid: is not a valid 6-digit hexadecimal color code. inclusion: is not set to one of the allowed values. inclusion_nested: is not set to one of the allowed values at path '%{path}'. invalid: is invalid. invalid_uri: must be a valid URI. invalid_url: is not a valid URL. invalid_url_scheme: 'is not a supported protocol (allowed: %{allowed_schemes}).' + is_for_all_cannot_modify: is for all projects and can therefore not be modified. less_than_or_equal_to: must be less than or equal to %{count}. not_available: is not available due to a system configuration. + not_before_start_date: must not be before the start date. not_deletable: cannot be deleted. not_editable: cannot be edited because it is already in effect. not_current_user: is not the current user. - system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. not_found: not found. not_a_date: is not a valid date. not_a_datetime: is not a valid date time. not_a_number: is not a number. not_allowed: is invalid because of missing permissions. - host_not_allowed: is not an allowed host. not_json: is not parseable as JSON. not_json_object: is not a JSON object. not_an_integer: is not an integer. not_an_iso_date: 'is not a valid date. Required format: YYYY-MM-DD.' not_same_project: doesn't belong to the same project. - datetime_must_be_in_future: must be in the future. odd: must be odd. + overlapping_range: overlaps with an existing non-working day range. regex_match_failed: does not match the regular expression %{expression}. regex_invalid: could not be validated with the associated regular expression. regex_list_invalid: Lines %{invalid_lines} could not be parsed as regular expression. - hexcode_invalid: is not a valid 6-digit hexadecimal color code. smaller_than_or_equal_to_max_length: must be smaller than or equal to maximum length. + ssrf_filtered: violates the SSRF policy of this OpenProject instance. + system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. taken: has already been taken. too_long: is too long (maximum is %{count} characters). too_short: is too short (minimum is %{count} characters). @@ -2180,6 +2179,7 @@ rw: url_not_secure_context: 'is not providing a "Secure Context". Either use HTTPS or a loopback address, such as localhost. ' + user_already_in_department: User %{user_id} is already a member of department %{department_id}. wrong_length: is the wrong length (should be %{count} characters). models: group: @@ -3475,6 +3475,12 @@ rw: selected: Selected include_sub_items: Include sub-items no_results_text: No results + header: + project_select_component: + all_projects: All projects + favorites: Favorites + leave_project: Leave project + title: Projects toggle_switch: label_on: 'On' label_off: 'Off' diff --git a/config/locales/crowdin/si.yml b/config/locales/crowdin/si.yml index f2fff444061..6244f5de315 100644 --- a/config/locales/crowdin/si.yml +++ b/config/locales/crowdin/si.yml @@ -2107,17 +2107,14 @@ si: before: must be before %{date}. before_or_equal_to: "%{date}ට පෙර හෝ සමාන විය යුතුය." blank: හිස් විය නොහැක. - not_before_start_date: must not be before the start date. - overlapping_range: overlaps with an existing non-working day range. blank_nested: needs to have the property '%{property}' set. cannot_delete_mapping: is required. Cannot be deleted. - is_for_all_cannot_modify: is for all projects and can therefore not be modified. cant_link_a_work_package_with_a_descendant: වැඩ පැකේජයක් එහි එක් උප කර්තව්යයකට සම්බන්ධ කළ නොහැක. circular_dependency: මෙම සම්බන්ධතාවය චක්රලේඛය යැපීමක් නිර්මාණය කරනු ඇත. confirmation: "%{attribute}නොගැලපේ." could_not_be_copied: "%{dependency} could not be (fully) copied." + datetime_must_be_in_future: must be in the future. does_not_exist: නොපවතී. - user_already_in_department: User %{user_id} is already a member of department %{department_id}. error_enterprise_only: "%{action} is only available in the OpenProject Enterprise edition." error_unauthorized: ප්රවේශ විය නොහැක. error_readonly: ලිවීමට උත්සාහ කළ නමුත් එය ලිවිය නොහැක. @@ -2138,36 +2135,38 @@ si: greater_than_or_equal_to: "%{count}ට වඩා වැඩි හෝ සමාන විය යුතුය." greater_than_or_equal_to_start_date: ආරම්භක දිනයට වඩා වැඩි හෝ සමාන විය යුතුය. greater_than_start_date: ආරම්භක දිනයට වඩා වැඩි විය යුතුය. + hexcode_invalid: is not a valid 6-digit hexadecimal color code. inclusion: අවසර ලත් අගයන්ගෙන් එකක් ලෙස සකසා නැත. inclusion_nested: is not set to one of the allowed values at path '%{path}'. invalid: අවලංගුයි. invalid_uri: must be a valid URI. invalid_url: වලංගු URL එකක් නොවේ. invalid_url_scheme: 'සහාය දක්වන ප්රොටෝකෝලය නොවේ (අවසර ඇත: %{allowed_schemes}).' + is_for_all_cannot_modify: is for all projects and can therefore not be modified. less_than_or_equal_to: "%{count}ට වඩා අඩු හෝ සමාන විය යුතුය." not_available: is not available due to a system configuration. + not_before_start_date: must not be before the start date. not_deletable: cannot be deleted. not_editable: cannot be edited because it is already in effect. not_current_user: is not the current user. - system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. not_found: not found. not_a_date: වලංගු දිනයක් නොවේ. not_a_datetime: වලංගු දිනය කාලය නොවේ. not_a_number: අංකයක් නොවේ. not_allowed: අතුරුදහන් අවසරයන් නිසා අවලංගු වේ. - host_not_allowed: is not an allowed host. not_json: is not parseable as JSON. not_json_object: is not a JSON object. not_an_integer: පූර්ණ සංඛ්යාලයක් නොවේ. not_an_iso_date: 'වලංගු දිනයක් නොවේ. අවශ්ය ආකෘතිය: YYY-MM-DD.' not_same_project: එකම ව්යාපෘතියට අයත් නොවේ. - datetime_must_be_in_future: must be in the future. odd: අමුතු විය යුතුය. + overlapping_range: overlaps with an existing non-working day range. regex_match_failed: does not match the regular expression %{expression}. regex_invalid: ආශ්රිත නිත්ය ප්රකාශනය සමඟ වලංගු කළ නොහැකි විය. regex_list_invalid: Lines %{invalid_lines} could not be parsed as regular expression. - hexcode_invalid: is not a valid 6-digit hexadecimal color code. smaller_than_or_equal_to_max_length: උපරිම දිගට වඩා කුඩා හෝ සමාන විය යුතුය. + ssrf_filtered: violates the SSRF policy of this OpenProject instance. + system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. taken: දැනටමත් ගෙන ඇත. too_long: ඉතා දිගු වේ (උපරිම %{count} අක්ෂර). too_short: ඉතා කෙටි වේ (අවම අක්ෂර %{count} වේ). @@ -2180,6 +2179,7 @@ si: url_not_secure_context: 'is not providing a "Secure Context". Either use HTTPS or a loopback address, such as localhost. ' + user_already_in_department: User %{user_id} is already a member of department %{department_id}. wrong_length: වැරදි දිග (අක්ෂර %{count} විය යුතුය). models: group: @@ -3475,6 +3475,12 @@ si: selected: Selected include_sub_items: Include sub-items no_results_text: No results + header: + project_select_component: + all_projects: All projects + favorites: Favorites + leave_project: Leave project + title: Projects toggle_switch: label_on: 'On' label_off: 'Off' diff --git a/config/locales/crowdin/sk.yml b/config/locales/crowdin/sk.yml index 262ae74f09b..ebd13edeb73 100644 --- a/config/locales/crowdin/sk.yml +++ b/config/locales/crowdin/sk.yml @@ -2149,17 +2149,14 @@ sk: before: musí byť pred termínom %{date}. before_or_equal_to: musí byť pred alebo rovné termínu %{date}. blank: nemôže byť prázdne. - not_before_start_date: must not be before the start date. - overlapping_range: overlaps with an existing non-working day range. blank_nested: needs to have the property '%{property}' set. cannot_delete_mapping: is required. Cannot be deleted. - is_for_all_cannot_modify: is for all projects and can therefore not be modified. cant_link_a_work_package_with_a_descendant: Pracovný balíček nemôže byť previazaný na žiadny zo svojich podriadenými balíčkov. circular_dependency: Tento vzťah by vytvoril cyklickú závislosť. confirmation: "%{attribute} sa nezhoduje." could_not_be_copied: "%{dependency} could not be (fully) copied." + datetime_must_be_in_future: must be in the future. does_not_exist: neexistuje. - user_already_in_department: User %{user_id} is already a member of department %{department_id}. error_enterprise_only: "%{action} is only available in the OpenProject Enterprise edition." error_unauthorized: may not be accessed. error_readonly: was attempted to be written but is not writable. @@ -2180,36 +2177,38 @@ sk: greater_than_or_equal_to: musí byť väčšie alebo rovné ako %{count}. greater_than_or_equal_to_start_date: musí byť väčší alebo rovný ako počiatočný dátum. greater_than_start_date: musí byť väčší ako počiatočný dátum. + hexcode_invalid: is not a valid 6-digit hexadecimal color code. inclusion: nie je nastavená na niektorú z povolených hodnôt. inclusion_nested: is not set to one of the allowed values at path '%{path}'. invalid: je neplatný. invalid_uri: must be a valid URI. invalid_url: nie je platnou URL adresou. invalid_url_scheme: 'nie je podporovaný protokol (povolené: %{allowed_schemes}).' + is_for_all_cannot_modify: is for all projects and can therefore not be modified. less_than_or_equal_to: musí byť menšie alebo rovné ako %{count}. not_available: is not available due to a system configuration. + not_before_start_date: must not be before the start date. not_deletable: cannot be deleted. not_editable: cannot be edited because it is already in effect. not_current_user: is not the current user. - system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. not_found: not found. not_a_date: nie je platný dátum. not_a_datetime: nie je platný dátum a čas. not_a_number: nie je číslo. not_allowed: je neplatné kvôli chýbajúcim oprávneniam. - host_not_allowed: is not an allowed host. not_json: is not parseable as JSON. not_json_object: is not a JSON object. not_an_integer: nie je celé číslo. not_an_iso_date: 'nie je platný dátum. Požadovaný formát: RRRR-MM-DD.' not_same_project: nepodlieha rovnakému projektu. - datetime_must_be_in_future: must be in the future. odd: musí byť nepárne. + overlapping_range: overlaps with an existing non-working day range. regex_match_failed: does not match the regular expression %{expression}. regex_invalid: nebolo možné overiť s príslušným regulárnym výrazom. regex_list_invalid: Lines %{invalid_lines} could not be parsed as regular expression. - hexcode_invalid: is not a valid 6-digit hexadecimal color code. smaller_than_or_equal_to_max_length: musí byť menšie alebo rovné ako maximálne dĺžka. + ssrf_filtered: violates the SSRF policy of this OpenProject instance. + system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. taken: už existuje v systéme. too_long: je príliš dlhý (maximum je %{count} znakov). too_short: je príliš krátky (minimum je %{count} znakov). @@ -2222,6 +2221,7 @@ sk: url_not_secure_context: 'is not providing a "Secure Context". Either use HTTPS or a loopback address, such as localhost. ' + user_already_in_department: User %{user_id} is already a member of department %{department_id}. wrong_length: má chybnú dĺžku (správne má byť %{count} znakov). models: group: @@ -3597,6 +3597,12 @@ sk: selected: Selected include_sub_items: Include sub-items no_results_text: No results + header: + project_select_component: + all_projects: All projects + favorites: Favorites + leave_project: Leave project + title: Projects toggle_switch: label_on: 'On' label_off: 'Off' diff --git a/config/locales/crowdin/sl.yml b/config/locales/crowdin/sl.yml index a432475b0fa..2fb2519680c 100644 --- a/config/locales/crowdin/sl.yml +++ b/config/locales/crowdin/sl.yml @@ -2150,17 +2150,14 @@ sl: before: mora biti pred %{date}. before_or_equal_to: mora biti pred ali enako %{date}. blank: ne sme biti prazno. - not_before_start_date: must not be before the start date. - overlapping_range: overlaps with an existing non-working day range. blank_nested: mora imeti nastavljeno lastnost '%{property}'. cannot_delete_mapping: is required. Cannot be deleted. - is_for_all_cannot_modify: is for all projects and can therefore not be modified. cant_link_a_work_package_with_a_descendant: Zahtevek ne more biti povezan s svojo podnalogo circular_dependency: Ta povezava bi ustvarila krožno odvisnost. confirmation: se ne ujema %{attribute} could_not_be_copied: "%{dependency} ni bilo mogoče (v celoti) kopirati." + datetime_must_be_in_future: must be in the future. does_not_exist: ne obstaja - user_already_in_department: User %{user_id} is already a member of department %{department_id}. error_enterprise_only: "%{action} is only available in the OpenProject Enterprise edition." error_unauthorized: morda ni mogoče dostopati. error_readonly: poskušano je bilo napisati, vendar ni mogoče pisati. @@ -2181,36 +2178,38 @@ sl: greater_than_or_equal_to: mora biti večje ali enako %{count}. greater_than_or_equal_to_start_date: mora biti večji ali enak začetnemu datumu. greater_than_start_date: mora biti večje od začetnega datuma. + hexcode_invalid: is not a valid 6-digit hexadecimal color code. inclusion: ni nastavljeno na eno od dovoljenih vrednosti. inclusion_nested: ni nastavljena na eno od dovoljenih vrednosti na poti '%{path}'. invalid: ni pravo. invalid_uri: must be a valid URI. invalid_url: 'ni veljaven URL. ' invalid_url_scheme: ni podprt protokol (dovoljeno:%{allowed_schemes}). + is_for_all_cannot_modify: is for all projects and can therefore not be modified. less_than_or_equal_to: 'mora biti manjše ali enako %{count}. ' not_available: is not available due to a system configuration. + not_before_start_date: must not be before the start date. not_deletable: se ne da izbrisati. not_editable: cannot be edited because it is already in effect. not_current_user: ni trenutni uporabnik. - system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. not_found: not found. not_a_date: ni veljaven datum not_a_datetime: ni veljaven datum. not_a_number: ni število. not_allowed: 'ni veljavno, saj manjka dovoljenje. ' - host_not_allowed: is not an allowed host. not_json: is not parseable as JSON. not_json_object: is not a JSON object. not_an_integer: 'ni celo število. ' not_an_iso_date: 'neveljaven čas. Potreben format: YYYY-MM-DD.' not_same_project: ne pripada istemu projektu - datetime_must_be_in_future: must be in the future. odd: 'mora biti liho. ' + overlapping_range: overlaps with an existing non-working day range. regex_match_failed: does not match the regular expression %{expression}. regex_invalid: ni bilo mogoče potrditi s pripadajočim stalnim izrazom. regex_list_invalid: Lines %{invalid_lines} could not be parsed as regular expression. - hexcode_invalid: is not a valid 6-digit hexadecimal color code. smaller_than_or_equal_to_max_length: mora biti manjše ali enako največji dolžini. + ssrf_filtered: violates the SSRF policy of this OpenProject instance. + system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. taken: je že zasedeno. too_long: je predolgo (največ %{count} znakov). too_short: je prekrateko (najmanj %{count} znakov). @@ -2223,6 +2222,7 @@ sl: url_not_secure_context: 'is not providing a "Secure Context". Either use HTTPS or a loopback address, such as localhost. ' + user_already_in_department: User %{user_id} is already a member of department %{department_id}. wrong_length: 'je napačna dolžina (mora biti %{count} znakov). ' models: group: @@ -3608,6 +3608,12 @@ sl: selected: Selected include_sub_items: Include sub-items no_results_text: No results + header: + project_select_component: + all_projects: All projects + favorites: Favorites + leave_project: Leave project + title: Projects toggle_switch: label_on: 'On' label_off: 'Off' diff --git a/config/locales/crowdin/sr.yml b/config/locales/crowdin/sr.yml index beca8904efc..aa7316c80b6 100644 --- a/config/locales/crowdin/sr.yml +++ b/config/locales/crowdin/sr.yml @@ -2128,17 +2128,14 @@ sr: before: must be before %{date}. before_or_equal_to: must be before or equal to %{date}. blank: can't be blank. - not_before_start_date: must not be before the start date. - overlapping_range: overlaps with an existing non-working day range. blank_nested: needs to have the property '%{property}' set. cannot_delete_mapping: is required. Cannot be deleted. - is_for_all_cannot_modify: is for all projects and can therefore not be modified. cant_link_a_work_package_with_a_descendant: A work package cannot be linked to one of its subtasks. circular_dependency: This relation would create a circular dependency. confirmation: doesn't match %{attribute}. could_not_be_copied: "%{dependency} could not be (fully) copied." + datetime_must_be_in_future: must be in the future. does_not_exist: does not exist. - user_already_in_department: User %{user_id} is already a member of department %{department_id}. error_enterprise_only: "%{action} is only available in the OpenProject Enterprise edition." error_unauthorized: may not be accessed. error_readonly: was attempted to be written but is not writable. @@ -2159,36 +2156,38 @@ sr: greater_than_or_equal_to: must be greater than or equal to %{count}. greater_than_or_equal_to_start_date: must be greater than or equal to the start date. greater_than_start_date: must be greater than the start date. + hexcode_invalid: is not a valid 6-digit hexadecimal color code. inclusion: is not set to one of the allowed values. inclusion_nested: is not set to one of the allowed values at path '%{path}'. invalid: is invalid. invalid_uri: must be a valid URI. invalid_url: is not a valid URL. invalid_url_scheme: 'is not a supported protocol (allowed: %{allowed_schemes}).' + is_for_all_cannot_modify: is for all projects and can therefore not be modified. less_than_or_equal_to: must be less than or equal to %{count}. not_available: is not available due to a system configuration. + not_before_start_date: must not be before the start date. not_deletable: cannot be deleted. not_editable: cannot be edited because it is already in effect. not_current_user: is not the current user. - system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. not_found: not found. not_a_date: is not a valid date. not_a_datetime: is not a valid date time. not_a_number: is not a number. not_allowed: is invalid because of missing permissions. - host_not_allowed: is not an allowed host. not_json: is not parseable as JSON. not_json_object: is not a JSON object. not_an_integer: is not an integer. not_an_iso_date: 'is not a valid date. Required format: YYYY-MM-DD.' not_same_project: doesn't belong to the same project. - datetime_must_be_in_future: must be in the future. odd: must be odd. + overlapping_range: overlaps with an existing non-working day range. regex_match_failed: does not match the regular expression %{expression}. regex_invalid: could not be validated with the associated regular expression. regex_list_invalid: Lines %{invalid_lines} could not be parsed as regular expression. - hexcode_invalid: is not a valid 6-digit hexadecimal color code. smaller_than_or_equal_to_max_length: must be smaller than or equal to maximum length. + ssrf_filtered: violates the SSRF policy of this OpenProject instance. + system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. taken: has already been taken. too_long: is too long (maximum is %{count} characters). too_short: is too short (minimum is %{count} characters). @@ -2201,6 +2200,7 @@ sr: url_not_secure_context: 'is not providing a "Secure Context". Either use HTTPS or a loopback address, such as localhost. ' + user_already_in_department: User %{user_id} is already a member of department %{department_id}. wrong_length: is the wrong length (should be %{count} characters). models: group: @@ -3537,6 +3537,12 @@ sr: selected: Selected include_sub_items: Include sub-items no_results_text: No results + header: + project_select_component: + all_projects: All projects + favorites: Favorites + leave_project: Leave project + title: Projects toggle_switch: label_on: 'On' label_off: 'Off' diff --git a/config/locales/crowdin/sv.yml b/config/locales/crowdin/sv.yml index f1c590c09a2..db0ed8085c5 100644 --- a/config/locales/crowdin/sv.yml +++ b/config/locales/crowdin/sv.yml @@ -2107,17 +2107,14 @@ sv: before: måste vara innan %{date}. before_or_equal_to: måste vara före eller lika med %{date}. blank: kan inte vara tomt. - not_before_start_date: must not be before the start date. - overlapping_range: overlaps with an existing non-working day range. blank_nested: needs to have the property '%{property}' set. cannot_delete_mapping: is required. Cannot be deleted. - is_for_all_cannot_modify: is for all projects and can therefore not be modified. cant_link_a_work_package_with_a_descendant: Ett arbetspaket kan inte kopplas till någon av dess underaktiviteter. circular_dependency: Detta förhållande skulle skapa ett cirkelberoende. confirmation: matchar inte %{attribute}. could_not_be_copied: "%{dependency} could not be (fully) copied." + datetime_must_be_in_future: must be in the future. does_not_exist: finns inte. - user_already_in_department: User %{user_id} is already a member of department %{department_id}. error_enterprise_only: "%{action} is only available in the OpenProject Enterprise edition." error_unauthorized: åtkomst nekas. error_readonly: försökte skrivas men är inte skrivbart. @@ -2138,36 +2135,38 @@ sv: greater_than_or_equal_to: måste vara större än eller lika med %{count}. greater_than_or_equal_to_start_date: måste vara senare eller lika som startdatumet. greater_than_start_date: måste vara senare än startdatumet. + hexcode_invalid: is not a valid 6-digit hexadecimal color code. inclusion: inte är inställd på ett av de tillåtna värdena. inclusion_nested: is not set to one of the allowed values at path '%{path}'. invalid: är ogiltig. invalid_uri: must be a valid URI. invalid_url: är inte ett giltigt URL. invalid_url_scheme: 'är inte ett tillåtet protokoll (tillåtna: %{allowed_schemes}).' + is_for_all_cannot_modify: is for all projects and can therefore not be modified. less_than_or_equal_to: måste vara mindre än eller lika med %{count}. not_available: is not available due to a system configuration. + not_before_start_date: must not be before the start date. not_deletable: kan inte raderas. not_editable: cannot be edited because it is already in effect. not_current_user: is not the current user. - system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. not_found: hittades inte. not_a_date: är inte är ett giltigt datum. not_a_datetime: är inte en giltig datumtid. not_a_number: är inte ett nummer. not_allowed: är inte tillåtet på grund av saknade behörigheter. - host_not_allowed: is not an allowed host. not_json: is not parseable as JSON. not_json_object: is not a JSON object. not_an_integer: är inte ett heltal. not_an_iso_date: är inte ett giltigt datum. Använd formatet ÅÅÅÅ-MM-DD. not_same_project: tillhör inte samma projekt. - datetime_must_be_in_future: must be in the future. odd: måste vara udda. + overlapping_range: overlaps with an existing non-working day range. regex_match_failed: does not match the regular expression %{expression}. regex_invalid: kunde inte valideras med det associerade reguljära uttrycket. regex_list_invalid: Lines %{invalid_lines} could not be parsed as regular expression. - hexcode_invalid: is not a valid 6-digit hexadecimal color code. smaller_than_or_equal_to_max_length: måste vara mindre än eller lika med maximal längd. + ssrf_filtered: violates the SSRF policy of this OpenProject instance. + system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. taken: har redan använts. too_long: är för långt (maximalt är %{count} tecken). too_short: är för kort (minimum är %{count} tecken). @@ -2180,6 +2179,7 @@ sv: url_not_secure_context: 'tillhandahåller inte en "Secure Context". Använd antingen HTTPS eller en loopback-adress, som localhost. ' + user_already_in_department: User %{user_id} is already a member of department %{department_id}. wrong_length: har fel längd (måste vara %{count} tecken). models: group: @@ -3475,6 +3475,12 @@ sv: selected: Selected include_sub_items: Include sub-items no_results_text: Inga resultat + header: + project_select_component: + all_projects: All projects + favorites: Favorites + leave_project: Leave project + title: Projects toggle_switch: label_on: 'On' label_off: 'Off' diff --git a/config/locales/crowdin/th.yml b/config/locales/crowdin/th.yml index 630b0f47049..c31af51a76f 100644 --- a/config/locales/crowdin/th.yml +++ b/config/locales/crowdin/th.yml @@ -2086,17 +2086,14 @@ th: before: must be before %{date}. before_or_equal_to: must be before or equal to %{date}. blank: can't be blank. - not_before_start_date: must not be before the start date. - overlapping_range: overlaps with an existing non-working day range. blank_nested: needs to have the property '%{property}' set. cannot_delete_mapping: is required. Cannot be deleted. - is_for_all_cannot_modify: is for all projects and can therefore not be modified. cant_link_a_work_package_with_a_descendant: A work package cannot be linked to one of its subtasks. circular_dependency: This relation would create a circular dependency. confirmation: doesn't match %{attribute}. could_not_be_copied: "%{dependency} could not be (fully) copied." + datetime_must_be_in_future: must be in the future. does_not_exist: does not exist. - user_already_in_department: User %{user_id} is already a member of department %{department_id}. error_enterprise_only: "%{action} is only available in the OpenProject Enterprise edition." error_unauthorized: may not be accessed. error_readonly: was attempted to be written but is not writable. @@ -2117,36 +2114,38 @@ th: greater_than_or_equal_to: must be greater than or equal to %{count}. greater_than_or_equal_to_start_date: must be greater than or equal to the start date. greater_than_start_date: must be greater than the start date. + hexcode_invalid: is not a valid 6-digit hexadecimal color code. inclusion: is not set to one of the allowed values. inclusion_nested: is not set to one of the allowed values at path '%{path}'. invalid: is invalid. invalid_uri: must be a valid URI. invalid_url: is not a valid URL. invalid_url_scheme: 'is not a supported protocol (allowed: %{allowed_schemes}).' + is_for_all_cannot_modify: is for all projects and can therefore not be modified. less_than_or_equal_to: must be less than or equal to %{count}. not_available: is not available due to a system configuration. + not_before_start_date: must not be before the start date. not_deletable: cannot be deleted. not_editable: cannot be edited because it is already in effect. not_current_user: is not the current user. - system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. not_found: not found. not_a_date: is not a valid date. not_a_datetime: is not a valid date time. not_a_number: is not a number. not_allowed: is invalid because of missing permissions. - host_not_allowed: is not an allowed host. not_json: is not parseable as JSON. not_json_object: is not a JSON object. not_an_integer: is not an integer. not_an_iso_date: 'is not a valid date. Required format: YYYY-MM-DD.' not_same_project: doesn't belong to the same project. - datetime_must_be_in_future: must be in the future. odd: must be odd. + overlapping_range: overlaps with an existing non-working day range. regex_match_failed: does not match the regular expression %{expression}. regex_invalid: could not be validated with the associated regular expression. regex_list_invalid: Lines %{invalid_lines} could not be parsed as regular expression. - hexcode_invalid: is not a valid 6-digit hexadecimal color code. smaller_than_or_equal_to_max_length: must be smaller than or equal to maximum length. + ssrf_filtered: violates the SSRF policy of this OpenProject instance. + system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. taken: has already been taken. too_long: is too long (maximum is %{count} characters). too_short: is too short (minimum is %{count} characters). @@ -2159,6 +2158,7 @@ th: url_not_secure_context: 'is not providing a "Secure Context". Either use HTTPS or a loopback address, such as localhost. ' + user_already_in_department: User %{user_id} is already a member of department %{department_id}. wrong_length: is the wrong length (should be %{count} characters). models: group: @@ -3413,6 +3413,12 @@ th: selected: Selected include_sub_items: Include sub-items no_results_text: No results + header: + project_select_component: + all_projects: All projects + favorites: Favorites + leave_project: Leave project + title: Projects toggle_switch: label_on: 'On' label_off: 'Off' diff --git a/config/locales/crowdin/tr.yml b/config/locales/crowdin/tr.yml index e963f3266ba..33f2e493867 100644 --- a/config/locales/crowdin/tr.yml +++ b/config/locales/crowdin/tr.yml @@ -2108,17 +2108,14 @@ tr: before: "%{date}'dan daha önce olması gerekir." before_or_equal_to: "%{date}} tarihinden önce veya ona eşit olmalıdır." blank: boş bırakılamaz. - not_before_start_date: başlangıç tarihinden önce olmamalıdır. - overlapping_range: mevcut bir çalışma dışı gün aralığı ile çakışır. blank_nested: "'%{property}' özelliğinin ayarlanmış olması gerekir." cannot_delete_mapping: zorunlu. Silinemez. - is_for_all_cannot_modify: tüm projeler içindir ve bu nedenle değiştirilemez. cant_link_a_work_package_with_a_descendant: İş paketi alt görevlerinden birine bağlanamaz. circular_dependency: Bu ilişki döngüsel bağımlılık oluşturacak. confirmation: "%{attribute} eşleşmiyor." could_not_be_copied: "%{dependency} (tam olarak) kopyalanamadı." + datetime_must_be_in_future: gelecekte olmalı. does_not_exist: mevcut değil. - user_already_in_department: Kullanıcı %{user_id} zaten %{department_id} departmanının bir üyesidir. error_enterprise_only: "%{action} yalnızca OpenProject Enterprise sürümünde mevcuttur." error_unauthorized: erişilemez. error_readonly: yazılmaya çalışıldı fakat yazılabilir değil. @@ -2141,38 +2138,40 @@ tr: greater_than_or_equal_to: "%{count} ya da daha büyük olması gerekir." greater_than_or_equal_to_start_date: başlangıç tarihi ile aynı ya da daha büyük olması gerekir. greater_than_start_date: başlangıç tarihinden daha büyük olması gerekir. + hexcode_invalid: geçerli bir 6 basamaklı onaltılık renk kodu değildir. inclusion: izin verilen değerlerden birine ayarlanmamış. inclusion_nested: "'%{path}' yolunda izin verilen değerlerden birine ayarlanmamış." invalid: geçersizdir. invalid_uri: must be a valid URI. invalid_url: geçerli bir adres değil. invalid_url_scheme: 'bu protokol desteklenmiyor (izin: %{allowed_schemes}).' + is_for_all_cannot_modify: tüm projeler içindir ve bu nedenle değiştirilemez. less_than_or_equal_to: "%{count} 'ten küçük veya bu değere eşit olmalıdır." not_available: 'Sistem yapılandırması nedeniyle kullanılamaz. ' + not_before_start_date: başlangıç tarihinden önce olmamalıdır. not_deletable: kaldırılamadı. not_editable: cannot be edited because it is already in effect. not_current_user: mevcut kullanıcı değil. - system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. not_found: bulunamadı. not_a_date: geçerli bir tarih değil. not_a_datetime: geçerli bir zaman değil. not_a_number: bir sayı değil. not_allowed: Eksik izinler nedeniyle geçersiz. - host_not_allowed: is not an allowed host. not_json: JSON olarak ayrıştırılamaz. not_json_object: geçerli bir JSON nesnesi değildir. not_an_integer: bir tamsayı değil. not_an_iso_date: 'geçerli bir tarih değil. Gerekli biçim:: YYYY-AA-GG.' not_same_project: aynı projeye ait değil. - datetime_must_be_in_future: gelecekte olmalı. odd: tek sayı olmalı. + overlapping_range: mevcut bir çalışma dışı gün aralığı ile çakışır. regex_match_failed: "%{expression} düzenli ifadesiyle eşleşmiyor." regex_invalid: atanmış düzenli ifadeler ile doğrulanamadı. regex_list_invalid: "%{invalid_lines} satırları düzenli ifade olarak ayrıştırılamadı." - hexcode_invalid: geçerli bir 6 basamaklı onaltılık renk kodu değildir. smaller_than_or_equal_to_max_length: en fazla uzunluğa eşit veya daha küçük olmalıdır. + ssrf_filtered: violates the SSRF policy of this OpenProject instance. + system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. taken: zaten alınmıştır. too_long: çok uzun (en fazla %{count} karakterdir). too_short: çok kısa (en az %{count} karakterdir). @@ -2185,6 +2184,7 @@ tr: url_not_secure_context: 'bir "Güvenli Bağlam" sağlamıyor. HTTPS veya localhost gibi bir geri döngü adresi kullanın. ' + user_already_in_department: Kullanıcı %{user_id} zaten %{department_id} departmanının bir üyesidir. wrong_length: uzunluğu yanlıştır (%{count} karakter olmalıdır). models: group: @@ -3480,6 +3480,12 @@ tr: selected: Seçilen include_sub_items: Alt öğeleri dahil et no_results_text: Sonuç yok + header: + project_select_component: + all_projects: All projects + favorites: Favorites + leave_project: Leave project + title: Projects toggle_switch: label_on: Açık label_off: Kapalı diff --git a/config/locales/crowdin/uk.yml b/config/locales/crowdin/uk.yml index d16049527d3..eff77fe5703 100644 --- a/config/locales/crowdin/uk.yml +++ b/config/locales/crowdin/uk.yml @@ -2144,17 +2144,14 @@ uk: before: має бути раніше %{date} before_or_equal_to: має бути до або %{date} blank: не може бути порожнім. - not_before_start_date: не має передувати даті початку. - overlapping_range: збігається з наявним діапазоном неробочих днів. blank_nested: "– потрібно встановити властивість «%{property}»." cannot_delete_mapping: "– обов’язкове. Неможливо видалити." - is_for_all_cannot_modify: призначений для всіх проєктів, тому його не можна бути змінити. cant_link_a_work_package_with_a_descendant: Робочий пакет не може бути пов'язаний з одним з підзадач. circular_dependency: Це співвідношення створить кругову залежність. confirmation: не збігається %{attribute} could_not_be_copied: "%{dependency} не вдалося скопіювати (повністю)." + datetime_must_be_in_future: має бути в майбутньому. does_not_exist: не існує. - user_already_in_department: Користувач %{user_id} уже є членом відділу «%{department_id}». error_enterprise_only: "%{action} можна лише у версії OpenProject Enterprise." error_unauthorized: "– можливо, немає доступу." error_readonly: "– було здійснено спробу запису, але елемент недоступний для запису." @@ -2175,36 +2172,38 @@ uk: greater_than_or_equal_to: має бути більшим або рівним %{count} greater_than_or_equal_to_start_date: має бути більшою або дорівнювати даті початку. greater_than_start_date: має бути більше дати початку. + hexcode_invalid: не є дійсним 6-значним шістнадцятковим кодом кольору. inclusion: не встановлено в одному з допустимих значень inclusion_nested: "– не призначено одне з дозволених значень за шляхом «%{path}»." invalid: зазначено невірно invalid_uri: має бути дійсною URL-адресою. invalid_url: не є дійсною URL-адресою. invalid_url_scheme: 'не є підтримуваним протоколом (дозволено: %{allowed_schemes}).' + is_for_all_cannot_modify: призначений для всіх проєктів, тому його не можна бути змінити. less_than_or_equal_to: має бути меншим або рівним %{count} not_available: "– недоступно через налаштування системи." + not_before_start_date: не має передувати даті початку. not_deletable: не можна видалити. not_editable: уже використовується, тому вносити зміни не можна. not_current_user: не поточний користувач. - system_wide_non_working_day_exists: конфліктує з наявним загальним неробочим днем, указаним для цієї дати. not_found: не знайдено. not_a_date: не є дійсною датою. not_a_datetime: не є дійсним датою. not_a_number: не є числом not_allowed: недійсний через відсутність дозволів. - host_not_allowed: не є дозволеним хостом. not_json: не аналізується як JSON. not_json_object: не є об’єктом JSON. not_an_integer: не є цілим числом not_an_iso_date: 'не є дійсною датою. Необхідний формат: YYYY-MM-DD.' not_same_project: не належить до одного проекту. - datetime_must_be_in_future: має бути в майбутньому. odd: має бути непарним. + overlapping_range: збігається з наявним діапазоном неробочих днів. regex_match_failed: не збігається з регулярним виразом %{expression}. regex_invalid: неможливо перевірити з відповідним регулярним виразом. regex_list_invalid: Неможливо проаналізувати рядки %{invalid_lines} як регулярний вираз. - hexcode_invalid: не є дійсним 6-значним шістнадцятковим кодом кольору. smaller_than_or_equal_to_max_length: має бути меншою або дорівнює максимальній довжині. + ssrf_filtered: violates the SSRF policy of this OpenProject instance. + system_wide_non_working_day_exists: конфліктує з наявним загальним неробочим днем, указаним для цієї дати. taken: вже прийнято. too_long: 'занадто довгий (максимум - %{count} characters). @@ -2219,6 +2218,7 @@ uk: url_not_secure_context: 'не надає контекст безпеки. Використовуйте HTTPS або адресу loopback, наприклад localhost. ' + user_already_in_department: Користувач %{user_id} уже є членом відділу «%{department_id}». wrong_length: неправильна довжина (повинна бути %{count} символів). models: group: @@ -3598,6 +3598,12 @@ uk: selected: Вибрано include_sub_items: Включити піделементи no_results_text: Немає результатів + header: + project_select_component: + all_projects: All projects + favorites: Favorites + leave_project: Leave project + title: Projects toggle_switch: label_on: Увімкнено label_off: Вимкнено diff --git a/config/locales/crowdin/uz.yml b/config/locales/crowdin/uz.yml index e7da5e75482..15ca0060dec 100644 --- a/config/locales/crowdin/uz.yml +++ b/config/locales/crowdin/uz.yml @@ -2107,17 +2107,14 @@ uz: before: must be before %{date}. before_or_equal_to: must be before or equal to %{date}. blank: can't be blank. - not_before_start_date: must not be before the start date. - overlapping_range: overlaps with an existing non-working day range. blank_nested: needs to have the property '%{property}' set. cannot_delete_mapping: is required. Cannot be deleted. - is_for_all_cannot_modify: is for all projects and can therefore not be modified. cant_link_a_work_package_with_a_descendant: A work package cannot be linked to one of its subtasks. circular_dependency: This relation would create a circular dependency. confirmation: doesn't match %{attribute}. could_not_be_copied: "%{dependency} could not be (fully) copied." + datetime_must_be_in_future: must be in the future. does_not_exist: does not exist. - user_already_in_department: User %{user_id} is already a member of department %{department_id}. error_enterprise_only: "%{action} is only available in the OpenProject Enterprise edition." error_unauthorized: may not be accessed. error_readonly: was attempted to be written but is not writable. @@ -2138,36 +2135,38 @@ uz: greater_than_or_equal_to: must be greater than or equal to %{count}. greater_than_or_equal_to_start_date: must be greater than or equal to the start date. greater_than_start_date: must be greater than the start date. + hexcode_invalid: is not a valid 6-digit hexadecimal color code. inclusion: is not set to one of the allowed values. inclusion_nested: is not set to one of the allowed values at path '%{path}'. invalid: is invalid. invalid_uri: must be a valid URI. invalid_url: is not a valid URL. invalid_url_scheme: 'is not a supported protocol (allowed: %{allowed_schemes}).' + is_for_all_cannot_modify: is for all projects and can therefore not be modified. less_than_or_equal_to: must be less than or equal to %{count}. not_available: is not available due to a system configuration. + not_before_start_date: must not be before the start date. not_deletable: cannot be deleted. not_editable: cannot be edited because it is already in effect. not_current_user: is not the current user. - system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. not_found: not found. not_a_date: is not a valid date. not_a_datetime: is not a valid date time. not_a_number: is not a number. not_allowed: is invalid because of missing permissions. - host_not_allowed: is not an allowed host. not_json: is not parseable as JSON. not_json_object: is not a JSON object. not_an_integer: is not an integer. not_an_iso_date: 'is not a valid date. Required format: YYYY-MM-DD.' not_same_project: doesn't belong to the same project. - datetime_must_be_in_future: must be in the future. odd: must be odd. + overlapping_range: overlaps with an existing non-working day range. regex_match_failed: does not match the regular expression %{expression}. regex_invalid: could not be validated with the associated regular expression. regex_list_invalid: Lines %{invalid_lines} could not be parsed as regular expression. - hexcode_invalid: is not a valid 6-digit hexadecimal color code. smaller_than_or_equal_to_max_length: must be smaller than or equal to maximum length. + ssrf_filtered: violates the SSRF policy of this OpenProject instance. + system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. taken: has already been taken. too_long: is too long (maximum is %{count} characters). too_short: is too short (minimum is %{count} characters). @@ -2180,6 +2179,7 @@ uz: url_not_secure_context: 'is not providing a "Secure Context". Either use HTTPS or a loopback address, such as localhost. ' + user_already_in_department: User %{user_id} is already a member of department %{department_id}. wrong_length: is the wrong length (should be %{count} characters). models: group: @@ -3475,6 +3475,12 @@ uz: selected: Selected include_sub_items: Include sub-items no_results_text: No results + header: + project_select_component: + all_projects: All projects + favorites: Favorites + leave_project: Leave project + title: Projects toggle_switch: label_on: 'On' label_off: 'Off' diff --git a/config/locales/crowdin/vi.yml b/config/locales/crowdin/vi.yml index c8ec9a18e1f..a2e57c2ac91 100644 --- a/config/locales/crowdin/vi.yml +++ b/config/locales/crowdin/vi.yml @@ -2088,17 +2088,14 @@ vi: before: phải trước khi %{date} before_or_equal_to: phải có trước hay tương đương với %{date} blank: không được để trống - not_before_start_date: must not be before the start date. - overlapping_range: overlaps with an existing non-working day range. blank_nested: cần phải đặt thuộc tính '%{property}'. cannot_delete_mapping: được yêu cầu. Không thể xóa được. - is_for_all_cannot_modify: dành cho tất cả các dự án và do đó không thể sửa đổi được. cant_link_a_work_package_with_a_descendant: Một gói công việc không thể được liên kết với một trong các nhiệm vụ con của nó. circular_dependency: Mối quan hệ này sẽ tạo ra sự phụ thuộc vòng tròn. confirmation: không khớp %{attribute}. could_not_be_copied: "%{dependency} không thể sao chép (đầy đủ)." + datetime_must_be_in_future: phải ở tương lai. does_not_exist: không tồn tại - user_already_in_department: User %{user_id} is already a member of department %{department_id}. error_enterprise_only: "%{action} chỉ có trong phiên bản OpenProject Enterprise." error_unauthorized: Có thể không được truy cập. error_readonly: đã được cố gắng viết nhưng không thể ghi được. @@ -2119,36 +2116,38 @@ vi: greater_than_or_equal_to: phải lớn hơn hoặc bằng %{count} greater_than_or_equal_to_start_date: phải lớn hơn hoặc bằng ngày bắt đầu. greater_than_start_date: phải lớn hơn ngày bắt đầu. + hexcode_invalid: không phải là mã màu thập lục phân 6 chữ số hợp lệ. inclusion: không nằm trong các giá trị cho phép inclusion_nested: không được đặt thành một trong các giá trị được phép tại đường dẫn '%{path}'. invalid: không hợp lệ invalid_uri: must be a valid URI. invalid_url: không phải là một URL hợp lệ. invalid_url_scheme: 'không phải là giao thức được hỗ trợ (được phép: %{allowed_schemes}).' + is_for_all_cannot_modify: dành cho tất cả các dự án và do đó không thể sửa đổi được. less_than_or_equal_to: phải nhỏ hơn hoặc bằng %{count} not_available: không khả dụng do cấu hình hệ thống. + not_before_start_date: must not be before the start date. not_deletable: không thể xóa được. not_editable: cannot be edited because it is already in effect. not_current_user: không phải là người dùng hiện tại. - system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. not_found: không tìm thấy. not_a_date: không phải là ngày hợp lệ not_a_datetime: không phải là thời gian hợp lệ not_a_number: không phải là số not_allowed: không hợp lệ vì thiếu quyền. - host_not_allowed: is not an allowed host. not_json: không thể phân tích cú pháp dưới dạng JSON. not_json_object: không phải là một đối tượng JSON. not_an_integer: không phải là một số nguyên not_an_iso_date: 'không phải là một ngày hợp lệ. Yêu cầu định dạng: YYYY-MM-DD.' not_same_project: không thuộc cùng dự án. - datetime_must_be_in_future: phải ở tương lai. odd: phải là số lẻ + overlapping_range: overlaps with an existing non-working day range. regex_match_failed: không khớp với biểu thức chính quy %{expression}. regex_invalid: có thể không được xác nhận với các biểu hiện thường xuyên liên kết. regex_list_invalid: Không thể phân tích cú pháp các dòng %{invalid_lines} dưới dạng biểu thức chính quy. - hexcode_invalid: không phải là mã màu thập lục phân 6 chữ số hợp lệ. smaller_than_or_equal_to_max_length: phải nhỏ hơn hoặc bằng với chiều dài tối đa + ssrf_filtered: violates the SSRF policy of this OpenProject instance. + system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. taken: đã bị dùng rồi. too_long: quá dài (tối đa %{count} ký tự). too_short: quá ngắn (tối thiểu %{count} ký tự). @@ -2161,6 +2160,7 @@ vi: url_not_secure_context: 'không cung cấp "Bối cảnh an toàn". Sử dụng HTTPS hoặc địa chỉ loopback, chẳng hạn như localhost. ' + user_already_in_department: User %{user_id} is already a member of department %{department_id}. wrong_length: độ dài không đúng (phải là %{count} ký tự). models: group: @@ -3415,6 +3415,12 @@ vi: selected: đã chọn include_sub_items: Bao gồm các mục phụ no_results_text: Không có kết quả + header: + project_select_component: + all_projects: All projects + favorites: Favorites + leave_project: Leave project + title: Projects toggle_switch: label_on: trên label_off: Tắt diff --git a/config/locales/crowdin/zh-CN.yml b/config/locales/crowdin/zh-CN.yml index e57fa423a3b..8a4e2c6dfd5 100644 --- a/config/locales/crowdin/zh-CN.yml +++ b/config/locales/crowdin/zh-CN.yml @@ -2086,17 +2086,14 @@ zh-CN: before: 必须在 %{date} 之前。 before_or_equal_to: 必须在早于或等于 %{date} blank: 不能为空。 - not_before_start_date: 不得在开始日期之前。 - overlapping_range: 与现有的非工作日范围重叠。 blank_nested: 需要设置属性“%{property}”。 cannot_delete_mapping: 必需项,不能删除 - is_for_all_cannot_modify: 适用于所有项目,因此不能修改。 cant_link_a_work_package_with_a_descendant: 工作包无法链接到它的子任务之一。 circular_dependency: 这种关系将创建循环依赖项。 confirmation: 不匹配 %{attribute}。 could_not_be_copied: 无法(完全)复制 %{dependency}。 + datetime_must_be_in_future: 必须是将来的时间 does_not_exist: 不存在。 - user_already_in_department: 用户 %{user_id} 已经是部门 %{department_id} 的成员。 error_enterprise_only: "%{action}仅在 OpenProject 企业版中可用。" error_unauthorized: 无法访问。 error_readonly: 曾尝试被写入,但不可写。 @@ -2117,36 +2114,38 @@ zh-CN: greater_than_or_equal_to: 必须大于或等于 %{count}。 greater_than_or_equal_to_start_date: 必须晚于或等于开始日期。 greater_than_start_date: 必须晚于开始日期。 + hexcode_invalid: 不是有效的 6 位十六进制颜色代码。 inclusion: 未设置为允许的值之一。 inclusion_nested: 未设置为路径“%{path}”中允许的值之一。 invalid: 是无效的。 invalid_uri: 必须是有效的 URI。 invalid_url: 不是有效的 URL。 invalid_url_scheme: 不是受支持的协议(允许:%{allowed_schemes})。 + is_for_all_cannot_modify: 适用于所有项目,因此不能修改。 less_than_or_equal_to: 必须小于或等于 %{count}。 not_available: 因系统配置而不可用。 + not_before_start_date: 不得在开始日期之前。 not_deletable: 无法删除。 not_editable: 无法编辑,因为其已经生效。 not_current_user: 不是当前用户。 - system_wide_non_working_day_exists: 与此日期现有的系统范围非工作日冲突。 not_found: 未找到 not_a_date: 不是有效的日期。 not_a_datetime: 不是有效的日期时间。 not_a_number: 不是一个数字。 not_allowed: 没有权限使用。 - host_not_allowed: 不是允许的主机。 not_json: 无法解析为 JSON。 not_json_object: 不是 JSON 对象。 not_an_integer: 不是一个整数。 not_an_iso_date: 不是有效日期。所需格式:YYYY-MM-DD。 not_same_project: 不属于同一个项目。 - datetime_must_be_in_future: 必须是将来的时间 odd: 必须是奇数。 + overlapping_range: 与现有的非工作日范围重叠。 regex_match_failed: 与正则表达式 %{expression}不匹配。 regex_invalid: 无法与关联的正则表达式进行验证。 regex_list_invalid: 行 %{invalid_lines} 无法解析为正则表达式。 - hexcode_invalid: 不是有效的 6 位十六进制颜色代码。 smaller_than_or_equal_to_max_length: 必须小于或等于最大长度。 + ssrf_filtered: violates the SSRF policy of this OpenProject instance. + system_wide_non_working_day_exists: 与此日期现有的系统范围非工作日冲突。 taken: 已经采取。 too_long: 太长 (最多 %{count} 个字符)。 too_short: 太短 (最低是 %{count} 个字符)。 @@ -2159,6 +2158,7 @@ zh-CN: url_not_secure_context: '未提供“安全上下文”。使用 HTTPS 或环回地址,例如 localhost。 ' + user_already_in_department: 用户 %{user_id} 已经是部门 %{department_id} 的成员。 wrong_length: 长度不正确 (应该是 %{count} 个字符)。 models: group: @@ -3413,6 +3413,12 @@ zh-CN: selected: 已选择 include_sub_items: 包含子条目 no_results_text: 无结果 + header: + project_select_component: + all_projects: All projects + favorites: Favorites + leave_project: Leave project + title: Projects toggle_switch: label_on: 开启 label_off: 关闭 diff --git a/config/locales/crowdin/zh-TW.yml b/config/locales/crowdin/zh-TW.yml index b2dbfa502fa..f49cfe86829 100644 --- a/config/locales/crowdin/zh-TW.yml +++ b/config/locales/crowdin/zh-TW.yml @@ -2082,17 +2082,14 @@ zh-TW: before: 必須在 %{date} 之前 before_or_equal_to: 必須在 %{date} 以前 blank: 不可空白 - not_before_start_date: must not be before the start date. - overlapping_range: overlaps with an existing non-working day range. blank_nested: '需要設置屬性 ''%{property}'' ' cannot_delete_mapping: 必需項,不能刪除 - is_for_all_cannot_modify: 適用於所有專案,因此無法修改。 cant_link_a_work_package_with_a_descendant: 工作套件不能聯結到自己的子套件。 circular_dependency: 這個關係會建立一個循環依賴 confirmation: 不吻合 %{attribute}。 could_not_be_copied: "%{dependency} 無法完整複製." + datetime_must_be_in_future: 必須是未來時間。 does_not_exist: 不存在 - user_already_in_department: User %{user_id} is already a member of department %{department_id}. error_enterprise_only: "%{action} 只適用於 OpenProject 企業版。" error_unauthorized: 無法被存取。 error_readonly: 被嘗試寫入但是無法寫入。 @@ -2113,36 +2110,38 @@ zh-TW: greater_than_or_equal_to: 必須大於或等於 %{count}。 greater_than_or_equal_to_start_date: 必須晚於或等於開始日期。 greater_than_start_date: 必須晚於開始日期。 + hexcode_invalid: 不是有效的六位數十六進位顏色代碼。 inclusion: 沒有被設置為一個允許的值。 inclusion_nested: 未設置為路徑“%{path}”中允許的值之一 invalid: 不正確。 invalid_uri: must be a valid URI. invalid_url: 不是有效的 URL。 invalid_url_scheme: '不是受支援的協定 (允許的協定: %{allowed_schemes})。' + is_for_all_cannot_modify: 適用於所有專案,因此無法修改。 less_than_or_equal_to: 必須少於或者等於 %{count}。 not_available: 由於系統配置所以不可用 + not_before_start_date: must not be before the start date. not_deletable: 無法刪除 not_editable: cannot be edited because it is already in effect. not_current_user: 不是目前使用者。 - system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. not_found: 未找到 not_a_date: 不是有效的日期。 not_a_datetime: 不是有效的日期時間。 not_a_number: 不是數字 not_allowed: 是無效的因為缺少權限 - host_not_allowed: is not an allowed host. not_json: 無法解析為 JSON。 not_json_object: 不是 JSON 物件。 not_an_integer: 不是整數 not_an_iso_date: 不是有效日期。所需格式:YYYY-MM-DD。 not_same_project: 不屬於相同的專案 - datetime_must_be_in_future: 必須是未來時間。 odd: 必須是奇數 + overlapping_range: overlaps with an existing non-working day range. regex_match_failed: 與正則表達式 %{expression} 不匹配。 regex_invalid: 不能被相關聯的正則運算式驗證。 regex_list_invalid: "%{invalid_lines} 行無法解析為正規表示式。" - hexcode_invalid: 不是有效的六位數十六進位顏色代碼。 smaller_than_or_equal_to_max_length: 必須小於或等於最大長度。 + ssrf_filtered: violates the SSRF policy of this OpenProject instance. + system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. taken: 已經被使用 too_long: 太長 (最長是 %{count} 個字元) too_short: 太短 (最少 %{count} 個字元) @@ -2155,6 +2154,7 @@ zh-TW: url_not_secure_context: '未提供「安全上下文」。使用 HTTPS 或環回地址,例如 localhost。 ' + user_already_in_department: User %{user_id} is already a member of department %{department_id}. wrong_length: 長度錯誤 (應該要有 %{count} 個字元) models: group: @@ -3407,6 +3407,12 @@ zh-TW: selected: 已選取 include_sub_items: 包含子項目 no_results_text: 查無結果 + header: + project_select_component: + all_projects: All projects + favorites: Favorites + leave_project: Leave project + title: Projects toggle_switch: label_on: 開啟 label_off: 關閉 diff --git a/modules/auth_saml/config/locales/crowdin/nl.yml b/modules/auth_saml/config/locales/crowdin/nl.yml index 4e618c9fc98..73552b9794f 100644 --- a/modules/auth_saml/config/locales/crowdin/nl.yml +++ b/modules/auth_saml/config/locales/crowdin/nl.yml @@ -90,7 +90,7 @@ nl: configuration: De endpoint URL's voor de identity provider, certificaten en verdere SAML opties configureren. configuration_metadata: Deze informatie is vooraf gevuld met behulp van de meegeleverde metadata. In de meeste gevallen hoeven ze niet bewerkt te worden. encryption: Configureer assertie handtekeningen en encryptie voor SAML verzoeken en antwoorden. - encryption_form: You may optionally want to encrypt the assertion response, or have requests from OpenProject signed. + encryption_form: U kunt optioneel de assertion-response versleutelen of de verzoeken van OpenProject laten ondertekenen. mapping: Pas de mapping tussen de SAML respons en gebruikerskenmerken handmatig aan in OpenProject. requested_attributes: Definieer de set kenmerken die moet worden opgevraagd in het SAML-verzoek dat naar uw identity provider wordt gestuurd. seeded_from_env: Deze provider is geplaatst vanuit de omgevingsconfiguratie. Deze kan niet worden bewerkt. @@ -102,13 +102,13 @@ nl: documentation_link: 'Please refer to our [documentation on configuring SAML providers](docs_url) for more information on these configuration options. ' - display_name: 'The name of the provider. This will be displayed as the login button and in the list of providers. + display_name: 'De naam van de provider. Deze naam wordt getoond op de inlogknop en in de lijst met providers. ' - metadata_none: 'Your identity provider does not have a metadata endpoint or XML download option. You can configure it manually. + metadata_none: 'Uw identiteitsprovider heeft geen metadata-endpoint of XML-downloadoptie. U kunt deze handmatig configureren. ' - metadata_url: 'Your identity provider provides a metadata URL. + metadata_url: 'Uw identiteitsprovider verstrekt een metadata-URL. ' metadata_xml: 'Your identity provider provides a metadata XML download. @@ -186,6 +186,6 @@ nl: icon: 'Optionally provide a public URL to an icon graphic that will be displayed next to the provider name. ' - metadata_for_idp: 'This information might be requested by your SAML identity provider. + metadata_for_idp: 'Uw SAML-identiteitsprovider kan om deze informatie vragen. ' diff --git a/modules/backlogs/config/locales/crowdin/de.yml b/modules/backlogs/config/locales/crowdin/de.yml index 4ed2dfdd579..d4cb4503439 100644 --- a/modules/backlogs/config/locales/crowdin/de.yml +++ b/modules/backlogs/config/locales/crowdin/de.yml @@ -28,8 +28,8 @@ de: attributes: project: sprint_sharing: Sprints teilen - backlog_excluded_types: Excluded work package types - statuses_considered_closed: Statuses considered closed + backlog_excluded_types: Ausgeschlossene Arbeitspaket-Typen + statuses_considered_closed: Als abgeschlossen geltende Status sprint: duration: Dauer finish_date: Endtermin @@ -40,7 +40,7 @@ de: in_planning: In Planung active: Aktiv completed: Abgeschlossen - work_packages: Work packages + work_packages: Arbeitspakete work_package: backlog_bucket: Backlog Bucket backlogs_work_package_type: Backlog Typ @@ -101,7 +101,7 @@ de: show: blankslate_title: Keine Burndown-Daten verfügbar blankslate_description: Legen Sie Start- und Enddatum für den Sprint fest, um ein Burndown-Diagramm zu erstellen. - excluded_work_package_types_caption: 'Choose which work package types to hide from the backlog. Items of the selected types will not appear in the backlog automatically, keeping it focused on the work that matters to your team. For example, types like Epics or Milestones that are managed at a higher level can be hidden to keep the backlog focused on actionable items. + excluded_work_package_types_caption: 'Wählen Sie, welche Arbeitspaket-Typen Sie aus dem Backlog ausblenden möchten. Elemente der ausgewählten Typen erscheinen nicht automatisch im Backlog und sind so auf die Arbeit konzentriert, die für Ihr Team wichtig ist. Typen wie Epics oder Milestones, die auf einer höheren Ebene verwaltet werden, können beispielsweise ausgeblendet werden, damit sich das Backlog auf umsetzbare Aufgaben konzentriert. ' finish_sprint_dialog_component: @@ -125,7 +125,7 @@ de: label_is_done_status: Status %{status_name} bedeutet abgeschlossen label_sprint_board: Sprint-Board move_to_bucket_dialog_component: - title: Move to backlog bucket + title: In Backlog Bucket verschieben move_to_sprint_dialog_component: title: Zum Sprint verschieben label_sprint: Sprint @@ -163,27 +163,27 @@ de: story_points: one: "%{count} Story-Punkte" other: "%{count} Story-Points" - statuses_considered_closed_caption: 'Choose the statuses that represent a closed or finished state in your workflow. These will be treated as the "Closed" state across reporting (e.g. burndown) and sprint planning. For example, statuses like Done, Resolved, or Won''t Fix may all represent a closed work item in your process. + statuses_considered_closed_caption: 'Wählen Sie die Status, die einen abgeschlossenen oder beendeten Zustand in Ihrem Arbeitsablauf darstellen. Diese werden in den Berichten (z.B. Burndown) und in der Sprint-Planung als abgeschlossen behandelt. Zum Beispiel können Status wie "Erledigt", "Gelöst" oder "Wird nicht behoben" in Ihrem Prozess ein abgeschlossenes Arbeitspaket darstellen. ' - types_and_statuses: Types and statuses + types_and_statuses: Typen und Status unassigned: Nicht zugewiesen user_preference: header_backlogs: Backlog-Modul button_update_backlogs: Backlog-Modul aktualisieren stories: update_service: - missing_target: target_id or direction must be present. - ambiguous_target: target_id and direction cannot both be present. - invalid_target_type: 'target_type must be one of: backlog_bucket:, sprint:, inbox.' - invalid_direction: 'direction must be one of: higher, highest, lower, lowest.' + missing_target: target_id oder direction muss vorhanden sein. + ambiguous_target: target_id und direction können nicht beide vorhanden sein. + invalid_target_type: 'target_type muss einer der folgenden Werte sein: backlog_bucket:, sprint:, inbox.' + invalid_direction: 'direction muss eine der folgenden sein: higher, highest, lower, lowest.' work_package_card_menu_component: action_menu: copy_url_to_clipboard: URL in die Zwischenablage kopieren copy_work_package_id: Arbeitspaket-ID kopieren move_menu: Verschieben - move_to_backlog_bucket: Move to backlog bucket - move_to_inbox: Move to inbox + move_to_backlog_bucket: In Backlog Bucket verschieben + move_to_inbox: In Posteingang verschieben move_to_sprint: Zum Sprint verschieben work_package_is_closed: Arbeitspaket ist abgeschlossen, wenn burndown: @@ -194,8 +194,8 @@ de: sprint_sharing: Sprints teilen upsell: sprint_sharing: - description: Share sprints across projects to align teams and coordinate work in scaled agile setups (SAFe). - label_all_sprints: All sprints + description: Teilen Sie Sprints über Projekte hinweg, um Teams aufeinander abzustimmen und die Arbeit in skalierten agilen Setups (SAFe) zu koordinieren. + label_all_sprints: Alle Sprints label_backlog: Backlog label_backlogs: Backlogs label_backlog_and_sprints: Backlog und Sprints @@ -215,13 +215,13 @@ de: notice_unsuccessful_start_with_reason: 'Der Sprint konnte nicht gestartet werden: %{reason}' notice_unsuccessful_finish: Der Sprint konnte nicht abgeschlossen werden. notice_unsuccessful_finish_with_reason: 'Der Sprint konnte nicht abgeschlossen werden: %{reason}' - notice_work_package_invisible_after_move: 'The work package was moved to %{backlog} but is not visible because its type or status is excluded from the backlog. + notice_work_package_invisible_after_move: 'Das Arbeitspaket wurde auf %{backlog} verschoben, ist aber nicht sichtbar, weil sein Typ oder Status gemäß Konfiguration im Backlog ausgeblendet wird. ' permission_create_sprints: Sprints erstellen permission_manage_sprint_items: Sprint-Elemente verwalten - permission_select_backlog_types_and_statuses: Select backlog types and statuses - permission_select_backlog_types_and_statuses_explanation: 'Allows choosing which work package types to hide from the backlog. Also allows defining which statuses represent a closed or finished state in the project''s workflow. + permission_select_backlog_types_and_statuses: Typen und Status für Backlogs wählen + permission_select_backlog_types_and_statuses_explanation: 'Ermöglicht die Auswahl der Arbeitspakettypen, die aus dem Backlog ausgeblendet werden sollen. Außerdem können Sie festlegen, welche Status einen abgeschlossenen oder beendeten Zustand im Projektworkflow darstellen. ' permission_share_sprint: Sprint teilen @@ -251,6 +251,6 @@ de: sprint_sharing: Sprints teilen backlogs: sharing_form_component: - sharing_description: Dieses Projekt kann entweder seine eigenen Sprints teilen, geteilte Sprints empfangen oder Sprints unabhängig bearbeiten (kein Teilen). - sharing_fallback_description: Lacking a corporate enterprise plan, the sharing options are limited to the project's own sprints. The currently active setting remains active. + sharing_description: Dieses Projekt kann entweder eigene Sprints teilen, geteilte Sprints empfangen oder Sprints eigenständig bearbeiten (ohne Teilen). + sharing_fallback_description: Da es keinen Enterprise-Plan gibt, sind die Optionen für die gemeinsame Nutzung auf die eigenen Sprints des Projekts beschränkt. Die derzeit aktive Einstellung bleibt aktiv. remaining_hours: verbleibender Aufwand diff --git a/modules/backlogs/config/locales/crowdin/js-nl.yml b/modules/backlogs/config/locales/crowdin/js-nl.yml index 6fd9b0aad01..2886ba3d64e 100644 --- a/modules/backlogs/config/locales/crowdin/js-nl.yml +++ b/modules/backlogs/config/locales/crowdin/js-nl.yml @@ -24,7 +24,7 @@ nl: js: work_packages: properties: - storyPoints: Verhaal punten + storyPoints: Story points burndown: - day: Day + day: Dag points: Points diff --git a/modules/backlogs/config/locales/crowdin/nl.yml b/modules/backlogs/config/locales/crowdin/nl.yml index b3e53a7f824..d61e239809a 100644 --- a/modules/backlogs/config/locales/crowdin/nl.yml +++ b/modules/backlogs/config/locales/crowdin/nl.yml @@ -38,7 +38,7 @@ nl: sharing: Delen statuses: in_planning: Wordt gepland - active: Actief + active: Gestart completed: Voltooid work_packages: Work packages work_package: diff --git a/modules/costs/config/locales/crowdin/de.yml b/modules/costs/config/locales/crowdin/de.yml index a44af351160..434a059e86c 100644 --- a/modules/costs/config/locales/crowdin/de.yml +++ b/modules/costs/config/locales/crowdin/de.yml @@ -39,8 +39,8 @@ de: unit: Einheit unit_plural: Einheit plural default: Standardkostentyp - for_all_projects: For all projects - rates: Rates + for_all_projects: Für alle Projekte + rates: Preise work_package: costs_by_type: Gebuchte Einheiten labor_costs: Personaleinzelkosten @@ -93,7 +93,7 @@ de: cost_types_project: attributes: project_ids: - blank: Please select a project. + blank: Bitte wählen Sie ein Projekt aus. attributes: comment: Kommentar cost_type: Kostentyp @@ -234,28 +234,28 @@ de: errors: validation: start_time_different_date: Der Datumsteil der Startzeit (%{start_time}) muss mit dem Datum (%{spent_on}) übereinstimmen. - label_available_cost_types_projects: Available cost types projects + label_available_cost_types_projects: Verfügbare Kostenarten in Projekten cost_types: errors: - no_cost_types_available: No cost types are available in this project. Please contact an administrator. + no_cost_types_available: In diesem Projekt sind keine Kostenarten verfügbar. Bitte kontaktieren Sie einen Administrator. admin: columns: - active_projects: Active projects + active_projects: Aktive Projekte cost_type_projects: for_all_projects_blank_slate: - heading: This cost type is enabled in all projects - description: Uncheck "For all projects" on the details tab to limit this cost type to specific projects. + heading: Diese Kostenart ist in allen Projekten aktiviert + description: Deaktivieren Sie auf der Registerkarte "Details" die Option "Für alle Projekte", um diese Kostenart auf bestimmte Projekte zu beschränken. no_projects: - heading: No projects assigned - description: Add projects so this cost type can be used in them. + heading: Keine zugewiesenen Projekte + description: Fügen Sie Projekte hinzu, damit diese Kostenart in ihnen verwendet werden kann. rates: - title: Rate history + title: Stückpreise-Historie settings: - time_and_costs: Time & Costs + time_and_costs: Zeit und Kosten cost_types: - heading: Cost types - none_active: No cost types are currently active in this project. - for_all_projects_hint: This cost type is enabled in all projects. + heading: Kostentypen + none_active: In diesem Projekt sind derzeit keine Kostenarten aktiv. + for_all_projects_hint: Diese Kostenart ist in allen Projekten aktiviert. costs: widgets: actual_costs: diff --git a/modules/grids/config/locales/crowdin/js-de.yml b/modules/grids/config/locales/crowdin/js-de.yml index 67885537124..866bbbcfbc2 100644 --- a/modules/grids/config/locales/crowdin/js-de.yml +++ b/modules/grids/config/locales/crowdin/js-de.yml @@ -33,7 +33,7 @@ de: title: Unterelemente project_favorites: title: Favorisierte Projekte - no_results: You currently have no favorite projects. Add one or multiple projects as favorite through their overview or in a project list. + no_results: Sie haben derzeit keine favorisierten Projekte. Fügen Sie ein oder mehrere Projekte in der Übersicht oder in einer Projektliste als Favoriten hinzu. time_entries_current_user: title: Meine gebuchte Zeit displayed_days: 'Dargestellte Tage im Widget:' diff --git a/modules/ldap_groups/config/locales/crowdin/de.yml b/modules/ldap_groups/config/locales/crowdin/de.yml index c895ce65e1d..2059a09aa07 100644 --- a/modules/ldap_groups/config/locales/crowdin/de.yml +++ b/modules/ldap_groups/config/locales/crowdin/de.yml @@ -22,7 +22,7 @@ de: group_name_attribute: Attribut für Gruppenname sync_users: Benutzer synchronisieren base_dn: Suchbasis DN - member_lookup_attribute: Group member attribute + member_lookup_attribute: Attribut für Gruppenmitglieder models: ldap_groups/synchronized_group: Synchronisierte LDAP-Gruppe ldap_groups/synchronized_filter: Synchronisationsfilter für LDAP-Gruppe @@ -33,7 +33,7 @@ de: ldap_groups: label_menu_item: LDAP-Gruppensynchronisierung label_group_key: LDAP-Gruppenfilter - label_synchronize: Discover LDAP groups + label_synchronize: LDAP-Gruppen entdecken settings: name_attribute: Attribut für LDAP-Gruppenname name_attribute_text: Das LDAP-Attribut für das Benennen einer OpenProject-Gruppe, wenn sie durch einen Filter angelegt wird. @@ -57,7 +57,7 @@ de: base_dn_text: 'Geben Sie den Suchbase-DN ein, der für diesen Filter verwendet werden soll. Er muss unter dem Basis-DN der gewählten LDAP-Verbindung liegen. Lassen Sie diese Option leer, um den Basis-DN der Verbindung wiederverwenden ' - member_lookup_attribute_text: 'Leave empty to use the default reverse lookup: OpenProject searches for users whose memberOf attribute matches the group DN. This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). Set this to the attribute name on group entries that lists member DNs to use forward lookup instead. Examples: "uniqueMember" (groupOfUniqueNames), "member" (groupOfNames). Use this for LDAP servers that do not maintain the memberOf attribute on user entries. + member_lookup_attribute_text: 'Lassen Sie diese Option leer, um standardmäßig die Rückwärtssuche zu verwenden: OpenProject sucht nach Benutzern, deren memberOf-Attribut mit dem DN der Gruppe übereinstimmt. Dazu muss das Attribut memberOf in den Benutzereinträgen vorhanden sein (Active Directory, OpenLDAP mit memberof overlay). Setzen Sie dies auf den Attributnamen in Gruppeneinträgen, die Mitglieder-DNs auflisten, um stattdessen Forward Lookup zu verwenden. Beispiele: "uniqueMember" (groupOfUniqueNames), "member" (groupOfNames). Verwenden Sie dies für LDAP-Server, die das Attribut memberOf nicht für Benutzereinträge pflegen. ' synchronized_groups: @@ -68,16 +68,16 @@ de: confirmation: Wenn Sie fortfahren, werden die synchronisierte Gruppe %{name} und alle %{users_count} Benutzer, die durch sie synchronisiert wurden, entfernt. info: 'Hinweis: Die OpenProject Gruppe selbst und die Mitglieder, die außerhalb dieser LDAP-Synchronisation hinzugefügt wurden, werden nicht entfernt.' help_text_html: | - This module allows you to set up a synchronization between LDAP and OpenProject groups. + Mit diesem Modul können Sie eine Synchronisierung für Gruppen zwischen LDAP und OpenProject einrichten.
- By default, OpenProject uses reverse lookup: it searches for users whose memberOf attribute matches the group DN. - This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). + Standardmäßig verwendet OpenProject die umgekehrte Suche: Es sucht nach Benutzern, deren memberOf-Attribut mit dem DN der Gruppe übereinstimmt. + Dazu muss das Attribut memberOf in den Benutzereinträgen vorhanden sein (Active Directory, OpenLDAP mit memberof overlay).
- If your LDAP server does not maintain memberOf on user entries (e.g. it uses groupOfUniqueNames with uniqueMember), - you can configure forward lookup by setting the Group member attribute on the synchronization filter. + Wenn Ihr LDAP-Server das Attribut memberOf für Benutzereinträge nicht enthält (er verwendet z.B. groupOfUniqueNames mit uniqueMember), + können Sie die Vorwärtssuche konfigurieren, indem Sie das Attribut Gruppenmitglied im Synchronisationsfilter setzen.
- Groups are synchronized hourly through a cron job. - [Please see our documentation on this topic](docs_url). + Die Gruppen werden stündlich über einen Cron-Job synchronisiert. + [Bitte lesen Sie unsere Dokumentation zu diesem Thema](docs_url). no_results: Keine synchronisierten Gruppen gefunden. no_members: Diese Gruppe hat noch keine synchronisierten Mitglieder. plural: Synchronisierte LDAP-Gruppen diff --git a/modules/meeting/config/locales/crowdin/de.yml b/modules/meeting/config/locales/crowdin/de.yml index 122a4c65e5b..e2cedc1ad79 100644 --- a/modules/meeting/config/locales/crowdin/de.yml +++ b/modules/meeting/config/locales/crowdin/de.yml @@ -374,8 +374,8 @@ de: caption: Dieser Text wird auf jeder Seite in der Mitte der Fußzeile angezeigt. submit_button: Download notifications: - disabled: Participants will not receive email updates informing them of changes to the date, time or list of participants. - enabled: All participants will receive updated calendar invites informing them of changes to date, time or list of participants. + disabled: Die Teilnehmended erhalten keine E-Mail, die sie über Änderungen des Datums, der Uhrzeit oder der Teilnehmer der Besprechung informiert. + enabled: Alle Teilnehmer erhalten aktualisierte Kalendereinladungen, die sie über Änderungen von Datum, Uhrzeit oder Teilnehmerliste informieren. sidepanel: title: E-Mail-Kalender-Aktualisierungen description: @@ -385,8 +385,8 @@ de: enable: E-Mail-Kalender-Aktualisierungen aktivieren? disable: E-Mail-Kalender-Aktualisierungen deaktivieren? message: - enable: Once enabled, an email will be sent out immediately to all participants. - disable: If they already had an invite for this meeting, it might no longer be accurate. + enable: Nach der Aktivierung wird sofort eine E-Mail an alle Teilnehmer verschickt. + disable: Wenn sie bereits eine Einladung für dieses Treffen hatten, ist diese möglicherweise nicht mehr korrekt. confirm_label: enable: E-Mail-Aktualisierungen aktivieren disable: E-Mail-Aktualisierungen deaktivieren @@ -492,8 +492,8 @@ de: weekly_interval: Alle %{interval} Wochen am %{weekday} monthly_day: Jeden Monat am %{day} monthly_day_interval: Alle %{interval} Monate am %{day} - monthly_nth_weekday: Every month on the %{ordinal} %{weekday} - monthly_nth_weekday_interval: Every %{interval} months on the %{ordinal} %{weekday} + monthly_nth_weekday: Jeden Monat am %{ordinal} %{weekday} + monthly_nth_weekday_interval: Alle %{interval} Monate am %{ordinal} %{weekday} frequency: "%{base} um %{time}" full: "%{base} um %{time}, endet %{end_date}" full_past: "%{base} um %{time}, endet am %{end_date}" @@ -602,7 +602,7 @@ de: label_agenda_item_duplicate_in_next_title: In die nächste Besprechung duplizieren? label_agenda_item_add_notes: Notiz hinzufügen label_agenda_item_add_outcome: Ergebnis hinzufügen - label_agenda_item_convert_to_work_package: Convert to work package + label_agenda_item_convert_to_work_package: In Arbeitspaket umwandeln label_agenda_item_work_package_add: Arbeitspaket hinzufügen label_agenda_item_work_package: Tagesordnungspunkt Arbeitspaket label_section_rename: Abschnitt umbenennen diff --git a/modules/resource_management/config/locales/crowdin/de.yml b/modules/resource_management/config/locales/crowdin/de.yml index a4159c2e96d..8ecba9d2bf4 100644 --- a/modules/resource_management/config/locales/crowdin/de.yml +++ b/modules/resource_management/config/locales/crowdin/de.yml @@ -30,13 +30,13 @@ de: resource_work_package_list: attributes: query: - must_be_work_package_query: must be a work package query. + must_be_work_package_query: muss mit einer Arbeitspaket-Abfrage verbunden sein. models: - resource_allocation: Resource Allocation - resource_planner: Resource Planner - resource_work_package_list: Work packages list - user_card: User cards - button_next: Next + resource_allocation: Ressourcenzuteilung + resource_planner: Ressourcenplanung + resource_work_package_list: Liste von Arbeitspaketen + user_card: Benutzerkarten + button_next: Weiter label_resource_management: Ressourcenplanung permission_allocate_user_resources: Benutzer-Ressourcen zuweisen permission_allocate_user_resources_explanation: 'Ermöglicht Benutzern das Erstellen, Aktualisieren und Löschen von Ressourcenzuweisungen innerhalb eines Ressourcenplaners. Dazu gehört die Zuweisung von Benutzern (oder Benutzerfiltern) zu einem Planer und die Anpassung des zugewiesenen Zeit- und Datumsbereichs. @@ -65,16 +65,16 @@ de: desc: Erstellen Sie einen Ressourcenplaner, um Kapazitäten für dieses Projekt zu planen. title: Keine Ressourcenplaner vorhanden configure_view_dialog: - delete_confirmation: Are you sure you want to delete this view? This cannot be undone. + delete_confirmation: Sind Sie sicher, dass Sie diese Ansicht löschen möchten? Dies kann nicht rückgängig gemacht werden. filter_mode: automatic: - caption: An automatically-generated list that displays items that meet criteria you define. - label: Automatically filtered - label: Item selection + caption: Eine automatisch generierte Liste, die Arbeitspakete anzeigt, die den von ihnen definierten Kriterien entsprechen. + label: Automatisch gefiltert + label: Auswahl manual: - caption: A custom list of items you manually add and remove. Filtering is not possible. - label: Manually hand-picked - title: Configure view + caption: Eine benutzerdefinierte Liste von Artikeln, die Sie manuell hinzufügen und entfernen. Eine Filterung ist nicht möglich. + label: Manuell ausgewählt + title: Ansicht konfigurieren favorite_caption: 'Machen Sie diese Ansicht zu einem Favoriten, um sie im oberen Bereich des Seitenleistenmenüs hinzuzufügen. ' @@ -82,7 +82,7 @@ de: label_resource_planner: Ressourcenplaner label_resource_planner_plural: Ressourcenplaner new_view_dialog: - title: Add View + title: Ansicht hinzufügen public_caption: 'Machen Sie diese Ansicht für alle Mitglieder des Projekts öffentlich. Dies hat keine Auswirkungen auf die Sichtbarkeit von Arbeitspaketen, die immer noch von den jeweiligen Benutzerrechten abhängt. ' @@ -91,42 +91,42 @@ de: sidebar: private: Privat public: Öffentlich - sub_views: Views in this resource planner + sub_views: Ansichten in dieser Ressourcenplanung view_types: resource_work_package_list: - caption: Create a view based on work packages and see its details and allocation in a list - label: Work packages list + caption: Erstellen Sie eine Ansicht auf Basis von Arbeitspaketen und sehen Sie deren Details und Zuweisungen in einer Liste + label: Liste von Arbeitspaketen user_card: - caption: Create a view based on users and see their details and allocation in a list of user cards - label: Users card list + caption: Erstellen Sie eine Ansicht auf der Basis von Benutzern und sehen Sie deren Details und Zuordnung in einer Kachelansicht von Benutzerkarten + label: Benutzer-Karten work_package_list: add_work_package_dialog: - title: Add work package + title: Arbeitspaket hinzufügen allocation_placeholder: "—" blank: - description: There are no work packages matching this view's filters yet. - title: No work packages to display + description: Es gibt noch keine Arbeitspakete, die den Filtern dieser Ansicht entsprechen. + title: Keine Arbeitspakete anzuzeigen columns: - allocated_members: Allocated members - allocation: Allocation - dates: Dates + allocated_members: Zugewiesene Benutzer + allocation: Zuweisung + dates: Daten context_menu: - add_filter_criteria: Add filter criteria - add_user_group: Add user group - edit_total_work: Edit total work - label: More actions - move: Move - move_down: Move down - move_to_bottom: Move to bottom - move_to_top: Move to top - move_up: Move up - remove: Remove - remove_confirmation: Remove this work package from the view? - see_allocation: See allocation - mobile_title: Work packages - query_name: 'Resource management work packages: %{name}' + add_filter_criteria: Filter hinzufügen + add_user_group: Benutzergruppe hinzufügen + edit_total_work: Gesamte Arbeit bearbeiten + label: Weitere Aktionen + move: Verschieben + move_down: Nach unten verschieben + move_to_bottom: Nach ganz unten verschieben + move_to_top: Nach ganz oben verschieben + move_up: Nach oben verschieben + remove: Entfernen + remove_confirmation: Dieses Arbeitspaket aus der Ansicht entfernen? + see_allocation: Zuteilung anzeigen + mobile_title: Arbeitspakete + query_name: 'Arbeitspakete zur Ressourcenverwaltung: %{name}' subheader: - add: Add - add_work_package: Add work package - allocate: Allocate - settings: Configure view + add: Hinzufügen + add_work_package: Arbeitspaket hinzufügen + allocate: Zuweisen + settings: Ansicht konfigurieren From 9763ebfeed1258afc6e5d2b7b5013d97c0a3d124 Mon Sep 17 00:00:00 2001 From: Wieland Lindenthal Date: Tue, 9 Jun 2026 06:36:17 +0200 Subject: [PATCH 069/107] Fix vertical content jumps in BlockNote editor (#23609) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix vertical content jumps in the BlockNote editor on selection BlockNote 0.51 puts the className we pass to (`block-note-editor-container`) onto BOTH the outer `.bn-container` wrapper AND an inner wrapper that does NOT carry `.bn-container`. With the previous selector matching by class name alone, every rule cascaded onto both nesting levels — most importantly `display: flex`, `flex-direction: column-reverse` and `gap: 10px`. Two flex layouts stacked one inside the other meant that whenever the side menu / drag handle plugin views re-rendered (which happens every time the selection moves or the mouse leaves the editor), both layout calcs ran and the inner wrapper's gap shifted the visible content by a few pixels. Tightening the selector to `.block-note-editor-container.bn-container` restricts the rules to the outer wrapper only; the inner wrapper falls back to defaults (`display: block`, no gap) and stops contributing to the layout. Refs https://community.openproject.org/wp/STC-779 Co-authored-by: Claude Opus 4.7 --- modules/documents/app/assets/stylesheets/_index.sass | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/modules/documents/app/assets/stylesheets/_index.sass b/modules/documents/app/assets/stylesheets/_index.sass index 3e7befa4d95..a64c9b5be8a 100644 --- a/modules/documents/app/assets/stylesheets/_index.sass +++ b/modules/documents/app/assets/stylesheets/_index.sass @@ -4,7 +4,14 @@ $blocknote-max-width: 800px .ck-content min-height: 30vh -.block-note-editor-container +// BlockNote 0.51 stamps `.block-note-editor-container` (the className we +// pass to ) onto BOTH its outer `.bn-container` wrapper AND +// an inner wrapper without `.bn-container`. Without the `.bn-container` +// requirement, the rules below cascade onto both elements — `gap: 10px` +// and `flex-direction: column-reverse` get applied at two nesting levels, +// which shows up as a few-pixel vertical layout jump whenever the side +// menu / drag handle re-renders during selection. +.block-note-editor-container.bn-container align-items: center position: relative display: flex From 857d445c29b63f79786f0613bdd29d154b5100bc Mon Sep 17 00:00:00 2001 From: OpenProject Actions CI Date: Tue, 9 Jun 2026 04:36:22 +0000 Subject: [PATCH 070/107] update locales from crowdin [ci skip] --- config/locales/crowdin/de.yml | 22 +++++++-------- .../auth_saml/config/locales/crowdin/nl.yml | 10 +++---- .../backlogs/config/locales/crowdin/de.yml | 28 +++++++++---------- .../backlogs/config/locales/crowdin/js-nl.yml | 4 +-- .../backlogs/config/locales/crowdin/nl.yml | 2 +- modules/meeting/config/locales/crowdin/de.yml | 4 +-- modules/wikis/config/locales/crowdin/nl.yml | 28 +++++++++---------- 7 files changed, 49 insertions(+), 49 deletions(-) diff --git a/config/locales/crowdin/de.yml b/config/locales/crowdin/de.yml index 32a812b740c..74f94db4a01 100644 --- a/config/locales/crowdin/de.yml +++ b/config/locales/crowdin/de.yml @@ -460,7 +460,7 @@ de: dialog: title: Arbeitspaket-Kennungen ändern heading: Aktivieren Sie projektspezifische Arbeitspaket-Kennungen? - description: 'This will change IDs for all work packages in all projects in this instance. Previous identifiers and URLs will continue to work. This change will take some time to complete. + description: 'Dadurch werden die IDs für alle Arbeitspakete in allen Projekten in diesem Fall geändert. Die bisherigen Identifikatoren und URLs werden weiterhin funktionieren. Diese Änderung wird einige Zeit in Anspruch nehmen. ' confirm_button: Kennungen ändern @@ -940,7 +940,7 @@ de: change_identifier_dialog_title: Projektkennung ändern change_identifier_format_hint_semantic: Nur Großbuchstaben (A-Z), Zahlen oder Unterstriche erlaubt. Maximal 10 Zeichen. Muss mit einem Buchstaben beginnen. change_identifier_format_hint_legacy: Nur Kleinbuchstaben (a-z), Zahlen, Bindestriche oder Unterstriche erlaubt. - change_identifier_warning: 'This will permanently change identifiers and URLs of all work packages in this project. The previous identifiers and URLs will nevertheless continue to work. + change_identifier_warning: 'Dies wird die Kennungen und URLs aller Arbeitspakete in diesem Projekt dauerhaft ändern. Die bisherigen Werte werden jedoch weiterhin funktionieren. ' subitems: @@ -3155,8 +3155,8 @@ de: edit_attribute_groups: description: 'Anpassen der Form-Konfiguration mit diesen zusätzlichen Add-ons:' features: - groups: Add new attribute sections - rename: Rename attribute sections + groups: Neue Attributabschnitte hinzufügen + rename: Attributabschnitte umbenennen related: Tabelle mit zugehörigen Arbeitspaketen hinzufügen readonly_work_packages: description: Arbeitspakete in bestimmten Status als schreibgeschützt markieren. @@ -3522,12 +3522,12 @@ de: new_features_list: line_0: Project-based work package identifiers for clearer references. line_1: Jira Migrator support for Jira identifiers, due dates, and more. - line_2: Option to exclude work package types from Backlogs. - line_3: Redesigned sprint views. - line_4: Improved work package linking across Documents and text editors. - line_5: More flexible meeting schedules and reduced email notification noise. - line_6: Nested groups for organizational structures and inherited permissions. - line_7: Improved administration interfaces for workflows, users, and type configuration. + line_2: Option Arbeitspakettypen und -status in Backlogs auszuschließen. + line_3: Neu gestaltete Sprint-Ansichten. + line_4: Verbesserte Verknüpfung von Arbeitspaketen zwischen dem Dokumenten-Modul und Texteditoren. + line_5: Flexiblere Besprechungspläne und weniger E-Mail-Benachrichtigungen. + line_6: Verschachtelte Gruppen für Organisationsstrukturen und vererbte Berechtigungen. + line_7: Verbesserte Verwaltungsoberflächen für Workflows, Benutzer und Typkonfiguration. links: upgrade_enterprise_edition: Auf Enterprise Edition upgraden postgres_migration: Migration Ihrer Installation zu PostgreSQL @@ -5355,7 +5355,7 @@ de: setting_welcome_on_homescreen: Willkommens-Block auf Startseite anzeigen setting_work_packages_identifier_classic: Instanzweite numerische Sequenz (Standard) setting_work_packages_identifier_classic_caption: 'Every work package gets a sequential number starting with 1 (for example, #1234). The numbers are unique within the instance and remain the same even if work packages are moved between projects.' - setting_work_packages_identifier_semantic: Project-based semantic identifiers (Beta) + setting_work_packages_identifier_semantic: Projektspezifische semantische Kennungen (Beta) setting_work_packages_identifier_semantic_caption: Every project has a unique project identifier prefixed to a number (for example, PROJ-11). The numbering of each project starts at 1. If a work package is moved to another project, a new identifier is generated but the old one will continue to function. setting_work_package_list_default_highlighting_mode: Standard Hervorhebung setting_work_package_list_default_highlighted_attributes: Voreinstellung Inline Hervorherbung diff --git a/modules/auth_saml/config/locales/crowdin/nl.yml b/modules/auth_saml/config/locales/crowdin/nl.yml index 4e618c9fc98..73552b9794f 100644 --- a/modules/auth_saml/config/locales/crowdin/nl.yml +++ b/modules/auth_saml/config/locales/crowdin/nl.yml @@ -90,7 +90,7 @@ nl: configuration: De endpoint URL's voor de identity provider, certificaten en verdere SAML opties configureren. configuration_metadata: Deze informatie is vooraf gevuld met behulp van de meegeleverde metadata. In de meeste gevallen hoeven ze niet bewerkt te worden. encryption: Configureer assertie handtekeningen en encryptie voor SAML verzoeken en antwoorden. - encryption_form: You may optionally want to encrypt the assertion response, or have requests from OpenProject signed. + encryption_form: U kunt optioneel de assertion-response versleutelen of de verzoeken van OpenProject laten ondertekenen. mapping: Pas de mapping tussen de SAML respons en gebruikerskenmerken handmatig aan in OpenProject. requested_attributes: Definieer de set kenmerken die moet worden opgevraagd in het SAML-verzoek dat naar uw identity provider wordt gestuurd. seeded_from_env: Deze provider is geplaatst vanuit de omgevingsconfiguratie. Deze kan niet worden bewerkt. @@ -102,13 +102,13 @@ nl: documentation_link: 'Please refer to our [documentation on configuring SAML providers](docs_url) for more information on these configuration options. ' - display_name: 'The name of the provider. This will be displayed as the login button and in the list of providers. + display_name: 'De naam van de provider. Deze naam wordt getoond op de inlogknop en in de lijst met providers. ' - metadata_none: 'Your identity provider does not have a metadata endpoint or XML download option. You can configure it manually. + metadata_none: 'Uw identiteitsprovider heeft geen metadata-endpoint of XML-downloadoptie. U kunt deze handmatig configureren. ' - metadata_url: 'Your identity provider provides a metadata URL. + metadata_url: 'Uw identiteitsprovider verstrekt een metadata-URL. ' metadata_xml: 'Your identity provider provides a metadata XML download. @@ -186,6 +186,6 @@ nl: icon: 'Optionally provide a public URL to an icon graphic that will be displayed next to the provider name. ' - metadata_for_idp: 'This information might be requested by your SAML identity provider. + metadata_for_idp: 'Uw SAML-identiteitsprovider kan om deze informatie vragen. ' diff --git a/modules/backlogs/config/locales/crowdin/de.yml b/modules/backlogs/config/locales/crowdin/de.yml index 7ad9a28f9b3..33ff0294888 100644 --- a/modules/backlogs/config/locales/crowdin/de.yml +++ b/modules/backlogs/config/locales/crowdin/de.yml @@ -28,8 +28,8 @@ de: attributes: project: sprint_sharing: Sprints teilen - backlog_excluded_types: Excluded work package types - statuses_considered_closed: Statuses considered closed + backlog_excluded_types: Ausgeschlossene Arbeitspaket-Typen + statuses_considered_closed: Als abgeschlossen geltende Status sprint: duration: Dauer finish_date: Endtermin @@ -100,7 +100,7 @@ de: show: blankslate_title: Keine Burndown-Daten verfügbar blankslate_description: Legen Sie Start- und Enddatum für den Sprint fest, um ein Burndown-Diagramm zu erstellen. - excluded_work_package_types_caption: 'Choose which work package types to hide from the backlog. Items of the selected types will not appear in the backlog automatically, keeping it focused on the work that matters to your team. For example, types like Epics or Milestones that are managed at a higher level can be hidden to keep the backlog focused on actionable items. + excluded_work_package_types_caption: 'Wählen Sie, welche Arbeitspaket-Typen Sie aus dem Backlog ausblenden möchten. Elemente der ausgewählten Typen erscheinen nicht automatisch im Backlog und sind so auf die Arbeit konzentriert, die für Ihr Team wichtig ist. Typen wie Epics oder Milestones, die auf einer höheren Ebene verwaltet werden, können beispielsweise ausgeblendet werden, damit sich das Backlog auf umsetzbare Aufgaben konzentriert. ' finish_sprint_dialog_component: @@ -160,20 +160,20 @@ de: story_points: one: "%{count} Story-Punkte" other: "%{count} Story-Points" - statuses_considered_closed_caption: 'Choose the statuses that represent a closed or finished state in your workflow. These will be treated as the "Closed" state across reporting (e.g. burndown) and sprint planning. For example, statuses like Done, Resolved, or Won''t Fix may all represent a closed work item in your process. + statuses_considered_closed_caption: 'Wählen Sie die Status, die einen abgeschlossenen oder beendeten Zustand in Ihrem Arbeitsablauf darstellen. Diese werden in den Berichten (z.B. Burndown) und in der Sprint-Planung als abgeschlossen behandelt. Zum Beispiel können Status wie "Erledigt", "Gelöst" oder "Wird nicht behoben" in Ihrem Prozess ein abgeschlossenes Arbeitspaket darstellen. ' - types_and_statuses: Types and statuses + types_and_statuses: Typen und Status unassigned: Nicht zugewiesen user_preference: header_backlogs: Backlog-Modul button_update_backlogs: Backlog-Modul aktualisieren stories: update_service: - missing_target: target_id or direction must be present. - ambiguous_target: target_id and direction cannot both be present. - invalid_target_type: 'target_type must be one of: backlog_bucket:, sprint:, inbox.' - invalid_direction: 'direction must be one of: higher, highest, lower, lowest.' + missing_target: target_id oder direction muss vorhanden sein. + ambiguous_target: target_id und direction können nicht beide vorhanden sein. + invalid_target_type: 'target_type muss einer der folgenden Werte sein: backlog_bucket:, sprint:, inbox.' + invalid_direction: 'direction muss eine der folgenden sein: higher, highest, lower, lowest.' work_package_card_menu_component: action_menu: copy_url_to_clipboard: URL in die Zwischenablage kopieren @@ -189,7 +189,7 @@ de: sprint_sharing: Sprints teilen upsell: sprint_sharing: - description: Share sprints across projects to align teams and coordinate work in scaled agile setups (SAFe). + description: Teilen Sie Sprints über Projekte hinweg, um Teams aufeinander abzustimmen und die Arbeit in skalierten agilen Setups (SAFe) zu koordinieren. label_backlog: Backlog label_backlog_bucket_edit: Backlog Bucket bearbeiten label_backlog_bucket_new: Neuer Backlog Bucket @@ -211,8 +211,8 @@ de: notice_unsuccessful_finish_with_reason: 'Der Sprint konnte nicht abgeschlossen werden: %{reason}' permission_create_sprints: Sprints erstellen permission_manage_sprint_items: Sprint-Elemente verwalten - permission_select_backlog_types_and_statuses: Select backlog types and statuses - permission_select_backlog_types_and_statuses_explanation: 'Allows choosing which work package types to hide from the backlog. Also allows defining which statuses represent a closed or finished state in the project''s workflow. + permission_select_backlog_types_and_statuses: Typen und Status für Backlogs wählen + permission_select_backlog_types_and_statuses_explanation: 'Ermöglicht die Auswahl der Arbeitspakettypen, die aus dem Backlog ausgeblendet werden sollen. Außerdem können Sie festlegen, welche Status einen abgeschlossenen oder beendeten Zustand im Projektworkflow darstellen. ' permission_share_sprint: Sprint teilen @@ -242,6 +242,6 @@ de: sprint_sharing: Sprints teilen backlogs: sharing_form_component: - sharing_description: Dieses Projekt kann entweder seine eigenen Sprints teilen, geteilte Sprints empfangen oder Sprints unabhängig bearbeiten (kein Teilen). - sharing_fallback_description: Lacking a corporate enterprise plan, the sharing options are limited to the project's own sprints. The currently active setting remains active. + sharing_description: Dieses Projekt kann entweder eigene Sprints teilen, geteilte Sprints empfangen oder Sprints eigenständig bearbeiten (ohne Teilen). + sharing_fallback_description: Da es keinen Enterprise-Plan gibt, sind die Optionen für die gemeinsame Nutzung auf die eigenen Sprints des Projekts beschränkt. Die derzeit aktive Einstellung bleibt aktiv. remaining_hours: verbleibender Aufwand diff --git a/modules/backlogs/config/locales/crowdin/js-nl.yml b/modules/backlogs/config/locales/crowdin/js-nl.yml index 6fd9b0aad01..2886ba3d64e 100644 --- a/modules/backlogs/config/locales/crowdin/js-nl.yml +++ b/modules/backlogs/config/locales/crowdin/js-nl.yml @@ -24,7 +24,7 @@ nl: js: work_packages: properties: - storyPoints: Verhaal punten + storyPoints: Story points burndown: - day: Day + day: Dag points: Points diff --git a/modules/backlogs/config/locales/crowdin/nl.yml b/modules/backlogs/config/locales/crowdin/nl.yml index 496dd7b411b..063cc521245 100644 --- a/modules/backlogs/config/locales/crowdin/nl.yml +++ b/modules/backlogs/config/locales/crowdin/nl.yml @@ -38,7 +38,7 @@ nl: sharing: Delen statuses: in_planning: Wordt gepland - active: Actief + active: Gestart completed: Voltooid work_package: backlog_bucket: Backlog Bucket diff --git a/modules/meeting/config/locales/crowdin/de.yml b/modules/meeting/config/locales/crowdin/de.yml index 009c663bf48..291101955b1 100644 --- a/modules/meeting/config/locales/crowdin/de.yml +++ b/modules/meeting/config/locales/crowdin/de.yml @@ -528,8 +528,8 @@ de: weekly_interval: Alle %{interval} Wochen am %{weekday} monthly_day: Jeden Monat am %{day} monthly_day_interval: Alle %{interval} Monate am %{day} - monthly_nth_weekday: Every month on the %{ordinal} %{weekday} - monthly_nth_weekday_interval: Every %{interval} months on the %{ordinal} %{weekday} + monthly_nth_weekday: Jeden Monat am %{ordinal} %{weekday} + monthly_nth_weekday_interval: Alle %{interval} Monate am %{ordinal} %{weekday} frequency: "%{base} um %{time}" full: "%{base} um %{time}, endet %{end_date}" full_past: "%{base} um %{time}, endet am %{end_date}" diff --git a/modules/wikis/config/locales/crowdin/nl.yml b/modules/wikis/config/locales/crowdin/nl.yml index dcf5bd97155..70a7fa0c7b8 100644 --- a/modules/wikis/config/locales/crowdin/nl.yml +++ b/modules/wikis/config/locales/crowdin/nl.yml @@ -9,9 +9,9 @@ nl: authentication_methods: oauth2_sso: Single-Sign-On through OpenID Connect Identity Provider two_way_oauth2: Two-way OAuth 2.0 authorization code flow - name: Name + name: Naam token_exchange_scope: XWiki Scope - universal_identifier: Universal identifier + universal_identifier: Unieke Id url: Instance URL wiki_audience: XWiki Audience errors: {} @@ -70,10 +70,10 @@ nl: description_html: The wiki provider %{wiki_provider} and all the related wiki page links will be deleted. In addition, every inline wiki page link will no longer be accessible. This action is irreversible. forms: general_info_form_component: - xwiki_instance_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. + xwiki_instance_description: Zorg ervoor dat u beheerrechten hebt in uw XWiki-instantie voordat u de installatie uitvoert. oauth_application_form_component: - application_id: Application ID - application_secret: Application secret + application_id: Applicatie-ID + application_secret: Application Secret oauth_client_form_component: client_id: Client ID health_status: @@ -88,7 +88,7 @@ nl: title: Health Report oauth_application_info_component: confirm_replace_oauth_application: This action will reset the current OAuth credentials. After confirming you will have to reenter the credentials in your XWiki instance and all users will have to reauthorize. Are you sure you want to proceed? - label_pending: Pending + label_pending: In afwachting replace_oauth_application: Replace OpenProject OAuth application oauth_client_info_component: confirm_replace_oauth_client: This action will reset the current XWiki OAuth credentials. All users will need to reauthorize against XWiki. Are you sure you want to proceed? @@ -110,25 +110,25 @@ nl: index_description: Add an external wiki service to link work packages to existing wiki pages or create new ones directly from OpenProject. label_add_new: Add new wiki provider label_edit: Edit XWiki provider - label_new_xwiki_instance: New XWiki provider + label_new_xwiki_instance: Nieuwe XWiki-provider label_wiki_platform: Wiki aanbieder - name_caption: Give your storage a name so that users can differentiate between multiple wiki platforms. + name_caption: Geef de opslag een naam, zodat gebruikers verschillende wiki-platformen van elkaar kunnen onderscheiden. name_placeholder: XWiki knowledge base new_provider_html: Read our documentation on [setting up an XWiki integration](docs_url) for more information. oauth: openproject_oauth: OpenProject OAuth sections: - general_information: Basisdetails + general_information: Basisgegevens oauth_configuration: OAuth configuration - url_caption: Please add the host address of your wiki platform including the https://. It should not be longer than 255 characters. - xwiki_instance: XWiki Instance + url_caption: Voeg het hostadres van uw wikiplatform toe, inclusief de https://. Het mag niet langer zijn dan 255 tekens. + xwiki_instance: XWiki instantie xwiki: oauth: - openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. Copy the credentials below into your XWiki instance. + openproject_oauth_description: Geef XWiki toestemming om OpenProject-gegevens te benaderen met behulp van een OAuth-applicatie. Kopieer de onderstaande inloggegevens naar uw XWiki-instantie. provider_oauth: XWiki OAuth - provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. A client ID is automatically generated to identify OpenProject to XWiki — no manual configuration is needed on the XWiki side. + provider_oauth_description: Geef OpenProject toestemming om XWiki-gegevens te benaderen met behulp van een OAuth-applicatie. De client-ID wordt automatisch gegenereerd om OpenProject in XWiki te identificeren — geen handmatige configuratie is vereist aan XWiki-zijde. openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth. xwiki_oauth: XWiki OAuth xwiki_oauth_description: Allow OpenProject to access XWiki data using an OAuth. macro: - page_not_found: Linked wiki page no longer available + page_not_found: De gekoppelde wiki-pagina is niet meer beschikbaar From 32a8bc43cc17d1bd0109d6a5e5c8002c6b10007f Mon Sep 17 00:00:00 2001 From: Kabiru Mwenja Date: Tue, 9 Jun 2026 08:36:32 +0300 Subject: [PATCH 071/107] Surface the predecessor lateral alias at each call site The LATERAL subquery is aliased `predecessor` where it is joined rather than inside the helper, so the relation each EXISTS clause references is visible without reading the helper. --- .../paginator/journal_changes_filter.rb | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/app/services/work_packages/activities_tab/paginator/journal_changes_filter.rb b/app/services/work_packages/activities_tab/paginator/journal_changes_filter.rb index 538dcc99427..9eaa3b2f598 100644 --- a/app/services/work_packages/activities_tab/paginator/journal_changes_filter.rb +++ b/app/services/work_packages/activities_tab/paginator/journal_changes_filter.rb @@ -60,7 +60,7 @@ class WorkPackages::ActivitiesTab::Paginator::JournalChangesFilter def attribute_data_changes_condition_sql <<~SQL.squish SELECT 1 - FROM #{predecessor_lateral_sql} + FROM #{predecessor_lateral_sql} predecessor INNER JOIN work_package_journals pred_data ON predecessor.data_id = pred_data.id INNER JOIN work_package_journals curr_data ON journals.data_id = curr_data.id WHERE (#{data_changes_condition_sql}) @@ -95,11 +95,11 @@ class WorkPackages::ActivitiesTab::Paginator::JournalChangesFilter ) end - # The immediate predecessor journal, exposed as a `predecessor` relation for - # comparison. Seeking the highest version below the current one through the - # (journable_type, journable_id, version) index keeps this a single-row lookup - # per journal; versions are incremental but may have gaps, so the seek matches - # on `< version` rather than `version - 1`. + # The immediate predecessor journal, for comparison against the current one. + # Callers alias this as `predecessor`. Seeking the highest version below the + # current one through the (journable_type, journable_id, version) index keeps + # this a single-row lookup per journal; versions are incremental but may have + # gaps, so the seek matches on `< version` rather than `version - 1`. def predecessor_lateral_sql <<~SQL.squish LATERAL ( @@ -110,7 +110,7 @@ class WorkPackages::ActivitiesTab::Paginator::JournalChangesFilter AND p.version < journals.version ORDER BY p.version DESC LIMIT 1 - ) predecessor + ) SQL end @@ -158,7 +158,7 @@ class WorkPackages::ActivitiesTab::Paginator::JournalChangesFilter <<~SQL.squish SELECT 1 FROM #{table} curr - LEFT JOIN #{predecessor_lateral_sql} ON TRUE + LEFT JOIN #{predecessor_lateral_sql} predecessor ON TRUE LEFT JOIN #{table} pred ON pred.journal_id = predecessor.id AND #{join_conditions} @@ -176,7 +176,7 @@ class WorkPackages::ActivitiesTab::Paginator::JournalChangesFilter <<~SQL.squish SELECT 1 - FROM #{predecessor_lateral_sql} + FROM #{predecessor_lateral_sql} predecessor INNER JOIN #{table} pred ON pred.journal_id = predecessor.id LEFT JOIN #{table} curr From 8998fa0606829afee718e9fb68bad8532d5e7068 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Jun 2026 05:41:32 +0000 Subject: [PATCH 072/107] Bump retriable from 3.5.0 to 3.5.1 Bumps [retriable](https://github.com/kamui/retriable) from 3.5.0 to 3.5.1. - [Release notes](https://github.com/kamui/retriable/releases) - [Changelog](https://github.com/kamui/retriable/blob/main/CHANGELOG.md) - [Commits](https://github.com/kamui/retriable/compare/v3.5.0...v3.5.1) --- updated-dependencies: - dependency-name: retriable dependency-version: 3.5.1 dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Gemfile | 2 +- Gemfile.lock | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Gemfile b/Gemfile index ff9b6d8f7bf..601b5043d53 100644 --- a/Gemfile +++ b/Gemfile @@ -276,7 +276,7 @@ group :test do gem "rspec-rails", "~> 8.0.4", group: :development # Retry failures within the same environment - gem "retriable", "~> 3.5.0" + gem "retriable", "~> 3.5.1" gem "rspec-retry", "~> 0.6.1" # Accessibility tests diff --git a/Gemfile.lock b/Gemfile.lock index 538e19e15ec..cdc2202db82 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1303,7 +1303,7 @@ GEM responders (3.2.0) actionpack (>= 7.0) railties (>= 7.0) - retriable (3.5.0) + retriable (3.5.1) rexml (3.4.4) rinku (2.0.6) roar (1.2.0) @@ -1733,7 +1733,7 @@ DEPENDENCIES redis (~> 5.4.0) request_store (~> 1.7.0) responders (~> 3.2) - retriable (~> 3.5.0) + retriable (~> 3.5.1) rinku (~> 2.0.4) roar (~> 1.2.0) rouge (~> 4.7.0) @@ -2217,7 +2217,7 @@ CHECKSUMS representable (3.2.0) sha256=cc29bf7eebc31653586849371a43ffe36c60b54b0a6365b5f7d95ec34d1ebace request_store (1.7.0) sha256=e1b75d5346a315f452242a68c937ef8e48b215b9453a77a6c0acdca2934c88cb responders (3.2.0) sha256=89c2d6ac0ae16f6458a11524cae4a8efdceba1a3baea164d28ee9046bd3df55a - retriable (3.5.0) sha256=2e48ab1256ab2f18713f08786d2a58ec7b8a42bb5c791efa7e965f7bd2b915c0 + retriable (3.5.1) sha256=446b751cf3a8576e2e9cf2702bced920d1af645f5477e8a7699ea3f1e4c12fff rexml (3.4.4) sha256=19e0a2c3425dfbf2d4fc1189747bdb2f849b6c5e74180401b15734bc97b5d142 rinku (2.0.6) sha256=8b60670e3143f3db2b37efa262971ce3619ec23092045498ef9f077d82828d7d roar (1.2.0) sha256=8db4d1ca79c57a5fb746c16c0d5661d7c3e0de3d9553dc016a88d2dba2929d08 From 6aed4d207af7caa4271cdbdcbc7b1e783bffc2a0 Mon Sep 17 00:00:00 2001 From: Jan Sandbrink Date: Wed, 3 Jun 2026 09:26:32 +0200 Subject: [PATCH 073/107] Add UI for managing internal wiki provider --- .../internal_wiki_provider_controller.rb | 57 +++++++++++++++++ .../wikis/admin/wiki_providers_controller.rb | 2 +- .../wikis/admin/internal_provider_form.rb | 43 +++++++++++++ .../internal_wiki_provider/show.html.erb | 48 ++++++++++++++ modules/wikis/config/locales/en.yml | 11 ++++ modules/wikis/config/routes.rb | 1 + .../wikis/lib/open_project/wikis/engine.rb | 18 +++++- .../features/admin/internal_provider_spec.rb | 63 +++++++++++++++++++ 8 files changed, 240 insertions(+), 3 deletions(-) create mode 100644 modules/wikis/app/controllers/wikis/admin/internal_wiki_provider_controller.rb create mode 100644 modules/wikis/app/forms/wikis/admin/internal_provider_form.rb create mode 100644 modules/wikis/app/views/wikis/admin/internal_wiki_provider/show.html.erb create mode 100644 modules/wikis/spec/features/admin/internal_provider_spec.rb diff --git a/modules/wikis/app/controllers/wikis/admin/internal_wiki_provider_controller.rb b/modules/wikis/app/controllers/wikis/admin/internal_wiki_provider_controller.rb new file mode 100644 index 00000000000..babc03aebc6 --- /dev/null +++ b/modules/wikis/app/controllers/wikis/admin/internal_wiki_provider_controller.rb @@ -0,0 +1,57 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +module Wikis + module Admin + class InternalWikiProviderController < ApplicationController + layout "admin" + + before_action :require_admin + + menu_item :internal_wiki_provider + + def show + @provider = Wikis::InternalProvider.first + end + + def update + provider = Wikis::InternalProvider.first + provider.update!(enabled: internal_provider_params[:enabled]) + redirect_to admin_settings_internal_wiki_provider_path + end + + private + + def internal_provider_params + params.expect(wikis_internal_provider: :enabled) + end + end + end +end diff --git a/modules/wikis/app/controllers/wikis/admin/wiki_providers_controller.rb b/modules/wikis/app/controllers/wikis/admin/wiki_providers_controller.rb index e509182c55e..0475bf0ce38 100644 --- a/modules/wikis/app/controllers/wikis/admin/wiki_providers_controller.rb +++ b/modules/wikis/app/controllers/wikis/admin/wiki_providers_controller.rb @@ -39,7 +39,7 @@ module Wikis before_action :require_admin before_action :find_wiki_provider, only: %i[edit update destroy confirm_destroy edit_general_info replace_oauth_application] - menu_item :wiki_providers + menu_item :external_wiki_providers def index @wiki_providers = editable_wiki_providers diff --git a/modules/wikis/app/forms/wikis/admin/internal_provider_form.rb b/modules/wikis/app/forms/wikis/admin/internal_provider_form.rb new file mode 100644 index 00000000000..61e7e8df168 --- /dev/null +++ b/modules/wikis/app/forms/wikis/admin/internal_provider_form.rb @@ -0,0 +1,43 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +module Wikis::Admin + class InternalProviderForm < ApplicationForm + form do |f| + f.check_box( + name: :enabled, + label: I18n.t("wikis.admin.internal_provider_form.checkbox_label"), + caption: I18n.t("wikis.admin.internal_provider_form.checkbox_caption") + ) + + f.submit(name: :save, label: I18n.t("button_save"), scheme: :primary) + end + end +end diff --git a/modules/wikis/app/views/wikis/admin/internal_wiki_provider/show.html.erb b/modules/wikis/app/views/wikis/admin/internal_wiki_provider/show.html.erb new file mode 100644 index 00000000000..bff9216d6a9 --- /dev/null +++ b/modules/wikis/app/views/wikis/admin/internal_wiki_provider/show.html.erb @@ -0,0 +1,48 @@ +<%#-- copyright +OpenProject is an open source project management software. +Copyright (C) the OpenProject GmbH + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License version 3. + +OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +Copyright (C) 2006-2013 Jean-Philippe Lang +Copyright (C) 2010-2013 the ChiliProject Team + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +See COPYRIGHT and LICENSE files for more details. + +++#%> + +<% html_title t(:label_administration), Wikis::InternalProvider.model_name.human %> + +<% content_for :content_header do %> + <%= render(Primer::OpenProject::PageHeader.new) do |header| %> + <% header.with_title { Wikis::InternalProvider.model_name.human } %> + <% header.with_description { t(".description") } %> + <% header.with_breadcrumbs([ + { href: admin_index_path, text: t(:label_administration) }, + { href: admin_settings_wiki_providers_path, text: t("menus.admin.wikis") }, + Wikis::InternalProvider.model_name.human + ]) %> + <% end %> +<% end %> + +<%= + primer_form_with(model: @provider, url: admin_settings_internal_wiki_provider_path) do |form| + render(Wikis::Admin::InternalProviderForm.new(form)) + end +%> diff --git a/modules/wikis/config/locales/en.yml b/modules/wikis/config/locales/en.yml index 3f2d66317e4..909e0cbcab8 100644 --- a/modules/wikis/config/locales/en.yml +++ b/modules/wikis/config/locales/en.yml @@ -31,6 +31,11 @@ en: wikis/xwiki_provider: one: XWiki provider other: XWiki providers + menus: + admin: + external_wiki_providers: Wiki providers + internal_wiki_provider: Internal wiki + wikis: "Wikis" permission_manage_wiki_page_links: Manage Wiki Page Links project_module_wiki_platforms: Wiki providers wikis: @@ -113,6 +118,12 @@ en: no_health_report: No report available no_health_report_description: Run the checks now for a full health status report for this wiki provider. title: Health Report + internal_provider_form: + checkbox_caption: Allow projects to use the internal OpenProject wiki along with external Wiki providers + checkbox_label: Enable the internal OpenProject wiki + internal_wiki_provider: + show: + description: Choose to enable or disable the internal OpenProject wiki oauth_application_info_component: confirm_replace_oauth_application: This action will reset the current OAuth credentials. After confirming you will have to reenter the credentials in your XWiki instance and all users will have to reauthorize. Are you sure you want to proceed? label_oauth_client_id: OAuth Client ID diff --git a/modules/wikis/config/routes.rb b/modules/wikis/config/routes.rb index 963162be729..3c46a204401 100644 --- a/modules/wikis/config/routes.rb +++ b/modules/wikis/config/routes.rb @@ -31,6 +31,7 @@ Rails.application.routes.draw do namespace :admin do namespace :settings do + resource :internal_wiki_provider, controller: "/wikis/admin/internal_wiki_provider", only: %i[show update] resources :wiki_providers, controller: "/wikis/admin/wiki_providers", except: [:show] do member do get :confirm_destroy diff --git a/modules/wikis/lib/open_project/wikis/engine.rb b/modules/wikis/lib/open_project/wikis/engine.rb index a8ce614c2cb..350f335a883 100644 --- a/modules/wikis/lib/open_project/wikis/engine.rb +++ b/modules/wikis/lib/open_project/wikis/engine.rb @@ -94,9 +94,23 @@ module OpenProject::Wikis menu :admin_menu, :wiki_providers, { controller: "/wikis/admin/wiki_providers", action: :index }, - if: ->(_) { OpenProject::FeatureDecisions.wiki_enhancements_active? }, - caption: :project_module_wiki_platforms, + if: ->(_) { User.current.admin? && OpenProject::FeatureDecisions.wiki_enhancements_active? }, + caption: :"menus.admin.wikis", icon: :book + + menu :admin_menu, + :internal_wiki_provider, + { controller: "/wikis/admin/internal_wiki_provider", action: :show }, + parent: :wiki_providers, + if: ->(_) { User.current.admin? && OpenProject::FeatureDecisions.wiki_enhancements_active? }, + caption: :"menus.admin.internal_wiki_provider" + + menu :admin_menu, + :external_wiki_providers, + { controller: "/wikis/admin/wiki_providers", action: :index }, + parent: :wiki_providers, + if: ->(_) { User.current.admin? && OpenProject::FeatureDecisions.wiki_enhancements_active? }, + caption: :"menus.admin.external_wiki_providers" end patch_with_namespace :WikiPages, :CreateService diff --git a/modules/wikis/spec/features/admin/internal_provider_spec.rb b/modules/wikis/spec/features/admin/internal_provider_spec.rb new file mode 100644 index 00000000000..d3a7c68f6df --- /dev/null +++ b/modules/wikis/spec/features/admin/internal_provider_spec.rb @@ -0,0 +1,63 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +require "spec_helper" + +RSpec.describe "Updating internal wiki provider", :js, :selenium, driver: :firefox_en do + shared_let(:admin) { create(:admin, preferences: { time_zone: "Etc/UTC" }) } + shared_let(:auth_provider) { create(:oidc_provider) } + + let!(:provider) { create(:internal_wiki_provider, enabled: true) } + + current_user { admin } + + it "can enable and disable the internal provider", :aggregate_failures, with_ee: [:scim_api] do + visit admin_settings_internal_wiki_provider_path + expect(page).to be_axe_clean.within("#content") + + expect(page).to have_checked_field("Enable the internal OpenProject wiki") + + uncheck "Enable the internal OpenProject wiki" + click_on "Save" + + SeleniumHubWaiter.wait + + expect(page).to have_unchecked_field("Enable the internal OpenProject wiki") + expect(provider.reload).not_to be_enabled + + check "Enable the internal OpenProject wiki" + click_on "Save" + + SeleniumHubWaiter.wait + + expect(page).to have_checked_field("Enable the internal OpenProject wiki") + expect(provider.reload).to be_enabled + end +end From 96e1f098589987736b109e80048847c29824da21 Mon Sep 17 00:00:00 2001 From: Jan Sandbrink Date: Tue, 9 Jun 2026 08:15:15 +0200 Subject: [PATCH 074/107] Adapt breadcrumbs in wiki providers views Making them consistent with the internal wiki view. Essentially we have a two-level navigation on the left and that needs to be reflected in the breadscrumbs everywhere. --- modules/wikis/app/views/wikis/admin/wiki_providers/edit.html.erb | 1 + .../wikis/app/views/wikis/admin/wiki_providers/index.html.erb | 1 + modules/wikis/app/views/wikis/admin/wiki_providers/new.html.erb | 1 + 3 files changed, 3 insertions(+) diff --git a/modules/wikis/app/views/wikis/admin/wiki_providers/edit.html.erb b/modules/wikis/app/views/wikis/admin/wiki_providers/edit.html.erb index b8afd7cbb11..a2c995b122f 100644 --- a/modules/wikis/app/views/wikis/admin/wiki_providers/edit.html.erb +++ b/modules/wikis/app/views/wikis/admin/wiki_providers/edit.html.erb @@ -43,6 +43,7 @@ See COPYRIGHT and LICENSE files for more details. header.with_breadcrumbs( [ { href: admin_index_path, text: t(:label_administration) }, + { href: admin_settings_wiki_providers_path, text: t("menus.admin.wikis") }, { href: admin_settings_wiki_providers_path, text: t(:project_module_wiki_platforms) }, page_title ] diff --git a/modules/wikis/app/views/wikis/admin/wiki_providers/index.html.erb b/modules/wikis/app/views/wikis/admin/wiki_providers/index.html.erb index fb08ec6d2e5..51dcb921429 100644 --- a/modules/wikis/app/views/wikis/admin/wiki_providers/index.html.erb +++ b/modules/wikis/app/views/wikis/admin/wiki_providers/index.html.erb @@ -35,6 +35,7 @@ See COPYRIGHT and LICENSE files for more details. <% header.with_description { t("wikis.admin.wiki_providers.index_description") } %> <% header.with_breadcrumbs([ { href: admin_index_path, text: t(:label_administration) }, + { href: admin_settings_wiki_providers_path, text: t("menus.admin.wikis") }, t(:project_module_wiki_platforms) ]) %> <% end %> diff --git a/modules/wikis/app/views/wikis/admin/wiki_providers/new.html.erb b/modules/wikis/app/views/wikis/admin/wiki_providers/new.html.erb index 9128d2f50de..eeefe962726 100644 --- a/modules/wikis/app/views/wikis/admin/wiki_providers/new.html.erb +++ b/modules/wikis/app/views/wikis/admin/wiki_providers/new.html.erb @@ -36,6 +36,7 @@ See COPYRIGHT and LICENSE files for more details. <% header.with_breadcrumbs([ { href: admin_index_path, text: t(:label_administration) }, + { href: admin_settings_wiki_providers_path, text: t("menus.admin.wikis") }, { href: admin_settings_wiki_providers_path, text: t(:project_module_wiki_platforms) }, t("wikis.admin.wiki_providers.label_new_provider") ]) %> From 7f650bf1c44d8fa0fab2d9db3c7148a12b62a325 Mon Sep 17 00:00:00 2001 From: Jan Sandbrink Date: Wed, 3 Jun 2026 16:18:41 +0200 Subject: [PATCH 075/107] Rename PageReference to CanonicalPageReference This represents XWikis default way of representing page references, but those are susceptible to become invalid after a page or space gets renamed. We'll also support other page references, so it's important to distinguish that multiple reference types exist. --- .../{page_reference.rb => canonical_page_reference.rb} | 7 ++++--- .../wikis/adapters/providers/xwiki/queries/page_info.rb | 2 +- ..._reference_spec.rb => canonical_page_reference_spec.rb} | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) rename modules/wikis/app/services/wikis/adapters/providers/xwiki/{page_reference.rb => canonical_page_reference.rb} (86%) rename modules/wikis/spec/services/wikis/adapters/providers/xwiki/{page_reference_spec.rb => canonical_page_reference_spec.rb} (97%) diff --git a/modules/wikis/app/services/wikis/adapters/providers/xwiki/page_reference.rb b/modules/wikis/app/services/wikis/adapters/providers/xwiki/canonical_page_reference.rb similarity index 86% rename from modules/wikis/app/services/wikis/adapters/providers/xwiki/page_reference.rb rename to modules/wikis/app/services/wikis/adapters/providers/xwiki/canonical_page_reference.rb index e73e89b5f82..431360280c5 100644 --- a/modules/wikis/app/services/wikis/adapters/providers/xwiki/page_reference.rb +++ b/modules/wikis/app/services/wikis/adapters/providers/xwiki/canonical_page_reference.rb @@ -32,10 +32,9 @@ module Wikis module Adapters module Providers module XWiki - # Represents a parsed XWiki stable page identifier in canonical document reference format: + # Represents an XWiki page identifier in canonical document reference format: # "wikiName:Space1.Space2.PageName" — e.g. "xwiki:Main.WebHome" - # Maps to the REST API path: /wikis/{wiki}/spaces/{s1}/spaces/{s2}/pages/{page} - PageReference = Data.define(:wiki, :spaces, :page) do + CanonicalPageReference = Data.define(:wiki, :spaces, :page) do def self.parse(identifier) wiki, page_path = identifier.split(":", 2) return nil if page_path.blank? @@ -46,6 +45,8 @@ module Wikis new(wiki:, spaces:, page:) end + # Maps the reference to the REST API path, excluding the `/rest` prefix, e.g. + # /wikis/{wiki}/spaces/{s1}/spaces/{s2}/pages/{page} def rest_path spaces_path = spaces.map { "/spaces/#{CGI.escapeURIComponent(it)}" }.join "/wikis/#{CGI.escapeURIComponent(wiki)}#{spaces_path}/pages/#{CGI.escapeURIComponent(page)}" diff --git a/modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/page_info.rb b/modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/page_info.rb index 53a25638026..db320cefd8e 100644 --- a/modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/page_info.rb +++ b/modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/page_info.rb @@ -37,7 +37,7 @@ module Wikis include Concerns::XWikiQuery def call(input_data:, auth_strategy:) - ref = PageReference.parse(input_data.identifier) + ref = CanonicalPageReference.parse(input_data.identifier) return failure(code: :not_found) unless ref authenticated(auth_strategy) do |http| diff --git a/modules/wikis/spec/services/wikis/adapters/providers/xwiki/page_reference_spec.rb b/modules/wikis/spec/services/wikis/adapters/providers/xwiki/canonical_page_reference_spec.rb similarity index 97% rename from modules/wikis/spec/services/wikis/adapters/providers/xwiki/page_reference_spec.rb rename to modules/wikis/spec/services/wikis/adapters/providers/xwiki/canonical_page_reference_spec.rb index a9465e38cd8..5ecbf7daa0f 100644 --- a/modules/wikis/spec/services/wikis/adapters/providers/xwiki/page_reference_spec.rb +++ b/modules/wikis/spec/services/wikis/adapters/providers/xwiki/canonical_page_reference_spec.rb @@ -31,7 +31,7 @@ require "spec_helper" require_module_spec_helper -RSpec.describe Wikis::Adapters::Providers::XWiki::PageReference do +RSpec.describe Wikis::Adapters::Providers::XWiki::CanonicalPageReference do describe ".parse" do subject { described_class.parse(identifier) } From e0d7aff43a38fe753aa6e12b08818776f2b77874 Mon Sep 17 00:00:00 2001 From: Mir Bhatia Date: Mon, 11 May 2026 18:18:32 +0200 Subject: [PATCH 076/107] Add QuickFilter::SelectPanelComponent --- .../{segmented_component => }/item.rb | 16 ++-- .../quick_filter/segmented_component.rb | 2 +- .../select_panel_component.html.erb | 60 ++++++++++++ .../quick_filter/select_panel_component.rb | 91 +++++++++++++++++++ config/locales/en.yml | 3 + .../quick-filter/select-panel.controller.ts | 63 +++++++++++++ 6 files changed, 225 insertions(+), 10 deletions(-) rename app/components/op_primer/quick_filter/{segmented_component => }/item.rb (83%) create mode 100644 app/components/op_primer/quick_filter/select_panel_component.html.erb create mode 100644 app/components/op_primer/quick_filter/select_panel_component.rb create mode 100644 frontend/src/stimulus/controllers/dynamic/quick-filter/select-panel.controller.ts diff --git a/app/components/op_primer/quick_filter/segmented_component/item.rb b/app/components/op_primer/quick_filter/item.rb similarity index 83% rename from app/components/op_primer/quick_filter/segmented_component/item.rb rename to app/components/op_primer/quick_filter/item.rb index 604aa78e3ff..1cc41d343a9 100644 --- a/app/components/op_primer/quick_filter/segmented_component/item.rb +++ b/app/components/op_primer/quick_filter/item.rb @@ -26,20 +26,18 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # See COPYRIGHT and LICENSE files for more details. -#++ +# ++ module OpPrimer module QuickFilter - class SegmentedComponent < ApplicationComponent - class Item < ApplicationComponent - attr_reader :label, :value + class Item < ApplicationComponent + attr_reader :label, :value - def initialize(label:, value:) - super + def initialize(label:, value:) + super - @label = label - @value = value - end + @label = label + @value = value end end end diff --git a/app/components/op_primer/quick_filter/segmented_component.rb b/app/components/op_primer/quick_filter/segmented_component.rb index 0ead8fbb7fc..42c033680b4 100644 --- a/app/components/op_primer/quick_filter/segmented_component.rb +++ b/app/components/op_primer/quick_filter/segmented_component.rb @@ -34,7 +34,7 @@ module OpPrimer include ApplicationHelper include OpTurbo::Streamable - renders_many :items, Item + renders_many :items, OpPrimer::QuickFilter::Item def initialize(name:, query:, filter_key:, path_args:, orders: nil) super diff --git a/app/components/op_primer/quick_filter/select_panel_component.html.erb b/app/components/op_primer/quick_filter/select_panel_component.html.erb new file mode 100644 index 00000000000..9d8954eca5c --- /dev/null +++ b/app/components/op_primer/quick_filter/select_panel_component.html.erb @@ -0,0 +1,60 @@ +<%#-- copyright +OpenProject is an open source project management software. +Copyright (C) the OpenProject GmbH + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License version 3. + +OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +Copyright (C) 2006-2013 Jean-Philippe Lang +Copyright (C) 2010-2013 the ChiliProject Team + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +See COPYRIGHT and LICENSE files for more details. + +++#%> + +
+ <%= render( + Primer::Alpha::SelectPanel.new( + select_variant: :multiple, + fetch_strategy: :local, + title: @name, + dynamic_label: true, + dynamic_label_prefix: current_values.any? ? @name : nil + ) + ) do |panel| %> + <% panel.with_show_button(scheme: :secondary) do |button| + button.with_trailing_visual_icon(icon: :"triangle-down") + current_label + end %> + <% items.each do |item| %> + <% panel.with_item( + label: item.label, + active: current_values.include?(item.value.to_s), + content_arguments: { data: { value: item.value.to_s } } + ) %> + <% end %> + <% panel.with_footer(show_divider: true) do %> + <%= render(Primer::Beta::Button.new(scheme: :primary, data: { action: "click->quick-filter--select-panel#apply" })) do %> + <%= t(:button_apply) %> + <% end %> + <% end %> + <% end %> +
diff --git a/app/components/op_primer/quick_filter/select_panel_component.rb b/app/components/op_primer/quick_filter/select_panel_component.rb new file mode 100644 index 00000000000..93b4e24223d --- /dev/null +++ b/app/components/op_primer/quick_filter/select_panel_component.rb @@ -0,0 +1,91 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +# ++ + +module OpPrimer + module QuickFilter + class SelectPanelComponent < ApplicationComponent + include ApplicationHelper + + renders_many :items, OpPrimer::QuickFilter::Item + + def initialize(name:, query:, filter_key:, path_args:, operator: "=") + super + + @name = name + @query = query + @filter_key = filter_key + @path_args = path_args + @operator = operator + end + + def render? + items.any? + end + + private + + def current_values + @query.find_active_filter(@filter_key)&.values&.map(&:to_s) || [] + end + + def current_label + return @name if current_values.empty? + + selected = items.select { |item| current_values.include?(item.value.to_s) } + return @name if selected.empty? + + return selected.first.label if selected.size == 1 + + I18n.t(:label_x_items_selected, count: selected.size) + end + + def base_url + polymorphic_path(@path_args, base_url_params) + end + + def base_url_params + {}.tap do |params| + params[:filters] = other_filters.to_json if other_filters.any? + params[:sortBy] = sort.to_json if sort.any? + end + end + + def other_filters + @query.filters + .reject { |f| f.name == @filter_key } + .map { |f| { f.class.key.to_s => { "operator" => f.operator.to_s, "values" => f.values } } } + end + + def sort + @query.orders.map { |order| [order.name, order.direction.to_s] } + end + end + end +end diff --git a/config/locales/en.yml b/config/locales/en.yml index 0dfcf46bfcc..e06c51b563f 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -4677,6 +4677,9 @@ en: label_x_working_days_time_off: one: "Time off: 1 working day" other: "Time off: %{count} working days" + label_x_items_selected: + one: "One item selected" + other: "%{count} items selected" label_yesterday: "yesterday" label_zen_mode: "Zen mode" label_role_type: "Type" diff --git a/frontend/src/stimulus/controllers/dynamic/quick-filter/select-panel.controller.ts b/frontend/src/stimulus/controllers/dynamic/quick-filter/select-panel.controller.ts new file mode 100644 index 00000000000..28ccc6e0ead --- /dev/null +++ b/frontend/src/stimulus/controllers/dynamic/quick-filter/select-panel.controller.ts @@ -0,0 +1,63 @@ +/* + * -- copyright + * OpenProject is an open source project management software. + * Copyright (C) the OpenProject GmbH + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License version 3. + * + * OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: + * Copyright (C) 2006-2013 Jean-Philippe Lang + * Copyright (C) 2010-2013 the ChiliProject Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * See COPYRIGHT and LICENSE files for more details. + * ++ + */ + +import { Controller } from '@hotwired/stimulus'; +import type { SelectPanelElement } from '@primer/view-components/app/components/primer/alpha/select_panel_element'; + +export default class SelectPanelQuickFilterController extends Controller { + static values = { + baseUrl: String, + filterKey: String, + operator: { type: String, default: '=' }, + }; + + declare baseUrlValue:string; + declare filterKeyValue:string; + declare operatorValue:string; + + apply() { + const panel = this.element.querySelector('select-panel'); + if (!panel) return; + + const selectedValues = panel.selectedItems + .map((item) => item.value) + .filter((v):v is string => v != null && v.length > 0); + + const url = new URL(this.baseUrlValue, window.location.origin); + + if (selectedValues.length > 0) { + const filters = JSON.parse(url.searchParams.get('filters') ?? '[]') as unknown[]; + filters.push({ [this.filterKeyValue]: { operator: this.operatorValue, values: selectedValues } }); + url.searchParams.set('filters', JSON.stringify(filters)); + } + + window.location.href = url.toString(); + } +} From addc37c0fff07719ad961d7c60691c25e69a2b46 Mon Sep 17 00:00:00 2001 From: Mir Bhatia Date: Mon, 11 May 2026 18:27:44 +0200 Subject: [PATCH 077/107] Rename QuickFilter::SegmentedControlComponent --- .../op_primer/quick_filter/boolean_component.rb | 2 +- ...nent.html.erb => segmented_control_component.html.erb} | 0 ...mented_component.rb => segmented_control_component.rb} | 2 +- lookbook/docs/patterns/10-quick-filters.md.erb | 8 ++++---- lookbook/previews/op_primer/quick_filter_preview.rb | 4 ++-- .../{segmented.html.erb => segmented_control.html.erb} | 2 +- ....erb => segmented_control_with_active_filter.html.erb} | 2 +- modules/costs/app/views/admin/cost_types/index.html.erb | 2 +- .../components/meetings/meeting_time_filter_component.rb | 2 +- ...ponent_spec.rb => segmented_control_component_spec.rb} | 2 +- 10 files changed, 13 insertions(+), 13 deletions(-) rename app/components/op_primer/quick_filter/{segmented_component.html.erb => segmented_control_component.html.erb} (100%) rename app/components/op_primer/quick_filter/{segmented_component.rb => segmented_control_component.rb} (97%) rename lookbook/previews/op_primer/quick_filter_preview/{segmented.html.erb => segmented_control.html.erb} (84%) rename lookbook/previews/op_primer/quick_filter_preview/{segmented_with_active_filter.html.erb => segmented_control_with_active_filter.html.erb} (85%) rename spec/components/op_primer/quick_filter/{segmented_component_spec.rb => segmented_control_component_spec.rb} (98%) diff --git a/app/components/op_primer/quick_filter/boolean_component.rb b/app/components/op_primer/quick_filter/boolean_component.rb index 2de711821b4..b5149afb90e 100644 --- a/app/components/op_primer/quick_filter/boolean_component.rb +++ b/app/components/op_primer/quick_filter/boolean_component.rb @@ -30,7 +30,7 @@ module OpPrimer module QuickFilter - class BooleanComponent < SegmentedComponent + class BooleanComponent < SegmentedControlComponent def initialize(name:, query:, filter_key:, path_args:, true_label: t(:general_text_Yes), false_label: t(:general_text_No), orders: nil) super(name:, query:, filter_key:, path_args:, orders:) diff --git a/app/components/op_primer/quick_filter/segmented_component.html.erb b/app/components/op_primer/quick_filter/segmented_control_component.html.erb similarity index 100% rename from app/components/op_primer/quick_filter/segmented_component.html.erb rename to app/components/op_primer/quick_filter/segmented_control_component.html.erb diff --git a/app/components/op_primer/quick_filter/segmented_component.rb b/app/components/op_primer/quick_filter/segmented_control_component.rb similarity index 97% rename from app/components/op_primer/quick_filter/segmented_component.rb rename to app/components/op_primer/quick_filter/segmented_control_component.rb index 42c033680b4..daa0fa332c9 100644 --- a/app/components/op_primer/quick_filter/segmented_component.rb +++ b/app/components/op_primer/quick_filter/segmented_control_component.rb @@ -30,7 +30,7 @@ module OpPrimer module QuickFilter - class SegmentedComponent < ApplicationComponent + class SegmentedControlComponent < ApplicationComponent include ApplicationHelper include OpTurbo::Streamable diff --git a/lookbook/docs/patterns/10-quick-filters.md.erb b/lookbook/docs/patterns/10-quick-filters.md.erb index 05840c2f635..9f53c23fd93 100644 --- a/lookbook/docs/patterns/10-quick-filters.md.erb +++ b/lookbook/docs/patterns/10-quick-filters.md.erb @@ -2,10 +2,10 @@ Quick filters are lightweight controls that let users toggle a single filter wit preserving any other active filters. There are currently two variants: -* SegmentedComponent +* SegmentedControlComponent * BooleanComponent -## SegmentedComponent +## SegmentedControlComponent A general purpose segmented control that accepts any number of items via `with_item` slots. Each item has a label and a filter value (`nil` means "no filter" and is useful for an "All" option). @@ -25,7 +25,7 @@ Note: Clicking on buttons in the above preview will break it and redirect to the ## BooleanComponent -A specialized subclass of `SegmentedComponent` for boolean (true/false) filters. +A specialized subclass of `SegmentedControlComponent` for boolean (true/false) filters. It always renders exactly two items using `t` and `f` as filter values. Labels are provided via `true_label` and `false_label`. @@ -36,4 +36,4 @@ Note: Clicking on buttons in the above preview will break it and redirect to the ## Parameters * `BooleanComponent` requires `true_label` and `false_label`. -* `SegmentedComponent` accepts items via a block using `with_item(label:, value:)`. +* `SegmentedControlComponent` accepts items via a block using `with_item(label:, value:)`. diff --git a/lookbook/previews/op_primer/quick_filter_preview.rb b/lookbook/previews/op_primer/quick_filter_preview.rb index bd680dd0858..43d1c0aa081 100644 --- a/lookbook/previews/op_primer/quick_filter_preview.rb +++ b/lookbook/previews/op_primer/quick_filter_preview.rb @@ -31,11 +31,11 @@ module OpPrimer # @logical_path OpenProject/Primer class QuickFilterPreview < Lookbook::Preview - def segmented + def segmented_control render_with_template(locals: { query: meeting_query }) end - def segmented_with_active_filter + def segmented_control_with_active_filter query = meeting_query query.where("time", "=", ["future"]) render_with_template(locals: { query: }) diff --git a/lookbook/previews/op_primer/quick_filter_preview/segmented.html.erb b/lookbook/previews/op_primer/quick_filter_preview/segmented_control.html.erb similarity index 84% rename from lookbook/previews/op_primer/quick_filter_preview/segmented.html.erb rename to lookbook/previews/op_primer/quick_filter_preview/segmented_control.html.erb index ca795c2a13b..7bfc4ff0687 100644 --- a/lookbook/previews/op_primer/quick_filter_preview/segmented.html.erb +++ b/lookbook/previews/op_primer/quick_filter_preview/segmented_control.html.erb @@ -1,5 +1,5 @@ <%= render( - OpPrimer::QuickFilter::SegmentedComponent.new( + OpPrimer::QuickFilter::SegmentedControlComponent.new( name: "Meeting type", query: query, filter_key: :type, diff --git a/lookbook/previews/op_primer/quick_filter_preview/segmented_with_active_filter.html.erb b/lookbook/previews/op_primer/quick_filter_preview/segmented_control_with_active_filter.html.erb similarity index 85% rename from lookbook/previews/op_primer/quick_filter_preview/segmented_with_active_filter.html.erb rename to lookbook/previews/op_primer/quick_filter_preview/segmented_control_with_active_filter.html.erb index c87266f8f02..258af6fafa2 100644 --- a/lookbook/previews/op_primer/quick_filter_preview/segmented_with_active_filter.html.erb +++ b/lookbook/previews/op_primer/quick_filter_preview/segmented_control_with_active_filter.html.erb @@ -1,5 +1,5 @@ <%= render( - OpPrimer::QuickFilter::SegmentedComponent.new( + OpPrimer::QuickFilter::SegmentedControlComponent.new( name: "Time", query: query, filter_key: :time, diff --git a/modules/costs/app/views/admin/cost_types/index.html.erb b/modules/costs/app/views/admin/cost_types/index.html.erb index c82b75f30d4..9e589c86338 100644 --- a/modules/costs/app/views/admin/cost_types/index.html.erb +++ b/modules/costs/app/views/admin/cost_types/index.html.erb @@ -53,7 +53,7 @@ See COPYRIGHT and LICENSE files for more details. ) do |subheader| subheader.with_quick_filter do render( - OpPrimer::QuickFilter::SegmentedComponent.new( + OpPrimer::QuickFilter::SegmentedControlComponent.new( name: t(:label_filter_plural), query: @query, filter_key: :status, diff --git a/modules/meeting/app/components/meetings/meeting_time_filter_component.rb b/modules/meeting/app/components/meetings/meeting_time_filter_component.rb index 96896d8e4ac..10fa5d0b1a8 100644 --- a/modules/meeting/app/components/meetings/meeting_time_filter_component.rb +++ b/modules/meeting/app/components/meetings/meeting_time_filter_component.rb @@ -29,7 +29,7 @@ # ++ module Meetings - class MeetingTimeFilterComponent < OpPrimer::QuickFilter::SegmentedComponent + class MeetingTimeFilterComponent < OpPrimer::QuickFilter::SegmentedControlComponent def initialize(query:, project: nil) super( name: I18n.t(:label_meeting_date_time), diff --git a/spec/components/op_primer/quick_filter/segmented_component_spec.rb b/spec/components/op_primer/quick_filter/segmented_control_component_spec.rb similarity index 98% rename from spec/components/op_primer/quick_filter/segmented_component_spec.rb rename to spec/components/op_primer/quick_filter/segmented_control_component_spec.rb index e747088b72c..43274a9ec72 100644 --- a/spec/components/op_primer/quick_filter/segmented_component_spec.rb +++ b/spec/components/op_primer/quick_filter/segmented_control_component_spec.rb @@ -30,7 +30,7 @@ require "rails_helper" -RSpec.describe OpPrimer::QuickFilter::SegmentedComponent, type: :component do +RSpec.describe OpPrimer::QuickFilter::SegmentedControlComponent, type: :component do include QuickFilterHelpers let(:project) { build_stubbed(:project) } From 7a508e1b1e33e9931219fac379024a464b084bbe Mon Sep 17 00:00:00 2001 From: Mir Bhatia Date: Tue, 12 May 2026 17:30:30 +0200 Subject: [PATCH 078/107] Add project quick filter to global meetings index page --- .../index_sub_header_component.html.erb | 17 ++++++++++++++ .../meetings/index_sub_header_component.rb | 6 +++++ .../spec/features/meetings_index_spec.rb | 23 +++++++++++++++++++ .../spec/support/pages/meetings/index.rb | 16 +++++++++++++ 4 files changed, 62 insertions(+) diff --git a/modules/meeting/app/components/meetings/index_sub_header_component.html.erb b/modules/meeting/app/components/meetings/index_sub_header_component.html.erb index 09a288aec64..c9f81e6e7b7 100644 --- a/modules/meeting/app/components/meetings/index_sub_header_component.html.erb +++ b/modules/meeting/app/components/meetings/index_sub_header_component.html.erb @@ -13,6 +13,23 @@ render(Meetings::MeetingTimeFilterComponent.new(query: @query, project: @project)) end + if @project.nil? + subheader.with_quick_filter do + render( + OpPrimer::QuickFilter::SelectPanelComponent.new( + name: I18n.t(:label_project), + query: @query, + filter_key: :project_id, + path_args: [@project, :meetings] + ) + ) do |component| + project_items.each do |project| + component.with_item(label: project.name, value: project.id) + end + end + end + end + subheader.with_filter_component do render(Meetings::MeetingFilterButtonComponent.new(query: @query, project: @project)) end diff --git a/modules/meeting/app/components/meetings/index_sub_header_component.rb b/modules/meeting/app/components/meetings/index_sub_header_component.rb index d5a2620632d..a0084251a90 100644 --- a/modules/meeting/app/components/meetings/index_sub_header_component.rb +++ b/modules/meeting/app/components/meetings/index_sub_header_component.rb @@ -41,6 +41,8 @@ module Meetings @params = params end + private + def render_create_button? if @project User.current.allowed_in_project?(:create_meetings, @project) @@ -64,5 +66,9 @@ module Meetings def filters_expanded? params[:filters].present? end + + def project_items + Project.visible.order(:name) + end end end diff --git a/modules/meeting/spec/features/meetings_index_spec.rb b/modules/meeting/spec/features/meetings_index_spec.rb index e77e38eeed2..da6e4fe85d2 100644 --- a/modules/meeting/spec/features/meetings_index_spec.rb +++ b/modules/meeting/spec/features/meetings_index_spec.rb @@ -374,6 +374,24 @@ RSpec.describe "Meetings", "Index", :js do end end + context 'with the "Project" quick filter' do + before do + meetings_page.visit! + meetings_page.set_sidebar_filter "All meetings" + end + + it "shows only meetings from the selected projects" do + meetings_page.set_project_filter(project) + + meetings_page.expect_meetings_listed(meeting, tomorrows_meeting) + meetings_page.expect_meetings_not_listed(other_project_meeting) + + meetings_page.set_project_filter(project, other_project) + + meetings_page.expect_meetings_listed(meeting, tomorrows_meeting, other_project_meeting) + end + end + include_examples "sidebar filtering", context: :global end @@ -407,6 +425,11 @@ RSpec.describe "Meetings", "Index", :js do end end + it 'does not show the "Project" quick filter' do + meetings_page.visit! + expect(page).to have_no_button I18n.t(:label_project), exact: true + end + include_examples "sidebar filtering", context: :project specify "with 1 meeting listed" do diff --git a/modules/meeting/spec/support/pages/meetings/index.rb b/modules/meeting/spec/support/pages/meetings/index.rb index a4f260a9a5f..74a9ff80cc8 100644 --- a/modules/meeting/spec/support/pages/meetings/index.rb +++ b/modules/meeting/spec/support/pages/meetings/index.rb @@ -149,6 +149,22 @@ module Pages::Meetings wait_for_network_idle end + def set_project_filter(*projects) + page.within("#content-body") do + click_link_or_button I18n.t(:label_project), exact: true + end + + projects.each do |project| + find("[role='option']", text: project.name).click + end + + within("[data-controller='quick-filter--select-panel']") do + click_link_or_button I18n.t(:button_apply) + end + + wait_for_network_idle + end + def expect_no_meetings_listed within "#content-wrapper" do expect(page) From cc3c3fbdf6162e56c49fd98c1034c32d09bf54b9 Mon Sep 17 00:00:00 2001 From: Mir Bhatia Date: Tue, 12 May 2026 18:44:24 +0200 Subject: [PATCH 079/107] Add component specs --- .../select_panel_component.html.erb | 2 +- .../spec/support/pages/meetings/index.rb | 7 +- .../select_panel_component_spec.rb | 167 ++++++++++++++++++ .../support/shared/components/quick_filter.rb | 15 +- 4 files changed, 183 insertions(+), 8 deletions(-) create mode 100644 spec/components/op_primer/quick_filter/select_panel_component_spec.rb diff --git a/app/components/op_primer/quick_filter/select_panel_component.html.erb b/app/components/op_primer/quick_filter/select_panel_component.html.erb index 9d8954eca5c..0c561708b86 100644 --- a/app/components/op_primer/quick_filter/select_panel_component.html.erb +++ b/app/components/op_primer/quick_filter/select_panel_component.html.erb @@ -40,7 +40,7 @@ See COPYRIGHT and LICENSE files for more details. dynamic_label_prefix: current_values.any? ? @name : nil ) ) do |panel| %> - <% panel.with_show_button(scheme: :secondary) do |button| + <% panel.with_show_button(scheme: :secondary, data: { test_selector: "quick-filter-select-panel-button" }) do |button| button.with_trailing_visual_icon(icon: :"triangle-down") current_label end %> diff --git a/modules/meeting/spec/support/pages/meetings/index.rb b/modules/meeting/spec/support/pages/meetings/index.rb index 74a9ff80cc8..c001b667b6f 100644 --- a/modules/meeting/spec/support/pages/meetings/index.rb +++ b/modules/meeting/spec/support/pages/meetings/index.rb @@ -150,12 +150,11 @@ module Pages::Meetings end def set_project_filter(*projects) - page.within("#content-body") do - click_link_or_button I18n.t(:label_project), exact: true - end + find_test_selector("quick-filter-select-panel-button").click projects.each do |project| - find("[role='option']", text: project.name).click + option = find("[role='option']", text: project.name) + option.click unless option[:"aria-selected"] == "true" end within("[data-controller='quick-filter--select-panel']") do diff --git a/spec/components/op_primer/quick_filter/select_panel_component_spec.rb b/spec/components/op_primer/quick_filter/select_panel_component_spec.rb new file mode 100644 index 00000000000..677a7dba4f0 --- /dev/null +++ b/spec/components/op_primer/quick_filter/select_panel_component_spec.rb @@ -0,0 +1,167 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +require "rails_helper" + +RSpec.describe OpPrimer::QuickFilter::SelectPanelComponent, type: :component do + include QuickFilterHelpers + + let(:project) { build_stubbed(:project) } + let(:query) { build_meeting_query } + + subject(:component) do + described_class.new( + name: "Project", + query:, + filter_key: :project_id, + path_args: [nil, :meetings] + ) + end + + def render_with_items + render_inline(component) do |c| + c.with_item(label: "Project 1", value: 1) + c.with_item(label: "Project 2", value: 2) + end + end + + context "when rendering with items" do + before { render_with_items } + + it "renders all items" do + expect(page).to have_text("Project 1") + expect(page).to have_text("Project 2") + end + + it "renders the select panel quick filter" do + expect(page).to have_css("[data-controller='quick-filter--select-panel']") + end + end + + context "when no items are given" do + before { render_inline(component) } + + it "does not render" do + expect(page).to have_no_css("[data-controller='quick-filter--select-panel']") + end + end + + context "when an item matches the active filter value" do + let(:query) { build_meeting_query.where("project_id", "=", ["1"]) } + + before { render_with_items } + + it "marks the matching item as selected" do + expect(page).to have_css("[aria-selected='true']", text: "Project 1", visible: :all) + end + + it "does not mark the other item as selected" do + expect(page).to have_no_css("[aria-selected='true']", text: "Project 2", visible: :all) + end + end + + context "when multiple items match the active filter" do + let(:query) { build_meeting_query.where("project_id", "=", ["1", "2"]) } + + before { render_with_items } + + it "marks all matching items as selected" do + expect(page).to have_css("[aria-selected='true']", text: "Project 1", visible: :all) + expect(page).to have_css("[aria-selected='true']", text: "Project 2", visible: :all) + end + end + + context "when no filter is active" do + before { render_with_items } + + it "marks no items as selected" do + expect(page).to have_no_css("[aria-selected='true']", visible: :all) + end + end + + context "with the show button label" do + context "when no filter is active" do + before { render_with_items } + + it "shows the component name" do + expect(page).to have_button("Project") + end + + it "does not render a dynamic label prefix" do + expect(page).to have_no_css("[data-dynamic-label-prefix]") + end + end + + context "when one item is active" do + let(:query) { build_meeting_query.where("project_id", "=", ["1"]) } + + before { render_with_items } + + it "shows the selected item name" do + expect(page).to have_button("Project 1") + end + + it "renders the dynamic label prefix" do + expect(page).to have_css("[data-dynamic-label-prefix='Project']") + end + end + + context "when multiple items are active" do + let(:query) { build_meeting_query.where("project_id", "=", ["1", "2"]) } + + before { render_with_items } + + it "shows the item count" do + expect(page).to have_button(I18n.t(:label_x_items_selected, count: 2)) + end + + it "renders the dynamic label prefix" do + expect(page).to have_css("[data-dynamic-label-prefix='Project']") + end + end + end + + context "when other filters are active" do + let(:query) { build_meeting_query.where("time", "=", ["future"]) } + + before { render_with_items } + + it "preserves the operator and values of other filters unchanged" do + base_url = page.find("[data-controller='quick-filter--select-panel']")[ + "data-quick-filter--select-panel-base-url-value" + ] + time_filter = filters_from_base_url(base_url).find { |f| f.key?("time") } + original = query.find_active_filter(:time) + + expect(time_filter["time"]["operator"]).to eq(original.operator.to_s) + expect(time_filter["time"]["values"]).to eq(original.values) + end + end +end diff --git a/spec/support/shared/components/quick_filter.rb b/spec/support/shared/components/quick_filter.rb index 672850b36cf..a1788f2acde 100644 --- a/spec/support/shared/components/quick_filter.rb +++ b/spec/support/shared/components/quick_filter.rb @@ -34,12 +34,21 @@ module QuickFilterHelpers end def filters_from_link(link) - json = CGI.unescape(link[:href].match(/filters=([^&]+)/)[1]) - JSON.parse(json) + parse_url_param(link[:href], "filters") end def sort_from_link(link) - json = CGI.unescape(link[:href].match(/sortBy=([^&]+)/)[1]) + parse_url_param(link[:href], "sortBy") + end + + def filters_from_base_url(url) + parse_url_param(url, "filters") + end + + private + + def parse_url_param(url, param) + json = CGI.unescape(url.match(/#{param}=([^&]+)/)[1]) JSON.parse(json) end end From 81304f093d0e44917d6e85e303cefcddc469fb29 Mon Sep 17 00:00:00 2001 From: Mir Bhatia Date: Wed, 13 May 2026 09:24:04 +0200 Subject: [PATCH 080/107] Update docs --- .../docs/patterns/10-quick-filters.md.erb | 19 ++++++++++++------- .../op_primer/quick_filter_preview.rb | 6 ++++++ .../select_panel_with_active_filter.html.erb | 12 ++++++++++++ 3 files changed, 30 insertions(+), 7 deletions(-) create mode 100644 lookbook/previews/op_primer/quick_filter_preview/select_panel_with_active_filter.html.erb diff --git a/lookbook/docs/patterns/10-quick-filters.md.erb b/lookbook/docs/patterns/10-quick-filters.md.erb index 9f53c23fd93..e626973bde5 100644 --- a/lookbook/docs/patterns/10-quick-filters.md.erb +++ b/lookbook/docs/patterns/10-quick-filters.md.erb @@ -1,16 +1,17 @@ -Quick filters are lightweight controls that let users toggle a single filter without opening the full filter panel. Each click can navigate to a new URL with updated `filters` and `sortBy` params, +Quick filters are lightweight controls that let users toggle a single filter without opening the full filter panel. Each click or selection navigates to a new URL with updated `filters` and `sortBy` params, preserving any other active filters. -There are currently two variants: +There are currently three variants: * SegmentedControlComponent * BooleanComponent +* SelectPanelComponent ## SegmentedControlComponent A general purpose segmented control that accepts any number of items via `with_item` slots. Each item has a label and a filter value (`nil` means "no filter" and is useful for an "All" option). -<%= embed OpPrimer::QuickFilterPreview, :segmented, panels: %i[source] %> +<%= embed OpPrimer::QuickFilterPreview, :segmented_control, panels: %i[source] %> Note: Clicking on buttons in the above preview will break it and redirect to the meetings index page. @@ -19,7 +20,7 @@ Note: Clicking on buttons in the above preview will break it and redirect to the When the query already has a matching filter value, the corresponding item is rendered as selected. You can also pass `orders` to define the sort order per value. -<%= embed OpPrimer::QuickFilterPreview, :segmented_with_active_filter, panels: %i[source] %> +<%= embed OpPrimer::QuickFilterPreview, :segmented_control_with_active_filter, panels: %i[source] %> Note: Clicking on buttons in the above preview will break it and redirect to the meetings index page. @@ -33,7 +34,11 @@ Labels are provided via `true_label` and `false_label`. Note: Clicking on buttons in the above preview will break it and redirect to the meetings index page. -## Parameters +## SelectPanelComponent -* `BooleanComponent` requires `true_label` and `false_label`. -* `SegmentedControlComponent` accepts items via a block using `with_item(label:, value:)`. +A multiselect select panel based quick filter. Select panel items are provided via `with_item` slots. +Navigation happens when items are checked and the "Apply" button is clicked. + +<%= embed OpPrimer::QuickFilterPreview, :select_panel_with_active_filter, panels: %i[source] %> + +Note: Clicking on buttons in the above preview will break it and redirect to the meetings index page. diff --git a/lookbook/previews/op_primer/quick_filter_preview.rb b/lookbook/previews/op_primer/quick_filter_preview.rb index 43d1c0aa081..239f66a683c 100644 --- a/lookbook/previews/op_primer/quick_filter_preview.rb +++ b/lookbook/previews/op_primer/quick_filter_preview.rb @@ -47,6 +47,12 @@ module OpPrimer render_with_template(locals: { query: }) end + def select_panel_with_active_filter + query = meeting_query + query.where("project_id", "=", [Project.visible.first&.id.to_s].compact) + render_with_template(locals: { query: }) + end + private def meeting_query diff --git a/lookbook/previews/op_primer/quick_filter_preview/select_panel_with_active_filter.html.erb b/lookbook/previews/op_primer/quick_filter_preview/select_panel_with_active_filter.html.erb new file mode 100644 index 00000000000..62b735a84aa --- /dev/null +++ b/lookbook/previews/op_primer/quick_filter_preview/select_panel_with_active_filter.html.erb @@ -0,0 +1,12 @@ +<%= render( + OpPrimer::QuickFilter::SelectPanelComponent.new( + name: "Project", + query: query, + filter_key: :project_id, + path_args: [:meetings] + ) + ) do |component| + Project.visible.each do |project| + component.with_item(label: project.name, value: project.id) + end + end %> From 1ba2bf95ceb74b481f6d287f3a85e2f07c9a6c7d Mon Sep 17 00:00:00 2001 From: Jan Sandbrink Date: Thu, 4 Jun 2026 11:03:45 +0200 Subject: [PATCH 081/107] Use stable identifiers to fetch XWiki pages We now have two ways to fetch page infos from XWiki: * using the canonical identifier (but through a new endpoint that will resolve stable identifiers as well) * using the stable identifier Since we want to store the stable identifier, the stable version is the one exposed through the XWiki registry. The canonical form is required to fully resolve some list queries from XWiki properly. --- .../xwiki/canonical_page_reference.rb | 4 + .../xwiki/queries/canonical_page_info.rb | 76 ++++++++++++ .../providers/xwiki/queries/search_pages.rb | 8 +- .../{page_info.rb => stable_page_info.rb} | 11 +- .../adapters/providers/xwiki/registry.rb | 2 +- .../providers/xwiki/stable_page_reference.rb | 60 ++++++++++ .../api/v3/page_links/page_links_api_spec.rb | 4 +- .../xwiki/canonical_page_reference_spec.rb | 20 ++++ ...fo_spec.rb => canonical_page_info_spec.rb} | 52 ++++----- .../xwiki/queries/search_pages_spec.rb | 7 ++ .../xwiki/queries/stable_page_info_spec.rb | 110 ++++++++++++++++++ .../xwiki/stable_page_reference_spec.rb | 66 +++++++++++ .../xwiki/canonical_page_info.yml | 73 ++++++++++++ .../vcr_cassettes/xwiki/query_exact_match.yml | 48 ++++---- .../vcr_cassettes/xwiki/query_no_match.yml | 8 +- .../xwiki/query_partial_match.yml | 46 ++++---- .../xwiki/query_quoted_match.yml | 47 ++++---- .../xwiki/query_unquoted_match.yml | 47 ++++---- .../vcr_cassettes/xwiki/stable_page_info.yml | 50 ++++++++ 19 files changed, 612 insertions(+), 127 deletions(-) create mode 100644 modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/canonical_page_info.rb rename modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/{page_info.rb => stable_page_info.rb} (84%) create mode 100644 modules/wikis/app/services/wikis/adapters/providers/xwiki/stable_page_reference.rb rename modules/wikis/spec/services/wikis/adapters/providers/xwiki/queries/{page_info_spec.rb => canonical_page_info_spec.rb} (71%) create mode 100644 modules/wikis/spec/services/wikis/adapters/providers/xwiki/queries/stable_page_info_spec.rb create mode 100644 modules/wikis/spec/services/wikis/adapters/providers/xwiki/stable_page_reference_spec.rb create mode 100644 spec/support/fixtures/vcr_cassettes/xwiki/canonical_page_info.yml create mode 100644 spec/support/fixtures/vcr_cassettes/xwiki/stable_page_info.yml diff --git a/modules/wikis/app/services/wikis/adapters/providers/xwiki/canonical_page_reference.rb b/modules/wikis/app/services/wikis/adapters/providers/xwiki/canonical_page_reference.rb index 431360280c5..6ff8767b2e1 100644 --- a/modules/wikis/app/services/wikis/adapters/providers/xwiki/canonical_page_reference.rb +++ b/modules/wikis/app/services/wikis/adapters/providers/xwiki/canonical_page_reference.rb @@ -51,6 +51,10 @@ module Wikis spaces_path = spaces.map { "/spaces/#{CGI.escapeURIComponent(it)}" }.join "/wikis/#{CGI.escapeURIComponent(wiki)}#{spaces_path}/pages/#{CGI.escapeURIComponent(page)}" end + + def to_s + "#{wiki}:#{spaces.join('.')}.#{page}" + end end end end diff --git a/modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/canonical_page_info.rb b/modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/canonical_page_info.rb new file mode 100644 index 00000000000..1274ddf8f39 --- /dev/null +++ b/modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/canonical_page_info.rb @@ -0,0 +1,76 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +module Wikis + module Adapters + module Providers + module XWiki + module Queries + # Fetch page information using a canonical XWiki identifier + class CanonicalPageInfo < BaseQuery + include Concerns::XWikiQuery + + def call(input_data:, auth_strategy:) + ref = CanonicalPageReference.parse(input_data.identifier) + return failure(code: :not_found) unless ref + + perform_request(ref, auth_strategy:) do |data| + success( + Results::PageInfo.new( + identifier: StablePageReference.parse(data.fetch("id")).to_s, + title: data.fetch("title"), + href: data.fetch("xwikiAbsoluteUrl"), + provider: + ) + ) + end + end + + def perform_request(reference, auth_strategy:, &) + authenticated(auth_strategy) do |http| + handle_response( + # This query is implemented as a PUT on the XWiki side, because it dynamically creates the + # stable identifier that it returns. Passing an empty JSON body is also required for the + # endpoint to not raise an error 🤷 + http.with(headers: { "Content-Type": "application/json" }) + .put( + rest_url("openproject/documents", query: { docRef: reference.to_s }), + body: "{}" + ), + & + ) + end + end + end + end + end + end + end +end diff --git a/modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/search_pages.rb b/modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/search_pages.rb index 5c09cabb327..c8a7e5122d5 100644 --- a/modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/search_pages.rb +++ b/modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/search_pages.rb @@ -47,7 +47,7 @@ module Wikis json.fetch("searchResults") .uniq { |r| r.fetch("id") } .map do |r| - result = page_info(identifier: r.fetch("id"), auth_strategy:) + result = canonical_page_info(identifier: r.fetch("id"), auth_strategy:) return result if result.failure? result.value! @@ -62,6 +62,12 @@ module Wikis def escape_quotes(string) string.gsub("\\", "\\\\").gsub('"', '\"') end + + def canonical_page_info(identifier:, auth_strategy:) + Input::PageInfo.build(identifier:).bind do |input_data| + CanonicalPageInfo.new(model: provider).call(input_data:, auth_strategy:) + end + end end end end diff --git a/modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/page_info.rb b/modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/stable_page_info.rb similarity index 84% rename from modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/page_info.rb rename to modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/stable_page_info.rb index db320cefd8e..51d2adbff3a 100644 --- a/modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/page_info.rb +++ b/modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/stable_page_info.rb @@ -33,20 +33,21 @@ module Wikis module Providers module XWiki module Queries - class PageInfo < BaseQuery + # Fetch page information using a stable XWiki identifier + class StablePageInfo < BaseQuery include Concerns::XWikiQuery def call(input_data:, auth_strategy:) - ref = CanonicalPageReference.parse(input_data.identifier) + ref = StablePageReference.parse(input_data.identifier) return failure(code: :not_found) unless ref authenticated(auth_strategy) do |http| handle_response(http.get(rest_url(ref.rest_path))) do |data| success( Results::PageInfo.new( - identifier: input_data.identifier, - title: data["title"], - href: data["xwikiAbsoluteUrl"], + identifier: ref.to_s, + title: data.fetch("title"), + href: data.fetch("xwikiAbsoluteUrl"), provider: ) ) diff --git a/modules/wikis/app/services/wikis/adapters/providers/xwiki/registry.rb b/modules/wikis/app/services/wikis/adapters/providers/xwiki/registry.rb index 534328ecf15..057136c3ade 100644 --- a/modules/wikis/app/services/wikis/adapters/providers/xwiki/registry.rb +++ b/modules/wikis/app/services/wikis/adapters/providers/xwiki/registry.rb @@ -61,7 +61,7 @@ module Wikis namespace("queries") do register(:user, Queries::User) - register(:page_info, Queries::PageInfo) + register(:page_info, Queries::StablePageInfo) register(:referencing_pages, Queries::ReferencingPages) register(:relation_page_links, Queries::RelationPageLinks) register(:search_pages, Queries::SearchPages) diff --git a/modules/wikis/app/services/wikis/adapters/providers/xwiki/stable_page_reference.rb b/modules/wikis/app/services/wikis/adapters/providers/xwiki/stable_page_reference.rb new file mode 100644 index 00000000000..d92675cf8cc --- /dev/null +++ b/modules/wikis/app/services/wikis/adapters/providers/xwiki/stable_page_reference.rb @@ -0,0 +1,60 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +module Wikis + module Adapters + module Providers + module XWiki + # Represents an XWiki page identifier using the "stable" page identifier format: e.g. 0b89a + StablePageReference = Data.define(:uid) do + class << self + private :new + + def parse(uid) + return nil if uid.nil? + + new(uid:) + end + end + + # Maps the reference to the REST API path, excluding the `/rest` prefix, e.g. + # /openproject/documents/0b89a + def rest_path + "/openproject/documents/#{CGI.escapeURIComponent(uid)}" + end + + def to_s + uid + end + end + end + end + end +end diff --git a/modules/wikis/spec/requests/api/v3/page_links/page_links_api_spec.rb b/modules/wikis/spec/requests/api/v3/page_links/page_links_api_spec.rb index 3ba6cb3f773..9f16d377916 100644 --- a/modules/wikis/spec/requests/api/v3/page_links/page_links_api_spec.rb +++ b/modules/wikis/spec/requests/api/v3/page_links/page_links_api_spec.rb @@ -168,10 +168,10 @@ RSpec.describe "API v3 wiki page links resource", content_type: :json do def stub_provider_queries internal_class = class_double(Wikis::Adapters::Providers::Internal::Queries::PageInfo) - xwiki_class = class_double(Wikis::Adapters::Providers::XWiki::Queries::PageInfo) + xwiki_class = class_double(Wikis::Adapters::Providers::XWiki::Queries::StablePageInfo) internal_query = instance_double(Wikis::Adapters::Providers::Internal::Queries::PageInfo) - xwiki_query = instance_double(Wikis::Adapters::Providers::XWiki::Queries::PageInfo) + xwiki_query = instance_double(Wikis::Adapters::Providers::XWiki::Queries::StablePageInfo) Wikis::Adapters::Registry.stub("internal.queries.page_info", internal_class) Wikis::Adapters::Registry.stub("xwiki.queries.page_info", xwiki_class) diff --git a/modules/wikis/spec/services/wikis/adapters/providers/xwiki/canonical_page_reference_spec.rb b/modules/wikis/spec/services/wikis/adapters/providers/xwiki/canonical_page_reference_spec.rb index 5ecbf7daa0f..8c7d29619a2 100644 --- a/modules/wikis/spec/services/wikis/adapters/providers/xwiki/canonical_page_reference_spec.rb +++ b/modules/wikis/spec/services/wikis/adapters/providers/xwiki/canonical_page_reference_spec.rb @@ -87,4 +87,24 @@ RSpec.describe Wikis::Adapters::Providers::XWiki::CanonicalPageReference do it { is_expected.to eq("/wikis/xwiki/spaces/My%20Space/pages/My%20Page") } end end + + describe "#to_s" do + subject { described_class.parse(identifier).to_s } + + context "with a standard identifier" do + let(:identifier) { "xwiki:Main.WebHome" } + + it "roundtrips" do + expect(subject).to eq(identifier) + end + end + + context "with a nested space identifier" do + let(:identifier) { "xwiki:MySpace.SubSpace.PageName" } + + it "roundtrips" do + expect(subject).to eq(identifier) + end + end + end end diff --git a/modules/wikis/spec/services/wikis/adapters/providers/xwiki/queries/page_info_spec.rb b/modules/wikis/spec/services/wikis/adapters/providers/xwiki/queries/canonical_page_info_spec.rb similarity index 71% rename from modules/wikis/spec/services/wikis/adapters/providers/xwiki/queries/page_info_spec.rb rename to modules/wikis/spec/services/wikis/adapters/providers/xwiki/queries/canonical_page_info_spec.rb index e9be445be71..27e913c3a2b 100644 --- a/modules/wikis/spec/services/wikis/adapters/providers/xwiki/queries/page_info_spec.rb +++ b/modules/wikis/spec/services/wikis/adapters/providers/xwiki/queries/canonical_page_info_spec.rb @@ -31,52 +31,46 @@ require "spec_helper" require_module_spec_helper -RSpec.describe Wikis::Adapters::Providers::XWiki::Queries::PageInfo, :webmock do - it "is registered" do - expect(Wikis::Adapters::Registry.resolve("xwiki.queries.page_info")).to eq(described_class) +RSpec.describe Wikis::Adapters::Providers::XWiki::Queries::CanonicalPageInfo, :webmock do + it "is not registered" do + expect(Wikis::Adapters::Registry.resolve("xwiki.queries.page_info")).not_to eq(described_class) end describe "#call" do let(:user) { create(:user) } - let(:wiki_provider) { create(:xwiki_provider, :with_connected_user, url: "https://xwiki.example.com/", connected_user: user) } + let(:wiki_provider) { create(:xwiki_provider, :for_local_connection, connected_user: user) } let(:identifier) { "xwiki:Main.WebHome" } - let(:page_url) { "https://xwiki.example.com/rest/wikis/xwiki/spaces/Main/pages/WebHome" } + let(:page_url) { "https://xwiki.local/rest/openproject/documents?docRef=xwiki:Main.WebHome" } let(:auth_strategy) { Wikis::Adapters::Input::AuthStrategy.build(key: :bearer_token, user:, provider: wiki_provider).value! } let(:input_data) { Wikis::Adapters::Input::PageInfo.build(identifier:).value! } let(:query) { described_class.new(model: wiki_provider) } subject(:result) { query.call(input_data:, auth_strategy:) } - context "when the page exists" do - let(:page_response) do - { "title" => "Home", "xwikiAbsoluteUrl" => "https://xwiki.example.com/bin/view/Main/" }.to_json - end - - before do - stub_request(:get, page_url) - .with(headers: { "Authorization" => "Bearer user-bearer-token" }) - .to_return(status: 200, body: page_response, headers: { "Content-Type" => "application/json" }) - end + context "when the page exists", vcr: "xwiki/canonical_page_info" do + # Set the expected identifier according to the stable identifier returned by XWiki (or update the VCR cassette accordingly) + let(:expected_identifier) { "484f4" } it "returns Success with title and href" do expect(result).to be_success expect(result.value!).to have_attributes( - identifier:, + identifier: expected_identifier, title: "Home", - href: "https://xwiki.example.com/bin/view/Main/" + href: "https://xwiki.local/bin/view/Main/" ) end end context "with a nested space identifier" do let(:identifier) { "xwiki:MySpace.SubSpace.PageName" } - let(:page_url) { "https://xwiki.example.com/rest/wikis/xwiki/spaces/MySpace/spaces/SubSpace/pages/PageName" } - let(:absolute_url) { "https://xwiki.example.com/bin/view/MySpace/SubSpace/PageName" } + let(:page_url) do + "https://xwiki.local/rest/openproject/documents?docRef=xwiki:MySpace.SubSpace.PageName" + end + let(:absolute_url) { "https://xwiki.local/bin/view/MySpace/SubSpace/PageName" } before do - stub_request(:get, page_url) - .to_return(status: 200, body: { "title" => "Nested Page", - "xwikiAbsoluteUrl" => absolute_url }.to_json, + stub_request(:put, page_url) + .to_return(status: 200, body: { id: "foo", title: "Nested Page", xwikiAbsoluteUrl: absolute_url }.to_json, headers: { "Content-Type" => "application/json" }) end @@ -93,44 +87,44 @@ RSpec.describe Wikis::Adapters::Providers::XWiki::Queries::PageInfo, :webmock do end context "when no OAuth token exists for the user" do - let(:wiki_provider) { create(:xwiki_provider, :with_oauth_client, url: "https://xwiki.example.com/") } + let(:wiki_provider) { create(:xwiki_provider, :with_oauth_client, url: "https://xwiki.local/") } it { is_expected.to be_failure.and have_attributes(failure: have_attributes(code: :missing_token)) } end context "when the page is not found" do - before { stub_request(:get, page_url).to_return(status: 404, body: "") } + before { stub_request(:put, page_url).to_return(status: 404, body: "") } it { is_expected.to be_failure.and have_attributes(failure: have_attributes(code: :not_found)) } end context "when access is unauthorized" do - before { stub_request(:get, page_url).to_return(status: 401, body: "") } + before { stub_request(:put, page_url).to_return(status: 401, body: "") } it { is_expected.to be_failure.and have_attributes(failure: have_attributes(code: :unauthorized)) } end context "when access is forbidden" do - before { stub_request(:get, page_url).to_return(status: 403, body: "") } + before { stub_request(:put, page_url).to_return(status: 403, body: "") } it { is_expected.to be_failure.and have_attributes(failure: have_attributes(code: :unauthorized)) } end context "when XWiki returns a non-2xx status" do - before { stub_request(:get, page_url).to_return(status: 500, body: "Internal Server Error") } + before { stub_request(:put, page_url).to_return(status: 500, body: "Internal Server Error") } it { is_expected.to be_failure.and have_attributes(failure: have_attributes(code: :request_failed)) } end context "when a network error occurs" do - before { stub_request(:get, page_url).to_timeout } + before { stub_request(:put, page_url).to_timeout } it { is_expected.to be_failure.and have_attributes(failure: have_attributes(code: :connection_error)) } end context "when the response body is not valid JSON" do before do - stub_request(:get, page_url) + stub_request(:put, page_url) .to_return(status: 200, body: "not json", headers: { "Content-Type" => "application/json" }) end diff --git a/modules/wikis/spec/services/wikis/adapters/providers/xwiki/queries/search_pages_spec.rb b/modules/wikis/spec/services/wikis/adapters/providers/xwiki/queries/search_pages_spec.rb index 9ae5ed65751..590fb2625f6 100644 --- a/modules/wikis/spec/services/wikis/adapters/providers/xwiki/queries/search_pages_spec.rb +++ b/modules/wikis/spec/services/wikis/adapters/providers/xwiki/queries/search_pages_spec.rb @@ -53,6 +53,13 @@ RSpec.describe Wikis::Adapters::Providers::XWiki::Queries::SearchPages, :disable expect(subject.value!.first.title).to eq("Test Page for RSpec") end + it "returns a complete PageInfo result" do + page_info = subject.value!.first + page_info.to_h.each do |attribute, value| + expect(value).not_to be_nil, "#{attribute} was expected to be non-nil, but was nil" + end + end + it "returns no other random results" do expect(subject.value!.count).to eq(1) end diff --git a/modules/wikis/spec/services/wikis/adapters/providers/xwiki/queries/stable_page_info_spec.rb b/modules/wikis/spec/services/wikis/adapters/providers/xwiki/queries/stable_page_info_spec.rb new file mode 100644 index 00000000000..85814a11e1b --- /dev/null +++ b/modules/wikis/spec/services/wikis/adapters/providers/xwiki/queries/stable_page_info_spec.rb @@ -0,0 +1,110 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +require "spec_helper" +require_module_spec_helper + +RSpec.describe Wikis::Adapters::Providers::XWiki::Queries::StablePageInfo, :webmock do + it "is registered" do + expect(Wikis::Adapters::Registry.resolve("xwiki.queries.page_info")).to eq(described_class) + end + + describe "#call" do + let(:user) { create(:user) } + let(:wiki_provider) { create(:xwiki_provider, :for_local_connection, connected_user: user) } + let(:identifier) { "123abc" } + let(:page_url) { "https://xwiki.local/rest/openproject/documents/123abc" } + let(:auth_strategy) { Wikis::Adapters::Input::AuthStrategy.build(key: :bearer_token, user:, provider: wiki_provider).value! } + let(:input_data) { Wikis::Adapters::Input::PageInfo.build(identifier:).value! } + let(:query) { described_class.new(model: wiki_provider) } + + subject(:result) { query.call(input_data:, auth_strategy:) } + + context "when the page exists", vcr: "xwiki/stable_page_info" do + # Before recording cassette make sure a wiki page with title "Test Page for RSpec" exists + # Set the according identifier of that test page below + let(:identifier) { "d70f1" } + + it "returns Success with title and href" do + expect(result).to be_success + expect(result.value!).to have_attributes( + identifier: "d70f1", + title: "Test Page for RSpec", + href: "https://xwiki.local/bin/view/Test%20Page/" + ) + end + end + + context "when no OAuth token exists for the user" do + let(:wiki_provider) { create(:xwiki_provider, :with_oauth_client, url: "https://xwiki.local/") } + + it { is_expected.to be_failure.and have_attributes(failure: have_attributes(code: :missing_token)) } + end + + context "when the page is not found" do + before { stub_request(:get, page_url).to_return(status: 404, body: "") } + + it { is_expected.to be_failure.and have_attributes(failure: have_attributes(code: :not_found)) } + end + + context "when access is unauthorized" do + before { stub_request(:get, page_url).to_return(status: 401, body: "") } + + it { is_expected.to be_failure.and have_attributes(failure: have_attributes(code: :unauthorized)) } + end + + context "when access is forbidden" do + before { stub_request(:get, page_url).to_return(status: 403, body: "") } + + it { is_expected.to be_failure.and have_attributes(failure: have_attributes(code: :unauthorized)) } + end + + context "when XWiki returns a non-2xx status" do + before { stub_request(:get, page_url).to_return(status: 500, body: "Internal Server Error") } + + it { is_expected.to be_failure.and have_attributes(failure: have_attributes(code: :request_failed)) } + end + + context "when a network error occurs" do + before { stub_request(:get, page_url).to_timeout } + + it { is_expected.to be_failure.and have_attributes(failure: have_attributes(code: :connection_error)) } + end + + context "when the response body is not valid JSON" do + before do + stub_request(:get, page_url) + .to_return(status: 200, body: "not json", headers: { "Content-Type" => "application/json" }) + end + + it { is_expected.to be_failure.and have_attributes(failure: have_attributes(code: :invalid_response)) } + end + end +end diff --git a/modules/wikis/spec/services/wikis/adapters/providers/xwiki/stable_page_reference_spec.rb b/modules/wikis/spec/services/wikis/adapters/providers/xwiki/stable_page_reference_spec.rb new file mode 100644 index 00000000000..ee223d4af85 --- /dev/null +++ b/modules/wikis/spec/services/wikis/adapters/providers/xwiki/stable_page_reference_spec.rb @@ -0,0 +1,66 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +require "spec_helper" +require_module_spec_helper + +RSpec.describe Wikis::Adapters::Providers::XWiki::StablePageReference do + describe ".parse" do + subject { described_class.parse(identifier) } + + let(:identifier) { "123abc" } + + it { is_expected.to have_attributes(uid: "123abc") } + + context "when passing nil" do + let(:identifier) { nil } + + it { is_expected.to be_nil } + end + end + + describe "#rest_path" do + subject { described_class.parse(identifier).rest_path } + + let(:identifier) { "123abc" } + + it { is_expected.to eq("/openproject/documents/123abc") } + end + + describe "#to_s" do + subject { described_class.parse(identifier).to_s } + + let(:identifier) { "123abc" } + + it "roundtrips" do + expect(subject).to eq(identifier) + end + end +end diff --git a/spec/support/fixtures/vcr_cassettes/xwiki/canonical_page_info.yml b/spec/support/fixtures/vcr_cassettes/xwiki/canonical_page_info.yml new file mode 100644 index 00000000000..85549582438 --- /dev/null +++ b/spec/support/fixtures/vcr_cassettes/xwiki/canonical_page_info.yml @@ -0,0 +1,73 @@ +--- +http_interactions: +- request: + method: put + uri: https://xwiki.local/rest/openproject/documents?docRef=xwiki:Main.WebHome + body: + encoding: UTF-8 + string: "{}" + headers: + User-Agent: + - OpenProject 17.6.0 HTTPX Client + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Content-Type: + - application/json + Content-Length: + - '2' + Authorization: + - Bearer + response: + status: + code: 202 + message: Accepted + headers: + Content-Language: + - en + Content-Script-Type: + - text/javascript + Content-Type: + - application/json;charset=UTF-8 + Date: + - Fri, 05 Jun 2026 06:30:56 GMT + Set-Cookie: + - JSESSIONID=E1711FFA64B3AFE5CBB3FA5881A7138D; Path=/; HttpOnly + Xwiki-Form-Token: + - ON8xsHlEpixyujzpUPNupg + Xwiki-User: + - xwiki:XWiki.admin + Xwiki-Version: + - 18.3.0 + body: + encoding: UTF-8 + string: '{"links":[{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/Main","rel":"http://www.xwiki.org/rel/space","type":null,"hrefLang":null},{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/Main/pages/WebHome/history","rel":"http://www.xwiki.org/rel/history","type":null,"hrefLang":null},{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/Main/pages/WebHome/children","rel":"http://www.xwiki.org/rel/children","type":null,"hrefLang":null},{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/Main/pages/WebHome/objects","rel":"http://www.xwiki.org/rel/objects","type":null,"hrefLang":null},{"href":"https://xwiki.local/rest/syntaxes","rel":"http://www.xwiki.org/rel/syntaxes","type":null,"hrefLang":null},{"href":"https://xwiki.local/rest/openproject/documents","rel":"self","type":null,"hrefLang":null},{"href":"https://xwiki.local/rest/wikis/xwiki/classes/Main.WebHome","rel":"http://www.xwiki.org/rel/class","type":null,"hrefLang":null}],"id":"484f4","fullName":"Main.WebHome","wiki":"xwiki","space":"Main","name":"WebHome","title":"Home","rawTitle":"Home","parent":"","parentId":"","version":"1.1","author":"XWiki.admin","authorName":null,"xwikiRelativeUrl":"https://xwiki.local/bin/view/Main/","xwikiAbsoluteUrl":"https://xwiki.local/bin/view/Main/","translations":{"links":[],"translations":[{"links":[{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/Main/pages/WebHome","rel":"http://www.xwiki.org/rel/page","type":null,"hrefLang":null},{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/Main/pages/WebHome/history","rel":"http://www.xwiki.org/rel/history","type":null,"hrefLang":null}],"language":"en"},{"links":[{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/Main/pages/WebHome/translations/pt_BR","rel":"http://www.xwiki.org/rel/page","type":null,"hrefLang":null},{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/Main/pages/WebHome/translations/pt_BR/history","rel":"http://www.xwiki.org/rel/history","type":null,"hrefLang":null}],"language":"pt_BR"},{"links":[{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/Main/pages/WebHome/translations/ru","rel":"http://www.xwiki.org/rel/page","type":null,"hrefLang":null},{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/Main/pages/WebHome/translations/ru/history","rel":"http://www.xwiki.org/rel/history","type":null,"hrefLang":null}],"language":"ru"},{"links":[{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/Main/pages/WebHome/translations/fr","rel":"http://www.xwiki.org/rel/page","type":null,"hrefLang":null},{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/Main/pages/WebHome/translations/fr/history","rel":"http://www.xwiki.org/rel/history","type":null,"hrefLang":null}],"language":"fr"},{"links":[{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/Main/pages/WebHome/translations/no","rel":"http://www.xwiki.org/rel/page","type":null,"hrefLang":null},{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/Main/pages/WebHome/translations/no/history","rel":"http://www.xwiki.org/rel/history","type":null,"hrefLang":null}],"language":"no"},{"links":[{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/Main/pages/WebHome/translations/da","rel":"http://www.xwiki.org/rel/page","type":null,"hrefLang":null},{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/Main/pages/WebHome/translations/da/history","rel":"http://www.xwiki.org/rel/history","type":null,"hrefLang":null}],"language":"da"},{"links":[{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/Main/pages/WebHome/translations/de","rel":"http://www.xwiki.org/rel/page","type":null,"hrefLang":null},{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/Main/pages/WebHome/translations/de/history","rel":"http://www.xwiki.org/rel/history","type":null,"hrefLang":null}],"language":"de"},{"links":[{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/Main/pages/WebHome/translations/en_GB","rel":"http://www.xwiki.org/rel/page","type":null,"hrefLang":null},{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/Main/pages/WebHome/translations/en_GB/history","rel":"http://www.xwiki.org/rel/history","type":null,"hrefLang":null}],"language":"en_GB"},{"links":[{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/Main/pages/WebHome/translations/es","rel":"http://www.xwiki.org/rel/page","type":null,"hrefLang":null},{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/Main/pages/WebHome/translations/es/history","rel":"http://www.xwiki.org/rel/history","type":null,"hrefLang":null}],"language":"es"},{"links":[{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/Main/pages/WebHome/translations/ca","rel":"http://www.xwiki.org/rel/page","type":null,"hrefLang":null},{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/Main/pages/WebHome/translations/ca/history","rel":"http://www.xwiki.org/rel/history","type":null,"hrefLang":null}],"language":"ca"},{"links":[{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/Main/pages/WebHome/translations/ko","rel":"http://www.xwiki.org/rel/page","type":null,"hrefLang":null},{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/Main/pages/WebHome/translations/ko/history","rel":"http://www.xwiki.org/rel/history","type":null,"hrefLang":null}],"language":"ko"},{"links":[{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/Main/pages/WebHome/translations/ja","rel":"http://www.xwiki.org/rel/page","type":null,"hrefLang":null},{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/Main/pages/WebHome/translations/ja/history","rel":"http://www.xwiki.org/rel/history","type":null,"hrefLang":null}],"language":"ja"},{"links":[{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/Main/pages/WebHome/translations/uk","rel":"http://www.xwiki.org/rel/page","type":null,"hrefLang":null},{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/Main/pages/WebHome/translations/uk/history","rel":"http://www.xwiki.org/rel/history","type":null,"hrefLang":null}],"language":"uk"}],"default":"en"},"syntax":"xwiki/2.1","language":"","majorVersion":1,"minorVersion":1,"hidden":false,"enforceRequiredRights":false,"created":1773821175000,"creator":"XWiki.admin","creatorName":null,"modified":1773821175000,"modifier":"XWiki.admin","modifierName":null,"originalMetadataAuthor":"xwiki:XWiki.admin","originalMetadataAuthorName":null,"comment":"Created + URL Shortener.","content":"== Welcome to your wiki ==\n\nXWiki is the best + tool to organize your knowledge. A //wiki// is organized in a hierarchy of + //pages//. You can create multiple wikis, each with its own set of pages.\n\nXWiki + can be used as a knowledge base (support, documentation, sales, etc.), for + collaborative workspaces or even as a complete intranet.\n\n== The basics + ==\n\nTo make the most out of your wiki, log-in and:\n\nUse the {{displayIcon + name=\"pencil\"/}} button above to //edit// this page and start customizing + your wiki to your needs.\n\nUse the {{displayIcon name=\"add\"/}} button above + to //add// more pages to your wiki and create the //hierarchy// that best + organizes your content.\n\nUse the {{displayIcon name=\"home\"/}} breadcrumbs + located above the title to //navigate// inside your pages. It''s easy to get + lost in a big wiki without them.\n\nYou can also use the [[Sandbox>>Sandbox.WebHome]] + for more demo content and generally a place to experiment with your wiki''s + features. \n\n {{box}}Learn more on how to use XWiki with the [[Getting Started + Guide>>https://www.xwiki.org/xwiki/bin/view/Documentation/UserGuide/GettingStarted/WebHome]].{{/box}}\n\n(% + class=\"row\" %)\n(((\n(% class=\"col-xs-12 col-sm-6\" %)\n(((\n== Extend + your wiki ==\n\nTo extend the power and functionalities of your wiki with + the features that //you// need, head over to the [[Extension Manager>>XWiki.XWikiPreferences||queryString=\"editor=globaladmin§ion=XWiki.Extensions\"]] + where you can search for and install extensions.\n\nTo browse through the + 900+ community contributed extensions available for XWiki, head over to the + [[Extensions Repository>>https://extensions.xwiki.org]].\n)))\n\n(% class=\"col-xs-12 + col-sm-6\" %)\n(((\n== Create your application ==\n\nGo beyond the available + extensions and define the //structure// of your data based on //your// needs, + creating //your// own applications with [[App Within Minutes>>AppWithinMinutes]] + (AWM). \n\nAWM will take care of making it easy for you and your users to + create and manage the data.\n)))\n)))","clazz":null,"objects":null,"attachments":null,"hierarchy":{"items":[{"label":"xwiki","name":"xwiki","type":"wiki","url":"https://xwiki.local/bin/view/Main/"},{"label":"Main","name":"Main","type":"space","url":"https://xwiki.local/bin/view/Main/"},{"label":"WebHome","name":"WebHome","type":"document","url":"https://xwiki.local/bin/view/Main/"}]},"rights":[],"renderedContent":null}' + recorded_at: Fri, 05 Jun 2026 06:30:56 GMT +recorded_with: VCR 6.4.0 diff --git a/spec/support/fixtures/vcr_cassettes/xwiki/query_exact_match.yml b/spec/support/fixtures/vcr_cassettes/xwiki/query_exact_match.yml index 18637472313..8791bef049a 100644 --- a/spec/support/fixtures/vcr_cassettes/xwiki/query_exact_match.yml +++ b/spec/support/fixtures/vcr_cassettes/xwiki/query_exact_match.yml @@ -27,29 +27,29 @@ http_interactions: Content-Type: - application/json;charset=UTF-8 Date: - - Tue, 02 Jun 2026 08:17:22 GMT + - Fri, 05 Jun 2026 06:39:19 GMT Set-Cookie: - - JSESSIONID=A90934AE8F68AA76D0E0970863A314F8; Path=/; HttpOnly + - JSESSIONID=EF2A09F6E0681B4B0B3E44D639CB89D9; Path=/; HttpOnly Xwiki-Form-Token: - - 2XZUUfWArYhRgLYx4nHjhQ + - ON8xsHlEpixyujzpUPNupg Xwiki-User: - xwiki:XWiki.admin Xwiki-Version: - 18.3.0 Content-Length: - - '790' + - '789' body: encoding: UTF-8 string: '{"links":[],"searchResults":[{"links":[{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/Test%20Page/pages/WebHome","rel":"http://www.xwiki.org/rel/page","type":null,"hrefLang":null}],"type":"page","id":"xwiki:Test Page.WebHome","pageFullName":"Test Page.WebHome","title":"Test Page for RSpec","wiki":"xwiki","space":"Test - Page","pageName":"WebHome","modified":1780386902000,"author":"xwiki:XWiki.admin","authorName":null,"version":"4.1","language":null,"className":null,"objectNumber":null,"filename":null,"score":30.283539,"object":null,"hierarchy":null}],"template":"https://xwiki.local/rest/?q={solrquery}(&number={number})(&start={start})(&orderField={fieldname}(&order={asc|desc}))(&distinct=1)(&prettyNames={false|true})(&wikis={wikis})(&className={classname})"}' - recorded_at: Tue, 02 Jun 2026 08:17:22 GMT + Page","pageName":"WebHome","modified":1780386902000,"author":"xwiki:XWiki.admin","authorName":null,"version":"4.1","language":null,"className":null,"objectNumber":null,"filename":null,"score":32.03692,"object":null,"hierarchy":null}],"template":"https://xwiki.local/rest/?q={solrquery}(&number={number})(&start={start})(&orderField={fieldname}(&order={asc|desc}))(&distinct=1)(&prettyNames={false|true})(&wikis={wikis})(&className={classname})"}' + recorded_at: Fri, 05 Jun 2026 06:39:19 GMT - request: - method: get - uri: https://xwiki.local/rest/wikis/xwiki/spaces/Test%20Page/pages/WebHome + method: put + uri: https://xwiki.local/rest/openproject/documents?docRef=xwiki:Test%20Page.WebHome body: - encoding: US-ASCII - string: '' + encoding: UTF-8 + string: "{}" headers: User-Agent: - OpenProject 17.6.0 HTTPX Client @@ -57,12 +57,16 @@ http_interactions: - application/json Accept-Encoding: - gzip, deflate + Content-Type: + - application/json + Content-Length: + - '2' Authorization: - Bearer response: status: - code: 200 - message: OK + code: 202 + message: Accepted headers: Content-Language: - en @@ -71,24 +75,24 @@ http_interactions: Content-Type: - application/json;charset=UTF-8 Date: - - Tue, 02 Jun 2026 08:17:22 GMT + - Fri, 05 Jun 2026 06:39:19 GMT Set-Cookie: - - JSESSIONID=6D38F35499AE562F0EEE91795F9951CF; Path=/; HttpOnly + - JSESSIONID=CD75D58F42FA2FF29480F0AA679975CB; Path=/; HttpOnly Xwiki-Form-Token: - - 2XZUUfWArYhRgLYx4nHjhQ + - ON8xsHlEpixyujzpUPNupg Xwiki-User: - xwiki:XWiki.admin Xwiki-Version: - 18.3.0 Content-Length: - - '2224' + - '2372' body: encoding: UTF-8 - string: '{"links":[{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/Test%20Page","rel":"http://www.xwiki.org/rel/space","type":null,"hrefLang":null},{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/Test%20Page/pages/WebHome","rel":"http://www.xwiki.org/rel/parent","type":null,"hrefLang":null},{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/Test%20Page/pages/WebHome/history","rel":"http://www.xwiki.org/rel/history","type":null,"hrefLang":null},{"href":"https://xwiki.local/rest/syntaxes","rel":"http://www.xwiki.org/rel/syntaxes","type":null,"hrefLang":null},{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/Test%20Page/pages/WebHome","rel":"self","type":null,"hrefLang":null},{"href":"https://xwiki.local/rest/wikis/xwiki/classes/Test%20Page.WebHome","rel":"http://www.xwiki.org/rel/class","type":null,"hrefLang":null}],"id":"xwiki:Test - Page.WebHome","fullName":"Test Page.WebHome","wiki":"xwiki","space":"Test - Page","name":"WebHome","title":"Test Page for RSpec","rawTitle":"Test Page - for RSpec","parent":"Main.WebHome","parentId":"xwiki:Main.WebHome","version":"4.1","author":"XWiki.admin","authorName":null,"xwikiRelativeUrl":"https://xwiki.local/bin/view/Test%20Page/","xwikiAbsoluteUrl":"https://xwiki.local/bin/view/Test%20Page/","translations":{"links":[],"translations":[],"default":"en"},"syntax":"xwiki/2.1","language":"","majorVersion":4,"minorVersion":1,"hidden":false,"enforceRequiredRights":false,"created":1780383689000,"creator":"XWiki.admin","creatorName":null,"modified":1780386902000,"modifier":"XWiki.admin","modifierName":null,"originalMetadataAuthor":"xwiki:XWiki.admin","originalMetadataAuthorName":null,"comment":"","content":"This - is a test page that I created with my own hands.","clazz":null,"objects":null,"attachments":null,"hierarchy":{"items":[{"label":"xwiki","name":"xwiki","type":"wiki","url":"https://xwiki.local/bin/view/Main/"},{"label":"Test + string: '{"links":[{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/Test%20Page","rel":"http://www.xwiki.org/rel/space","type":null,"hrefLang":null},{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/Test%20Page/pages/WebHome","rel":"http://www.xwiki.org/rel/parent","type":null,"hrefLang":null},{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/Test%20Page/pages/WebHome/history","rel":"http://www.xwiki.org/rel/history","type":null,"hrefLang":null},{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/Test%20Page/pages/WebHome/objects","rel":"http://www.xwiki.org/rel/objects","type":null,"hrefLang":null},{"href":"https://xwiki.local/rest/syntaxes","rel":"http://www.xwiki.org/rel/syntaxes","type":null,"hrefLang":null},{"href":"https://xwiki.local/rest/openproject/documents","rel":"self","type":null,"hrefLang":null},{"href":"https://xwiki.local/rest/wikis/xwiki/classes/Test%20Page.WebHome","rel":"http://www.xwiki.org/rel/class","type":null,"hrefLang":null}],"id":"d70f1","fullName":"Test + Page.WebHome","wiki":"xwiki","space":"Test Page","name":"WebHome","title":"Test + Page for RSpec","rawTitle":"Test Page for RSpec","parent":"Main.WebHome","parentId":"xwiki:Main.WebHome","version":"4.1","author":"XWiki.admin","authorName":null,"xwikiRelativeUrl":"https://xwiki.local/bin/view/Test%20Page/","xwikiAbsoluteUrl":"https://xwiki.local/bin/view/Test%20Page/","translations":{"links":[],"translations":[],"default":"en"},"syntax":"xwiki/2.1","language":"","majorVersion":4,"minorVersion":1,"hidden":false,"enforceRequiredRights":false,"created":1780383689000,"creator":"XWiki.admin","creatorName":null,"modified":1780386902000,"modifier":"XWiki.admin","modifierName":null,"originalMetadataAuthor":"xwiki:XWiki.admin","originalMetadataAuthorName":null,"comment":"Created + URL Shortener.","content":"This is a test page that I created with my own + hands.","clazz":null,"objects":null,"attachments":null,"hierarchy":{"items":[{"label":"xwiki","name":"xwiki","type":"wiki","url":"https://xwiki.local/bin/view/Main/"},{"label":"Test Page","name":"Test Page","type":"space","url":"https://xwiki.local/bin/view/Test%20Page/"},{"label":"WebHome","name":"WebHome","type":"document","url":"https://xwiki.local/bin/view/Test%20Page/"}]},"rights":[],"renderedContent":null}' - recorded_at: Tue, 02 Jun 2026 08:17:22 GMT + recorded_at: Fri, 05 Jun 2026 06:39:19 GMT recorded_with: VCR 6.4.0 diff --git a/spec/support/fixtures/vcr_cassettes/xwiki/query_no_match.yml b/spec/support/fixtures/vcr_cassettes/xwiki/query_no_match.yml index 21d38b10029..c1158559d9d 100644 --- a/spec/support/fixtures/vcr_cassettes/xwiki/query_no_match.yml +++ b/spec/support/fixtures/vcr_cassettes/xwiki/query_no_match.yml @@ -27,11 +27,11 @@ http_interactions: Content-Type: - application/json;charset=UTF-8 Date: - - Tue, 02 Jun 2026 08:17:23 GMT + - Fri, 05 Jun 2026 06:39:20 GMT Set-Cookie: - - JSESSIONID=9D417B4F0A9D4C117C903A54394DAD6C; Path=/; HttpOnly + - JSESSIONID=D1B7C7CFA5520362BCB9E2DB63EFCE00; Path=/; HttpOnly Xwiki-Form-Token: - - 2XZUUfWArYhRgLYx4nHjhQ + - ON8xsHlEpixyujzpUPNupg Xwiki-User: - xwiki:XWiki.admin Xwiki-Version: @@ -41,5 +41,5 @@ http_interactions: body: encoding: UTF-8 string: '{"links":[],"searchResults":[],"template":"https://xwiki.local/rest/?q={solrquery}(&number={number})(&start={start})(&orderField={fieldname}(&order={asc|desc}))(&distinct=1)(&prettyNames={false|true})(&wikis={wikis})(&className={classname})"}' - recorded_at: Tue, 02 Jun 2026 08:17:23 GMT + recorded_at: Fri, 05 Jun 2026 06:39:20 GMT recorded_with: VCR 6.4.0 diff --git a/spec/support/fixtures/vcr_cassettes/xwiki/query_partial_match.yml b/spec/support/fixtures/vcr_cassettes/xwiki/query_partial_match.yml index 86708b6d8f9..a78c9afd3d3 100644 --- a/spec/support/fixtures/vcr_cassettes/xwiki/query_partial_match.yml +++ b/spec/support/fixtures/vcr_cassettes/xwiki/query_partial_match.yml @@ -27,11 +27,11 @@ http_interactions: Content-Type: - application/json;charset=UTF-8 Date: - - Tue, 02 Jun 2026 08:17:22 GMT + - Fri, 05 Jun 2026 06:39:19 GMT Set-Cookie: - - JSESSIONID=4570EBB986F92482503F494102024098; Path=/; HttpOnly + - JSESSIONID=689FB3235B4E5A8C46683A1331BD9EB2; Path=/; HttpOnly Xwiki-Form-Token: - - 2XZUUfWArYhRgLYx4nHjhQ + - ON8xsHlEpixyujzpUPNupg Xwiki-User: - xwiki:XWiki.admin Xwiki-Version: @@ -42,14 +42,14 @@ http_interactions: encoding: UTF-8 string: '{"links":[],"searchResults":[{"links":[{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/Test%20Page/pages/WebHome","rel":"http://www.xwiki.org/rel/page","type":null,"hrefLang":null}],"type":"page","id":"xwiki:Test Page.WebHome","pageFullName":"Test Page.WebHome","title":"Test Page for RSpec","wiki":"xwiki","space":"Test - Page","pageName":"WebHome","modified":1780386902000,"author":"xwiki:XWiki.admin","authorName":null,"version":"4.1","language":null,"className":null,"objectNumber":null,"filename":null,"score":14.608791,"object":null,"hierarchy":null}],"template":"https://xwiki.local/rest/?q={solrquery}(&number={number})(&start={start})(&orderField={fieldname}(&order={asc|desc}))(&distinct=1)(&prettyNames={false|true})(&wikis={wikis})(&className={classname})"}' - recorded_at: Tue, 02 Jun 2026 08:17:22 GMT + Page","pageName":"WebHome","modified":1780386902000,"author":"xwiki:XWiki.admin","authorName":null,"version":"4.1","language":null,"className":null,"objectNumber":null,"filename":null,"score":14.085169,"object":null,"hierarchy":null}],"template":"https://xwiki.local/rest/?q={solrquery}(&number={number})(&start={start})(&orderField={fieldname}(&order={asc|desc}))(&distinct=1)(&prettyNames={false|true})(&wikis={wikis})(&className={classname})"}' + recorded_at: Fri, 05 Jun 2026 06:39:19 GMT - request: - method: get - uri: https://xwiki.local/rest/wikis/xwiki/spaces/Test%20Page/pages/WebHome + method: put + uri: https://xwiki.local/rest/openproject/documents?docRef=xwiki:Test%20Page.WebHome body: - encoding: US-ASCII - string: '' + encoding: UTF-8 + string: "{}" headers: User-Agent: - OpenProject 17.6.0 HTTPX Client @@ -57,12 +57,16 @@ http_interactions: - application/json Accept-Encoding: - gzip, deflate + Content-Type: + - application/json + Content-Length: + - '2' Authorization: - Bearer response: status: - code: 200 - message: OK + code: 202 + message: Accepted headers: Content-Language: - en @@ -71,24 +75,24 @@ http_interactions: Content-Type: - application/json;charset=UTF-8 Date: - - Tue, 02 Jun 2026 08:17:22 GMT + - Fri, 05 Jun 2026 06:39:19 GMT Set-Cookie: - - JSESSIONID=36828A84C85C858E144AA581B1A1F138; Path=/; HttpOnly + - JSESSIONID=41BB94B7774F3AAF5872EC50FF78C37B; Path=/; HttpOnly Xwiki-Form-Token: - - 2XZUUfWArYhRgLYx4nHjhQ + - ON8xsHlEpixyujzpUPNupg Xwiki-User: - xwiki:XWiki.admin Xwiki-Version: - 18.3.0 Content-Length: - - '2224' + - '2372' body: encoding: UTF-8 - string: '{"links":[{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/Test%20Page","rel":"http://www.xwiki.org/rel/space","type":null,"hrefLang":null},{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/Test%20Page/pages/WebHome","rel":"http://www.xwiki.org/rel/parent","type":null,"hrefLang":null},{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/Test%20Page/pages/WebHome/history","rel":"http://www.xwiki.org/rel/history","type":null,"hrefLang":null},{"href":"https://xwiki.local/rest/syntaxes","rel":"http://www.xwiki.org/rel/syntaxes","type":null,"hrefLang":null},{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/Test%20Page/pages/WebHome","rel":"self","type":null,"hrefLang":null},{"href":"https://xwiki.local/rest/wikis/xwiki/classes/Test%20Page.WebHome","rel":"http://www.xwiki.org/rel/class","type":null,"hrefLang":null}],"id":"xwiki:Test - Page.WebHome","fullName":"Test Page.WebHome","wiki":"xwiki","space":"Test - Page","name":"WebHome","title":"Test Page for RSpec","rawTitle":"Test Page - for RSpec","parent":"Main.WebHome","parentId":"xwiki:Main.WebHome","version":"4.1","author":"XWiki.admin","authorName":null,"xwikiRelativeUrl":"https://xwiki.local/bin/view/Test%20Page/","xwikiAbsoluteUrl":"https://xwiki.local/bin/view/Test%20Page/","translations":{"links":[],"translations":[],"default":"en"},"syntax":"xwiki/2.1","language":"","majorVersion":4,"minorVersion":1,"hidden":false,"enforceRequiredRights":false,"created":1780383689000,"creator":"XWiki.admin","creatorName":null,"modified":1780386902000,"modifier":"XWiki.admin","modifierName":null,"originalMetadataAuthor":"xwiki:XWiki.admin","originalMetadataAuthorName":null,"comment":"","content":"This - is a test page that I created with my own hands.","clazz":null,"objects":null,"attachments":null,"hierarchy":{"items":[{"label":"xwiki","name":"xwiki","type":"wiki","url":"https://xwiki.local/bin/view/Main/"},{"label":"Test + string: '{"links":[{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/Test%20Page","rel":"http://www.xwiki.org/rel/space","type":null,"hrefLang":null},{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/Test%20Page/pages/WebHome","rel":"http://www.xwiki.org/rel/parent","type":null,"hrefLang":null},{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/Test%20Page/pages/WebHome/history","rel":"http://www.xwiki.org/rel/history","type":null,"hrefLang":null},{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/Test%20Page/pages/WebHome/objects","rel":"http://www.xwiki.org/rel/objects","type":null,"hrefLang":null},{"href":"https://xwiki.local/rest/syntaxes","rel":"http://www.xwiki.org/rel/syntaxes","type":null,"hrefLang":null},{"href":"https://xwiki.local/rest/openproject/documents","rel":"self","type":null,"hrefLang":null},{"href":"https://xwiki.local/rest/wikis/xwiki/classes/Test%20Page.WebHome","rel":"http://www.xwiki.org/rel/class","type":null,"hrefLang":null}],"id":"d70f1","fullName":"Test + Page.WebHome","wiki":"xwiki","space":"Test Page","name":"WebHome","title":"Test + Page for RSpec","rawTitle":"Test Page for RSpec","parent":"Main.WebHome","parentId":"xwiki:Main.WebHome","version":"4.1","author":"XWiki.admin","authorName":null,"xwikiRelativeUrl":"https://xwiki.local/bin/view/Test%20Page/","xwikiAbsoluteUrl":"https://xwiki.local/bin/view/Test%20Page/","translations":{"links":[],"translations":[],"default":"en"},"syntax":"xwiki/2.1","language":"","majorVersion":4,"minorVersion":1,"hidden":false,"enforceRequiredRights":false,"created":1780383689000,"creator":"XWiki.admin","creatorName":null,"modified":1780386902000,"modifier":"XWiki.admin","modifierName":null,"originalMetadataAuthor":"xwiki:XWiki.admin","originalMetadataAuthorName":null,"comment":"Created + URL Shortener.","content":"This is a test page that I created with my own + hands.","clazz":null,"objects":null,"attachments":null,"hierarchy":{"items":[{"label":"xwiki","name":"xwiki","type":"wiki","url":"https://xwiki.local/bin/view/Main/"},{"label":"Test Page","name":"Test Page","type":"space","url":"https://xwiki.local/bin/view/Test%20Page/"},{"label":"WebHome","name":"WebHome","type":"document","url":"https://xwiki.local/bin/view/Test%20Page/"}]},"rights":[],"renderedContent":null}' - recorded_at: Tue, 02 Jun 2026 08:17:22 GMT + recorded_at: Fri, 05 Jun 2026 06:39:19 GMT recorded_with: VCR 6.4.0 diff --git a/spec/support/fixtures/vcr_cassettes/xwiki/query_quoted_match.yml b/spec/support/fixtures/vcr_cassettes/xwiki/query_quoted_match.yml index bc3063416a4..b1238e1edde 100644 --- a/spec/support/fixtures/vcr_cassettes/xwiki/query_quoted_match.yml +++ b/spec/support/fixtures/vcr_cassettes/xwiki/query_quoted_match.yml @@ -27,11 +27,11 @@ http_interactions: Content-Type: - application/json;charset=UTF-8 Date: - - Tue, 02 Jun 2026 08:17:22 GMT + - Fri, 05 Jun 2026 06:39:20 GMT Set-Cookie: - - JSESSIONID=C28E0999BF663CA702569EE1C5C696E2; Path=/; HttpOnly + - JSESSIONID=A1B5B0EFF5FD5E7B4F6E4CB0D185B065; Path=/; HttpOnly Xwiki-Form-Token: - - 2XZUUfWArYhRgLYx4nHjhQ + - ON8xsHlEpixyujzpUPNupg Xwiki-User: - xwiki:XWiki.admin Xwiki-Version: @@ -42,14 +42,14 @@ http_interactions: encoding: UTF-8 string: '{"links":[],"searchResults":[{"links":[{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/%22Quoted%22%20pages%20can%20be%20tricky/pages/WebHome","rel":"http://www.xwiki.org/rel/page","type":null,"hrefLang":null}],"type":"page","id":"xwiki:\"Quoted\" pages can be tricky.WebHome","pageFullName":"\"Quoted\" pages can be tricky.WebHome","title":"\"Quoted\" - pages can be tricky","wiki":"xwiki","space":"\"Quoted\" pages can be tricky","pageName":"WebHome","modified":1780387197000,"author":"xwiki:XWiki.admin","authorName":null,"version":"1.1","language":null,"className":null,"objectNumber":null,"filename":null,"score":42.605682,"object":null,"hierarchy":null}],"template":"https://xwiki.local/rest/?q={solrquery}(&number={number})(&start={start})(&orderField={fieldname}(&order={asc|desc}))(&distinct=1)(&prettyNames={false|true})(&wikis={wikis})(&className={classname})"}' - recorded_at: Tue, 02 Jun 2026 08:17:22 GMT + pages can be tricky","wiki":"xwiki","space":"\"Quoted\" pages can be tricky","pageName":"WebHome","modified":1780387197000,"author":"xwiki:XWiki.admin","authorName":null,"version":"1.1","language":null,"className":null,"objectNumber":null,"filename":null,"score":41.692856,"object":null,"hierarchy":null}],"template":"https://xwiki.local/rest/?q={solrquery}(&number={number})(&start={start})(&orderField={fieldname}(&order={asc|desc}))(&distinct=1)(&prettyNames={false|true})(&wikis={wikis})(&className={classname})"}' + recorded_at: Fri, 05 Jun 2026 06:39:20 GMT - request: - method: get - uri: https://xwiki.local/rest/wikis/xwiki/spaces/%22Quoted%22%20pages%20can%20be%20tricky/pages/WebHome + method: put + uri: https://xwiki.local/rest/openproject/documents?docRef=xwiki:%22Quoted%22%20pages%20can%20be%20tricky.WebHome body: - encoding: US-ASCII - string: '' + encoding: UTF-8 + string: "{}" headers: User-Agent: - OpenProject 17.6.0 HTTPX Client @@ -57,12 +57,16 @@ http_interactions: - application/json Accept-Encoding: - gzip, deflate + Content-Type: + - application/json + Content-Length: + - '2' Authorization: - Bearer response: status: - code: 200 - message: OK + code: 202 + message: Accepted headers: Content-Language: - en @@ -71,24 +75,25 @@ http_interactions: Content-Type: - application/json;charset=UTF-8 Date: - - Tue, 02 Jun 2026 08:17:22 GMT + - Fri, 05 Jun 2026 06:39:20 GMT Set-Cookie: - - JSESSIONID=EC142E0079C91196143B051273FDA2FD; Path=/; HttpOnly + - JSESSIONID=9F577E6A3744F626EDDD3668B5F9EE9D; Path=/; HttpOnly Xwiki-Form-Token: - - 2XZUUfWArYhRgLYx4nHjhQ + - ON8xsHlEpixyujzpUPNupg Xwiki-User: - xwiki:XWiki.admin Xwiki-Version: - 18.3.0 Content-Length: - - '2642' + - '2769' body: encoding: UTF-8 - string: '{"links":[{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/%22Quoted%22%20pages%20can%20be%20tricky","rel":"http://www.xwiki.org/rel/space","type":null,"hrefLang":null},{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/%22Quoted%22%20pages%20can%20be%20tricky/pages/WebHome","rel":"http://www.xwiki.org/rel/parent","type":null,"hrefLang":null},{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/%22Quoted%22%20pages%20can%20be%20tricky/pages/WebHome/history","rel":"http://www.xwiki.org/rel/history","type":null,"hrefLang":null},{"href":"https://xwiki.local/rest/syntaxes","rel":"http://www.xwiki.org/rel/syntaxes","type":null,"hrefLang":null},{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/%22Quoted%22%20pages%20can%20be%20tricky/pages/WebHome","rel":"self","type":null,"hrefLang":null},{"href":"https://xwiki.local/rest/wikis/xwiki/classes/%22Quoted%22%20pages%20can%20be%20tricky.WebHome","rel":"http://www.xwiki.org/rel/class","type":null,"hrefLang":null}],"id":"xwiki:\"Quoted\" - pages can be tricky.WebHome","fullName":"\"Quoted\" pages can be tricky.WebHome","wiki":"xwiki","space":"\"Quoted\" - pages can be tricky","name":"WebHome","title":"\"Quoted\" pages can be tricky","rawTitle":"\"Quoted\" - pages can be tricky","parent":"Main.WebHome","parentId":"xwiki:Main.WebHome","version":"1.1","author":"XWiki.admin","authorName":null,"xwikiRelativeUrl":"https://xwiki.local/bin/view/%22Quoted%22%20pages%20can%20be%20tricky/","xwikiAbsoluteUrl":"https://xwiki.local/bin/view/%22Quoted%22%20pages%20can%20be%20tricky/","translations":{"links":[],"translations":[],"default":"en"},"syntax":"xwiki/2.1","language":"","majorVersion":1,"minorVersion":1,"hidden":false,"enforceRequiredRights":false,"created":1780387197000,"creator":"XWiki.admin","creatorName":null,"modified":1780387197000,"modifier":"XWiki.admin","modifierName":null,"originalMetadataAuthor":"xwiki:XWiki.admin","originalMetadataAuthorName":null,"comment":"","content":"When - the page title contains quotes, it''s harder to exactly match their page title.","clazz":null,"objects":null,"attachments":null,"hierarchy":{"items":[{"label":"xwiki","name":"xwiki","type":"wiki","url":"https://xwiki.local/bin/view/Main/"},{"label":"\"Quoted\" + string: '{"links":[{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/%22Quoted%22%20pages%20can%20be%20tricky","rel":"http://www.xwiki.org/rel/space","type":null,"hrefLang":null},{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/%22Quoted%22%20pages%20can%20be%20tricky/pages/WebHome","rel":"http://www.xwiki.org/rel/parent","type":null,"hrefLang":null},{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/%22Quoted%22%20pages%20can%20be%20tricky/pages/WebHome/history","rel":"http://www.xwiki.org/rel/history","type":null,"hrefLang":null},{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/%22Quoted%22%20pages%20can%20be%20tricky/pages/WebHome/objects","rel":"http://www.xwiki.org/rel/objects","type":null,"hrefLang":null},{"href":"https://xwiki.local/rest/syntaxes","rel":"http://www.xwiki.org/rel/syntaxes","type":null,"hrefLang":null},{"href":"https://xwiki.local/rest/openproject/documents","rel":"self","type":null,"hrefLang":null},{"href":"https://xwiki.local/rest/wikis/xwiki/classes/%22Quoted%22%20pages%20can%20be%20tricky.WebHome","rel":"http://www.xwiki.org/rel/class","type":null,"hrefLang":null}],"id":"1a013","fullName":"\"Quoted\" + pages can be tricky.WebHome","wiki":"xwiki","space":"\"Quoted\" pages can + be tricky","name":"WebHome","title":"\"Quoted\" pages can be tricky","rawTitle":"\"Quoted\" + pages can be tricky","parent":"Main.WebHome","parentId":"xwiki:Main.WebHome","version":"1.1","author":"XWiki.admin","authorName":null,"xwikiRelativeUrl":"https://xwiki.local/bin/view/%22Quoted%22%20pages%20can%20be%20tricky/","xwikiAbsoluteUrl":"https://xwiki.local/bin/view/%22Quoted%22%20pages%20can%20be%20tricky/","translations":{"links":[],"translations":[],"default":"en"},"syntax":"xwiki/2.1","language":"","majorVersion":1,"minorVersion":1,"hidden":false,"enforceRequiredRights":false,"created":1780387197000,"creator":"XWiki.admin","creatorName":null,"modified":1780387197000,"modifier":"XWiki.admin","modifierName":null,"originalMetadataAuthor":"xwiki:XWiki.admin","originalMetadataAuthorName":null,"comment":"Created + URL Shortener.","content":"When the page title contains quotes, it''s harder + to exactly match their page title.","clazz":null,"objects":null,"attachments":null,"hierarchy":{"items":[{"label":"xwiki","name":"xwiki","type":"wiki","url":"https://xwiki.local/bin/view/Main/"},{"label":"\"Quoted\" pages can be tricky","name":"\"Quoted\" pages can be tricky","type":"space","url":"https://xwiki.local/bin/view/%22Quoted%22%20pages%20can%20be%20tricky/"},{"label":"WebHome","name":"WebHome","type":"document","url":"https://xwiki.local/bin/view/%22Quoted%22%20pages%20can%20be%20tricky/"}]},"rights":[],"renderedContent":null}' - recorded_at: Tue, 02 Jun 2026 08:17:22 GMT + recorded_at: Fri, 05 Jun 2026 06:39:20 GMT recorded_with: VCR 6.4.0 diff --git a/spec/support/fixtures/vcr_cassettes/xwiki/query_unquoted_match.yml b/spec/support/fixtures/vcr_cassettes/xwiki/query_unquoted_match.yml index db53a2fc824..c46c68fc370 100644 --- a/spec/support/fixtures/vcr_cassettes/xwiki/query_unquoted_match.yml +++ b/spec/support/fixtures/vcr_cassettes/xwiki/query_unquoted_match.yml @@ -27,11 +27,11 @@ http_interactions: Content-Type: - application/json;charset=UTF-8 Date: - - Tue, 02 Jun 2026 08:17:23 GMT + - Fri, 05 Jun 2026 06:39:20 GMT Set-Cookie: - - JSESSIONID=10D557C0A4C7D3C599B80C2FA01F5FF5; Path=/; HttpOnly + - JSESSIONID=B47446E1E06E6D2A73FC512CEAB8083D; Path=/; HttpOnly Xwiki-Form-Token: - - 2XZUUfWArYhRgLYx4nHjhQ + - ON8xsHlEpixyujzpUPNupg Xwiki-User: - xwiki:XWiki.admin Xwiki-Version: @@ -42,14 +42,14 @@ http_interactions: encoding: UTF-8 string: '{"links":[],"searchResults":[{"links":[{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/%22Quoted%22%20pages%20can%20be%20tricky/pages/WebHome","rel":"http://www.xwiki.org/rel/page","type":null,"hrefLang":null}],"type":"page","id":"xwiki:\"Quoted\" pages can be tricky.WebHome","pageFullName":"\"Quoted\" pages can be tricky.WebHome","title":"\"Quoted\" - pages can be tricky","wiki":"xwiki","space":"\"Quoted\" pages can be tricky","pageName":"WebHome","modified":1780387197000,"author":"xwiki:XWiki.admin","authorName":null,"version":"1.1","language":null,"className":null,"objectNumber":null,"filename":null,"score":42.605682,"object":null,"hierarchy":null}],"template":"https://xwiki.local/rest/?q={solrquery}(&number={number})(&start={start})(&orderField={fieldname}(&order={asc|desc}))(&distinct=1)(&prettyNames={false|true})(&wikis={wikis})(&className={classname})"}' - recorded_at: Tue, 02 Jun 2026 08:17:23 GMT + pages can be tricky","wiki":"xwiki","space":"\"Quoted\" pages can be tricky","pageName":"WebHome","modified":1780387197000,"author":"xwiki:XWiki.admin","authorName":null,"version":"1.1","language":null,"className":null,"objectNumber":null,"filename":null,"score":41.692856,"object":null,"hierarchy":null}],"template":"https://xwiki.local/rest/?q={solrquery}(&number={number})(&start={start})(&orderField={fieldname}(&order={asc|desc}))(&distinct=1)(&prettyNames={false|true})(&wikis={wikis})(&className={classname})"}' + recorded_at: Fri, 05 Jun 2026 06:39:20 GMT - request: - method: get - uri: https://xwiki.local/rest/wikis/xwiki/spaces/%22Quoted%22%20pages%20can%20be%20tricky/pages/WebHome + method: put + uri: https://xwiki.local/rest/openproject/documents?docRef=xwiki:%22Quoted%22%20pages%20can%20be%20tricky.WebHome body: - encoding: US-ASCII - string: '' + encoding: UTF-8 + string: "{}" headers: User-Agent: - OpenProject 17.6.0 HTTPX Client @@ -57,12 +57,16 @@ http_interactions: - application/json Accept-Encoding: - gzip, deflate + Content-Type: + - application/json + Content-Length: + - '2' Authorization: - Bearer response: status: - code: 200 - message: OK + code: 202 + message: Accepted headers: Content-Language: - en @@ -71,24 +75,25 @@ http_interactions: Content-Type: - application/json;charset=UTF-8 Date: - - Tue, 02 Jun 2026 08:17:23 GMT + - Fri, 05 Jun 2026 06:39:20 GMT Set-Cookie: - - JSESSIONID=85112D2673FA7F3B99AEC6BF0A182372; Path=/; HttpOnly + - JSESSIONID=2B1297828F8D8887496627F7356421D5; Path=/; HttpOnly Xwiki-Form-Token: - - 2XZUUfWArYhRgLYx4nHjhQ + - ON8xsHlEpixyujzpUPNupg Xwiki-User: - xwiki:XWiki.admin Xwiki-Version: - 18.3.0 Content-Length: - - '2642' + - '2769' body: encoding: UTF-8 - string: '{"links":[{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/%22Quoted%22%20pages%20can%20be%20tricky","rel":"http://www.xwiki.org/rel/space","type":null,"hrefLang":null},{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/%22Quoted%22%20pages%20can%20be%20tricky/pages/WebHome","rel":"http://www.xwiki.org/rel/parent","type":null,"hrefLang":null},{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/%22Quoted%22%20pages%20can%20be%20tricky/pages/WebHome/history","rel":"http://www.xwiki.org/rel/history","type":null,"hrefLang":null},{"href":"https://xwiki.local/rest/syntaxes","rel":"http://www.xwiki.org/rel/syntaxes","type":null,"hrefLang":null},{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/%22Quoted%22%20pages%20can%20be%20tricky/pages/WebHome","rel":"self","type":null,"hrefLang":null},{"href":"https://xwiki.local/rest/wikis/xwiki/classes/%22Quoted%22%20pages%20can%20be%20tricky.WebHome","rel":"http://www.xwiki.org/rel/class","type":null,"hrefLang":null}],"id":"xwiki:\"Quoted\" - pages can be tricky.WebHome","fullName":"\"Quoted\" pages can be tricky.WebHome","wiki":"xwiki","space":"\"Quoted\" - pages can be tricky","name":"WebHome","title":"\"Quoted\" pages can be tricky","rawTitle":"\"Quoted\" - pages can be tricky","parent":"Main.WebHome","parentId":"xwiki:Main.WebHome","version":"1.1","author":"XWiki.admin","authorName":null,"xwikiRelativeUrl":"https://xwiki.local/bin/view/%22Quoted%22%20pages%20can%20be%20tricky/","xwikiAbsoluteUrl":"https://xwiki.local/bin/view/%22Quoted%22%20pages%20can%20be%20tricky/","translations":{"links":[],"translations":[],"default":"en"},"syntax":"xwiki/2.1","language":"","majorVersion":1,"minorVersion":1,"hidden":false,"enforceRequiredRights":false,"created":1780387197000,"creator":"XWiki.admin","creatorName":null,"modified":1780387197000,"modifier":"XWiki.admin","modifierName":null,"originalMetadataAuthor":"xwiki:XWiki.admin","originalMetadataAuthorName":null,"comment":"","content":"When - the page title contains quotes, it''s harder to exactly match their page title.","clazz":null,"objects":null,"attachments":null,"hierarchy":{"items":[{"label":"xwiki","name":"xwiki","type":"wiki","url":"https://xwiki.local/bin/view/Main/"},{"label":"\"Quoted\" + string: '{"links":[{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/%22Quoted%22%20pages%20can%20be%20tricky","rel":"http://www.xwiki.org/rel/space","type":null,"hrefLang":null},{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/%22Quoted%22%20pages%20can%20be%20tricky/pages/WebHome","rel":"http://www.xwiki.org/rel/parent","type":null,"hrefLang":null},{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/%22Quoted%22%20pages%20can%20be%20tricky/pages/WebHome/history","rel":"http://www.xwiki.org/rel/history","type":null,"hrefLang":null},{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/%22Quoted%22%20pages%20can%20be%20tricky/pages/WebHome/objects","rel":"http://www.xwiki.org/rel/objects","type":null,"hrefLang":null},{"href":"https://xwiki.local/rest/syntaxes","rel":"http://www.xwiki.org/rel/syntaxes","type":null,"hrefLang":null},{"href":"https://xwiki.local/rest/openproject/documents","rel":"self","type":null,"hrefLang":null},{"href":"https://xwiki.local/rest/wikis/xwiki/classes/%22Quoted%22%20pages%20can%20be%20tricky.WebHome","rel":"http://www.xwiki.org/rel/class","type":null,"hrefLang":null}],"id":"1a013","fullName":"\"Quoted\" + pages can be tricky.WebHome","wiki":"xwiki","space":"\"Quoted\" pages can + be tricky","name":"WebHome","title":"\"Quoted\" pages can be tricky","rawTitle":"\"Quoted\" + pages can be tricky","parent":"Main.WebHome","parentId":"xwiki:Main.WebHome","version":"1.1","author":"XWiki.admin","authorName":null,"xwikiRelativeUrl":"https://xwiki.local/bin/view/%22Quoted%22%20pages%20can%20be%20tricky/","xwikiAbsoluteUrl":"https://xwiki.local/bin/view/%22Quoted%22%20pages%20can%20be%20tricky/","translations":{"links":[],"translations":[],"default":"en"},"syntax":"xwiki/2.1","language":"","majorVersion":1,"minorVersion":1,"hidden":false,"enforceRequiredRights":false,"created":1780387197000,"creator":"XWiki.admin","creatorName":null,"modified":1780387197000,"modifier":"XWiki.admin","modifierName":null,"originalMetadataAuthor":"xwiki:XWiki.admin","originalMetadataAuthorName":null,"comment":"Created + URL Shortener.","content":"When the page title contains quotes, it''s harder + to exactly match their page title.","clazz":null,"objects":null,"attachments":null,"hierarchy":{"items":[{"label":"xwiki","name":"xwiki","type":"wiki","url":"https://xwiki.local/bin/view/Main/"},{"label":"\"Quoted\" pages can be tricky","name":"\"Quoted\" pages can be tricky","type":"space","url":"https://xwiki.local/bin/view/%22Quoted%22%20pages%20can%20be%20tricky/"},{"label":"WebHome","name":"WebHome","type":"document","url":"https://xwiki.local/bin/view/%22Quoted%22%20pages%20can%20be%20tricky/"}]},"rights":[],"renderedContent":null}' - recorded_at: Tue, 02 Jun 2026 08:17:23 GMT + recorded_at: Fri, 05 Jun 2026 06:39:20 GMT recorded_with: VCR 6.4.0 diff --git a/spec/support/fixtures/vcr_cassettes/xwiki/stable_page_info.yml b/spec/support/fixtures/vcr_cassettes/xwiki/stable_page_info.yml new file mode 100644 index 00000000000..0d7cd62208a --- /dev/null +++ b/spec/support/fixtures/vcr_cassettes/xwiki/stable_page_info.yml @@ -0,0 +1,50 @@ +--- +http_interactions: +- request: + method: get + uri: https://xwiki.local/rest/openproject/documents/d70f1 + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - OpenProject 17.6.0 HTTPX Client + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Authorization: + - Bearer + response: + status: + code: 200 + message: OK + headers: + Content-Language: + - en + Content-Script-Type: + - text/javascript + Content-Type: + - application/json;charset=UTF-8 + Date: + - Fri, 05 Jun 2026 06:33:33 GMT + Set-Cookie: + - JSESSIONID=20FFAE29A62BFE6CEC0152BB7FC0ADB6; Path=/; HttpOnly + Xwiki-Form-Token: + - ON8xsHlEpixyujzpUPNupg + Xwiki-User: + - xwiki:XWiki.admin + Xwiki-Version: + - 18.3.0 + Content-Length: + - '2378' + body: + encoding: UTF-8 + string: '{"links":[{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/Test%20Page","rel":"http://www.xwiki.org/rel/space","type":null,"hrefLang":null},{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/Test%20Page/pages/WebHome","rel":"http://www.xwiki.org/rel/parent","type":null,"hrefLang":null},{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/Test%20Page/pages/WebHome/history","rel":"http://www.xwiki.org/rel/history","type":null,"hrefLang":null},{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/Test%20Page/pages/WebHome/objects","rel":"http://www.xwiki.org/rel/objects","type":null,"hrefLang":null},{"href":"https://xwiki.local/rest/syntaxes","rel":"http://www.xwiki.org/rel/syntaxes","type":null,"hrefLang":null},{"href":"https://xwiki.local/rest/openproject/documents/d70f1","rel":"self","type":null,"hrefLang":null},{"href":"https://xwiki.local/rest/wikis/xwiki/classes/Test%20Page.WebHome","rel":"http://www.xwiki.org/rel/class","type":null,"hrefLang":null}],"id":"d70f1","fullName":"Test + Page.WebHome","wiki":"xwiki","space":"Test Page","name":"WebHome","title":"Test + Page for RSpec","rawTitle":"Test Page for RSpec","parent":"Main.WebHome","parentId":"xwiki:Main.WebHome","version":"4.1","author":"XWiki.admin","authorName":null,"xwikiRelativeUrl":"https://xwiki.local/bin/view/Test%20Page/","xwikiAbsoluteUrl":"https://xwiki.local/bin/view/Test%20Page/","translations":{"links":[],"translations":[],"default":"en"},"syntax":"xwiki/2.1","language":"","majorVersion":4,"minorVersion":1,"hidden":false,"enforceRequiredRights":false,"created":1780383689000,"creator":"XWiki.admin","creatorName":null,"modified":1780386902000,"modifier":"XWiki.admin","modifierName":null,"originalMetadataAuthor":"xwiki:XWiki.admin","originalMetadataAuthorName":null,"comment":"Created + URL Shortener.","content":"This is a test page that I created with my own + hands.","clazz":null,"objects":null,"attachments":null,"hierarchy":{"items":[{"label":"xwiki","name":"xwiki","type":"wiki","url":"https://xwiki.local/bin/view/Main/"},{"label":"Test + Page","name":"Test Page","type":"space","url":"https://xwiki.local/bin/view/Test%20Page/"},{"label":"WebHome","name":"WebHome","type":"document","url":"https://xwiki.local/bin/view/Test%20Page/"}]},"rights":[],"renderedContent":null}' + recorded_at: Fri, 05 Jun 2026 06:33:33 GMT +recorded_with: VCR 6.4.0 From 1599bde011cd3b35e1a3f33856de62ecc7ae5d41 Mon Sep 17 00:00:00 2001 From: Jan Sandbrink Date: Thu, 4 Jun 2026 15:13:47 +0200 Subject: [PATCH 082/107] Return a proper failure if unexpected JSON is encountered Instead of raising an error, we use throw-catch based control flow to return the same failure that would be returned if the response had not been JSON at all. --- .../providers/xwiki/queries/canonical_page_info.rb | 2 +- .../xwiki/queries/concerns/xwiki_query.rb | 14 ++++++++++++++ .../providers/xwiki/queries/search_pages.rb | 14 +++++++------- .../providers/xwiki/queries/stable_page_info.rb | 4 ++-- .../xwiki/queries/canonical_page_info_spec.rb | 9 +++++++++ .../xwiki/queries/stable_page_info_spec.rb | 9 +++++++++ 6 files changed, 42 insertions(+), 10 deletions(-) diff --git a/modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/canonical_page_info.rb b/modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/canonical_page_info.rb index 1274ddf8f39..85260412e22 100644 --- a/modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/canonical_page_info.rb +++ b/modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/canonical_page_info.rb @@ -44,7 +44,7 @@ module Wikis perform_request(ref, auth_strategy:) do |data| success( Results::PageInfo.new( - identifier: StablePageReference.parse(data.fetch("id")).to_s, + identifier: StablePageReference.parse(fetch_json(data, "id")).to_s, title: data.fetch("title"), href: data.fetch("xwikiAbsoluteUrl"), provider: diff --git a/modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/concerns/xwiki_query.rb b/modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/concerns/xwiki_query.rb index 1a317968ab9..dde1eb644c3 100644 --- a/modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/concerns/xwiki_query.rb +++ b/modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/concerns/xwiki_query.rb @@ -37,6 +37,16 @@ module Wikis module XWikiQuery ACCEPT_HEADERS = { "Accept" => "application/json" }.freeze + def self.included(base) + base.prepend Prepended + end + + module Prepended + def call(**) + catch(:xwiki_error) { super } + end + end + def authenticated(auth_strategy) Adapters::Authentication[auth_strategy].call do |http| yield http.with(headers: ACCEPT_HEADERS) @@ -71,6 +81,10 @@ module Wikis failure(code: :request_failed) end end + + def fetch_json(json_hash, key) + json_hash.fetch(key) { throw :xwiki_error, failure(code: :invalid_response) } + end end end end diff --git a/modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/search_pages.rb b/modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/search_pages.rb index c8a7e5122d5..3a44dce9a1e 100644 --- a/modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/search_pages.rb +++ b/modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/search_pages.rb @@ -44,14 +44,14 @@ module Wikis authenticated(auth_strategy) do |http| handle_response(http.get(rest_url("wikis/query", query:))) do |json| success( - json.fetch("searchResults") - .uniq { |r| r.fetch("id") } - .map do |r| - result = canonical_page_info(identifier: r.fetch("id"), auth_strategy:) - return result if result.failure? + fetch_json(json, "searchResults") + .uniq { |r| fetch_json(r, "id") } + .map do |r| + result = canonical_page_info(identifier: fetch_json(r, "id"), auth_strategy:) + return result if result.failure? - result.value! - end + result.value! + end ) end end diff --git a/modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/stable_page_info.rb b/modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/stable_page_info.rb index 51d2adbff3a..59603e6a4e7 100644 --- a/modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/stable_page_info.rb +++ b/modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/stable_page_info.rb @@ -46,8 +46,8 @@ module Wikis success( Results::PageInfo.new( identifier: ref.to_s, - title: data.fetch("title"), - href: data.fetch("xwikiAbsoluteUrl"), + title: fetch_json(data, "title"), + href: fetch_json(data, "xwikiAbsoluteUrl"), provider: ) ) diff --git a/modules/wikis/spec/services/wikis/adapters/providers/xwiki/queries/canonical_page_info_spec.rb b/modules/wikis/spec/services/wikis/adapters/providers/xwiki/queries/canonical_page_info_spec.rb index 27e913c3a2b..cc4e7648e14 100644 --- a/modules/wikis/spec/services/wikis/adapters/providers/xwiki/queries/canonical_page_info_spec.rb +++ b/modules/wikis/spec/services/wikis/adapters/providers/xwiki/queries/canonical_page_info_spec.rb @@ -130,5 +130,14 @@ RSpec.describe Wikis::Adapters::Providers::XWiki::Queries::CanonicalPageInfo, :w it { is_expected.to be_failure.and have_attributes(failure: have_attributes(code: :invalid_response)) } end + + context "when the response body is unexpected JSON" do + before do + stub_request(:put, page_url) + .to_return(status: 200, body: { error: "An error occured" }.to_json, headers: { "Content-Type" => "application/json" }) + end + + it { is_expected.to be_failure.and have_attributes(failure: have_attributes(code: :invalid_response)) } + end end end diff --git a/modules/wikis/spec/services/wikis/adapters/providers/xwiki/queries/stable_page_info_spec.rb b/modules/wikis/spec/services/wikis/adapters/providers/xwiki/queries/stable_page_info_spec.rb index 85814a11e1b..99791e8071f 100644 --- a/modules/wikis/spec/services/wikis/adapters/providers/xwiki/queries/stable_page_info_spec.rb +++ b/modules/wikis/spec/services/wikis/adapters/providers/xwiki/queries/stable_page_info_spec.rb @@ -106,5 +106,14 @@ RSpec.describe Wikis::Adapters::Providers::XWiki::Queries::StablePageInfo, :webm it { is_expected.to be_failure.and have_attributes(failure: have_attributes(code: :invalid_response)) } end + + context "when the response body is unexpected JSON" do + before do + stub_request(:get, page_url) + .to_return(status: 200, body: { error: "An error occured" }.to_json, headers: { "Content-Type" => "application/json" }) + end + + it { is_expected.to be_failure.and have_attributes(failure: have_attributes(code: :invalid_response)) } + end end end From f466dd38325d61e395d9149d934951adc49affec Mon Sep 17 00:00:00 2001 From: Jan Sandbrink Date: Fri, 5 Jun 2026 09:40:39 +0200 Subject: [PATCH 083/107] Reduce maximum result size of XWiki search_pages This is only done to improve worst-case latency, because we perform one additional request per result. Local testing showed a latency above 1000ms for 50 results and ~500ms for 20 results. I'd expect real world scenarios to be slightly worse, because of higher network latency. --- .../providers/xwiki/queries/search_pages.rb | 4 +++- .../vcr_cassettes/xwiki/query_exact_match.yml | 16 ++++++++-------- .../vcr_cassettes/xwiki/query_no_match.yml | 8 ++++---- .../xwiki/query_partial_match.yml | 16 ++++++++-------- .../vcr_cassettes/xwiki/query_quoted_match.yml | 18 +++++++++--------- .../xwiki/query_unquoted_match.yml | 18 +++++++++--------- 6 files changed, 41 insertions(+), 39 deletions(-) diff --git a/modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/search_pages.rb b/modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/search_pages.rb index 3a44dce9a1e..9029f99636f 100644 --- a/modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/search_pages.rb +++ b/modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/search_pages.rb @@ -36,7 +36,9 @@ module Wikis class SearchPages < BaseQuery include Concerns::XWikiQuery - MAXIMUM_RESULTS = 50 + # Limiting result size rather strictly, because each result will cause another HTTP call to XWiki, this does not + # scale well. A stricter limit improves the worst case latency. + MAXIMUM_RESULTS = 20 def call(input_data:, auth_strategy:) query = { q: "\"#{escape_quotes input_data.query}\"", number: MAXIMUM_RESULTS } diff --git a/spec/support/fixtures/vcr_cassettes/xwiki/query_exact_match.yml b/spec/support/fixtures/vcr_cassettes/xwiki/query_exact_match.yml index 8791bef049a..782f6749212 100644 --- a/spec/support/fixtures/vcr_cassettes/xwiki/query_exact_match.yml +++ b/spec/support/fixtures/vcr_cassettes/xwiki/query_exact_match.yml @@ -2,7 +2,7 @@ http_interactions: - request: method: get - uri: https://xwiki.local/rest/wikis/query?number=50&q=%22Test%20Page%20for%20RSpec%22 + uri: https://xwiki.local/rest/wikis/query?number=20&q=%22Test%20Page%20for%20RSpec%22 body: encoding: US-ASCII string: '' @@ -27,9 +27,9 @@ http_interactions: Content-Type: - application/json;charset=UTF-8 Date: - - Fri, 05 Jun 2026 06:39:19 GMT + - Fri, 05 Jun 2026 08:53:32 GMT Set-Cookie: - - JSESSIONID=EF2A09F6E0681B4B0B3E44D639CB89D9; Path=/; HttpOnly + - JSESSIONID=86BECC608B1C5FD09A32A74836CAEA4E; Path=/; HttpOnly Xwiki-Form-Token: - ON8xsHlEpixyujzpUPNupg Xwiki-User: @@ -42,8 +42,8 @@ http_interactions: encoding: UTF-8 string: '{"links":[],"searchResults":[{"links":[{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/Test%20Page/pages/WebHome","rel":"http://www.xwiki.org/rel/page","type":null,"hrefLang":null}],"type":"page","id":"xwiki:Test Page.WebHome","pageFullName":"Test Page.WebHome","title":"Test Page for RSpec","wiki":"xwiki","space":"Test - Page","pageName":"WebHome","modified":1780386902000,"author":"xwiki:XWiki.admin","authorName":null,"version":"4.1","language":null,"className":null,"objectNumber":null,"filename":null,"score":32.03692,"object":null,"hierarchy":null}],"template":"https://xwiki.local/rest/?q={solrquery}(&number={number})(&start={start})(&orderField={fieldname}(&order={asc|desc}))(&distinct=1)(&prettyNames={false|true})(&wikis={wikis})(&className={classname})"}' - recorded_at: Fri, 05 Jun 2026 06:39:19 GMT + Page","pageName":"WebHome","modified":1780386902000,"author":"xwiki:XWiki.admin","authorName":null,"version":"4.1","language":null,"className":null,"objectNumber":null,"filename":null,"score":36.06842,"object":null,"hierarchy":null}],"template":"https://xwiki.local/rest/?q={solrquery}(&number={number})(&start={start})(&orderField={fieldname}(&order={asc|desc}))(&distinct=1)(&prettyNames={false|true})(&wikis={wikis})(&className={classname})"}' + recorded_at: Fri, 05 Jun 2026 08:53:32 GMT - request: method: put uri: https://xwiki.local/rest/openproject/documents?docRef=xwiki:Test%20Page.WebHome @@ -75,9 +75,9 @@ http_interactions: Content-Type: - application/json;charset=UTF-8 Date: - - Fri, 05 Jun 2026 06:39:19 GMT + - Fri, 05 Jun 2026 08:53:32 GMT Set-Cookie: - - JSESSIONID=CD75D58F42FA2FF29480F0AA679975CB; Path=/; HttpOnly + - JSESSIONID=D0C7401B4A9ADC6FF35E556801B050B3; Path=/; HttpOnly Xwiki-Form-Token: - ON8xsHlEpixyujzpUPNupg Xwiki-User: @@ -94,5 +94,5 @@ http_interactions: URL Shortener.","content":"This is a test page that I created with my own hands.","clazz":null,"objects":null,"attachments":null,"hierarchy":{"items":[{"label":"xwiki","name":"xwiki","type":"wiki","url":"https://xwiki.local/bin/view/Main/"},{"label":"Test Page","name":"Test Page","type":"space","url":"https://xwiki.local/bin/view/Test%20Page/"},{"label":"WebHome","name":"WebHome","type":"document","url":"https://xwiki.local/bin/view/Test%20Page/"}]},"rights":[],"renderedContent":null}' - recorded_at: Fri, 05 Jun 2026 06:39:19 GMT + recorded_at: Fri, 05 Jun 2026 08:53:32 GMT recorded_with: VCR 6.4.0 diff --git a/spec/support/fixtures/vcr_cassettes/xwiki/query_no_match.yml b/spec/support/fixtures/vcr_cassettes/xwiki/query_no_match.yml index c1158559d9d..1f75478d02f 100644 --- a/spec/support/fixtures/vcr_cassettes/xwiki/query_no_match.yml +++ b/spec/support/fixtures/vcr_cassettes/xwiki/query_no_match.yml @@ -2,7 +2,7 @@ http_interactions: - request: method: get - uri: https://xwiki.local/rest/wikis/query?number=50&q=%22A%20page%20that%20does%20not%20exist%22 + uri: https://xwiki.local/rest/wikis/query?number=20&q=%22A%20page%20that%20does%20not%20exist%22 body: encoding: US-ASCII string: '' @@ -27,9 +27,9 @@ http_interactions: Content-Type: - application/json;charset=UTF-8 Date: - - Fri, 05 Jun 2026 06:39:20 GMT + - Fri, 05 Jun 2026 08:53:31 GMT Set-Cookie: - - JSESSIONID=D1B7C7CFA5520362BCB9E2DB63EFCE00; Path=/; HttpOnly + - JSESSIONID=732467DE0A76FD79B8958EC80B2E9BB2; Path=/; HttpOnly Xwiki-Form-Token: - ON8xsHlEpixyujzpUPNupg Xwiki-User: @@ -41,5 +41,5 @@ http_interactions: body: encoding: UTF-8 string: '{"links":[],"searchResults":[],"template":"https://xwiki.local/rest/?q={solrquery}(&number={number})(&start={start})(&orderField={fieldname}(&order={asc|desc}))(&distinct=1)(&prettyNames={false|true})(&wikis={wikis})(&className={classname})"}' - recorded_at: Fri, 05 Jun 2026 06:39:20 GMT + recorded_at: Fri, 05 Jun 2026 08:53:31 GMT recorded_with: VCR 6.4.0 diff --git a/spec/support/fixtures/vcr_cassettes/xwiki/query_partial_match.yml b/spec/support/fixtures/vcr_cassettes/xwiki/query_partial_match.yml index a78c9afd3d3..0419190f295 100644 --- a/spec/support/fixtures/vcr_cassettes/xwiki/query_partial_match.yml +++ b/spec/support/fixtures/vcr_cassettes/xwiki/query_partial_match.yml @@ -2,7 +2,7 @@ http_interactions: - request: method: get - uri: https://xwiki.local/rest/wikis/query?number=50&q=%22for%20RSpec%22 + uri: https://xwiki.local/rest/wikis/query?number=20&q=%22for%20RSpec%22 body: encoding: US-ASCII string: '' @@ -27,9 +27,9 @@ http_interactions: Content-Type: - application/json;charset=UTF-8 Date: - - Fri, 05 Jun 2026 06:39:19 GMT + - Fri, 05 Jun 2026 08:53:31 GMT Set-Cookie: - - JSESSIONID=689FB3235B4E5A8C46683A1331BD9EB2; Path=/; HttpOnly + - JSESSIONID=61B575D9D2898F806A6569BC6F465501; Path=/; HttpOnly Xwiki-Form-Token: - ON8xsHlEpixyujzpUPNupg Xwiki-User: @@ -42,8 +42,8 @@ http_interactions: encoding: UTF-8 string: '{"links":[],"searchResults":[{"links":[{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/Test%20Page/pages/WebHome","rel":"http://www.xwiki.org/rel/page","type":null,"hrefLang":null}],"type":"page","id":"xwiki:Test Page.WebHome","pageFullName":"Test Page.WebHome","title":"Test Page for RSpec","wiki":"xwiki","space":"Test - Page","pageName":"WebHome","modified":1780386902000,"author":"xwiki:XWiki.admin","authorName":null,"version":"4.1","language":null,"className":null,"objectNumber":null,"filename":null,"score":14.085169,"object":null,"hierarchy":null}],"template":"https://xwiki.local/rest/?q={solrquery}(&number={number})(&start={start})(&orderField={fieldname}(&order={asc|desc}))(&distinct=1)(&prettyNames={false|true})(&wikis={wikis})(&className={classname})"}' - recorded_at: Fri, 05 Jun 2026 06:39:19 GMT + Page","pageName":"WebHome","modified":1780386902000,"author":"xwiki:XWiki.admin","authorName":null,"version":"4.1","language":null,"className":null,"objectNumber":null,"filename":null,"score":15.390617,"object":null,"hierarchy":null}],"template":"https://xwiki.local/rest/?q={solrquery}(&number={number})(&start={start})(&orderField={fieldname}(&order={asc|desc}))(&distinct=1)(&prettyNames={false|true})(&wikis={wikis})(&className={classname})"}' + recorded_at: Fri, 05 Jun 2026 08:53:31 GMT - request: method: put uri: https://xwiki.local/rest/openproject/documents?docRef=xwiki:Test%20Page.WebHome @@ -75,9 +75,9 @@ http_interactions: Content-Type: - application/json;charset=UTF-8 Date: - - Fri, 05 Jun 2026 06:39:19 GMT + - Fri, 05 Jun 2026 08:53:32 GMT Set-Cookie: - - JSESSIONID=41BB94B7774F3AAF5872EC50FF78C37B; Path=/; HttpOnly + - JSESSIONID=753A9D110C6DC9393E3350EA056BBC05; Path=/; HttpOnly Xwiki-Form-Token: - ON8xsHlEpixyujzpUPNupg Xwiki-User: @@ -94,5 +94,5 @@ http_interactions: URL Shortener.","content":"This is a test page that I created with my own hands.","clazz":null,"objects":null,"attachments":null,"hierarchy":{"items":[{"label":"xwiki","name":"xwiki","type":"wiki","url":"https://xwiki.local/bin/view/Main/"},{"label":"Test Page","name":"Test Page","type":"space","url":"https://xwiki.local/bin/view/Test%20Page/"},{"label":"WebHome","name":"WebHome","type":"document","url":"https://xwiki.local/bin/view/Test%20Page/"}]},"rights":[],"renderedContent":null}' - recorded_at: Fri, 05 Jun 2026 06:39:19 GMT + recorded_at: Fri, 05 Jun 2026 08:53:32 GMT recorded_with: VCR 6.4.0 diff --git a/spec/support/fixtures/vcr_cassettes/xwiki/query_quoted_match.yml b/spec/support/fixtures/vcr_cassettes/xwiki/query_quoted_match.yml index b1238e1edde..b2f28f954e0 100644 --- a/spec/support/fixtures/vcr_cassettes/xwiki/query_quoted_match.yml +++ b/spec/support/fixtures/vcr_cassettes/xwiki/query_quoted_match.yml @@ -2,7 +2,7 @@ http_interactions: - request: method: get - uri: https://xwiki.local/rest/wikis/query?number=50&q=%22%5C%22Quoted%5C%22%20pages%20can%20be%20tricky%22 + uri: https://xwiki.local/rest/wikis/query?number=20&q=%22%5C%22Quoted%5C%22%20pages%20can%20be%20tricky%22 body: encoding: US-ASCII string: '' @@ -27,9 +27,9 @@ http_interactions: Content-Type: - application/json;charset=UTF-8 Date: - - Fri, 05 Jun 2026 06:39:20 GMT + - Fri, 05 Jun 2026 08:53:32 GMT Set-Cookie: - - JSESSIONID=A1B5B0EFF5FD5E7B4F6E4CB0D185B065; Path=/; HttpOnly + - JSESSIONID=0A832E95AF62319A728E2D94FF402FD2; Path=/; HttpOnly Xwiki-Form-Token: - ON8xsHlEpixyujzpUPNupg Xwiki-User: @@ -37,13 +37,13 @@ http_interactions: Xwiki-Version: - 18.3.0 Content-Length: - - '893' + - '891' body: encoding: UTF-8 string: '{"links":[],"searchResults":[{"links":[{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/%22Quoted%22%20pages%20can%20be%20tricky/pages/WebHome","rel":"http://www.xwiki.org/rel/page","type":null,"hrefLang":null}],"type":"page","id":"xwiki:\"Quoted\" pages can be tricky.WebHome","pageFullName":"\"Quoted\" pages can be tricky.WebHome","title":"\"Quoted\" - pages can be tricky","wiki":"xwiki","space":"\"Quoted\" pages can be tricky","pageName":"WebHome","modified":1780387197000,"author":"xwiki:XWiki.admin","authorName":null,"version":"1.1","language":null,"className":null,"objectNumber":null,"filename":null,"score":41.692856,"object":null,"hierarchy":null}],"template":"https://xwiki.local/rest/?q={solrquery}(&number={number})(&start={start})(&orderField={fieldname}(&order={asc|desc}))(&distinct=1)(&prettyNames={false|true})(&wikis={wikis})(&className={classname})"}' - recorded_at: Fri, 05 Jun 2026 06:39:20 GMT + pages can be tricky","wiki":"xwiki","space":"\"Quoted\" pages can be tricky","pageName":"WebHome","modified":1780387197000,"author":"xwiki:XWiki.admin","authorName":null,"version":"1.1","language":null,"className":null,"objectNumber":null,"filename":null,"score":46.0744,"object":null,"hierarchy":null}],"template":"https://xwiki.local/rest/?q={solrquery}(&number={number})(&start={start})(&orderField={fieldname}(&order={asc|desc}))(&distinct=1)(&prettyNames={false|true})(&wikis={wikis})(&className={classname})"}' + recorded_at: Fri, 05 Jun 2026 08:53:32 GMT - request: method: put uri: https://xwiki.local/rest/openproject/documents?docRef=xwiki:%22Quoted%22%20pages%20can%20be%20tricky.WebHome @@ -75,9 +75,9 @@ http_interactions: Content-Type: - application/json;charset=UTF-8 Date: - - Fri, 05 Jun 2026 06:39:20 GMT + - Fri, 05 Jun 2026 08:53:32 GMT Set-Cookie: - - JSESSIONID=9F577E6A3744F626EDDD3668B5F9EE9D; Path=/; HttpOnly + - JSESSIONID=8074F7A06BEFB236927D7E9858A4D266; Path=/; HttpOnly Xwiki-Form-Token: - ON8xsHlEpixyujzpUPNupg Xwiki-User: @@ -95,5 +95,5 @@ http_interactions: URL Shortener.","content":"When the page title contains quotes, it''s harder to exactly match their page title.","clazz":null,"objects":null,"attachments":null,"hierarchy":{"items":[{"label":"xwiki","name":"xwiki","type":"wiki","url":"https://xwiki.local/bin/view/Main/"},{"label":"\"Quoted\" pages can be tricky","name":"\"Quoted\" pages can be tricky","type":"space","url":"https://xwiki.local/bin/view/%22Quoted%22%20pages%20can%20be%20tricky/"},{"label":"WebHome","name":"WebHome","type":"document","url":"https://xwiki.local/bin/view/%22Quoted%22%20pages%20can%20be%20tricky/"}]},"rights":[],"renderedContent":null}' - recorded_at: Fri, 05 Jun 2026 06:39:20 GMT + recorded_at: Fri, 05 Jun 2026 08:53:32 GMT recorded_with: VCR 6.4.0 diff --git a/spec/support/fixtures/vcr_cassettes/xwiki/query_unquoted_match.yml b/spec/support/fixtures/vcr_cassettes/xwiki/query_unquoted_match.yml index c46c68fc370..9e9fbe26be3 100644 --- a/spec/support/fixtures/vcr_cassettes/xwiki/query_unquoted_match.yml +++ b/spec/support/fixtures/vcr_cassettes/xwiki/query_unquoted_match.yml @@ -2,7 +2,7 @@ http_interactions: - request: method: get - uri: https://xwiki.local/rest/wikis/query?number=50&q=%22Quoted%20pages%20can%20be%20tricky%22 + uri: https://xwiki.local/rest/wikis/query?number=20&q=%22Quoted%20pages%20can%20be%20tricky%22 body: encoding: US-ASCII string: '' @@ -27,9 +27,9 @@ http_interactions: Content-Type: - application/json;charset=UTF-8 Date: - - Fri, 05 Jun 2026 06:39:20 GMT + - Fri, 05 Jun 2026 08:53:32 GMT Set-Cookie: - - JSESSIONID=B47446E1E06E6D2A73FC512CEAB8083D; Path=/; HttpOnly + - JSESSIONID=85EDC4821BCF449B0D29798F3AD7D750; Path=/; HttpOnly Xwiki-Form-Token: - ON8xsHlEpixyujzpUPNupg Xwiki-User: @@ -37,13 +37,13 @@ http_interactions: Xwiki-Version: - 18.3.0 Content-Length: - - '893' + - '891' body: encoding: UTF-8 string: '{"links":[],"searchResults":[{"links":[{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/%22Quoted%22%20pages%20can%20be%20tricky/pages/WebHome","rel":"http://www.xwiki.org/rel/page","type":null,"hrefLang":null}],"type":"page","id":"xwiki:\"Quoted\" pages can be tricky.WebHome","pageFullName":"\"Quoted\" pages can be tricky.WebHome","title":"\"Quoted\" - pages can be tricky","wiki":"xwiki","space":"\"Quoted\" pages can be tricky","pageName":"WebHome","modified":1780387197000,"author":"xwiki:XWiki.admin","authorName":null,"version":"1.1","language":null,"className":null,"objectNumber":null,"filename":null,"score":41.692856,"object":null,"hierarchy":null}],"template":"https://xwiki.local/rest/?q={solrquery}(&number={number})(&start={start})(&orderField={fieldname}(&order={asc|desc}))(&distinct=1)(&prettyNames={false|true})(&wikis={wikis})(&className={classname})"}' - recorded_at: Fri, 05 Jun 2026 06:39:20 GMT + pages can be tricky","wiki":"xwiki","space":"\"Quoted\" pages can be tricky","pageName":"WebHome","modified":1780387197000,"author":"xwiki:XWiki.admin","authorName":null,"version":"1.1","language":null,"className":null,"objectNumber":null,"filename":null,"score":46.0744,"object":null,"hierarchy":null}],"template":"https://xwiki.local/rest/?q={solrquery}(&number={number})(&start={start})(&orderField={fieldname}(&order={asc|desc}))(&distinct=1)(&prettyNames={false|true})(&wikis={wikis})(&className={classname})"}' + recorded_at: Fri, 05 Jun 2026 08:53:32 GMT - request: method: put uri: https://xwiki.local/rest/openproject/documents?docRef=xwiki:%22Quoted%22%20pages%20can%20be%20tricky.WebHome @@ -75,9 +75,9 @@ http_interactions: Content-Type: - application/json;charset=UTF-8 Date: - - Fri, 05 Jun 2026 06:39:20 GMT + - Fri, 05 Jun 2026 08:53:32 GMT Set-Cookie: - - JSESSIONID=2B1297828F8D8887496627F7356421D5; Path=/; HttpOnly + - JSESSIONID=6C4E5F9B0CF3BAD764856C1C7DD0F8DD; Path=/; HttpOnly Xwiki-Form-Token: - ON8xsHlEpixyujzpUPNupg Xwiki-User: @@ -95,5 +95,5 @@ http_interactions: URL Shortener.","content":"When the page title contains quotes, it''s harder to exactly match their page title.","clazz":null,"objects":null,"attachments":null,"hierarchy":{"items":[{"label":"xwiki","name":"xwiki","type":"wiki","url":"https://xwiki.local/bin/view/Main/"},{"label":"\"Quoted\" pages can be tricky","name":"\"Quoted\" pages can be tricky","type":"space","url":"https://xwiki.local/bin/view/%22Quoted%22%20pages%20can%20be%20tricky/"},{"label":"WebHome","name":"WebHome","type":"document","url":"https://xwiki.local/bin/view/%22Quoted%22%20pages%20can%20be%20tricky/"}]},"rights":[],"renderedContent":null}' - recorded_at: Fri, 05 Jun 2026 06:39:20 GMT + recorded_at: Fri, 05 Jun 2026 08:53:32 GMT recorded_with: VCR 6.4.0 From 1d8329c220bc314e866da8626fa322d045d5b790 Mon Sep 17 00:00:00 2001 From: Mir Bhatia Date: Wed, 13 May 2026 17:31:36 +0200 Subject: [PATCH 084/107] Try async fetch --- .../select_panel_component.html.erb | 17 +++++---- .../quick_filter/select_panel_component.rb | 20 +++++++++- .../index_sub_header_component.html.erb | 5 ++- .../meetings/index_sub_header_component.rb | 7 +++- .../app/controllers/meetings_controller.rb | 15 +++++++- .../app/views/meetings/project_items.html.erb | 38 +++++++++++++++++++ modules/meeting/config/routes.rb | 1 + .../lib/open_project/meeting/engine.rb | 2 +- 8 files changed, 90 insertions(+), 15 deletions(-) create mode 100644 modules/meeting/app/views/meetings/project_items.html.erb diff --git a/app/components/op_primer/quick_filter/select_panel_component.html.erb b/app/components/op_primer/quick_filter/select_panel_component.html.erb index 0c561708b86..adf6b3b3b07 100644 --- a/app/components/op_primer/quick_filter/select_panel_component.html.erb +++ b/app/components/op_primer/quick_filter/select_panel_component.html.erb @@ -34,7 +34,8 @@ See COPYRIGHT and LICENSE files for more details. <%= render( Primer::Alpha::SelectPanel.new( select_variant: :multiple, - fetch_strategy: :local, + fetch_strategy: fetch_strategy, + src: panel_src, title: @name, dynamic_label: true, dynamic_label_prefix: current_values.any? ? @name : nil @@ -44,12 +45,14 @@ See COPYRIGHT and LICENSE files for more details. button.with_trailing_visual_icon(icon: :"triangle-down") current_label end %> - <% items.each do |item| %> - <% panel.with_item( - label: item.label, - active: current_values.include?(item.value.to_s), - content_arguments: { data: { value: item.value.to_s } } - ) %> + <% unless @src.present? %> + <% items.each do |item| %> + <% panel.with_item( + label: item.label, + active: current_values.include?(item.value.to_s), + content_arguments: { data: { value: item.value.to_s } } + ) %> + <% end %> <% end %> <% panel.with_footer(show_divider: true) do %> <%= render(Primer::Beta::Button.new(scheme: :primary, data: { action: "click->quick-filter--select-panel#apply" })) do %> diff --git a/app/components/op_primer/quick_filter/select_panel_component.rb b/app/components/op_primer/quick_filter/select_panel_component.rb index 93b4e24223d..ad02b2a9fa8 100644 --- a/app/components/op_primer/quick_filter/select_panel_component.rb +++ b/app/components/op_primer/quick_filter/select_panel_component.rb @@ -35,7 +35,7 @@ module OpPrimer renders_many :items, OpPrimer::QuickFilter::Item - def initialize(name:, query:, filter_key:, path_args:, operator: "=") + def initialize(name:, query:, filter_key:, path_args:, operator: "=", src: nil) super @name = name @@ -43,10 +43,11 @@ module OpPrimer @filter_key = filter_key @path_args = path_args @operator = operator + @src = src end def render? - items.any? + @src.present? || items.any? end private @@ -66,6 +67,21 @@ module OpPrimer I18n.t(:label_x_items_selected, count: selected.size) end + def panel_src + return nil if @src.blank? + return @src if current_values.empty? + + uri = URI.parse(@src) + params = Rack::Utils.parse_nested_query(uri.query.to_s) + params["selected"] = current_values.join(",") + uri.query = params.to_query + uri.to_s + end + + def fetch_strategy + @src.present? ? :eventually_local : :local + end + def base_url polymorphic_path(@path_args, base_url_params) end diff --git a/modules/meeting/app/components/meetings/index_sub_header_component.html.erb b/modules/meeting/app/components/meetings/index_sub_header_component.html.erb index c9f81e6e7b7..d252629d9d0 100644 --- a/modules/meeting/app/components/meetings/index_sub_header_component.html.erb +++ b/modules/meeting/app/components/meetings/index_sub_header_component.html.erb @@ -20,10 +20,11 @@ name: I18n.t(:label_project), query: @query, filter_key: :project_id, - path_args: [@project, :meetings] + path_args: [@project, :meetings], + src: project_items_meetings_path ) ) do |component| - project_items.each do |project| + selected_projects.each do |project| component.with_item(label: project.name, value: project.id) end end diff --git a/modules/meeting/app/components/meetings/index_sub_header_component.rb b/modules/meeting/app/components/meetings/index_sub_header_component.rb index a0084251a90..99f51891c96 100644 --- a/modules/meeting/app/components/meetings/index_sub_header_component.rb +++ b/modules/meeting/app/components/meetings/index_sub_header_component.rb @@ -67,8 +67,11 @@ module Meetings params[:filters].present? end - def project_items - Project.visible.order(:name) + def selected_projects + selected_ids = @query.find_active_filter(:project_id)&.values&.map(&:to_s) || [] + return [] if selected_ids.empty? + + Project.visible.where(id: selected_ids) end end end diff --git a/modules/meeting/app/controllers/meetings_controller.rb b/modules/meeting/app/controllers/meetings_controller.rb index fbebcf7051b..ad0af222e8f 100644 --- a/modules/meeting/app/controllers/meetings_controller.rb +++ b/modules/meeting/app/controllers/meetings_controller.rb @@ -34,7 +34,7 @@ class MeetingsController < ApplicationController before_action :determine_date_range, only: %i[history] before_action :determine_author, only: %i[history] before_action :build_meeting, only: %i[new new_dialog fetch_timezone] - before_action :find_meeting, except: %i[index new create new_dialog fetch_timezone fetch_templates] + before_action :find_meeting, except: %i[index new create new_dialog fetch_timezone fetch_templates project_items] before_action :redirect_to_project, only: %i[show] before_action :set_activity, only: %i[history] before_action :find_copy_from_meeting, only: %i[create] @@ -383,6 +383,19 @@ class MeetingsController < ApplicationController respond_with_turbo_streams end + def project_items + projects = Project.visible.order(:name) + selected_ids = params[:selected]&.split(",") || [] + + respond_to do |format| + format.html_fragment do + render "meetings/project_items", + locals: { projects:, selected_ids: }, + layout: false + end + end + end + def generate_pdf_dialog respond_with_dialog Meetings::Exports::ModalDialogComponent.new( meeting: @meeting, diff --git a/modules/meeting/app/views/meetings/project_items.html.erb b/modules/meeting/app/views/meetings/project_items.html.erb new file mode 100644 index 00000000000..fcee3df2f36 --- /dev/null +++ b/modules/meeting/app/views/meetings/project_items.html.erb @@ -0,0 +1,38 @@ +<%#-- copyright +OpenProject is an open source project management software. +Copyright (C) the OpenProject GmbH + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License version 3. + +OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +Copyright (C) 2006-2013 Jean-Philippe Lang +Copyright (C) 2010-2013 the ChiliProject Team + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +See COPYRIGHT and LICENSE files for more details. + +++#%> + +<%= render(Primer::Alpha::SelectPanel::ItemList.new(select_variant: :multiple)) do |list| %> + <% projects.each do |project| %> + <% list.with_item( + label: project.name, + active: selected_ids.include?(project.id.to_s), + content_arguments: { data: { value: project.id.to_s } } + ) %> + <% end %> +<% end %> diff --git a/modules/meeting/config/routes.rb b/modules/meeting/config/routes.rb index acb0be0aeea..526fe05f80e 100644 --- a/modules/meeting/config/routes.rb +++ b/modules/meeting/config/routes.rb @@ -47,6 +47,7 @@ Rails.application.routes.draw do get "menu" => "meetings/menus#show" get :fetch_timezone get :fetch_templates + get :project_items get "ical/:token", controller: "meetings/ical", action: :index, as: "ical_feed" diff --git a/modules/meeting/lib/open_project/meeting/engine.rb b/modules/meeting/lib/open_project/meeting/engine.rb index c7894770d41..b6ce5cf588a 100644 --- a/modules/meeting/lib/open_project/meeting/engine.rb +++ b/modules/meeting/lib/open_project/meeting/engine.rb @@ -44,7 +44,7 @@ module OpenProject::Meeting permission :view_meetings, { meetings: %i[index show check_for_updates download_ics - presentation generate_pdf_dialog history], + presentation generate_pdf_dialog history project_items], "meetings/filters": %i[show], "meetings/menus": %i[show], work_package_meetings_tab: %i[index count], From 141f4b1669144218bf7f54d81e32d5040eac5a73 Mon Sep 17 00:00:00 2001 From: Mir Bhatia Date: Fri, 15 May 2026 16:31:18 +0200 Subject: [PATCH 085/107] Improve async version --- .../select_panel_component.html.erb | 2 +- .../quick_filter/select_panel_component.rb | 57 ++++++++++++++----- .../filters/shared/project_filter/optional.rb | 4 ++ .../index_sub_header_component.html.erb | 6 +- .../meetings/index_sub_header_component.rb | 6 -- .../app/controllers/meetings_controller.rb | 10 +++- 6 files changed, 58 insertions(+), 27 deletions(-) diff --git a/app/components/op_primer/quick_filter/select_panel_component.html.erb b/app/components/op_primer/quick_filter/select_panel_component.html.erb index adf6b3b3b07..55b6f28b2c6 100644 --- a/app/components/op_primer/quick_filter/select_panel_component.html.erb +++ b/app/components/op_primer/quick_filter/select_panel_component.html.erb @@ -45,7 +45,7 @@ See COPYRIGHT and LICENSE files for more details. button.with_trailing_visual_icon(icon: :"triangle-down") current_label end %> - <% unless @src.present? %> + <% if local? %> <% items.each do |item| %> <% panel.with_item( label: item.label, diff --git a/app/components/op_primer/quick_filter/select_panel_component.rb b/app/components/op_primer/quick_filter/select_panel_component.rb index ad02b2a9fa8..b2f98231272 100644 --- a/app/components/op_primer/quick_filter/select_panel_component.rb +++ b/app/components/op_primer/quick_filter/select_panel_component.rb @@ -35,7 +35,7 @@ module OpPrimer renders_many :items, OpPrimer::QuickFilter::Item - def initialize(name:, query:, filter_key:, path_args:, operator: "=", src: nil) + def initialize(name:, query:, filter_key:, path_args:, operator: "=", src: nil, label_method: :name) super @name = name @@ -44,42 +44,73 @@ module OpPrimer @path_args = path_args @operator = operator @src = src + @label_method = label_method + end + + def before_render + if async? && local? + raise ArgumentError, "Use `src` for async loading or inline items for local rendering, not both." + end + + if async? && + @query.filter_for(@filter_key).method(:value_objects).owner == Queries::Filters::Base + raise ArgumentError, + "#{@query.filter_for(@filter_key).class} does not implement #value_objects. " \ + "This is required when using the async version." + end end def render? - @src.present? || items.any? + async? || local? end private + def async? + @src.present? + end + + def local? + items.any? + end + + def active_filter + @active_filter ||= @query.find_active_filter(@filter_key) + end + def current_values - @query.find_active_filter(@filter_key)&.values&.map(&:to_s) || [] + active_filter&.values&.map(&:to_s) || [] end def current_label return @name if current_values.empty? + return I18n.t(:label_x_items_selected, count: current_values.size) if current_values.size > 1 - selected = items.select { |item| current_values.include?(item.value.to_s) } - return @name if selected.empty? + single_label || @name + end - return selected.first.label if selected.size == 1 - - I18n.t(:label_x_items_selected, count: selected.size) + def single_label + if async? + active_filter.value_objects.first.send(@label_method) + elsif local? + items.find { |item| current_values.include?(item.value.to_s) }.label + end end def panel_src - return nil if @src.blank? + return unless async? + # Pass currently selected ids so the right items can be marked in the response return @src if current_values.empty? uri = URI.parse(@src) - params = Rack::Utils.parse_nested_query(uri.query.to_s) - params["selected"] = current_values.join(",") - uri.query = params.to_query + uri.query = Rack::Utils.parse_nested_query(uri.query.to_s) + .merge("selected" => current_values.join(",")) + .to_query uri.to_s end def fetch_strategy - @src.present? ? :eventually_local : :local + async? ? :eventually_local : :local end def base_url diff --git a/app/models/queries/filters/shared/project_filter/optional.rb b/app/models/queries/filters/shared/project_filter/optional.rb index 95de9205222..9884c0b0c15 100644 --- a/app/models/queries/filters/shared/project_filter/optional.rb +++ b/app/models/queries/filters/shared/project_filter/optional.rb @@ -40,6 +40,10 @@ module Queries::Filters::Shared::ProjectFilter::Optional @allowed_values ||= ::Project.visible.pluck(:id).map { |id| [id, id.to_s] } end + def value_objects + Project.visible.where(id: values) + end + def type :list_optional end diff --git a/modules/meeting/app/components/meetings/index_sub_header_component.html.erb b/modules/meeting/app/components/meetings/index_sub_header_component.html.erb index d252629d9d0..063e4434fc9 100644 --- a/modules/meeting/app/components/meetings/index_sub_header_component.html.erb +++ b/modules/meeting/app/components/meetings/index_sub_header_component.html.erb @@ -23,11 +23,7 @@ path_args: [@project, :meetings], src: project_items_meetings_path ) - ) do |component| - selected_projects.each do |project| - component.with_item(label: project.name, value: project.id) - end - end + ) end end diff --git a/modules/meeting/app/components/meetings/index_sub_header_component.rb b/modules/meeting/app/components/meetings/index_sub_header_component.rb index 99f51891c96..20b4b81fba6 100644 --- a/modules/meeting/app/components/meetings/index_sub_header_component.rb +++ b/modules/meeting/app/components/meetings/index_sub_header_component.rb @@ -67,11 +67,5 @@ module Meetings params[:filters].present? end - def selected_projects - selected_ids = @query.find_active_filter(:project_id)&.values&.map(&:to_s) || [] - return [] if selected_ids.empty? - - Project.visible.where(id: selected_ids) - end end end diff --git a/modules/meeting/app/controllers/meetings_controller.rb b/modules/meeting/app/controllers/meetings_controller.rb index ad0af222e8f..6b41bf4b8e5 100644 --- a/modules/meeting/app/controllers/meetings_controller.rb +++ b/modules/meeting/app/controllers/meetings_controller.rb @@ -384,14 +384,20 @@ class MeetingsController < ApplicationController end def project_items - projects = Project.visible.order(:name) + @query = load_query + # Scope to projects that have meetings visible to the current user + projects = Project.where(id: @query.results.select(:project_id)).order(:name) + # The component appends ?selected=id1,id2 so we know which items to mark as selected. + # Standard filters can't be passed to the query because then the projects from @query.results + # would be *only* the already selected list selected_ids = params[:selected]&.split(",") || [] respond_to do |format| format.html_fragment do render "meetings/project_items", locals: { projects:, selected_ids: }, - layout: false + layout: false, + formats: %i[html html_fragment] end end end From eaf8eb0c170926a8890310f09206c8efee96ab32 Mon Sep 17 00:00:00 2001 From: Mir Bhatia Date: Fri, 15 May 2026 17:37:59 +0200 Subject: [PATCH 086/107] Add single select version --- .../quick_filter/select_panel_component.html.erb | 11 +++++++---- .../quick_filter/select_panel_component.rb | 15 ++++++++++++++- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/app/components/op_primer/quick_filter/select_panel_component.html.erb b/app/components/op_primer/quick_filter/select_panel_component.html.erb index 55b6f28b2c6..9eb734b7a8c 100644 --- a/app/components/op_primer/quick_filter/select_panel_component.html.erb +++ b/app/components/op_primer/quick_filter/select_panel_component.html.erb @@ -33,7 +33,7 @@ See COPYRIGHT and LICENSE files for more details. data-quick-filter--select-panel-operator-value="<%= @operator %>"> <%= render( Primer::Alpha::SelectPanel.new( - select_variant: :multiple, + select_variant: @select_variant, fetch_strategy: fetch_strategy, src: panel_src, title: @name, @@ -50,13 +50,16 @@ See COPYRIGHT and LICENSE files for more details. <% panel.with_item( label: item.label, active: current_values.include?(item.value.to_s), + href: @select_variant == :single ? item_href(item.value) : nil, content_arguments: { data: { value: item.value.to_s } } ) %> <% end %> <% end %> - <% panel.with_footer(show_divider: true) do %> - <%= render(Primer::Beta::Button.new(scheme: :primary, data: { action: "click->quick-filter--select-panel#apply" })) do %> - <%= t(:button_apply) %> + <% if @select_variant == :multiple %> + <% panel.with_footer(show_divider: true) do %> + <%= render(Primer::Beta::Button.new(scheme: :primary, data: { action: "click->quick-filter--select-panel#apply" })) do %> + <%= t(:button_apply) %> + <% end %> <% end %> <% end %> <% end %> diff --git a/app/components/op_primer/quick_filter/select_panel_component.rb b/app/components/op_primer/quick_filter/select_panel_component.rb index b2f98231272..c7b5b9789c5 100644 --- a/app/components/op_primer/quick_filter/select_panel_component.rb +++ b/app/components/op_primer/quick_filter/select_panel_component.rb @@ -35,7 +35,8 @@ module OpPrimer renders_many :items, OpPrimer::QuickFilter::Item - def initialize(name:, query:, filter_key:, path_args:, operator: "=", src: nil, label_method: :name) + def initialize(name:, query:, filter_key:, path_args:, operator: "=", src: nil, label_method: :name, + select_variant: :multiple) super @name = name @@ -45,6 +46,7 @@ module OpPrimer @operator = operator @src = src @label_method = label_method + @select_variant = select_variant end def before_render @@ -52,6 +54,10 @@ module OpPrimer raise ArgumentError, "Use `src` for async loading or inline items for local rendering, not both." end + if async? && @select_variant == :single + raise ArgumentError, "Async mode is not supported with select_variant: :single." + end + if async? && @query.filter_for(@filter_key).method(:value_objects).owner == Queries::Filters::Base raise ArgumentError, @@ -124,6 +130,13 @@ module OpPrimer end end + def item_href(value) + filters = other_filters + [{ @filter_key.to_s => { "operator" => @operator, "values" => [value.to_s] } }] + params = { filters: filters.to_json } + params[:sortBy] = sort.to_json if sort.any? + polymorphic_path(@path_args, params) + end + def other_filters @query.filters .reject { |f| f.name == @filter_key } From 79570798301503f01377db80884b2f0e66f3ec58 Mon Sep 17 00:00:00 2001 From: Mir Bhatia Date: Mon, 18 May 2026 14:14:11 +0200 Subject: [PATCH 087/107] Add clear button and turbo navigate instead of full page reload --- .../quick_filter/select_panel_component.html.erb | 13 ++++++++++--- .../quick_filter/select_panel_component.rb | 12 +++++++----- .../dynamic/quick-filter/select-panel.controller.ts | 12 ++++++++++-- 3 files changed, 27 insertions(+), 10 deletions(-) diff --git a/app/components/op_primer/quick_filter/select_panel_component.html.erb b/app/components/op_primer/quick_filter/select_panel_component.html.erb index 9eb734b7a8c..4404b27bd74 100644 --- a/app/components/op_primer/quick_filter/select_panel_component.html.erb +++ b/app/components/op_primer/quick_filter/select_panel_component.html.erb @@ -55,10 +55,17 @@ See COPYRIGHT and LICENSE files for more details. ) %> <% end %> <% end %> - <% if @select_variant == :multiple %> + <% if @select_variant == :multiple || current_values.any? %> <% panel.with_footer(show_divider: true) do %> - <%= render(Primer::Beta::Button.new(scheme: :primary, data: { action: "click->quick-filter--select-panel#apply" })) do %> - <%= t(:button_apply) %> + <% if current_values.any? %> + <%= render(Primer::Beta::Button.new(scheme: :secondary, data: { action: "click->quick-filter--select-panel#clear" })) do %> + <%= t(:button_clear) %> + <% end %> + <% end %> + <% if @select_variant == :multiple %> + <%= render(Primer::Beta::Button.new(scheme: :primary, data: { action: "click->quick-filter--select-panel#apply" })) do %> + <%= t(:button_apply) %> + <% end %> <% end %> <% end %> <% end %> diff --git a/app/components/op_primer/quick_filter/select_panel_component.rb b/app/components/op_primer/quick_filter/select_panel_component.rb index c7b5b9789c5..280817e9739 100644 --- a/app/components/op_primer/quick_filter/select_panel_component.rb +++ b/app/components/op_primer/quick_filter/select_panel_component.rb @@ -105,13 +105,15 @@ module OpPrimer def panel_src return unless async? - # Pass currently selected ids so the right items can be marked in the response - return @src if current_values.empty? uri = URI.parse(@src) - uri.query = Rack::Utils.parse_nested_query(uri.query.to_s) - .merge("selected" => current_values.join(",")) - .to_query + params = Rack::Utils.parse_nested_query(uri.query.to_s) + # Pass other active filters (e.g. time=past) so the fragment endpoint builds + # the same query scope as the current page, not its own default + params["filters"] = other_filters.to_json if other_filters.any? + # Pass currently selected ids so the right items can be marked in the response + params["selected"] = current_values.join(",") if current_values.any? + uri.query = params.to_query uri.to_s end diff --git a/frontend/src/stimulus/controllers/dynamic/quick-filter/select-panel.controller.ts b/frontend/src/stimulus/controllers/dynamic/quick-filter/select-panel.controller.ts index 28ccc6e0ead..c7665dfd3b0 100644 --- a/frontend/src/stimulus/controllers/dynamic/quick-filter/select-panel.controller.ts +++ b/frontend/src/stimulus/controllers/dynamic/quick-filter/select-panel.controller.ts @@ -29,6 +29,7 @@ */ import { Controller } from '@hotwired/stimulus'; +import { visit } from '@hotwired/turbo'; import type { SelectPanelElement } from '@primer/view-components/app/components/primer/alpha/select_panel_element'; export default class SelectPanelQuickFilterController extends Controller { @@ -42,7 +43,14 @@ export default class SelectPanelQuickFilterController extends Controller { declare filterKeyValue:string; declare operatorValue:string; - apply() { + clear() { + visit(this.baseUrlValue); + } + + apply(event:Event) { + // Prevent updating dynamic label before the page reloads anyway to stop flickering + event.stopPropagation(); + const panel = this.element.querySelector('select-panel'); if (!panel) return; @@ -58,6 +66,6 @@ export default class SelectPanelQuickFilterController extends Controller { url.searchParams.set('filters', JSON.stringify(filters)); } - window.location.href = url.toString(); + visit(url.toString()); } } From 6f207589ef17b72b700c3756022689f61264ade2 Mon Sep 17 00:00:00 2001 From: Mir Bhatia Date: Tue, 9 Jun 2026 08:40:27 +0200 Subject: [PATCH 088/107] Update label to change colours and include counter conditionally --- .../select_panel_component.html.erb | 13 ++-- .../quick_filter/select_panel_component.rb | 15 +---- .../select_panel_component_spec.rb | 65 +++++++++++++++---- 3 files changed, 62 insertions(+), 31 deletions(-) diff --git a/app/components/op_primer/quick_filter/select_panel_component.html.erb b/app/components/op_primer/quick_filter/select_panel_component.html.erb index 4404b27bd74..e0f15707a1a 100644 --- a/app/components/op_primer/quick_filter/select_panel_component.html.erb +++ b/app/components/op_primer/quick_filter/select_panel_component.html.erb @@ -36,14 +36,13 @@ See COPYRIGHT and LICENSE files for more details. select_variant: @select_variant, fetch_strategy: fetch_strategy, src: panel_src, - title: @name, - dynamic_label: true, - dynamic_label_prefix: current_values.any? ? @name : nil + title: @name ) ) do |panel| %> <% panel.with_show_button(scheme: :secondary, data: { test_selector: "quick-filter-select-panel-button" }) do |button| - button.with_trailing_visual_icon(icon: :"triangle-down") - current_label + button.with_trailing_visual_counter(count: current_values.size) if current_values.any? + button.with_trailing_action_icon(icon: :"triangle-down", color: current_values.empty? ? :muted : :default) + button_label end %> <% if local? %> <% items.each do |item| %> @@ -58,12 +57,12 @@ See COPYRIGHT and LICENSE files for more details. <% if @select_variant == :multiple || current_values.any? %> <% panel.with_footer(show_divider: true) do %> <% if current_values.any? %> - <%= render(Primer::Beta::Button.new(scheme: :secondary, data: { action: "click->quick-filter--select-panel#clear" })) do %> + <%= render(Primer::Beta::Button.new(scheme: :secondary, data: { action: "click->quick-filter--select-panel#clear", test_selector: "quick-filter-clear-button" })) do %> <%= t(:button_clear) %> <% end %> <% end %> <% if @select_variant == :multiple %> - <%= render(Primer::Beta::Button.new(scheme: :primary, data: { action: "click->quick-filter--select-panel#apply" })) do %> + <%= render(Primer::Beta::Button.new(scheme: :primary, data: { action: "click->quick-filter--select-panel#apply", test_selector: "quick-filter-apply-button" })) do %> <%= t(:button_apply) %> <% end %> <% end %> diff --git a/app/components/op_primer/quick_filter/select_panel_component.rb b/app/components/op_primer/quick_filter/select_panel_component.rb index 280817e9739..4c5762261ac 100644 --- a/app/components/op_primer/quick_filter/select_panel_component.rb +++ b/app/components/op_primer/quick_filter/select_panel_component.rb @@ -88,19 +88,10 @@ module OpPrimer active_filter&.values&.map(&:to_s) || [] end - def current_label - return @name if current_values.empty? - return I18n.t(:label_x_items_selected, count: current_values.size) if current_values.size > 1 + def button_label + return render(Primer::Beta::Text.new(color: :muted)) { @name } if current_values.empty? - single_label || @name - end - - def single_label - if async? - active_filter.value_objects.first.send(@label_method) - elsif local? - items.find { |item| current_values.include?(item.value.to_s) }.label - end + @name end def panel_src diff --git a/spec/components/op_primer/quick_filter/select_panel_component_spec.rb b/spec/components/op_primer/quick_filter/select_panel_component_spec.rb index 677a7dba4f0..c9549ece0b4 100644 --- a/spec/components/op_primer/quick_filter/select_panel_component_spec.rb +++ b/spec/components/op_primer/quick_filter/select_panel_component_spec.rb @@ -106,16 +106,21 @@ RSpec.describe OpPrimer::QuickFilter::SelectPanelComponent, type: :component do end end - context "with the show button label" do + context "with the show button" do context "when no filter is active" do before { render_with_items } - it "shows the component name" do + it "shows the component name in muted text" do expect(page).to have_button("Project") + expect(page).to have_css("button .color-fg-muted", text: "Project") end - it "does not render a dynamic label prefix" do - expect(page).to have_no_css("[data-dynamic-label-prefix]") + it "does not show a counter" do + expect(page).to have_no_css("button .Counter") + end + + it "renders the trailing icon in muted color" do + expect(page).to have_css("button .octicon-triangle-down.color-fg-muted") end end @@ -124,12 +129,20 @@ RSpec.describe OpPrimer::QuickFilter::SelectPanelComponent, type: :component do before { render_with_items } - it "shows the selected item name" do - expect(page).to have_button("Project 1") + it "shows the component name as the label" do + expect(page).to have_button("Project") end - it "renders the dynamic label prefix" do - expect(page).to have_css("[data-dynamic-label-prefix='Project']") + it "does not render muted text" do + expect(page).to have_no_css("button .color-fg-muted", text: "Project") + end + + it "shows a counter with the selected count" do + expect(page).to have_css("button .Counter", text: "1") + end + + it "renders the trailing icon in default color" do + expect(page).to have_css("button .octicon-triangle-down.color-fg-default") end end @@ -138,12 +151,40 @@ RSpec.describe OpPrimer::QuickFilter::SelectPanelComponent, type: :component do before { render_with_items } - it "shows the item count" do - expect(page).to have_button(I18n.t(:label_x_items_selected, count: 2)) + it "shows the component name as the label" do + expect(page).to have_button("Project") end - it "renders the dynamic label prefix" do - expect(page).to have_css("[data-dynamic-label-prefix='Project']") + it "shows a counter with the selected count" do + expect(page).to have_css("button .Counter", text: "2") + end + end + end + + context "with the footer" do + context "when no filter is active" do + before { render_with_items } + + it "renders an apply button" do + expect(page).to have_test_selector("quick-filter-apply-button") + end + + it "does not render a clear button" do + expect(page).to have_no_test_selector("quick-filter-clear-button") + end + end + + context "when a filter is active" do + let(:query) { build_meeting_query.where("project_id", "=", ["1"]) } + + before { render_with_items } + + it "renders a clear button" do + expect(page).to have_test_selector("quick-filter-clear-button") + end + + it "renders an apply button" do + expect(page).to have_test_selector("quick-filter-apply-button") end end end From 6f0e53f406aae40c263d57ef64a3175dfec8c792 Mon Sep 17 00:00:00 2001 From: Mir Bhatia Date: Tue, 9 Jun 2026 09:05:28 +0200 Subject: [PATCH 089/107] Please rubocop --- .../quick_filter/select_panel_component.rb | 18 +++++++++++------- .../meetings/index_sub_header_component.rb | 1 - 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/app/components/op_primer/quick_filter/select_panel_component.rb b/app/components/op_primer/quick_filter/select_panel_component.rb index 4c5762261ac..456171b3d85 100644 --- a/app/components/op_primer/quick_filter/select_panel_component.rb +++ b/app/components/op_primer/quick_filter/select_panel_component.rb @@ -98,16 +98,20 @@ module OpPrimer return unless async? uri = URI.parse(@src) - params = Rack::Utils.parse_nested_query(uri.query.to_s) - # Pass other active filters (e.g. time=past) so the fragment endpoint builds - # the same query scope as the current page, not its own default - params["filters"] = other_filters.to_json if other_filters.any? - # Pass currently selected ids so the right items can be marked in the response - params["selected"] = current_values.join(",") if current_values.any? - uri.query = params.to_query + uri.query = panel_src_params(uri).to_query uri.to_s end + def panel_src_params(uri) + Rack::Utils.parse_nested_query(uri.query.to_s).tap do |params| + # Pass other active filters (e.g. time=past) so the fragment endpoint builds + # the same query scope as the current page, not its own default + params["filters"] = other_filters.to_json if other_filters.any? + # Pass currently selected ids so the right items can be marked in the response + params["selected"] = current_values.join(",") if current_values.any? + end + end + def fetch_strategy async? ? :eventually_local : :local end diff --git a/modules/meeting/app/components/meetings/index_sub_header_component.rb b/modules/meeting/app/components/meetings/index_sub_header_component.rb index 20b4b81fba6..346ff5971b8 100644 --- a/modules/meeting/app/components/meetings/index_sub_header_component.rb +++ b/modules/meeting/app/components/meetings/index_sub_header_component.rb @@ -66,6 +66,5 @@ module Meetings def filters_expanded? params[:filters].present? end - end end From 92a0c03c4212e1be84c43cf963f32f417d217025 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20G=C3=BCnther?= Date: Tue, 9 Jun 2026 09:13:52 +0200 Subject: [PATCH 090/107] Fix fetching of SAML metadata for large aggregate endpoints (#23531) * Fix fetching of SAML metadata for large aggregate endpoints https://community.openproject.org/work_packages/OP-19420 * Use XML pull parser to avoid text parsing --- .../contracts/saml/providers/base_contract.rb | 2 + .../forms/saml/providers/metadata_url_form.rb | 8 + .../forms/saml/providers/metadata_xml_form.rb | 8 + modules/auth_saml/app/models/saml/provider.rb | 1 + .../app/services/saml/metadata_document.rb | 152 ++++++ .../app/services/saml/metadata_fetcher.rb | 69 +++ .../services/saml/update_metadata_service.rb | 16 +- modules/auth_saml/config/locales/en.yml | 8 + .../spec/fixtures/federation_metadata.xml | 443 ++++++++++++++++++ .../services/saml/metadata_document_spec.rb | 141 ++++++ .../services/saml/metadata_fetcher_spec.rb | 97 ++++ .../saml/update_metadata_service_spec.rb | 23 +- 12 files changed, 961 insertions(+), 7 deletions(-) create mode 100644 modules/auth_saml/app/services/saml/metadata_document.rb create mode 100644 modules/auth_saml/app/services/saml/metadata_fetcher.rb create mode 100644 modules/auth_saml/spec/fixtures/federation_metadata.xml create mode 100644 modules/auth_saml/spec/services/saml/metadata_document_spec.rb create mode 100644 modules/auth_saml/spec/services/saml/metadata_fetcher_spec.rb diff --git a/modules/auth_saml/app/contracts/saml/providers/base_contract.rb b/modules/auth_saml/app/contracts/saml/providers/base_contract.rb index eaee4f8e5d5..834e1c6ee19 100644 --- a/modules/auth_saml/app/contracts/saml/providers/base_contract.rb +++ b/modules/auth_saml/app/contracts/saml/providers/base_contract.rb @@ -47,6 +47,8 @@ module Saml url: { allow_blank: true, allow_nil: true, schemes: %w[http https] }, if: -> { model.metadata_url_changed? } + attribute :idp_entity_id + attribute :idp_sso_service_url validates :idp_sso_service_url, url: { schemes: %w[http https] }, diff --git a/modules/auth_saml/app/forms/saml/providers/metadata_url_form.rb b/modules/auth_saml/app/forms/saml/providers/metadata_url_form.rb index 4be72e20603..e3e7c47325d 100644 --- a/modules/auth_saml/app/forms/saml/providers/metadata_url_form.rb +++ b/modules/auth_saml/app/forms/saml/providers/metadata_url_form.rb @@ -40,6 +40,14 @@ module Saml caption: I18n.t("saml.instructions.metadata_url"), input_width: :xlarge ) + f.text_field( + name: :idp_entity_id, + label: I18n.t("activerecord.attributes.saml/provider.idp_entity_id"), + required: false, + disabled: provider.seeded_from_env?, + caption: I18n.t("saml.instructions.idp_entity_id"), + input_width: :xlarge + ) end end end diff --git a/modules/auth_saml/app/forms/saml/providers/metadata_xml_form.rb b/modules/auth_saml/app/forms/saml/providers/metadata_xml_form.rb index 51024a6dc1c..f4ecd4425fc 100644 --- a/modules/auth_saml/app/forms/saml/providers/metadata_xml_form.rb +++ b/modules/auth_saml/app/forms/saml/providers/metadata_xml_form.rb @@ -42,6 +42,14 @@ module Saml rows: 10, input_width: :medium ) + f.text_field( + name: :idp_entity_id, + label: I18n.t("activerecord.attributes.saml/provider.idp_entity_id"), + required: false, + disabled: provider.seeded_from_env?, + caption: I18n.t("saml.instructions.idp_entity_id"), + input_width: :xlarge + ) end end end diff --git a/modules/auth_saml/app/models/saml/provider.rb b/modules/auth_saml/app/models/saml/provider.rb index e9aeae7fc51..1843c2e81e7 100644 --- a/modules/auth_saml/app/models/saml/provider.rb +++ b/modules/auth_saml/app/models/saml/provider.rb @@ -11,6 +11,7 @@ module Saml store_attribute :options, :metadata_xml, :string store_attribute :options, :last_metadata_update, :datetime + store_attribute :options, :idp_entity_id, :string store_attribute :options, :idp_sso_service_url, :string store_attribute :options, :idp_slo_service_url, :string diff --git a/modules/auth_saml/app/services/saml/metadata_document.rb b/modules/auth_saml/app/services/saml/metadata_document.rb new file mode 100644 index 00000000000..5d7855d46c9 --- /dev/null +++ b/modules/auth_saml/app/services/saml/metadata_document.rb @@ -0,0 +1,152 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +module Saml + # Prepares SAML metadata XML for parsing by ruby-saml. + # + # Federation aggregates MAY contain thousands of individual entities. + # Using ruby-saml directly would load the full document into REXML, which is extremely slow. + # This class streams the XML and tries to extract the matching single EntityDescriptor when we can. + class MetadataDocument + class MetadataTooLargeError < StandardError; end + + class FederationMetadataError < StandardError; end + + MAX_SIZE = 150.megabytes + + def self.prepare(source, entity_id: nil) + new(source, entity_id:).prepare + end + + def initialize(source, entity_id: nil) + @source = source + @entity_id = entity_id.presence + end + + def prepare + if aggregate? + read_entity_fragment! + else + read_all + end + end + + def read_entity_fragment! + fragment = extract_entity_fragment + if fragment.nil? + message = + if @entity_id + "Entity '#{@entity_id}' not found in federation aggregate" + else + "No identity provider found in federation aggregate" + end + raise FederationMetadataError, message + end + + fragment + end + + # Decide whether the document is a federation aggregate by inspecting its root element. + # Using +Nokogiri::XML::Reader+, we only advance to the root element and stop based on it. + def aggregate? + with_reader_io do |io| + Nokogiri::XML::Reader(io).each do |node| + next unless node.node_type == Nokogiri::XML::Reader::TYPE_ELEMENT + + return node.local_name == "EntitiesDescriptor" + end + end + + false + end + + private + + def extract_entity_fragment + if @entity_id + find_entity_by_id + else + find_first_idp_entity + end + end + + # We try to prevent calling outer_xml on all entities when looking. + # Instead, we can only look at entityID attribute until the target is found, + # and then call outer_xml only on that fragment. + def find_entity_by_id + with_reader_io do |io| + Nokogiri::XML::Reader(io).each do |node| + next unless entity_descriptor_element?(node) + next unless node.attribute("entityID") == @entity_id + + return node.outer_xml + end + end + + nil + end + + def find_first_idp_entity + with_reader_io do |io| + Nokogiri::XML::Reader(io).each do |node| + next unless entity_descriptor_element?(node) + + fragment = node.outer_xml + return fragment if idp_descriptor_fragment?(fragment) + end + end + + nil + end + + def idp_descriptor_fragment?(fragment) + Nokogiri::XML.fragment(fragment).at_xpath(".//*[local-name()='IDPSSODescriptor']").present? + end + + def entity_descriptor_element?(node) + node.node_type == Nokogiri::XML::Reader::TYPE_ELEMENT && node.local_name == "EntityDescriptor" + end + + def read_all + return @source if @source.is_a?(String) + + with_reader_io(&:read) + end + + def with_reader_io(&) + if @source.is_a?(String) + StringIO.open(@source, &) + else + @source.rewind + yield @source + end + end + end +end diff --git a/modules/auth_saml/app/services/saml/metadata_fetcher.rb b/modules/auth_saml/app/services/saml/metadata_fetcher.rb new file mode 100644 index 00000000000..32711f7e4fd --- /dev/null +++ b/modules/auth_saml/app/services/saml/metadata_fetcher.rb @@ -0,0 +1,69 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +module Saml + class MetadataFetcher + include ActionView::Helpers::NumberHelper + + def self.fetch(url, &) + new(url).fetch(&) + end + + def initialize(url) + @url = url + end + + def fetch + Tempfile.create("saml-metadata") do |file| + file.binmode + + OpenProject::SsrfProtection.get(@url) do |response| + unless response.is_a?(Net::HTTPSuccess) + raise OneLogin::RubySaml::HttpError, + "Failed to fetch idp metadata: #{response.code}: #{response.message}" + end + + bytes_written = 0 + response.read_body do |chunk| + file.write(chunk) + bytes_written += chunk.bytesize + if bytes_written > MetadataDocument::MAX_SIZE + raise MetadataDocument::MetadataTooLargeError, + "Metadata exceeds max size of #{number_to_human_size(MetadataDocument::MAX_SIZE, precision: 2)}" + end + end + end + + file.rewind + yield file + end + end + end +end diff --git a/modules/auth_saml/app/services/saml/update_metadata_service.rb b/modules/auth_saml/app/services/saml/update_metadata_service.rb index 3bb26271904..aff7267ec1f 100644 --- a/modules/auth_saml/app/services/saml/update_metadata_service.rb +++ b/modules/auth_saml/app/services/saml/update_metadata_service.rb @@ -39,8 +39,14 @@ module Saml @provider = provider end - def call + def call # rubocop:disable Metrics/AbcSize apply_metadata(merge_certificates(fetch_metadata)) + rescue MetadataDocument::FederationMetadataError => e + OpenProject.logger.error(e) + ServiceResult.failure(result: provider, message: I18n.t("saml.metadata_parser.federation_metadata")) + rescue MetadataDocument::MetadataTooLargeError => e + OpenProject.logger.error(e) + ServiceResult.failure(result: provider, message: I18n.t("saml.metadata_parser.metadata_too_large")) rescue StandardError => e OpenProject.logger.error(e) ServiceResult.failure(result: provider, @@ -69,12 +75,16 @@ module Saml end def parse_xml - parser_instance.parse_to_hash(provider.metadata_xml) + xml = MetadataDocument.prepare(provider.metadata_xml, entity_id: provider.idp_entity_id) + parser_instance.parse_to_hash(xml) end def parse_url validate_metadata_url_host! - parser_instance.parse_remote_to_hash(provider.metadata_url) + MetadataFetcher.fetch(provider.metadata_url) do |file| + xml = MetadataDocument.prepare(file, entity_id: provider.idp_entity_id) + parser_instance.parse_to_hash(xml) + end end def validate_metadata_url_host! diff --git a/modules/auth_saml/config/locales/en.yml b/modules/auth_saml/config/locales/en.yml index 2ac0332c26e..611a4e662dd 100644 --- a/modules/auth_saml/config/locales/en.yml +++ b/modules/auth_saml/config/locales/en.yml @@ -12,6 +12,7 @@ en: sp_entity_id: Service entity ID metadata_url: Identity provider metadata URL name_identifier_format: Name identifier format + idp_entity_id: Identity provider entity ID idp_sso_service_url: Identity provider login endpoint idp_slo_service_url: Identity provider logout endpoint idp_cert: Public certificate of identity provider @@ -43,6 +44,10 @@ en: success: "Successfully updated the configuration using the identity provider metadata." invalid_url: "Provided metadata URL is invalid. Provide a HTTP(s) URL." error: "Failed to retrieve the identity provider metadata: %{error}" + federation_metadata: > + The metadata URL points to a federation aggregate (many identity providers). + Use your institution's direct metadata URL, or enter your institution's IdP entity ID in the metadata form and try again. + metadata_too_large: "The metadata file exceeds the maximum allowed size." providers: label_empty_title: "No SAML providers configured yet." label_empty_description: "Add a provider to see them here." @@ -107,6 +112,9 @@ en: Your identity provider does not have a metadata endpoint or XML download option. You can configure it manually. metadata_url: > Your identity provider provides a metadata URL. + idp_entity_id: > + Optional: Useful when the metadata URL points to a federation aggregate with a lot of entries. + Enter the entity ID of your institution's identity provider. Leave blank for single-entity metadata URLs. metadata_xml: > Your identity provider provides a metadata XML download. limit_self_registration: > diff --git a/modules/auth_saml/spec/fixtures/federation_metadata.xml b/modules/auth_saml/spec/fixtures/federation_metadata.xml new file mode 100644 index 00000000000..7ab347030a6 --- /dev/null +++ b/modules/auth_saml/spec/fixtures/federation_metadata.xml @@ -0,0 +1,443 @@ + + + + + + + + + + State University Portal + Student and staff portal of State University + + + + + + MIIDKzCCAhOgAwIBAgIUNKP1WT7mAMRllZ3z8EDR2to1VNYwDQYJKoZIhvcNAQELBQAwJTEjMCEG +A1UEAwwaaWRwLmV4YW1wbGUtdW5pdmVyc2l0eS5lZHUwHhcNMjYwNjAzMDg1NDI3WhcNMzYwNTMx +MDg1NDI3WjAlMSMwIQYDVQQDDBppZHAuZXhhbXBsZS11bml2ZXJzaXR5LmVkdTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAK+dgrVLuW+JCM2ST/SfA1J8XX3aCgtuU18Z1Xb8PcmMjQCJ +Ow0PDIApqp/JJAyt7KDiv8cgJgAmPMGbVQpcmMcOInBu+AvTsndagVqV7V3ePLwN/WOm+NPVoB2g +EEYGhF32gwZSQ0SHtJphxy4KoJv8CspVWRTviFU/pi1t8HsWJBLW6U6Jb7eLySM/G//6AFWFULdH +GImkAk/9BfT7iCINYHsOW0MO237UKw90qShxtFCB/fqPRC6eldC2kFkod9eIw9x7cMuH74QGVsCd +XAv+HUUtd6ov8Vn0xwaDiDxneXgKEBMwdVl97B+s9egUuif2TuMSYF09Qx7KREyayC0CAwEAAaNT +MFEwHQYDVR0OBBYEFHh0ON9CYmfpcEQYlxixtd6kkmHVMB8GA1UdIwQYMBaAFHh0ON9CYmfpcEQY +lxixtd6kkmHVMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBABSLwFVGf8L9+alT +RU3n3D+vyUOvb5zb3hMER3WN0p323nQyeZ7WVSfIy3vsD2PcdsDinYpM9NV9P5zU+11PgAMRwqGv +UnQLbklJ3d/5ciwdCVPUk+/c8pVwOnrCa5D6m1C8Or4Pnoxihz7sdmGoaGXdlrDhcwzosKx/AcT1 +aJNor+3SzkXJLzNfrYypBeUS8XzlzH3lTY+J1aYrfzXNK06XPCMlckKVL4nFVe0yDrSUk9DiLojy +b90TaOSCqAGzoecoV8MOCxef6EvFgHmPpq8oMycWal4Ud2zdugUOtnNWxUVvWS15L7O7VG1eley/z +UrWMUi2pWJ1Gk1NAFs8/0A= + + + + + + + State University + State University + https://www.state-university.edu + + + Alex + Smith + mailto:asmith@state-university.edu + + + + + + + + + + + Tech Institute Library + Electronic resources portal for Tech Institute staff + + + + + + MIIDKzCCAhOgAwIBAgIUNKP1WT7mAMRllZ3z8EDR2to1VNYwDQYJKoZIhvcNAQELBQAwJTEjMCEG +A1UEAwwaaWRwLmV4YW1wbGUtdW5pdmVyc2l0eS5lZHUwHhcNMjYwNjAzMDg1NDI3WhcNMzYwNTMx +MDg1NDI3WjAlMSMwIQYDVQQDDBppZHAuZXhhbXBsZS11bml2ZXJzaXR5LmVkdTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAK+dgrVLuW+JCM2ST/SfA1J8XX3aCgtuU18Z1Xb8PcmMjQCJ +Ow0PDIApqp/JJAyt7KDiv8cgJgAmPMGbVQpcmMcOInBu+AvTsndagVqV7V3ePLwN/WOm+NPVoB2g +EEYGhF32gwZSQ0SHtJphxy4KoJv8CspVWRTviFU/pi1t8HsWJBLW6U6Jb7eLySM/G//6AFWFULdH +GImkAk/9BfT7iCINYHsOW0MO237UKw90qShxtFCB/fqPRC6eldC2kFkod9eIw9x7cMuH74QGVsCd +XAv+HUUtd6ov8Vn0xwaDiDxneXgKEBMwdVl97B+s9egUuif2TuMSYF09Qx7KREyayC0CAwEAAaNT +MFEwHQYDVR0OBBYEFHh0ON9CYmfpcEQYlxixtd6kkmHVMB8GA1UdIwQYMBaAFHh0ON9CYmfpcEQY +lxixtd6kkmHVMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBABSLwFVGf8L9+alT +RU3n3D+vyUOvb5zb3hMER3WN0p323nQyeZ7WVSfIy3vsD2PcdsDinYpM9NV9P5zU+11PgAMRwqGv +UnQLbklJ3d/5ciwdCVPUk+/c8pVwOnrCa5D6m1C8Or4Pnoxihz7sdmGoaGXdlrDhcwzosKx/AcT1 +aJNor+3SzkXJLzNfrYypBeUS8XzlzH3lTY+J1aYrfzXNK06XPCMlckKVL4nFVe0yDrSUk9DiLojy +b90TaOSCqAGzoecoV8MOCxef6EvFgHmPpq8oMycWal4Ud2zdugUOtnNWxUVvWS15L7O7VG1eley/z +UrWMUi2pWJ1Gk1NAFs8/0A= + + + + + + + Tech Institute + Tech Institute + https://www.tech-institute.ac.uk + + + Jamie + Taylor + mailto:jtaylor@tech-institute.ac.uk + + + + + + + + + + + Research Center Data Portal + Scientific data access portal + + + + + + MIIDKzCCAhOgAwIBAgIUNKP1WT7mAMRllZ3z8EDR2to1VNYwDQYJKoZIhvcNAQELBQAwJTEjMCEG +A1UEAwwaaWRwLmV4YW1wbGUtdW5pdmVyc2l0eS5lZHUwHhcNMjYwNjAzMDg1NDI3WhcNMzYwNTMx +MDg1NDI3WjAlMSMwIQYDVQQDDBppZHAuZXhhbXBsZS11bml2ZXJzaXR5LmVkdTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAK+dgrVLuW+JCM2ST/SfA1J8XX3aCgtuU18Z1Xb8PcmMjQCJ +Ow0PDIApqp/JJAyt7KDiv8cgJgAmPMGbVQpcmMcOInBu+AvTsndagVqV7V3ePLwN/WOm+NPVoB2g +EEYGhF32gwZSQ0SHtJphxy4KoJv8CspVWRTviFU/pi1t8HsWJBLW6U6Jb7eLySM/G//6AFWFULdH +GImkAk/9BfT7iCINYHsOW0MO237UKw90qShxtFCB/fqPRC6eldC2kFkod9eIw9x7cMuH74QGVsCd +XAv+HUUtd6ov8Vn0xwaDiDxneXgKEBMwdVl97B+s9egUuif2TuMSYF09Qx7KREyayC0CAwEAAaNT +MFEwHQYDVR0OBBYEFHh0ON9CYmfpcEQYlxixtd6kkmHVMB8GA1UdIwQYMBaAFHh0ON9CYmfpcEQY +lxixtd6kkmHVMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBABSLwFVGf8L9+alT +RU3n3D+vyUOvb5zb3hMER3WN0p323nQyeZ7WVSfIy3vsD2PcdsDinYpM9NV9P5zU+11PgAMRwqGv +UnQLbklJ3d/5ciwdCVPUk+/c8pVwOnrCa5D6m1C8Or4Pnoxihz7sdmGoaGXdlrDhcwzosKx/AcT1 +aJNor+3SzkXJLzNfrYypBeUS8XzlzH3lTY+J1aYrfzXNK06XPCMlckKVL4nFVe0yDrSUk9DiLojy +b90TaOSCqAGzoecoV8MOCxef6EvFgHmPpq8oMycWal4Ud2zdugUOtnNWxUVvWS15L7O7VG1eley/z +UrWMUi2pWJ1Gk1NAFs8/0A= + + + + + + + Research Center + Research Center + https://www.research-center.de + + + Maria + Weber + mailto:mweber@research-center.de + + + + + + + + + + + + + State University + Identity provider of State University + https://www.state-university.edu + + + + + + MIIDJzCCAg+gAwIBAgIULPAnn8haVhQcUbxjrZLjtbFX5RkwDQYJKoZIhvcNAQELBQAwIzEhMB8G +A1UEAwwYaWRwLnN0YXRlLXVuaXZlcnNpdHkuZWR1MB4XDTI2MDYwMzA4NTQ0OVoXDTM2MDUzMTA4 +NTQ0OVowIzEhMB8GA1UEAwwYaWRwLnN0YXRlLXVuaXZlcnNpdHkuZWR1MIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEAwo21vefLRM/2iK6LO4Sbl++0h+zrLuSSusY/0Wu3QjPAGklaqzQ0j +Dc2jbY5bXei4ebWuGxT5PCqPOFIaTQM8uJ5q7uVAo06ab6/uSfwjDJTNE7jokhMeilNh4GuoWTsb +CyGMDUbSdfTNTDCC/ELoWlTCErce+TuIZulG8Jzmmm3AKTmMjOW+Ch3HMLoKCmEyniKs7m0eB7Az +298bFCFKp0dpqkfre5U5WTYeFe39RBbZfDPl0bN0UxF1T7ITOf6tkryXPJXfQAnXDiCnB22A936M +5ou1XFTozkE8RBbgOjq34zBbM0V69rPnhh0yqFDIVUVtULcgyJQEIB5qpigDQIDAQABo1MwUTAdBg +NVHQ4EFgQUQ4UIhO5Q3RmegmL27mKP0j5QJQ4wHwYDVR0jBBgwFoAUQ4UIhO5Q3RmegmL27mKP0j +5QJQ4wDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEALUR5WnK0mbu2lPO6CXd7LTs +IcRdEq/qXRQC+KqofuS5dyZ0N2ip0zD50tG6y8YjWQHERQ89+ZEKv5VmD9+k4PnZpNfVjfmyeivq +bWohIn/0iNAUNmY/bam0qbz8SCiLPLVrKvu9BAGWcoV7UX9zf+qe+NNT8z1bFVR3+WcnnO/AEWyu +UVab0ud6HYp5xc36Jj3e98T50h5OaXpQpwfyuM7/p4WX3Ri5FRa0tNxlAy685cuL6B5zrbUOoc+Q +sc3FqNtGFM/TExrW9VY/kRQVDpuhqv/eUO7RfQJmv1FBhP+XMdXUudJ6aNFswI0P1UO/H9YGm93U +CXnNW8NGo/MwFSg== + + + + + urn:oasis:names:tc:SAML:2.0:nameid-format:transient + urn:oasis:names:tc:SAML:2.0:nameid-format:persistent + + + + + State University + State University + https://www.state-university.edu + + + Alex + Smith + mailto:asmith@state-university.edu + + + + + + + + + + + Tech Institute + Identity provider of Tech Institute + https://www.tech-institute.ac.uk + + + + + + MIIDJzCCAg+gAwIBAgIUFozhkEI22FNzfgPfPg6tXhOCsLMwDQYJKoZIhvcNAQELBQAwIzEhMB8G +A1UEAwwYaWRwLnRlY2gtaW5zdGl0dXRlLmFjLnVrMB4XDTI2MDYwMzA4NTQ0OVoXDTM2MDUzMTA4 +NTQ0OVowIzEhMB8GA1UEAwwYaWRwLnRlY2gtaW5zdGl0dXRlLmFjLnVrMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEAodVdylnMKJ5d3p7vZqX4za/12IJVI7/Xsyi7S1UxfB52vktX9EZo +IxqO9GLMe9lIrHFOB8jU1I7BdYp8r0E4mo44YYikncOMKNaOuHF5J1WaJOUZd807jriGO9agZor9 +AmABRpl3w/WYVL9OZPj1mHngQPWaVcosM3OkxXwdULPdcxfe3VATHcNWi7uoLZsB0hpBwua47ldS +wThmZkVNjdjlD0BRiUCSynFtSY2vGxHz+D/aBvYhrGlBX4uTPCOxqybyC3dfadD9ZlvLfY0d1Yic +ZvNEybP8bPcu8xUwnsyL6bBsdat7/XXbawOsxEXxSR9wcv42ZfgKmKyTyUdpLQIDAQABo1MwUTAd +BgNVHQ4EFgQUDVmR5rn9fYj2XkwffcZAwCWKvfowHwYDVR0jBBgwFoAUDVmR5rn9fYj2XkwffcZA +wCWKvfowDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAnVbAE4SsEYhodobnZEWGu +z/747XH/m7DM9KM4lvKq6QOd/C/aJ7Lp9nwfl1gXIHdwdYozlOpak2+zfVFFbepvDOldldpScJzZ +sC+80PTta+h91OTug6Q+viRJV/OzQPozLJ6jz5Tox8dYn7T2XIfmM49jX+tAR861QopVaHLmZ3Lg +EHzsk+aIV6I6yyJfBmpy4+tO5OhKv3UHLCHmo7NPVhiX+pxe3+XCghdRtKMFCB9gwqJxYoybHb+a +NrbgZmhp6hjzd9tsFQDMSdkCSTHWCaqua5Hi4EfMIR75SKxUZvrCkTe4FOa+rG5bq26vdeKBZUCs +sd+OCMN3dWtH446Lf7Gw== + + + + + urn:oasis:names:tc:SAML:2.0:nameid-format:transient + + + + + Tech Institute + Tech Institute + https://www.tech-institute.ac.uk + + + Jamie + Taylor + mailto:jtaylor@tech-institute.ac.uk + + + + + + + + + + + Research Center + Identity provider of Research Center + https://www.research-center.de + + + + + + MIIDIzCCAgugAwIBAgIUcxlF9USQY3nQvvO8uqXJL7C8/XgwDQYJKoZIhvcNAQELBQAwITEfMB0G +A1UEAwwWaWRwLnJlc2VhcmNoLWNlbnRlci5kZTAeFw0yNjA2MDMwODU0NDlaFw0zNjA1MzEwODU0 +NDlaMCExHzAdBgNVBAMMFmlkcC5yZXNlYXJjaC1jZW50ZXIuZGUwggEiMA0GCSqGSIb3DQEBAQUA +A4IBDwAwggEKAoIBAQDPxGQuYQjgdNedu3dgelQQ5t+1SxM4an4xQav4rXqG2ZtmEmDS3WDfy7Kc +RKtSfW/6+zWmNUd6wQQnc+3VgnmOb+qRTSh9XCD3WFSrr/hG0HfrmzKtjo4nYK5gWLdXQwgwznu +R40IOxsKEEtkp2UgkFLMAtGjJ15Kyu6J3eV8MIpB468G+mXXXhbLw7y8uB+cyCTWGsG1aa1ahmZS +Rz7K9H1TafUSuarUis/+oXZO9+YJHNEi9iU4U6h9iTlqPkly146FefQlHsBys7T0Es46aIqiaCMC +ygCDxhKK4Rwf0E67I9QMFbTW1y8LF5hKs42NBzcf46iAkwYgPzisbqZtLAgMBAAGjUzBRMB0GA1Ud +DgQWBBSfqZUJOP+vllNKi2xk3Lbo8St4sDAfBgNVHSMEGDAWgBSfqZUJOP+vllNKi2xk3Lbo8St4 +sDAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQBAJPRIMKcogeICnsF2pfca25Gln +5w13G95as+du3wx5ZVqQLH+JYLKcM6Uq7FVvWIrBwbOjCa9FEyUs1lATOtTkCZ3q05X/sw+sGMXI +r8H/vkDhOPkwIlKRaSRJHCBGN3xk8lUxev6fwwlU3Ht0fQEiOAWlc9N231wDYFDIAXmJbN/tG3/l +OfJUT1MXHdWe7QuJzmwLQ9OXogfdV2SskSQSqH9MKYcQ+qADc1lf0J0Or0GKSLvjz8YPLkwhXLGr +NhM+VyjD50hrg0DkUtco/8RTnkC3FkAvI/6WjpSiejpjW8Muh3rRAzxnfA9FQV0S0YXmlb/isM/l +Z6NiIkQ/8eB + + + + + urn:oasis:names:tc:SAML:2.0:nameid-format:transient + + + + + Research Center + Research Center + https://www.research-center.de + + + Maria + Weber + mailto:mweber@research-center.de + + + + + + + + + + + National Laboratory + Laboratoire National + Identity provider of National Laboratory + https://www.national-lab.fr + + + + + + MIIDHTCCAgWgAwIBAgIUUl2dXqMr4hJ6wf4fj/GOQlZAcpEwDQYJKoZIhvcNAQELBQAwHjEcMBoG +A1UEAwwTaWRwLm5hdGlvbmFsLWxhYi5mcjAeFw0yNjA2MDMwODU0NDlaFw0zNjA1MzEwODU0NDla +MB4xHDAaBgNVBAMME2lkcC5uYXRpb25hbC1sYWIuZnIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQDAlY882lrAlhuadc5xMT6U8ELf5zH7adGzGjtP76Kx9SLYewDASPXY7nXUx3aM2kqs +o+MWX0iaVpnWYvV+LMFyH6Mg/12pZhRx8S/cQysYEV3loWVSi3lESkOK9ELR2BeWOrYyZtk3Pz3q +AJ/BoSFegxe7OxC866m20LMKG9sDBB88i9svxmxXYxSR/HkAEfarSruk37aLOD++Iud+FBfJvRJR +174MZj6gecIsGcXy2Zn41WLgjGl3/sWUK27SWoa9Up5vDTIeQ8lZ5ySbRT58M+eHCOxSVf/gFf7s +49+v5i/9iDKDMo5Hy+MDbdovUaDo6KQmiPg6cfzqT52AT39lAgMBAAGjUzBRMB0GA1UdDgQWBBTj +Gvmk9xkzVe57Cte2KOEnf3k2hzAfBgNVHSMEGDAWgBTjGvmk9xkzVe57Cte2KOEnf3k2hzAPBgNV +HRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQAMvHuuB2KGKl0n7d0MtJ2/fzKtJmJMMja2 +o1Mqj/rg2Nkq31wrFdXqayxypYDSXQgLoABkWYyZkWIhoWOnml2J9bUDJ8uYLulp4VbNZnAylAS5 +9hu/35ZEc9hmUrm9Q8JaevKdULneiIiR2R269oqf0QEJgF26ZzEEodH0oj7ZNOOuF2OXy+8R893Y +DSnLHCEtW6uZWjEQTsfbGVcppvYYho6/K0/saO0IPb1/LZ8z1uB7CWbsn5KRnqR0AvT2+R5xlIxE +k7uWFpPOkdfgfnJ9UbfN2tgDyiieyME3PZZ5sjGWs/StRfnt/z9FeB00T3chiF4ldtuIysmUFDLu +3fm5 + + + + + urn:oasis:names:tc:SAML:2.0:nameid-format:transient + urn:oasis:names:tc:SAML:2.0:nameid-format:persistent + + + + + National Laboratory + National Laboratory + https://www.national-lab.fr + + + Sophie + Martin + mailto:smartin@national-lab.fr + + + + + + + + + + + Polytechnic University + Universidade Politécnica + Identity provider of Polytechnic University + https://www.polytechnic.edu.br + + + + + + MIIDIzCCAgugAwIBAgIUcX6lAS/Bq/lth/N/EA1dj6b7aI4wDQYJKoZIhvcNAQELBQAwITEfMB0G +A1UEAwwWaWRwLnBvbHl0ZWNobmljLmVkdS5icjAeFw0yNjA2MDMwODU0NDlaFw0zNjA1MzEwODU0 +NDlaMCExHzAdBgNVBAMMFmlkcC5wb2x5dGVjaG5pYy5lZHUuYnIwggEiMA0GCSqGSIb3DQEBAQUA +A4IBDwAwggEKAoIBAQDgmBYTodZcgpqaimV8nFH/YH6I6Y2euIgEIIPTHVboHUXAgErOrSU1jzjF +2S1UX7uHiyg00GSJyQPBPn2i73nTplDSyj0TzmcDdI2uWyY8kygozuGrsjVv7T+krTswlCYD+GhF +09VK18Gk8VHX0DB/5GFFB03yORHSOi0MieJ5cIWNxDpSaj3UJyVnZdvA9jfxvJKIjVE3niNG82Gc +Y70VglYRr5Gm814eDAYxhfqJNfSZxKowCmxrcTiKRN/E/hrEzFAYxXaCsyaO5WYs49+IOt2pNkJH +t86ErHQEKjTF3sf10WsN9UzYz1zv74b6sqfT8GztSjmI7XcDN36ZooJBAgMBAAGjUzBRMB0GA1Ud +DgQWBBTF0YvxRtWXlt/f1Y3//c6aX/gxxzAfBgNVHSMEGDAWgBTF0YvxRtWXlt/f1Y3//c6aX/gx +xzAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQDVu6t9PvJ7ewKeJ05q7sFdNw9k +MEjDdim/m3Y6j31YGjSdBXmKnaH898hliATkgv7EnzgFkCT45NtT8aX1pETDEl9kgxL/TjhdwdHK +1q+Skou1NmJM+Zd7Zm8yvreA7Gj+YTiTL2iF4jeRTR+k04KZaQCLMgoxTQNgF/uxlitapX2+L+d +IyTikGTkfINXNRjhvx2t3rUqJoxn/bl1qM6uS4A/R5aOne6xve5Kd+lyUCOxB/TZuHpDZgB6O1FT +03HXTn4lmoCIiCPsjXhXqQOgTq+g8JPMUYtGAi4diNF+CWcD9Zv/1rdqCuGlk1O105HRIPcST5LF +4MzCa1nJBoVPj + + + + + urn:oasis:names:tc:SAML:2.0:nameid-format:transient + + + + + Polytechnic University + Polytechnic University + https://www.polytechnic.edu.br + + + Carlos + Silva + mailto:csilva@polytechnic.edu.br + + + + diff --git a/modules/auth_saml/spec/services/saml/metadata_document_spec.rb b/modules/auth_saml/spec/services/saml/metadata_document_spec.rb new file mode 100644 index 00000000000..3f7073a2e58 --- /dev/null +++ b/modules/auth_saml/spec/services/saml/metadata_document_spec.rb @@ -0,0 +1,141 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +require "spec_helper" + +RSpec.describe Saml::MetadataDocument do + # Fixture: 3 SPs then 5 IdPs — see spec/fixtures/federation_metadata.xml + let(:federation_xml) { Rails.root.join("modules/auth_saml/spec/fixtures/federation_metadata.xml").read } + + # Minimal single EntityDescriptor — not an aggregate, so prepare returns it unchanged + let(:single_idp_xml) do + <<~XML + + + + + + XML + end + + # Entity IDs present in the fixture + let(:first_idp_entity_id) { "https://idp.state-university.edu/idp/shibboleth" } + let(:last_idp_entity_id) { "https://idp.polytechnic.edu.br/idp/shibboleth" } + let(:sp_entity_id) { "https://sp.state-university.edu/shibboleth" } + + describe ".prepare on a single-entity document" do + it "returns the XML unchanged" do + result = described_class.prepare(single_idp_xml) + expect(result).to eq(single_idp_xml) + end + end + + describe ".prepare on a federation aggregate" do + it "detects the aggregate" do + expect(described_class.new(federation_xml).aggregate?).to be(true) + end + + context "without an entity_id" do + it "returns the first IdP entity, skipping SP-only entries" do + result = described_class.prepare(federation_xml) + + expect(result).to include(first_idp_entity_id) + expect(result).to include("IDPSSODescriptor") + expect(result).not_to include("SPSSODescriptor") + end + end + + context "with a matching entity_id" do + it "extracts the requested IdP" do + result = described_class.prepare(federation_xml, entity_id: last_idp_entity_id) + + expect(result).to include(last_idp_entity_id) + expect(result).to include("IDPSSODescriptor") + end + + it "can also extract an SP entity by entity_id" do + result = described_class.prepare(federation_xml, entity_id: sp_entity_id) + + expect(result).to include(sp_entity_id) + expect(result).to include("SPSSODescriptor") + end + end + + context "with an entity_id not present in the aggregate" do + it "raises FederationMetadataError with the missing entity_id in the message" do + expect do + described_class.prepare(federation_xml, entity_id: "https://missing.example.com/idp/shibboleth") + end.to raise_error(described_class::FederationMetadataError, /missing\.example\.com/) + end + end + + context "when the aggregate contains no IdPs and no entity_id is given" do + let(:sp_only_aggregate) do + <<~XML + + + + + + XML + end + + it "raises FederationMetadataError" do + expect do + described_class.prepare(sp_only_aggregate) + end.to raise_error(described_class::FederationMetadataError) + end + end + end + + describe ".prepare on an IO source (Tempfile)" do + it "reads a single-entity file correctly" do + Tempfile.create("spec-metadata") do |f| + f.write(single_idp_xml) + f.rewind + expect(described_class.prepare(f)).to eq(single_idp_xml) + end + end + + it "extracts the first IdP from a federation aggregate file" do + Tempfile.create("spec-metadata") do |f| + f.write(federation_xml) + f.rewind + result = described_class.prepare(f) + expect(result).to include(first_idp_entity_id) + expect(result).to include("IDPSSODescriptor") + end + end + end +end diff --git a/modules/auth_saml/spec/services/saml/metadata_fetcher_spec.rb b/modules/auth_saml/spec/services/saml/metadata_fetcher_spec.rb new file mode 100644 index 00000000000..0a989534c01 --- /dev/null +++ b/modules/auth_saml/spec/services/saml/metadata_fetcher_spec.rb @@ -0,0 +1,97 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +require "spec_helper" + +RSpec.describe Saml::MetadataFetcher do + let(:url) { "https://example.com/metadata" } + let(:response) { instance_double(Net::HTTPSuccess) } + + before do + allow(response).to receive(:is_a?).with(Net::HTTPSuccess).and_return(true) + allow(OpenProject::SsrfProtection).to receive(:get).and_yield(response) + end + + describe ".fetch" do + context "with a successful response" do + before do + allow(response).to receive(:read_body).and_yield("") + end + + it "yields a file with the response body rewound to the start" do + described_class.fetch(url) do |file| + expect(file).to be_a(File) + expect(file.pos).to eq(0) + expect(file.read).to eq("") + end + end + + it "removes the tempfile after the block" do + path = nil + described_class.fetch(url) do |file| + path = file.path + expect(File.exist?(path)).to be(true) + end + expect(File.exist?(path)).to be(false) + end + end + + context "when the response is not successful" do + let(:response) { instance_double(Net::HTTPNotFound, code: "404", message: "Not Found") } + + before do + allow(response).to receive(:is_a?).with(Net::HTTPSuccess).and_return(false) + allow(OpenProject::SsrfProtection).to receive(:get).and_yield(response) + end + + it "raises HttpError without yielding" do + yielded = false + expect do + described_class.fetch(url) { yielded = true } + end.to raise_error(OneLogin::RubySaml::HttpError, /404/) + expect(yielded).to be(false) + end + end + + context "when the response body exceeds MAX_SIZE" do + before do + allow(response).to receive(:read_body).and_yield("x" * (Saml::MetadataDocument::MAX_SIZE + 1)) + end + + it "raises MetadataTooLargeError without yielding" do + yielded = false + expect do + described_class.fetch(url) { yielded = true } + end.to raise_error(Saml::MetadataDocument::MetadataTooLargeError) + expect(yielded).to be(false) + end + end + end +end diff --git a/modules/auth_saml/spec/services/saml/update_metadata_service_spec.rb b/modules/auth_saml/spec/services/saml/update_metadata_service_spec.rb index 342d894b2a3..bc2c9ac1f47 100644 --- a/modules/auth_saml/spec/services/saml/update_metadata_service_spec.rb +++ b/modules/auth_saml/spec/services/saml/update_metadata_service_spec.rb @@ -231,22 +231,37 @@ RSpec.describe Saml::UpdateMetadataService do let(:metadata_url) { "https://example.com/metadata" } let(:provider) { Saml::Provider.new(metadata_url:) } let(:parser_instance) { instance_double(OneLogin::RubySaml::IdpMetadataParser) } + let(:http_response) { instance_double(Net::HTTPSuccess) } before do allow(OneLogin::RubySaml::IdpMetadataParser).to receive(:new).and_return(parser_instance) - allow(parser_instance).to receive(:parse_remote_to_hash).and_return({}) + allow(parser_instance).to receive(:parse_to_hash).and_return({}) + allow(Saml::MetadataDocument).to receive(:prepare).and_return("") + allow(http_response).to receive(:is_a?).with(Net::HTTPSuccess).and_return(true) + allow(http_response).to receive(:read_body).and_yield("") + allow(OpenProject::SsrfProtection).to receive(:get) end context "when the URL host resolves to a safe IP" do before do allow(OpenProject::SsrfProtection).to receive(:safe_ip?).with("example.com").and_return(IPAddr.new("93.184.216.34")) + allow(OpenProject::SsrfProtection).to receive(:get).and_yield(http_response) end - it "checks the host and fetches metadata remotely" do + it "checks the host, fetches metadata via MetadataFetcher, and cleans up the tempfile" do + fetched_file = nil + allow(Saml::MetadataDocument).to receive(:prepare) do |file, **| + fetched_file = file + "" + end + parse_metadata expect(OpenProject::SsrfProtection).to have_received(:safe_ip?).with("example.com") - expect(parser_instance).to have_received(:parse_remote_to_hash).with(metadata_url) + expect(OpenProject::SsrfProtection).to have_received(:get).with(metadata_url) + expect(Saml::MetadataDocument).to have_received(:prepare).with(instance_of(File), entity_id: nil) + expect(parser_instance).to have_received(:parse_to_hash).with("") + expect(fetched_file).to be_closed end end @@ -261,7 +276,7 @@ RSpec.describe Saml::UpdateMetadataService do expect(result).not_to be_success expect(result.message).to include("MetadataHostNotAllowedError") expect(OpenProject::SsrfProtection).to have_received(:safe_ip?).with("example.com") - expect(parser_instance).not_to have_received(:parse_remote_to_hash) + expect(OpenProject::SsrfProtection).not_to have_received(:get) end end end From f94d7b0bfcce14c239554d03e1192c63ca4dc2d5 Mon Sep 17 00:00:00 2001 From: Kabiru Mwenja Date: Tue, 9 Jun 2026 10:25:21 +0300 Subject: [PATCH 091/107] Resolve the changes-filter predecessor once in a journals CTE The :only_changes filter re-seeked each journal's predecessor in every EXISTS branch (~7 LATERAL lookups per row). A CTE now shadows the journals table, exposing predecessor_id/predecessor_data_id once per row, and each branch reads those columns instead. On a 703-journal work package this cuts the COUNT from ~1.13M to ~35K shared buffers. --- .../work_packages/activities_tab/paginator.rb | 19 ++-- .../paginator/journal_changes_filter.rb | 89 +++++++++++-------- .../activities_tab/paginator_spec.rb | 20 +++++ 3 files changed, 79 insertions(+), 49 deletions(-) diff --git a/app/services/work_packages/activities_tab/paginator.rb b/app/services/work_packages/activities_tab/paginator.rb index f0c3c7a7497..305a1ccdfec 100644 --- a/app/services/work_packages/activities_tab/paginator.rb +++ b/app/services/work_packages/activities_tab/paginator.rb @@ -114,9 +114,7 @@ class WorkPackages::ActivitiesTab::Paginator # package's journals plus the journals written for its changesets — changesets # are journalized, so each carries a journal timestamped with its committed_on. def activities_scope(filter: self.filter) - scope = filtered_journals(filter) - scope = scope.or(changeset_journals) if include_changesets?(filter) - scope.reorder(created_at: :desc, id: :desc) + filtered_journals(filter).reorder(created_at: :desc, id: :desc) end def pagy_options @@ -160,8 +158,8 @@ class WorkPackages::ActivitiesTab::Paginator def filtered_journals(filter) case filter when Filters::ONLY_COMMENTS then apply_comments_only_filter(visible_journals) - when Filters::ONLY_CHANGES then apply_changes_only_filter(visible_journals) - else visible_journals + when Filters::ONLY_CHANGES then apply_changes_only_filter(with_changesets(visible_journals)) + else with_changesets(visible_journals) end end @@ -170,11 +168,12 @@ class WorkPackages::ActivitiesTab::Paginator journable_id: work_package.changesets.except(:order).select(:id)) end - # Most work packages have no changesets (revisions are a legacy feature), so - # the changeset leg is merged in only when one exists — keeping the common - # query scoped to the work package's own journals. - def include_changesets?(filter) - filter != Filters::ONLY_COMMENTS && work_package.changesets.exists? + # Most work packages have no changesets (revisions are a legacy feature). Merging + # the changeset leg in only when one exists keeps the common query scoped to the + # work package's own journals; always merging the empty leg pushes the planner + # onto a slower global scan. + def with_changesets(scope) + work_package.changesets.exists? ? scope.or(changeset_journals) : scope end def page_journals(page_relation) diff --git a/app/services/work_packages/activities_tab/paginator/journal_changes_filter.rb b/app/services/work_packages/activities_tab/paginator/journal_changes_filter.rb index 9eaa3b2f598..e8cc333ac87 100644 --- a/app/services/work_packages/activities_tab/paginator/journal_changes_filter.rb +++ b/app/services/work_packages/activities_tab/paginator/journal_changes_filter.rb @@ -38,32 +38,64 @@ # * Cause metadata (system-triggered changes) # * Attribute/data changes (compares work_package_journals columns with immediate predecessor) # -# This heuristic compares association records with the predecessor journal to detect actual changes, -# not just the presence of snapshot records. +# Each journal's immediate predecessor is resolved once, in a CTE named `journals` that +# shadows the table and exposes `predecessor_id` / `predecessor_data_id` columns. Every +# change-detection branch then reads those columns instead of re-seeking the predecessor. +# Changeset journals carry no detectable attribute history and are always included. class WorkPackages::ActivitiesTab::Paginator::JournalChangesFilter class << self - def apply(scope) - sql = <<~SQL.squish - version = 1 - OR (cause IS NOT NULL AND cause != '{}') + # @param membership [ActiveRecord::Relation] the activity feed's journals + # (visible work package journals, optionally unioned with changeset journals) + def apply(membership) + Journal + .with(journals: Arel.sql(enriched_journals_sql(membership))) + .where(OpenProject::SqlSanitization.sanitize(changes_condition_sql)) + end + + private + + # Enrich each journal row with its immediate predecessor's id and data_id. The + # predecessor is the highest version below the current one, located through the + # (journable_type, journable_id, version) index; versions are incremental but may + # have gaps, so the seek matches on `< version` rather than `version - 1`. A LEFT + # JOIN keeps initial (version = 1) journals, whose predecessor columns stay NULL. + def enriched_journals_sql(membership) + <<~SQL.squish + SELECT curr.*, + predecessor.id AS predecessor_id, + predecessor.data_id AS predecessor_data_id + FROM (#{membership.to_sql}) curr + LEFT JOIN LATERAL ( + SELECT p.id, p.data_id + FROM journals p + WHERE p.journable_id = curr.journable_id + AND p.journable_type = curr.journable_type + AND p.version < curr.version + ORDER BY p.version DESC + LIMIT 1 + ) predecessor ON TRUE + SQL + end + + def changes_condition_sql + <<~SQL.squish + journals.journable_type = '#{Changeset.name}' + OR journals.version = 1 + OR (journals.cause IS NOT NULL AND journals.cause != '{}') OR EXISTS (#{attribute_data_changes_condition_sql}) OR EXISTS (#{attachment_changes_condition_sql}) OR EXISTS (#{custom_field_changes_condition_sql}) OR EXISTS (#{file_link_changes_condition_sql}) SQL - - scope.where(OpenProject::SqlSanitization.sanitize(sql)) end - private - def attribute_data_changes_condition_sql <<~SQL.squish SELECT 1 - FROM #{predecessor_lateral_sql} predecessor - INNER JOIN work_package_journals pred_data ON predecessor.data_id = pred_data.id - INNER JOIN work_package_journals curr_data ON journals.data_id = curr_data.id - WHERE (#{data_changes_condition_sql}) + FROM work_package_journals pred_data + INNER JOIN work_package_journals curr_data ON curr_data.id = journals.data_id + WHERE pred_data.id = journals.predecessor_data_id + AND (#{data_changes_condition_sql}) SQL end @@ -95,25 +127,6 @@ class WorkPackages::ActivitiesTab::Paginator::JournalChangesFilter ) end - # The immediate predecessor journal, for comparison against the current one. - # Callers alias this as `predecessor`. Seeking the highest version below the - # current one through the (journable_type, journable_id, version) index keeps - # this a single-row lookup per journal; versions are incremental but may have - # gaps, so the seek matches on `< version` rather than `version - 1`. - def predecessor_lateral_sql - <<~SQL.squish - LATERAL ( - SELECT p.id, p.data_id - FROM journals p - WHERE p.journable_id = journals.journable_id - AND p.journable_type = journals.journable_type - AND p.version < journals.version - ORDER BY p.version DESC - LIMIT 1 - ) - SQL - end - def data_changes_condition_sql data_change_columns = Journal::WorkPackageJournal.column_names - ["id"] @@ -158,9 +171,8 @@ class WorkPackages::ActivitiesTab::Paginator::JournalChangesFilter <<~SQL.squish SELECT 1 FROM #{table} curr - LEFT JOIN #{predecessor_lateral_sql} predecessor ON TRUE LEFT JOIN #{table} pred - ON pred.journal_id = predecessor.id + ON pred.journal_id = journals.predecessor_id AND #{join_conditions} WHERE curr.journal_id = journals.id AND (#{where_clause}) @@ -176,13 +188,12 @@ class WorkPackages::ActivitiesTab::Paginator::JournalChangesFilter <<~SQL.squish SELECT 1 - FROM #{predecessor_lateral_sql} predecessor - INNER JOIN #{table} pred - ON pred.journal_id = predecessor.id + FROM #{table} pred LEFT JOIN #{table} curr ON curr.journal_id = journals.id AND #{join_conditions} - WHERE curr.id IS NULL + WHERE pred.journal_id = journals.predecessor_id + AND curr.id IS NULL SQL end end diff --git a/spec/services/work_packages/activities_tab/paginator_spec.rb b/spec/services/work_packages/activities_tab/paginator_spec.rb index af9428ce51a..771a5934906 100644 --- a/spec/services/work_packages/activities_tab/paginator_spec.rb +++ b/spec/services/work_packages/activities_tab/paginator_spec.rb @@ -529,6 +529,26 @@ RSpec.describe WorkPackages::ActivitiesTab::Paginator, with_settings: { journal_ expect(records.map(&:id)).to include(initial_journal.id) end + context "with changesets" do + let(:repository) { create(:repository_subversion, project:) } + let!(:changeset) do + create(:changeset, + repository:, + committed_on: 1.day.ago, + revision: "rev1") + end + + before do + work_package.changesets << changeset + end + + it "includes changesets (commits are activity, not attribute-diffable journals)" do + _pagy, records = paginator.call + + expect(records).to include(changeset) + end + end + context "with attribute changes" do let!(:journal_with_attribute_change) do work_package.subject = "Updated subject" From de3f31f3df0203bc9cce436b4552812c06feed1d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Jun 2026 08:35:17 +0100 Subject: [PATCH 092/107] Bump the typescript-eslint group in /frontend with 2 updates (#23621) Bumps the typescript-eslint group in /frontend with 2 updates: [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) and [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser). Updates `@typescript-eslint/eslint-plugin` from 8.59.4 to 8.60.0 - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.60.0/packages/eslint-plugin) Updates `@typescript-eslint/parser` from 8.59.4 to 8.60.0 - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.60.0/packages/parser) --- updated-dependencies: - dependency-name: "@typescript-eslint/eslint-plugin" dependency-version: 8.60.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: typescript-eslint - dependency-name: "@typescript-eslint/parser" dependency-version: 8.60.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: typescript-eslint ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frontend/package-lock.json | 187 ++++++++++++------------------------- frontend/package.json | 4 +- 2 files changed, 64 insertions(+), 127 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index fb04847555d..2b6fc2b234c 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -154,8 +154,8 @@ "@types/urijs": "^1.19.26", "@types/uuid": "^11.0.0", "@types/webpack-env": "^1.16.0", - "@typescript-eslint/eslint-plugin": "8.59.4", - "@typescript-eslint/parser": "8.59.4", + "@typescript-eslint/eslint-plugin": "8.60.0", + "@typescript-eslint/parser": "8.60.0", "@vitest/browser-playwright": "^4.1.7", "@vitest/coverage-v8": "^4.1.7", "@vitest/eslint-plugin": "^1.6.18", @@ -9191,17 +9191,17 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.59.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.4.tgz", - "integrity": "sha512-PegsU+XfyJJNjd4+u/k6f9yTyp0lEXXiPopUNobZcIAUJFGICFLN+sP0Rb3JehVmiij1Ph0dFGYqODoRo/2+6A==", + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.60.0.tgz", + "integrity": "sha512-QYb/sa74/s7OKMbACMjrYnGspj9Hs5YI5aaffSL65UfeBUzVzBJfVo3oWSpbzPurvm7yaCCo2Lk7lVj610HqKw==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.59.4", - "@typescript-eslint/type-utils": "8.59.4", - "@typescript-eslint/utils": "8.59.4", - "@typescript-eslint/visitor-keys": "8.59.4", + "@typescript-eslint/scope-manager": "8.60.0", + "@typescript-eslint/type-utils": "8.60.0", + "@typescript-eslint/utils": "8.60.0", + "@typescript-eslint/visitor-keys": "8.60.0", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" @@ -9214,22 +9214,22 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.59.4", + "@typescript-eslint/parser": "8.60.0", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { - "version": "8.59.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.4.tgz", - "integrity": "sha512-cYXeNAUsG4lJo5dbc1FcKm+JwIWrj1/UpTORsC6tGMjEZ81DYcvIr9/ueikhMa/Y/gDQYGp+YX9/xQrXje5BJw==", + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.60.0.tgz", + "integrity": "sha512-HtXuPfrHTyBDkameWpl+vJb1Uevu2tznAyahM1Oc4AENidCLTPiZDWIo4GfcxNdC/RcfGcadzzkqbRG87dUrQA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.59.4", - "@typescript-eslint/types": "8.59.4", - "@typescript-eslint/typescript-estree": "8.59.4" + "@typescript-eslint/scope-manager": "8.60.0", + "@typescript-eslint/types": "8.60.0", + "@typescript-eslint/typescript-estree": "8.60.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -9253,16 +9253,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.59.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.4.tgz", - "integrity": "sha512-zORHqO/tuhxY1zWuTvMUqddRxpiFJ72xVfcNoWpqdLjs6lfPbuQBJuW4pk+49/uBMy7Ssr4bzgjiKmmDB1UbZQ==", + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.60.0.tgz", + "integrity": "sha512-fcqpj/MyK4sxDPcbe7STNPbpQL4RLZOPWuaTmwZYuc+hJKzRf58yRxfhqGpc6PIq9ZyfSBpfHgmUHmHs0KwHwg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.59.4", - "@typescript-eslint/types": "8.59.4", - "@typescript-eslint/typescript-estree": "8.59.4", - "@typescript-eslint/visitor-keys": "8.59.4", + "@typescript-eslint/scope-manager": "8.60.0", + "@typescript-eslint/types": "8.60.0", + "@typescript-eslint/typescript-estree": "8.60.0", + "@typescript-eslint/visitor-keys": "8.60.0", "debug": "^4.4.3" }, "engines": { @@ -9278,14 +9278,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.59.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.4.tgz", - "integrity": "sha512-Ly00Vu4oAacfDeHp2Zg85ioNG6l8HG+tN1D7J+xTHSxu9y0awYKJ2zH1rFBn8ZSfuGK+7FxK3Cgl3uAz0aZZLg==", + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.60.0.tgz", + "integrity": "sha512-aZu74NNKJeUWqCjDddzdiKaS82dgYgV/vmf+Ui3ZdZejmgfXR/q+pRumgobnQ2cCJTgGTWp4ypiwsuofFubavg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.59.4", - "@typescript-eslint/types": "^8.59.4", + "@typescript-eslint/tsconfig-utils": "^8.60.0", + "@typescript-eslint/types": "^8.60.0", "debug": "^4.4.3" }, "engines": { @@ -9300,14 +9300,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.59.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.4.tgz", - "integrity": "sha512-mUeR/3H1WrTAddJrwut8OoPjfauaztMQmRwV5fQTUyNVJCLiUXXe4lGEyYIL2oFDpP7UtgbGJXCt72wT0z2S3Q==", + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.60.0.tgz", + "integrity": "sha512-pFzqhllJMs+jghLQWzV00ds39xLzuyqPSev5pd8f4Ir0rtKR3ZLUB4/4dhjOFighWb9larvtfJvqL+4yKDI3Xw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.59.4", - "@typescript-eslint/visitor-keys": "8.59.4" + "@typescript-eslint/types": "8.60.0", + "@typescript-eslint/visitor-keys": "8.60.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -9318,9 +9318,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.59.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.4.tgz", - "integrity": "sha512-DLCpnKgD4alVxTBSKulK+gU1KCqOgUXfDRDXh2mZgzokQKa/70ax93I2uVO3m/LLvIAtWZIFoiifudmIqAxpMA==", + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.60.0.tgz", + "integrity": "sha512-BZPR3RGYlAXnly6ymAxfkVn5rCbZzQNou0rxv3GfWZ8cTQp+hhVd73khbGLAd8k1TlAPLISH337M+tAgAnaJDQ==", "dev": true, "license": "MIT", "engines": { @@ -9335,15 +9335,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.59.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.4.tgz", - "integrity": "sha512-uonTuPAAKr9XaBGqJ3LjYTh72zy5DyGesljO9gtmk/eFW0W1fRHjnwVYKB35Lm8d5Q5CluEW3gPHjTvZTmgrfA==", + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.60.0.tgz", + "integrity": "sha512-SX46wEUtitCpq7AN38HkUU/+zvUpdKf7ephtWAFgckH8O7PQIyL5gvrhQgBLuEYgLfuKWOVvWVskMbuFHAz5xg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.59.4", - "@typescript-eslint/typescript-estree": "8.59.4", - "@typescript-eslint/utils": "8.59.4", + "@typescript-eslint/types": "8.60.0", + "@typescript-eslint/typescript-estree": "8.60.0", + "@typescript-eslint/utils": "8.60.0", "debug": "^4.4.3", "ts-api-utils": "^2.5.0" }, @@ -9360,16 +9360,16 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/utils": { - "version": "8.59.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.4.tgz", - "integrity": "sha512-cYXeNAUsG4lJo5dbc1FcKm+JwIWrj1/UpTORsC6tGMjEZ81DYcvIr9/ueikhMa/Y/gDQYGp+YX9/xQrXje5BJw==", + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.60.0.tgz", + "integrity": "sha512-HtXuPfrHTyBDkameWpl+vJb1Uevu2tznAyahM1Oc4AENidCLTPiZDWIo4GfcxNdC/RcfGcadzzkqbRG87dUrQA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.59.4", - "@typescript-eslint/types": "8.59.4", - "@typescript-eslint/typescript-estree": "8.59.4" + "@typescript-eslint/scope-manager": "8.60.0", + "@typescript-eslint/types": "8.60.0", + "@typescript-eslint/typescript-estree": "8.60.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -9384,9 +9384,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.59.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.4.tgz", - "integrity": "sha512-F1o7WJcCq+bc8dwcO/YsSEOudAH8RDtaOhM6wcAQhcUsFhnWQl81JKy48q1hoxAU0qrzM89+31GYh1515Zde3Q==", + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.60.0.tgz", + "integrity": "sha512-AsE7x2XaAK+CVbeih0Fvbn+r1qHxtpLDJ3XUuFcIinT318T90yHMJC+Zgv+jUuDjQQd06HKwxnDu6sz1IcTilA==", "dev": true, "license": "MIT", "engines": { @@ -9398,16 +9398,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.59.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.4.tgz", - "integrity": "sha512-F+RuOmcDXo4+TPdfd/TCLS3m2nw8gE9XXyZLrA3JBfaA5tz9TtdkyD3YJFmPxulyc2cKbEok/CvFE3MgSLWnag==", + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.60.0.tgz", + "integrity": "sha512-3AcZNBGMClm6CXDyo8kYvVGT/sx29sS0oBsIb9oZI2gunA4Vm2M3YHzRLPvsUBBsl+yB5FPtltq7gGH0iTlp9g==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.59.4", - "@typescript-eslint/tsconfig-utils": "8.59.4", - "@typescript-eslint/types": "8.59.4", - "@typescript-eslint/visitor-keys": "8.59.4", + "@typescript-eslint/project-service": "8.60.0", + "@typescript-eslint/tsconfig-utils": "8.60.0", + "@typescript-eslint/types": "8.60.0", + "@typescript-eslint/visitor-keys": "8.60.0", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", @@ -9658,13 +9658,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.59.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.4.tgz", - "integrity": "sha512-U3gxVaDVnuZKhSspW/MzMxE1kq7zOdc072FcSNoqA1I9p8HyKbBFfEHoWckBAMgNMph4MamwS5iTVzFmrnt8TQ==", + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.60.0.tgz", + "integrity": "sha512-9WI52t8ZGLVGrPMBet25yAftqY/n95+zmoUUtJBBQTKDSKUu7OsPTroT2op7U9JatkoRccL0YkWDNMFfC4Sjxg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.59.4", + "@typescript-eslint/types": "8.60.0", "eslint-visitor-keys": "^5.0.0" }, "engines": { @@ -9844,69 +9844,6 @@ } } }, - "node_modules/@vitest/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { - "version": "8.59.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.2.tgz", - "integrity": "sha512-JzfyEpEtOU89CcFSwyNS3mu4MLvLSXqnmX05+aKBDM+TdR5jzcGOEBwxwGNxrEQ7p/z6kK2WyioCGBf2zZBnvg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.59.2", - "@typescript-eslint/visitor-keys": "8.59.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@vitest/eslint-plugin/node_modules/@typescript-eslint/types": { - "version": "8.59.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.2.tgz", - "integrity": "sha512-e82GVOE8Ps3E++Egvb6Y3Dw0S10u8NkQ9KXmtRhCWJJ8kDhOJTvtMAWnFL16kB1583goCWXsr0NieKCZMs2/0Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@vitest/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.59.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.2.tgz", - "integrity": "sha512-NwjLUnGy8/Zfx23fl50tRC8rYaYnM52xNRYFAXvmiil9yh1+K6aRVQMnzW6gQB/1DLgWt977lYQn7C+wtgXZiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.59.2", - "eslint-visitor-keys": "^5.0.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@vitest/eslint-plugin/node_modules/eslint-visitor-keys": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", - "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/@vitest/expect": { "version": "4.1.8", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.8.tgz", diff --git a/frontend/package.json b/frontend/package.json index 48be43de982..cdc2225f67f 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -33,8 +33,8 @@ "@types/urijs": "^1.19.26", "@types/uuid": "^11.0.0", "@types/webpack-env": "^1.16.0", - "@typescript-eslint/eslint-plugin": "8.59.4", - "@typescript-eslint/parser": "8.59.4", + "@typescript-eslint/eslint-plugin": "8.60.0", + "@typescript-eslint/parser": "8.60.0", "@vitest/browser-playwright": "^4.1.7", "@vitest/coverage-v8": "^4.1.7", "@vitest/eslint-plugin": "^1.6.18", From 4f59344fdb63f51d1cf25f3f92f789e982962349 Mon Sep 17 00:00:00 2001 From: ulferts Date: Tue, 9 Jun 2026 09:40:46 +0200 Subject: [PATCH 093/107] fix lockfileVersion --- frontend/package-lock.json | 15550 +---------------------------------- 1 file changed, 350 insertions(+), 15200 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 2d0a8d05012..2eb792efeb7 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,7 +1,7 @@ { "name": "openproject-frontend", "version": "0.1.0", - "lockfileVersion": 2, + "lockfileVersion": 3, "requires": true, "packages": { "": { @@ -418,12 +418,12 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.2102.14", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2102.14.tgz", - "integrity": "sha512-0+vjVsCkMyJdVjz5XkPW+Bdf/9TI8V2voomx/+o0o+oOaqqiEhptQWFnaIlLr7HasjB0LxXK5P9L0oQ61vxj8Q==", + "version": "0.2102.13", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2102.13.tgz", + "integrity": "sha512-fheyi0gPx6b7tT+WQ+ePlzdGqKjPLUK72wg5Z9pkVtQ5+VN/8yB9mlRlmoivngd2FeNG9wMeNynWZGYycnOWVw==", "license": "MIT", "dependencies": { - "@angular-devkit/core": "21.2.14", + "@angular-devkit/core": "21.2.13", "rxjs": "7.8.2" }, "bin": { @@ -436,17 +436,17 @@ } }, "node_modules/@angular-devkit/build-angular": { - "version": "21.2.14", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-21.2.14.tgz", - "integrity": "sha512-EgKDd5pYctnsj3yYAZt3vivodH+r61X0ivWbZljcwT7OO4CEDyTR7Vtu4TUSr+tlplz5x2PYsWNr1nqyF0hufw==", + "version": "21.2.13", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-21.2.13.tgz", + "integrity": "sha512-H+wLj9n4khPIUYlIPCVfOGZzTsTVn/lzkY46DTMHd7gQF35vG+/xWvWCu3Shpf/0c631U7Jc2Mg7G+GBDgxe/g==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.2102.14", - "@angular-devkit/build-webpack": "0.2102.14", - "@angular-devkit/core": "21.2.14", - "@angular/build": "21.2.14", + "@angular-devkit/architect": "0.2102.13", + "@angular-devkit/build-webpack": "0.2102.13", + "@angular-devkit/core": "21.2.13", + "@angular/build": "21.2.13", "@babel/core": "7.29.0", "@babel/generator": "7.29.1", "@babel/helper-annotate-as-pure": "7.27.3", @@ -457,7 +457,7 @@ "@babel/preset-env": "7.29.2", "@babel/runtime": "7.29.2", "@discoveryjs/json-ext": "0.6.3", - "@ngtools/webpack": "21.2.14", + "@ngtools/webpack": "21.2.13", "ansi-colors": "4.1.3", "autoprefixer": "10.4.27", "babel-loader": "10.0.0", @@ -512,7 +512,7 @@ "@angular/platform-browser": "^21.0.0", "@angular/platform-server": "^21.0.0", "@angular/service-worker": "^21.0.0", - "@angular/ssr": "^21.2.14", + "@angular/ssr": "^21.2.13", "@web/test-runner": "^0.20.0", "browser-sync": "^3.0.2", "jest": "^30.2.0", @@ -698,13 +698,13 @@ } }, "node_modules/@angular-devkit/build-webpack": { - "version": "0.2102.14", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.2102.14.tgz", - "integrity": "sha512-UjZzypzYLYaWMVplu9CYpx0gxKYu9+V3GiOrtlshInuGMZe9uQy7wRgiFUUKClRSMf8CCT1jfCof9gFwqYCRuQ==", + "version": "0.2102.13", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.2102.13.tgz", + "integrity": "sha512-xnGq62JImcvPUM5r7Uvj7Y243fepwhbTG3zaIR2JKR+4EwF5pS5moXuVf+xVvxRqQkNcmLGfr7uJogmpw+dUgA==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/architect": "0.2102.14", + "@angular-devkit/architect": "0.2102.13", "rxjs": "7.8.2" }, "engines": { @@ -718,9 +718,9 @@ } }, "node_modules/@angular-devkit/core": { - "version": "21.2.14", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.2.14.tgz", - "integrity": "sha512-RSOWXB9bFc2nwRWMxbIT0RbSNFUrwfBo4N5MNxbyQ69Ndc0gVm3h+3ArHv0qotH4d+pJYbm5ttXu8YqR2kc0CA==", + "version": "21.2.13", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.2.13.tgz", + "integrity": "sha512-9jLaHcUr6BumIY9nCsBib1q62p259nf++gd2igYJ7mLm1w/0wEacsZ1cC8wCGEe6vx8a+DrD+EVCQ6zivePG2A==", "license": "MIT", "dependencies": { "ajv": "8.18.0", @@ -790,12 +790,12 @@ } }, "node_modules/@angular-devkit/schematics": { - "version": "21.2.14", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-21.2.14.tgz", - "integrity": "sha512-KMJlQSBEzI4+Cy1Zh72gmGQNN2I1vY+nj9CoRcZPBIi1si+0ZAc49XT85eYl+eQumNTVQviUG7LQqgLDAHml+g==", + "version": "21.2.13", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-21.2.13.tgz", + "integrity": "sha512-gifpOcMNiAy49lQmQKhzpxoSfS3qJQSEdJSF5m7RVFkAcmllfcCD76GPN4dhho3wdAnbZ3qr54LtDqrGY4xNjw==", "license": "MIT", "dependencies": { - "@angular-devkit/core": "21.2.14", + "@angular-devkit/core": "21.2.13", "jsonc-parser": "3.3.1", "magic-string": "0.30.21", "ora": "9.3.0", @@ -926,9 +926,9 @@ } }, "node_modules/@angular/animations": { - "version": "21.2.16", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-21.2.16.tgz", - "integrity": "sha512-YPhph/OC1A0vkT95XZW6lXMNmi5ly91JeXi+5yeG8CCxfqscVfRNPsYbRWjSueO0cQT2HJ8U1CLteQ5a1OaoHA==", + "version": "21.2.15", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-21.2.15.tgz", + "integrity": "sha512-Z8AsLTwc++Fcu0fJnclAF9zMfumAd5KXrwtSdyECqLpqd+lEmmsOpeOl6P7loqdDz99KYh/8UF4eJxdMvnsaKw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -937,18 +937,18 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/core": "21.2.16" + "@angular/core": "21.2.15" } }, "node_modules/@angular/build": { - "version": "21.2.14", - "resolved": "https://registry.npmjs.org/@angular/build/-/build-21.2.14.tgz", - "integrity": "sha512-l8JB326iIwum2WmbopUUFdiuYsbHchix6MH8o6F6FA7LJr8QLTvipwwbw+Jx31/RE50WkGmzsZ1fBDw/cMbmUw==", + "version": "21.2.13", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-21.2.13.tgz", + "integrity": "sha512-Y9TDAaTQ+E5LScCKA/hPZmns/7Mpu6J2BiPj2cETA1xNjvgRpeb5Mh32KuhZb20NSFLvjpdnLuBTTtbym7hevw==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.2102.14", + "@angular-devkit/architect": "0.2102.13", "@babel/core": "7.29.0", "@babel/helper-annotate-as-pure": "7.27.3", "@babel/helper-split-export-declaration": "7.24.7", @@ -991,7 +991,7 @@ "@angular/platform-browser": "^21.0.0", "@angular/platform-server": "^21.0.0", "@angular/service-worker": "^21.0.0", - "@angular/ssr": "^21.2.14", + "@angular/ssr": "^21.2.13", "karma": "^6.4.0", "less": "^4.2.0", "ng-packagr": "^21.0.0", @@ -1071,9 +1071,9 @@ } }, "node_modules/@angular/cdk": { - "version": "21.2.14", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-21.2.14.tgz", - "integrity": "sha512-806REq/CLf37nEhmmd8Q+ILN8z/RVG2vk2n8YZ/4TdHpcBCi5ux4AxLbpMmduLwGPOzPagJ6ggRzE5fnX0rmcQ==", + "version": "21.2.13", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-21.2.13.tgz", + "integrity": "sha512-nQGGJ6Efqi8n0qhT/PllsaIIY+vz+TL7/tpR7F2QKiqzS/9l4m7ea0vvS6fSMGrjEbqbkzTHbjLDsIg6X2hK+w==", "license": "MIT", "dependencies": { "parse5": "^8.0.0", @@ -1111,18 +1111,18 @@ } }, "node_modules/@angular/cli": { - "version": "21.2.14", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-21.2.14.tgz", - "integrity": "sha512-S8jExTjxPJILwpg2lu3DohSASVZ8DLhSNCmOe7z0qF9VskRSjC7SIQv1rq36tsJkenxuA72gjVOHZv+uSRT8HA==", + "version": "21.2.13", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-21.2.13.tgz", + "integrity": "sha512-j1kOV/f0og/3xCwG7Y8RyPd6V7uYfX2NuvXbvN1mzgxLLN2mu6CTsvPg5l/9Pu9SJI3KOPRgDxWyuP3k8KuzMg==", "license": "MIT", "dependencies": { - "@angular-devkit/architect": "0.2102.14", - "@angular-devkit/core": "21.2.14", - "@angular-devkit/schematics": "21.2.14", + "@angular-devkit/architect": "0.2102.13", + "@angular-devkit/core": "21.2.13", + "@angular-devkit/schematics": "21.2.13", "@inquirer/prompts": "7.10.1", "@listr2/prompt-adapter-inquirer": "3.0.5", "@modelcontextprotocol/sdk": "1.26.0", - "@schematics/angular": "21.2.14", + "@schematics/angular": "21.2.13", "@yarnpkg/lockfile": "1.1.0", "algoliasearch": "5.48.1", "ini": "6.0.0", @@ -1264,9 +1264,9 @@ } }, "node_modules/@angular/common": { - "version": "21.2.16", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-21.2.16.tgz", - "integrity": "sha512-htHNepKzjIjkc5BQ7MKDN0bVDOfQpFr/fGUxa6irC0kFLfWt7idUTdNcxypRvjCCTuBYHkjr74fH4QKu+qvPXg==", + "version": "21.2.15", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-21.2.15.tgz", + "integrity": "sha512-PHbICQe4YCXnax2FcmKUpiffs8XPW9A0KlZF35qgJoQyBMBZx5F8c8geCh25jxtq77n3eBTmOa/WIAdSqiitkQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -1275,14 +1275,14 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/core": "21.2.16", + "@angular/core": "21.2.15", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "21.2.16", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-21.2.16.tgz", - "integrity": "sha512-hVjp93gYgNj5aRbCQUK7L+pOfdqk96lCtmSL2hOL725Pmib9NyNIrA3ISfAQHN+Qo70763WUZahOiqBBOzfAcg==", + "version": "21.2.15", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-21.2.15.tgz", + "integrity": "sha512-nwpNb+NbVUNzR3cck0QXbU/oFK7BpmXOXVnN/w7+P4+TsFUYeTtO1Ojbc15jkqe6mSM0lBvGlcoztVblHQkqcw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -1292,9 +1292,9 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "21.2.16", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-21.2.16.tgz", - "integrity": "sha512-w2ck3o+uw29AZEGK3HvOsF/ZRiPcfoq2TaDtiNjdH+svhwawt9PfMXrDbbIKF30prWzKLpT3UsCqTz1awv7Ubw==", + "version": "21.2.15", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-21.2.15.tgz", + "integrity": "sha512-/MU7OA9d/e9P5SthR+N6JJObBmzcGsgNQaeQ2YfSUnU0lCRVQweTWwxLFDbfU6UX8MZFWB6pdI57zod8r5kXUw==", "license": "MIT", "dependencies": { "@babel/core": "7.29.0", @@ -1314,7 +1314,7 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/compiler": "21.2.16", + "@angular/compiler": "21.2.15", "typescript": ">=5.9 <6.1" }, "peerDependenciesMeta": { @@ -1471,9 +1471,9 @@ } }, "node_modules/@angular/core": { - "version": "21.2.16", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-21.2.16.tgz", - "integrity": "sha512-uufKORlB0jeYdqOvjAfMYgqIqmJentOj8XvTUxsFP5k85xxzXsDarSpP199YQz6jhJJQYNOWIloDkUTQJi5rNA==", + "version": "21.2.15", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-21.2.15.tgz", + "integrity": "sha512-J5JsUnNtQURdeA7EA3DoCsMBizW3l01gfqM326Al72Ou3woFWmRb5P3LOXpIOzAeMQhO6Z5tW+B1t+4qmoq7uw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -1482,7 +1482,7 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/compiler": "21.2.16", + "@angular/compiler": "21.2.15", "rxjs": "^6.5.3 || ^7.4.0", "zone.js": "~0.15.0 || ~0.16.0" }, @@ -1496,9 +1496,9 @@ } }, "node_modules/@angular/elements": { - "version": "21.2.16", - "resolved": "https://registry.npmjs.org/@angular/elements/-/elements-21.2.16.tgz", - "integrity": "sha512-p9Y8KyMZQ37Tn7zjkaiQJUog+TtDlypqwD4ABzUNKKkgjLTRMVbS+xJ7rPuF5HSCsGS2tO+fsbxWcIGHIACL+Q==", + "version": "21.2.15", + "resolved": "https://registry.npmjs.org/@angular/elements/-/elements-21.2.15.tgz", + "integrity": "sha512-ynK/FJY/YVN/mBBMOd3/v9F9DKkhDXYIvSiCBTKxnP8PwOG6Sf3xb2y3LHJuPh5wlrcHBZszVOPyeB4vNi3FPA==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -1507,14 +1507,14 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/core": "21.2.16", + "@angular/core": "21.2.15", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/forms": { - "version": "21.2.16", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-21.2.16.tgz", - "integrity": "sha512-2djTJmTpg/MkQ2kdCI9k0LT4RL9/Hg03fDUNN2eN5c04FIk99D3yHXUJYLwiaErLuLQNkU8HaijluKHdH93cWQ==", + "version": "21.2.15", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-21.2.15.tgz", + "integrity": "sha512-swGUHgbBrPNvODPR9qBP6+vT2EHiyW361iEgS3HpTmvDhF/kD4l8NE0vh3P5N0DnEtGh4umOCKfQ1w6hPJ7lqA==", "license": "MIT", "dependencies": { "@standard-schema/spec": "^1.0.0", @@ -1524,9 +1524,9 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/common": "21.2.16", - "@angular/core": "21.2.16", - "@angular/platform-browser": "21.2.16", + "@angular/common": "21.2.15", + "@angular/core": "21.2.15", + "@angular/platform-browser": "21.2.15", "rxjs": "^6.5.3 || ^7.4.0" } }, @@ -1541,9 +1541,9 @@ } }, "node_modules/@angular/platform-browser": { - "version": "21.2.16", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-21.2.16.tgz", - "integrity": "sha512-59ToWYDb+O3fS0+Y4ubQqV0zY6sf2esLZ19AT7JKXN7Akqbz7aQ2/3k3PKmfhwKWek5o3lkuNz8YhxKQruNh8Q==", + "version": "21.2.15", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-21.2.15.tgz", + "integrity": "sha512-O4ZHVV/rxkK1AuiD9M3UssL/HkoQvBcZy2+U421IMNibclGhwH9aRwc/0ZlQ7zpseS9+KPZ23FebvN4/92IbPg==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -1552,9 +1552,9 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/animations": "21.2.16", - "@angular/common": "21.2.16", - "@angular/core": "21.2.16" + "@angular/animations": "21.2.15", + "@angular/common": "21.2.15", + "@angular/core": "21.2.15" }, "peerDependenciesMeta": { "@angular/animations": { @@ -1563,9 +1563,9 @@ } }, "node_modules/@angular/platform-browser-dynamic": { - "version": "21.2.16", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-21.2.16.tgz", - "integrity": "sha512-WtTnkJOmKiGccHRQfBdkwODAkpTB4zbPN3IKhcqCjlezKaPqZB5tjrIu72Z5pmi5VIgJz1LmfO1LSVCMC5h7dA==", + "version": "21.2.15", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-21.2.15.tgz", + "integrity": "sha512-3xvlWLZlsWjPyJFGatOOsod/f5AFjmSUDoOXo0zsr2ckHc4TxbDTnkLULhRSWv6m68fKOdQb8Si8rI15gC5yqA==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -1574,16 +1574,16 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/common": "21.2.16", - "@angular/compiler": "21.2.16", - "@angular/core": "21.2.16", - "@angular/platform-browser": "21.2.16" + "@angular/common": "21.2.15", + "@angular/compiler": "21.2.15", + "@angular/core": "21.2.15", + "@angular/platform-browser": "21.2.15" } }, "node_modules/@angular/router": { - "version": "21.2.16", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-21.2.16.tgz", - "integrity": "sha512-0+Pyh0uT4vCLabKoGCARYWlwpz4DgZI9AE01n8s9u/nKAZuEMnJtLLnaUtHEMI8nJSqpgnS/5AthuJZdDEfkYw==", + "version": "21.2.15", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-21.2.15.tgz", + "integrity": "sha512-Cej4hYkmaTB6wXn1xQPlr4O1wHgUD0WLv//Oue1IssKqL8vkzic5f5x/H/bxtxxGlSnc+i6uIUF/lvjdGoWk/A==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -1592,9 +1592,9 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@angular/common": "21.2.16", - "@angular/core": "21.2.16", - "@angular/platform-browser": "21.2.16", + "@angular/common": "21.2.15", + "@angular/core": "21.2.15", + "@angular/platform-browser": "21.2.15", "rxjs": "^6.5.3 || ^7.4.0" } }, @@ -3568,6 +3568,7 @@ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "aix" @@ -3584,6 +3585,7 @@ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -3600,6 +3602,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -3616,6 +3619,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -3648,6 +3652,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -3664,6 +3669,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -3680,6 +3686,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -3696,6 +3703,7 @@ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -3712,6 +3720,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -3728,6 +3737,7 @@ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -3744,6 +3754,7 @@ "loong64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -3760,6 +3771,7 @@ "mips64el" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -3776,6 +3788,7 @@ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -3792,6 +3805,7 @@ "riscv64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -3808,6 +3822,7 @@ "s390x" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -3824,6 +3839,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -3840,6 +3856,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "netbsd" @@ -3856,6 +3873,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "netbsd" @@ -3872,6 +3890,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "openbsd" @@ -3888,6 +3907,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "openbsd" @@ -3904,6 +3924,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "openharmony" @@ -3920,6 +3941,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "sunos" @@ -3936,6 +3958,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -3952,6 +3975,7 @@ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -3968,6 +3992,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -4416,6 +4441,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/@github/auto-check-element/-/auto-check-element-6.0.0.tgz", "integrity": "sha512-87mHEywJEtlG/37zFrx4PUgDqczgtv9jrauW3IojNy9y+nALIAm6e2jnWpfgcqeMWSevzph2M6reJoHpuSjyWw==", + "license": "MIT", "dependencies": { "@github/mini-throttle": "^2.1.0" } @@ -4424,45 +4450,52 @@ "version": "3.8.0", "resolved": "https://registry.npmjs.org/@github/auto-complete-element/-/auto-complete-element-3.8.0.tgz", "integrity": "sha512-rS2Uj38V1BsenLvrIswV5IXfiYH2/KUhz6inot+JXho/fFOO+01tsW1HxqSdIXqh5EDuoY0f/GQsztZcH22AXQ==", + "license": "MIT", "dependencies": { "@github/combobox-nav": "^2.1.7" } }, "node_modules/@github/catalyst": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@github/catalyst/-/catalyst-1.8.0.tgz", - "integrity": "sha512-uLpi/D/mKfylYaFLfzNuloXNENi0AlcM0Z7hwYLH8Z030jBCr+ueMdX2xLxCzpMH/keYXKh0uPrHSMfcbxU6KA==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@github/catalyst/-/catalyst-1.8.1.tgz", + "integrity": "sha512-dnN4WWpbeuQvA17LvsGdlXEueJdBk9y+I+WO5pdNpoHNOXPsFcz3hJrq1iRmdsNgQOf4S8e83axtwIxvG62eWA==", "license": "MIT" }, "node_modules/@github/clipboard-copy-element": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@github/clipboard-copy-element/-/clipboard-copy-element-1.3.0.tgz", - "integrity": "sha512-wyntkQkwoLbLo+Hqg2LIVMXDIzcvUb9bSDz+clX6nVJItwzh103rHxdXFRZD+DmxVbuEW5xSznYQXkz1jZT+xg==" + "integrity": "sha512-wyntkQkwoLbLo+Hqg2LIVMXDIzcvUb9bSDz+clX6nVJItwzh103rHxdXFRZD+DmxVbuEW5xSznYQXkz1jZT+xg==", + "license": "MIT" }, "node_modules/@github/combobox-nav": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/@github/combobox-nav/-/combobox-nav-2.3.1.tgz", - "integrity": "sha512-gwxPzLw8XKecy1nP63i9lOBritS3bWmxl02UX6G0TwMQZbMem1BCS1tEZgYd3mkrkiDrUMWaX+DbFCuDFo3K+A==" + "integrity": "sha512-gwxPzLw8XKecy1nP63i9lOBritS3bWmxl02UX6G0TwMQZbMem1BCS1tEZgYd3mkrkiDrUMWaX+DbFCuDFo3K+A==", + "license": "MIT" }, "node_modules/@github/details-menu-element": { "version": "1.0.13", "resolved": "https://registry.npmjs.org/@github/details-menu-element/-/details-menu-element-1.0.13.tgz", - "integrity": "sha512-gMkii86w/oUP5dq8yOWZn1sgbgtFj3AYETxxtpsqRggZktgd8te4+npAn4Hm+936c/lxmEzXqfjARL/CzGR4+w==" + "integrity": "sha512-gMkii86w/oUP5dq8yOWZn1sgbgtFj3AYETxxtpsqRggZktgd8te4+npAn4Hm+936c/lxmEzXqfjARL/CzGR4+w==", + "license": "MIT" }, "node_modules/@github/image-crop-element": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/@github/image-crop-element/-/image-crop-element-5.0.0.tgz", - "integrity": "sha512-Vgm2OwWAs1ESoib/t5sjxsAYo6YTOxxAjWDRxswX7qrqoyCejTZ3hshdo4Ep5e+Mz/GVTZC3rdMtg06dk/eT4g==" + "integrity": "sha512-Vgm2OwWAs1ESoib/t5sjxsAYo6YTOxxAjWDRxswX7qrqoyCejTZ3hshdo4Ep5e+Mz/GVTZC3rdMtg06dk/eT4g==", + "license": "MIT" }, "node_modules/@github/include-fragment-element": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@github/include-fragment-element/-/include-fragment-element-6.3.0.tgz", - "integrity": "sha512-BJTt8ZE/arsbC9lQtTH8c1hZS0ZigiN+kzH54ffQ6MhHLT83h0OpSdS9NEVocPl2uuO6w3qxnEKTDzUGMQ5rdQ==" + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@github/include-fragment-element/-/include-fragment-element-6.4.1.tgz", + "integrity": "sha512-ffgXc7qwBtY/rYcMkAjxZJlyOPFaeC9K1Oc+n7Edwt3BAHPokUSdMfDivb+/dGO+NU2n7l1/L4v5uQN+wBeV4g==", + "license": "MIT" }, "node_modules/@github/mini-throttle": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/@github/mini-throttle/-/mini-throttle-2.1.1.tgz", - "integrity": "sha512-KtOPaB+FiKJ6jcKm9UKyaM5fPURHGf+xcp+b4Mzoi81hOc6M1sIGpMZMAVbNzfa2lW5+RPGKq888Px0j76OZ/A==" + "integrity": "sha512-KtOPaB+FiKJ6jcKm9UKyaM5fPURHGf+xcp+b4Mzoi81hOc6M1sIGpMZMAVbNzfa2lW5+RPGKq888Px0j76OZ/A==", + "license": "MIT" }, "node_modules/@github/relative-time-element": { "version": "5.0.0", @@ -4473,12 +4506,14 @@ "node_modules/@github/remote-input-element": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/@github/remote-input-element/-/remote-input-element-0.4.0.tgz", - "integrity": "sha512-apsMwsFW24F+w2wzT8oKoBi9lpm6GeFOmtuL+1YwDVmIiwixfHOD3MnEsEOv0RwmHsMdWmIjP9mxWyTWPKZHGg==" + "integrity": "sha512-apsMwsFW24F+w2wzT8oKoBi9lpm6GeFOmtuL+1YwDVmIiwixfHOD3MnEsEOv0RwmHsMdWmIjP9mxWyTWPKZHGg==", + "license": "MIT" }, "node_modules/@github/tab-container-element": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/@github/tab-container-element/-/tab-container-element-3.4.0.tgz", - "integrity": "sha512-Yx70pO8A0p7Stnm9knKkUNX8i4bjuwDYZarRkM8JH0Z+ffhpe++oNAPbzGI9GEcGugRHvKuSC6p4YOdoHtTniQ==" + "integrity": "sha512-Yx70pO8A0p7Stnm9knKkUNX8i4bjuwDYZarRkM8JH0Z+ffhpe++oNAPbzGI9GEcGugRHvKuSC6p4YOdoHtTniQ==", + "license": "MIT" }, "node_modules/@github/webauthn-json": { "version": "2.1.1", @@ -5654,6 +5689,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -5667,6 +5703,7 @@ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -5680,6 +5717,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -5693,6 +5731,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -5706,6 +5745,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -5719,6 +5759,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -5840,9 +5881,9 @@ } }, "node_modules/@mantine/core": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/@mantine/core/-/core-9.3.1.tgz", - "integrity": "sha512-4rBoHpggSohayE+Os7lKdbsHTw7m/uZRKYjk9DN6cKBhQIjdiULdcG+b4b5CMVZSqZDHPgT70uWGI7yqkn8Ufw==", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@mantine/core/-/core-9.3.0.tgz", + "integrity": "sha512-mHVCm61YVW9ipy9eHiKMqsRUm3TkOErbdw7zHs0HRw5g403nf7tSTqNGvaYE+aX1Py874qMkrUzeQfj4bjiiBA==", "license": "MIT", "dependencies": { "@floating-ui/react": "^0.27.19", @@ -5852,15 +5893,15 @@ "type-fest": "^5.6.0" }, "peerDependencies": { - "@mantine/hooks": "9.3.1", + "@mantine/hooks": "9.3.0", "react": "^19.2.0", "react-dom": "^19.2.0" } }, "node_modules/@mantine/hooks": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/@mantine/hooks/-/hooks-9.3.1.tgz", - "integrity": "sha512-zAOlxV59j5CDgAnExN+ypaR6dVW1vwMKDvKUxIlUVd/e52qxYnPyYRD+shJmyOLaZRuQmVF0R/7mJAjt2jw9cA==", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@mantine/hooks/-/hooks-9.3.0.tgz", + "integrity": "sha512-QoSr9WI4WsKWrM3qFYYizHUn3+n+CVcFMYe4sdlnmFPStvs6BacPODKJSbFlYl73Z20t82JIy0eKqt4noHQI2g==", "license": "MIT", "peerDependencies": { "react": "^19.2.0" @@ -6232,6 +6273,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -6245,6 +6287,7 @@ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -6258,6 +6301,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -6271,6 +6315,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -6284,6 +6329,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -6330,6 +6376,7 @@ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -6346,6 +6393,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -6378,6 +6426,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -6394,6 +6443,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -6410,6 +6460,7 @@ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -6426,6 +6477,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -6442,6 +6494,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -6458,6 +6511,7 @@ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -6474,6 +6528,7 @@ "riscv64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -6490,6 +6545,7 @@ "s390x" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -6506,6 +6562,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -6522,6 +6579,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -6538,6 +6596,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "openharmony" @@ -6554,6 +6613,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -6570,6 +6630,7 @@ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -6586,6 +6647,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -6599,6 +6661,7 @@ "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz", "integrity": "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "@tybys/wasm-util": "^0.10.1" @@ -6653,9 +6716,9 @@ } }, "node_modules/@ngtools/webpack": { - "version": "21.2.14", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-21.2.14.tgz", - "integrity": "sha512-HXt4pYLlWCJphO6TZoTsi2Z9Lyq/PqYpiKlqUmNoo/oIiSuXtoT/8+84Z/SfBdzeZpiVrAFz+/QGTVFoD8RSGg==", + "version": "21.2.13", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-21.2.13.tgz", + "integrity": "sha512-Y3W1x5+P8mHXRIkeSxGdj10ipQjJkTT6/bc/Sz5BN2qacbNIYIDg0fnk/ikvl9KAvI/49gUwYxfq4QBodS5ktQ==", "dev": true, "license": "MIT", "engines": { @@ -6965,6 +7028,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -7005,6 +7069,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -7025,6 +7090,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -7045,6 +7111,7 @@ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -7065,6 +7132,7 @@ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -7085,6 +7153,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -7105,6 +7174,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -7125,6 +7195,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -7145,6 +7216,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -7165,6 +7237,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -7185,6 +7258,7 @@ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -7205,6 +7279,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -7393,9 +7468,10 @@ "license": "MIT" }, "node_modules/@primer/behaviors": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@primer/behaviors/-/behaviors-1.3.5.tgz", - "integrity": "sha512-HWwz+6MrfK5NTWcg9GdKFpMBW/yrAV937oXiw2eDtsd88P3SRwoCt6ZO6QmKp9RP3nDU9cbqmuGZ0xBh0eIFeg==" + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/@primer/behaviors/-/behaviors-1.10.2.tgz", + "integrity": "sha512-93juWZbWg2DRhC11+7RT7hMpY1VD3lBosLmccqEZ65yrCHqkBCjI8Uj8wxs3y0U+wWE07LAoLHAPylyWbifg5A==", + "license": "MIT" }, "node_modules/@primer/css": { "version": "22.1.0", @@ -7496,6 +7572,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -7528,6 +7605,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -7544,6 +7622,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -7560,6 +7639,7 @@ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -7576,6 +7656,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -7592,6 +7673,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -7608,6 +7690,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -7624,6 +7707,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -7640,6 +7724,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "openharmony" @@ -7656,6 +7741,7 @@ "wasm32" ], "dev": true, + "license": "MIT", "optional": true, "dependencies": { "@napi-rs/wasm-runtime": "^1.1.1" @@ -7672,6 +7758,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -7688,6 +7775,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -7710,6 +7798,7 @@ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -7723,6 +7812,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -7749,6 +7839,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -7762,6 +7853,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -7775,6 +7867,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -7788,6 +7881,7 @@ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -7801,6 +7895,7 @@ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -7814,6 +7909,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -7827,6 +7923,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -7840,6 +7937,7 @@ "loong64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -7853,6 +7951,7 @@ "loong64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -7866,6 +7965,7 @@ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -7879,6 +7979,7 @@ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -7892,6 +7993,7 @@ "riscv64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -7905,6 +8007,7 @@ "riscv64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -7918,6 +8021,7 @@ "s390x" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -7931,6 +8035,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -7944,6 +8049,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -7957,6 +8063,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "openbsd" @@ -7970,6 +8077,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "openharmony" @@ -7983,6 +8091,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -7996,6 +8105,7 @@ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -8009,6 +8119,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -8022,6 +8133,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -8040,13 +8152,13 @@ "dev": true }, "node_modules/@schematics/angular": { - "version": "21.2.14", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-21.2.14.tgz", - "integrity": "sha512-rIEdtNTdCCTwuo7B4tMoq5qmbLXdBgmW6Ays1hyno//4OE+HFtvlWZd+hl6KceEyN00IcZ2HRaPnfd71E1JnoA==", + "version": "21.2.13", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-21.2.13.tgz", + "integrity": "sha512-e5guslSLKbb3PJ6gUuVqM+V9xgn68cJkG1IyBohho34shbpOeoWW2eYdWQQjxvn0KUdgEhYSRBluBamCHngaUA==", "license": "MIT", "dependencies": { - "@angular-devkit/core": "21.2.14", - "@angular-devkit/schematics": "21.2.14", + "@angular-devkit/core": "21.2.13", + "@angular-devkit/schematics": "21.2.13", "jsonc-parser": "3.3.1" }, "engines": { @@ -8187,9 +8299,9 @@ } }, "node_modules/@stylistic/eslint-plugin/node_modules/@typescript-eslint/types": { - "version": "8.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.61.0.tgz", - "integrity": "sha512-9QTQpZ5Iin4CdIodfbDQFSeiSJKidgYJYug1P9CC2xWgUTvlmixViqDZNciMjwLBZyJnG4tGmPl97rVAFb1AJg==", + "version": "8.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.60.1.tgz", + "integrity": "sha512-4h0tY8ppCkdCzcrl2YM5M3my0xsE1Tf8om3owEu5oPWmXwkKRmk0j0LGDzYBGUcAlesEbxBhazqu/K4cu3Ug7w==", "dev": true, "license": "MIT", "engines": { @@ -8491,17 +8603,17 @@ } }, "node_modules/@tiptap/extensions": { - "version": "3.26.0", - "resolved": "https://registry.npmjs.org/@tiptap/extensions/-/extensions-3.26.0.tgz", - "integrity": "sha512-4wajuqnO2X0+LVvsBjW/xk3/tmdb16bNL939QhicAay4YYqXITeV2v3XJsryzmG4L5GkK1yLxvRGk4aLoxWrnA==", + "version": "3.23.6", + "resolved": "https://registry.npmjs.org/@tiptap/extensions/-/extensions-3.23.6.tgz", + "integrity": "sha512-X09/Db1teB+ifXzDGVVFmOeQRx7wTAayE9/280spxpsHkHZvJ5bHRvWIzUzviMIjbBz+NPDIKYPK7gMfh9iaig==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "3.26.0", - "@tiptap/pm": "3.26.0" + "@tiptap/core": "3.23.6", + "@tiptap/pm": "3.23.6" } }, "node_modules/@tiptap/pm": { @@ -8638,10 +8750,11 @@ } }, "node_modules/@tybys/wasm-util": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", - "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz", + "integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "tslib": "^2.4.0" @@ -8850,9 +8963,9 @@ } }, "node_modules/@types/jquery": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-4.0.1.tgz", - "integrity": "sha512-9a59A/tycXgYuPABcp6/3spSShn0NT2UOM4EfHvMumjYi4lJWTsK5SZWjhx3yRm9IHGCeWXdV2YfNsrWrft/CA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-4.0.0.tgz", + "integrity": "sha512-Z+to+A2VkaHq1DfI2oSwsoCdhCHMpTSgjWzNcbNlRGYzksDBpPUgEcAL+RQjOBJRaLoEAOHXxqDGBVP+BblBwg==", "dev": true, "license": "MIT" }, @@ -8928,9 +9041,9 @@ "dev": true }, "node_modules/@types/react": { - "version": "19.2.17", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.17.tgz", - "integrity": "sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==", + "version": "19.2.16", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.16.tgz", + "integrity": "sha512-esJiCAnl0kfpNdE69f3So4WJUXy95dLZydX0KwK46riIHDzHM7O9Vtf9xCHW0PXIqvgqNrswl522kA/5yx+F4w==", "dev": true, "license": "MIT", "dependencies": { @@ -9352,16 +9465,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.61.0.tgz", - "integrity": "sha512-3bzFt7ImFMW/jVYwJamDoe/dMOdFLSC6pom6rRjdh4SZJEYupyMzem8e7vKZLclLfpHjlwSAXOUxtKxGXUiLqA==", + "version": "8.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.60.1.tgz", + "integrity": "sha512-h2MPBLoNtjc3qZWfY3Tl51yPorQ2McHn8pJfcMNTcIvrrZrr90Ykffit0yjrPFWQcRcUxzH20+6OcVdW4yHtUg==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.61.0", - "@typescript-eslint/types": "8.61.0", - "@typescript-eslint/typescript-estree": "8.61.0" + "@typescript-eslint/scope-manager": "8.60.1", + "@typescript-eslint/types": "8.60.1", + "@typescript-eslint/typescript-estree": "8.60.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -9376,14 +9489,14 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/project-service": { - "version": "8.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.61.0.tgz", - "integrity": "sha512-DV42F7MLJO6Rax7SK1yg43tcnEfGUrurSpSxKuVX+a3RCTzBlH3fuxprrOJXKCJGAaw82xXocikJ0uQaqwXgGA==", + "version": "8.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.60.1.tgz", + "integrity": "sha512-eXkTH2bxmXlqD1RnOPmLZ9ZM9D3VwSx04JOwBnP9RQ+yUA5a2Mu7SfW8uaV2Aon53NJzZlZYuX7tn91Izf+xaw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.61.0", - "@typescript-eslint/types": "^8.61.0", + "@typescript-eslint/tsconfig-utils": "^8.60.1", + "@typescript-eslint/types": "^8.60.1", "debug": "^4.4.3" }, "engines": { @@ -9398,14 +9511,14 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { - "version": "8.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.61.0.tgz", - "integrity": "sha512-IWdXFHFSb6mlC3HPc7QsLDm5zYEbUla6trDEHf32D3/dnuUyXd87plScSNXSbm0/RxMvObpI17sv/EDTGrGZkA==", + "version": "8.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.60.1.tgz", + "integrity": "sha512-gvI5OQoptnxQnchOirukCuQ55svJSTuD/4k5+pC267xyBtYry748R9/c3tYUzb/iE6RZfllRz2lVulLCHkTm4w==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.61.0", - "@typescript-eslint/visitor-keys": "8.61.0" + "@typescript-eslint/types": "8.60.1", + "@typescript-eslint/visitor-keys": "8.60.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -9416,9 +9529,9 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.61.0.tgz", - "integrity": "sha512-O5Amvdv9ztMpxpf+vmFULGG78IE6Qwdr3bCGvqwG4nwc9H2qXkOYJJnRbRHyMkQTjv1d03olqwwwzHLMqpFePQ==", + "version": "8.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.60.1.tgz", + "integrity": "sha512-nh8w4qAteiKuZu3pSSzG/yGKpw0OlkrKnzFmbVRenKaD4qc+7i1GrmZaLVkr8rk4uipiPGMOW4YsM6WmKZ5CvA==", "dev": true, "license": "MIT", "engines": { @@ -9433,9 +9546,9 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { - "version": "8.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.61.0.tgz", - "integrity": "sha512-9QTQpZ5Iin4CdIodfbDQFSeiSJKidgYJYug1P9CC2xWgUTvlmixViqDZNciMjwLBZyJnG4tGmPl97rVAFb1AJg==", + "version": "8.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.60.1.tgz", + "integrity": "sha512-4h0tY8ppCkdCzcrl2YM5M3my0xsE1Tf8om3owEu5oPWmXwkKRmk0j0LGDzYBGUcAlesEbxBhazqu/K4cu3Ug7w==", "dev": true, "license": "MIT", "engines": { @@ -9447,16 +9560,16 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.61.0.tgz", - "integrity": "sha512-42zatd5qSvvcV1JdDBCLxYRznvP4eIHpPoZXdkPFnAmanA4FuZ5dibSnCBggY8hQnqajPpoGjXFdZ7fIJKQnlA==", + "version": "8.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.60.1.tgz", + "integrity": "sha512-alpRkfG8hlVE5kdJW2GkfgDgXxold3e8e4l6EnmhRmRLbekgAPCCGDVD++sABy9FcgPFroq+uFcCSM1vR57Cew==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.61.0", - "@typescript-eslint/tsconfig-utils": "8.61.0", - "@typescript-eslint/types": "8.61.0", - "@typescript-eslint/visitor-keys": "8.61.0", + "@typescript-eslint/project-service": "8.60.1", + "@typescript-eslint/tsconfig-utils": "8.60.1", + "@typescript-eslint/types": "8.60.1", + "@typescript-eslint/visitor-keys": "8.60.1", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", @@ -9475,13 +9588,13 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.61.0.tgz", - "integrity": "sha512-QVLZu3ZPQEE+HICQyAMZ2yLQhxf0meY/wx6Hx14YcTNj13JB3qHlX3lJ02L3fLGHgERRH71kvYDwiXIguT3AjQ==", + "version": "8.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.60.1.tgz", + "integrity": "sha512-EbGRQg4FhrmwLodl+t3JNAnXHWVr9Vp+Zl1QBZVPY4ByfkzIT8cX3K6QWODHtkIZqqJVEWvhHSx3v5PDHsaQag==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.61.0", + "@typescript-eslint/types": "8.60.1", "eslint-visitor-keys": "^5.0.0" }, "engines": { @@ -10786,9 +10899,9 @@ } }, "node_modules/baseline-browser-mapping": { - "version": "2.10.34", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.34.tgz", - "integrity": "sha512-IMDedajPifLnHNY0X9n8hKxRTQ6/eTHwr5bDo04WnuqxyKw6LYtQywCuuqPZwhl3aBXMvQpJov42GLCwRRdQzw==", + "version": "2.10.33", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.33.tgz", + "integrity": "sha512-bA6+tcSLpz2tIEdDXZPpPTIuxBcC4+w6SieaYyfigIa4h8GlFxbA17v22Vx3JUtuZQj9SgOsnbK+aTBzyDyEuw==", "license": "Apache-2.0", "bin": { "baseline-browser-mapping": "dist/cli.cjs" @@ -11157,9 +11270,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001797", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001797.tgz", - "integrity": "sha512-l8xKG+gwAIExZGl9FrF7KUwuOmk6wbEPC9Xoy/RtnWv1XG0Q4LFlagaLpUv3Kiza3W/wm27zy0yWJEieYKAP6w==", + "version": "1.0.30001793", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001793.tgz", + "integrity": "sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA==", "funding": [ { "type": "opencollective", @@ -12345,9 +12458,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.369", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.369.tgz", - "integrity": "sha512-XM22K9FNaaCOvMMrBn1caIc8v0g6+pKt660ZbfQqUZvfil0hEzr8ZoiY7VcSLGM3L/x3rz5PqZrk+bKOOmVM9w==", + "version": "1.5.367", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.367.tgz", + "integrity": "sha512-4Mk/mrynCNQ+atY40D3UpmhLWB6AHMbYMlIrPhHcMF6x0L7O0b052FCAsxw1LlaR++UFuNg3D/A6XCuGDa0guQ==", "license": "ISC" }, "node_modules/emoji-mart": { @@ -14247,9 +14360,10 @@ } }, "node_modules/hono": { - "version": "4.12.14", - "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.14.tgz", - "integrity": "sha512-am5zfg3yu6sqn5yjKBNqhnTX7Cv+m00ox+7jbaKkrLMRJ4rAdldd1xPd/JzbBWspqaQv6RSTrgFN95EsfhC+7w==", + "version": "4.12.23", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.23.tgz", + "integrity": "sha512-eIaZ9qDgu7XV0pxOCrg7/WhnQ6Ivm22UcxhXx/A3dcbqbbYgBEkc6e/J/s7j2tS96zoB0S9VBdLwQNCWwUo4LA==", + "license": "MIT", "engines": { "node": ">=16.9.0" } @@ -21347,16 +21461,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.61.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.61.0.tgz", - "integrity": "sha512-8y31Rd0eGTrDKqhy6vT0HtzhN+YLjQizwX3aA3hPXP/ynSfnrBXcQY5IzsP9/DM7+klX4IUncZZjkchP0z+rUw==", + "version": "8.60.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.60.1.tgz", + "integrity": "sha512-6m5hkkRAp8lKvhVpcprAIn5KkehQEh+47oHH2VGnExEh7dhNxXlg6GPAOIu6TxbVQxhebrJDvjl3020ooiWCMA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.61.0", - "@typescript-eslint/parser": "8.61.0", - "@typescript-eslint/typescript-estree": "8.61.0", - "@typescript-eslint/utils": "8.61.0" + "@typescript-eslint/eslint-plugin": "8.60.1", + "@typescript-eslint/parser": "8.60.1", + "@typescript-eslint/typescript-estree": "8.60.1", + "@typescript-eslint/utils": "8.60.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -21371,17 +21485,17 @@ } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.61.0.tgz", - "integrity": "sha512-bFNvl9ZczlVb+wR2Akszf3gHfKVj/8WanXaGJ3UstTA7brNKg0cNdk6X1Psu5V7MZ2oQtzZKOEzIUehaoxbDGw==", + "version": "8.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.60.1.tgz", + "integrity": "sha512-JQ4S5GB0tfjO8BuJ4fcX+HodkzJjYBV+7OJ+wLygaX7OGQ7FudyHL4NSCA6ob+w3Yn+5MkKIozOwQhXeM7opVg==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.61.0", - "@typescript-eslint/type-utils": "8.61.0", - "@typescript-eslint/utils": "8.61.0", - "@typescript-eslint/visitor-keys": "8.61.0", + "@typescript-eslint/scope-manager": "8.60.1", + "@typescript-eslint/type-utils": "8.60.1", + "@typescript-eslint/utils": "8.60.1", + "@typescript-eslint/visitor-keys": "8.60.1", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" @@ -21394,22 +21508,22 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.61.0", + "@typescript-eslint/parser": "^8.60.1", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/parser": { - "version": "8.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.61.0.tgz", - "integrity": "sha512-5B7PfA2e1NQGCnDHd/0lW7W3gvp3d59Ryw54FYO8Uswxo9f6ikw3AZV+Xj/TvpImmpsiYyUqAfhC6kJID1jF6w==", + "version": "8.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.60.1.tgz", + "integrity": "sha512-A0M6ua6H252bVjPvvtSgl2QA4+ET9S5Mtkb2GDyTxIhH/C4qDItT7RQNO5PhMC6NXGYXOR9dIalcDDgBKT7oFA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.61.0", - "@typescript-eslint/types": "8.61.0", - "@typescript-eslint/typescript-estree": "8.61.0", - "@typescript-eslint/visitor-keys": "8.61.0", + "@typescript-eslint/scope-manager": "8.60.1", + "@typescript-eslint/types": "8.60.1", + "@typescript-eslint/typescript-estree": "8.60.1", + "@typescript-eslint/visitor-keys": "8.60.1", "debug": "^4.4.3" }, "engines": { @@ -21425,14 +21539,14 @@ } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/project-service": { - "version": "8.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.61.0.tgz", - "integrity": "sha512-DV42F7MLJO6Rax7SK1yg43tcnEfGUrurSpSxKuVX+a3RCTzBlH3fuxprrOJXKCJGAaw82xXocikJ0uQaqwXgGA==", + "version": "8.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.60.1.tgz", + "integrity": "sha512-eXkTH2bxmXlqD1RnOPmLZ9ZM9D3VwSx04JOwBnP9RQ+yUA5a2Mu7SfW8uaV2Aon53NJzZlZYuX7tn91Izf+xaw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.61.0", - "@typescript-eslint/types": "^8.61.0", + "@typescript-eslint/tsconfig-utils": "^8.60.1", + "@typescript-eslint/types": "^8.60.1", "debug": "^4.4.3" }, "engines": { @@ -21447,14 +21561,14 @@ } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/scope-manager": { - "version": "8.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.61.0.tgz", - "integrity": "sha512-IWdXFHFSb6mlC3HPc7QsLDm5zYEbUla6trDEHf32D3/dnuUyXd87plScSNXSbm0/RxMvObpI17sv/EDTGrGZkA==", + "version": "8.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.60.1.tgz", + "integrity": "sha512-gvI5OQoptnxQnchOirukCuQ55svJSTuD/4k5+pC267xyBtYry748R9/c3tYUzb/iE6RZfllRz2lVulLCHkTm4w==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.61.0", - "@typescript-eslint/visitor-keys": "8.61.0" + "@typescript-eslint/types": "8.60.1", + "@typescript-eslint/visitor-keys": "8.60.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -21465,9 +21579,9 @@ } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.61.0.tgz", - "integrity": "sha512-O5Amvdv9ztMpxpf+vmFULGG78IE6Qwdr3bCGvqwG4nwc9H2qXkOYJJnRbRHyMkQTjv1d03olqwwwzHLMqpFePQ==", + "version": "8.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.60.1.tgz", + "integrity": "sha512-nh8w4qAteiKuZu3pSSzG/yGKpw0OlkrKnzFmbVRenKaD4qc+7i1GrmZaLVkr8rk4uipiPGMOW4YsM6WmKZ5CvA==", "dev": true, "license": "MIT", "engines": { @@ -21482,15 +21596,15 @@ } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/type-utils": { - "version": "8.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.61.0.tgz", - "integrity": "sha512-TuBiQYIkd97yBfInHCTKVYMbX4kvEmpOEuixIuzCU9p8BGT1SfyyO0d0IfDMbPIHcjn/hWnusUX5e8v5Xg+X8A==", + "version": "8.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.60.1.tgz", + "integrity": "sha512-sdwTrpjosW7ANQYJ39ZBF1ZyEMEGVB2UsikrserVM/30a/F1dTLnu9bGxEdosugyu5caigjLrR2qiD11asjI1A==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.61.0", - "@typescript-eslint/typescript-estree": "8.61.0", - "@typescript-eslint/utils": "8.61.0", + "@typescript-eslint/types": "8.60.1", + "@typescript-eslint/typescript-estree": "8.60.1", + "@typescript-eslint/utils": "8.60.1", "debug": "^4.4.3", "ts-api-utils": "^2.5.0" }, @@ -21507,9 +21621,9 @@ } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/types": { - "version": "8.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.61.0.tgz", - "integrity": "sha512-9QTQpZ5Iin4CdIodfbDQFSeiSJKidgYJYug1P9CC2xWgUTvlmixViqDZNciMjwLBZyJnG4tGmPl97rVAFb1AJg==", + "version": "8.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.60.1.tgz", + "integrity": "sha512-4h0tY8ppCkdCzcrl2YM5M3my0xsE1Tf8om3owEu5oPWmXwkKRmk0j0LGDzYBGUcAlesEbxBhazqu/K4cu3Ug7w==", "dev": true, "license": "MIT", "engines": { @@ -21521,16 +21635,16 @@ } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.61.0.tgz", - "integrity": "sha512-42zatd5qSvvcV1JdDBCLxYRznvP4eIHpPoZXdkPFnAmanA4FuZ5dibSnCBggY8hQnqajPpoGjXFdZ7fIJKQnlA==", + "version": "8.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.60.1.tgz", + "integrity": "sha512-alpRkfG8hlVE5kdJW2GkfgDgXxold3e8e4l6EnmhRmRLbekgAPCCGDVD++sABy9FcgPFroq+uFcCSM1vR57Cew==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.61.0", - "@typescript-eslint/tsconfig-utils": "8.61.0", - "@typescript-eslint/types": "8.61.0", - "@typescript-eslint/visitor-keys": "8.61.0", + "@typescript-eslint/project-service": "8.60.1", + "@typescript-eslint/tsconfig-utils": "8.60.1", + "@typescript-eslint/types": "8.60.1", + "@typescript-eslint/visitor-keys": "8.60.1", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", @@ -21549,13 +21663,13 @@ } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.61.0.tgz", - "integrity": "sha512-QVLZu3ZPQEE+HICQyAMZ2yLQhxf0meY/wx6Hx14YcTNj13JB3qHlX3lJ02L3fLGHgERRH71kvYDwiXIguT3AjQ==", + "version": "8.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.60.1.tgz", + "integrity": "sha512-EbGRQg4FhrmwLodl+t3JNAnXHWVr9Vp+Zl1QBZVPY4ByfkzIT8cX3K6QWODHtkIZqqJVEWvhHSx3v5PDHsaQag==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.61.0", + "@typescript-eslint/types": "8.60.1", "eslint-visitor-keys": "^5.0.0" }, "engines": { @@ -22970,14969 +23084,5 @@ "zod": "^3.25.0 || ^4.0.0" } } - }, - "dependencies": { - "@adobe/css-tools": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.5.0.tgz", - "integrity": "sha512-6OzddxPio9UiWTCemp4N8cYLV2ZN1ncRnV1cVGtve7dhPOtRkleRyx32GQCYSwDYgaHU3USMm84tNsvKzRCa1Q==", - "dev": true - }, - "@algolia/abtesting": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.14.1.tgz", - "integrity": "sha512-Dkj0BgPiLAaim9sbQ97UKDFHJE/880wgStAM18U++NaJ/2Cws34J5731ovJifr6E3Pv4T2CqvMXf8qLCC417Ew==", - "requires": { - "@algolia/client-common": "5.48.1", - "@algolia/requester-browser-xhr": "5.48.1", - "@algolia/requester-fetch": "5.48.1", - "@algolia/requester-node-http": "5.48.1" - } - }, - "@algolia/client-abtesting": { - "version": "5.48.1", - "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.48.1.tgz", - "integrity": "sha512-LV5qCJdj+/m9I+Aj91o+glYszrzd7CX6NgKaYdTOj4+tUYfbS62pwYgUfZprYNayhkQpVFcrW8x8ZlIHpS23Vw==", - "requires": { - "@algolia/client-common": "5.48.1", - "@algolia/requester-browser-xhr": "5.48.1", - "@algolia/requester-fetch": "5.48.1", - "@algolia/requester-node-http": "5.48.1" - } - }, - "@algolia/client-analytics": { - "version": "5.48.1", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.48.1.tgz", - "integrity": "sha512-/AVoMqHhPm14CcHq7mwB+bUJbfCv+jrxlNvRjXAuO+TQa+V37N8k1b0ijaRBPdmSjULMd8KtJbQyUyabXOu6Kg==", - "requires": { - "@algolia/client-common": "5.48.1", - "@algolia/requester-browser-xhr": "5.48.1", - "@algolia/requester-fetch": "5.48.1", - "@algolia/requester-node-http": "5.48.1" - } - }, - "@algolia/client-common": { - "version": "5.48.1", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.48.1.tgz", - "integrity": "sha512-VXO+qu2Ep6ota28ktvBm3sG53wUHS2n7bgLWmce5jTskdlCD0/JrV4tnBm1l7qpla1CeoQb8D7ShFhad+UoSOw==" - }, - "@algolia/client-insights": { - "version": "5.48.1", - "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.48.1.tgz", - "integrity": "sha512-zl+Qyb0nLg+Y5YvKp1Ij+u9OaPaKg2/EPzTwKNiVyOHnQJlFxmXyUZL1EInczAZsEY8hVpPCLtNfhMhfxluXKQ==", - "requires": { - "@algolia/client-common": "5.48.1", - "@algolia/requester-browser-xhr": "5.48.1", - "@algolia/requester-fetch": "5.48.1", - "@algolia/requester-node-http": "5.48.1" - } - }, - "@algolia/client-personalization": { - "version": "5.48.1", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.48.1.tgz", - "integrity": "sha512-r89Qf9Oo9mKWQXumRu/1LtvVJAmEDpn8mHZMc485pRfQUMAwSSrsnaw1tQ3sszqzEgAr1c7rw6fjBI+zrAXTOw==", - "requires": { - "@algolia/client-common": "5.48.1", - "@algolia/requester-browser-xhr": "5.48.1", - "@algolia/requester-fetch": "5.48.1", - "@algolia/requester-node-http": "5.48.1" - } - }, - "@algolia/client-query-suggestions": { - "version": "5.48.1", - "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.48.1.tgz", - "integrity": "sha512-TPKNPKfghKG/bMSc7mQYD9HxHRUkBZA4q1PEmHgICaSeHQscGqL4wBrKkhfPlDV1uYBKW02pbFMUhsOt7p4ZpA==", - "requires": { - "@algolia/client-common": "5.48.1", - "@algolia/requester-browser-xhr": "5.48.1", - "@algolia/requester-fetch": "5.48.1", - "@algolia/requester-node-http": "5.48.1" - } - }, - "@algolia/client-search": { - "version": "5.48.1", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.48.1.tgz", - "integrity": "sha512-4Fu7dnzQyQmMFknYwTiN/HxPbH4DyxvQ1m+IxpPp5oslOgz8m6PG5qhiGbqJzH4HiT1I58ecDiCAC716UyVA8Q==", - "requires": { - "@algolia/client-common": "5.48.1", - "@algolia/requester-browser-xhr": "5.48.1", - "@algolia/requester-fetch": "5.48.1", - "@algolia/requester-node-http": "5.48.1" - } - }, - "@algolia/ingestion": { - "version": "1.48.1", - "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.48.1.tgz", - "integrity": "sha512-/RFq3TqtXDUUawwic/A9xylA2P3LDMO8dNhphHAUOU51b1ZLHrmZ6YYJm3df1APz7xLY1aht6okCQf+/vmrV9w==", - "requires": { - "@algolia/client-common": "5.48.1", - "@algolia/requester-browser-xhr": "5.48.1", - "@algolia/requester-fetch": "5.48.1", - "@algolia/requester-node-http": "5.48.1" - } - }, - "@algolia/monitoring": { - "version": "1.48.1", - "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.48.1.tgz", - "integrity": "sha512-Of0jTeAZRyRhC7XzDSjJef0aBkgRcvRAaw0ooYRlOw57APii7lZdq+layuNdeL72BRq1snaJhoMMwkmLIpJScw==", - "requires": { - "@algolia/client-common": "5.48.1", - "@algolia/requester-browser-xhr": "5.48.1", - "@algolia/requester-fetch": "5.48.1", - "@algolia/requester-node-http": "5.48.1" - } - }, - "@algolia/recommend": { - "version": "5.48.1", - "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.48.1.tgz", - "integrity": "sha512-bE7JcpFXzxF5zHwj/vkl2eiCBvyR1zQ7aoUdO+GDXxGp0DGw7nI0p8Xj6u8VmRQ+RDuPcICFQcCwRIJT5tDJFw==", - "requires": { - "@algolia/client-common": "5.48.1", - "@algolia/requester-browser-xhr": "5.48.1", - "@algolia/requester-fetch": "5.48.1", - "@algolia/requester-node-http": "5.48.1" - } - }, - "@algolia/requester-browser-xhr": { - "version": "5.48.1", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.48.1.tgz", - "integrity": "sha512-MK3wZ2koLDnvH/AmqIF1EKbJlhRS5j74OZGkLpxI4rYvNi9Jn/C7vb5DytBnQ4KUWts7QsmbdwHkxY5txQHXVw==", - "requires": { - "@algolia/client-common": "5.48.1" - } - }, - "@algolia/requester-fetch": { - "version": "5.48.1", - "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.48.1.tgz", - "integrity": "sha512-2oDT43Y5HWRSIQMPQI4tA/W+TN/N2tjggZCUsqQV440kxzzoPGsvv9QP1GhQ4CoDa+yn6ygUsGp6Dr+a9sPPSg==", - "requires": { - "@algolia/client-common": "5.48.1" - } - }, - "@algolia/requester-node-http": { - "version": "5.48.1", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.48.1.tgz", - "integrity": "sha512-xcaCqbhupVWhuBP1nwbk1XNvwrGljozutEiLx06mvqDf3o8cHyEgQSHS4fKJM+UAggaWVnnFW+Nne5aQ8SUJXg==", - "requires": { - "@algolia/client-common": "5.48.1" - } - }, - "@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "@angular-builders/common": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@angular-builders/common/-/common-5.0.3.tgz", - "integrity": "sha512-Dro3574mu4/xqmjdA3159+TXDhgTbIJpEY/iBETSKUvHJiCgHel+R3eT105RpHN5o7NaD2rau5Zk2wuZqOk35Q==", - "dev": true, - "requires": { - "@angular-devkit/core": "^21.0.0", - "ts-node": "^10.0.0", - "tsconfig-paths": "^4.2.0" - } - }, - "@angular-builders/custom-esbuild": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@angular-builders/custom-esbuild/-/custom-esbuild-21.0.3.tgz", - "integrity": "sha512-Q56JTNVrmdm2XJEHu3HWsTcxXMREYZ2ROnuaUs7ZV02Tu8E9Y8ejk8LCsRFNe/LKciUUMzaM6B78nSkXrkkNjQ==", - "dev": true, - "requires": { - "@angular-builders/common": "5.0.3", - "@angular-devkit/architect": ">=0.2100.0 < 0.2200.0", - "@angular-devkit/core": "^21.0.0", - "@angular/build": "^21.0.0" - } - }, - "@angular-devkit/architect": { - "version": "0.2102.14", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2102.14.tgz", - "integrity": "sha512-0+vjVsCkMyJdVjz5XkPW+Bdf/9TI8V2voomx/+o0o+oOaqqiEhptQWFnaIlLr7HasjB0LxXK5P9L0oQ61vxj8Q==", - "requires": { - "@angular-devkit/core": "21.2.14", - "rxjs": "7.8.2" - } - }, - "@angular-devkit/build-angular": { - "version": "21.2.14", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-21.2.14.tgz", - "integrity": "sha512-EgKDd5pYctnsj3yYAZt3vivodH+r61X0ivWbZljcwT7OO4CEDyTR7Vtu4TUSr+tlplz5x2PYsWNr1nqyF0hufw==", - "dev": true, - "requires": { - "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.2102.14", - "@angular-devkit/build-webpack": "0.2102.14", - "@angular-devkit/core": "21.2.14", - "@angular/build": "21.2.14", - "@babel/core": "7.29.0", - "@babel/generator": "7.29.1", - "@babel/helper-annotate-as-pure": "7.27.3", - "@babel/helper-split-export-declaration": "7.24.7", - "@babel/plugin-transform-async-generator-functions": "7.29.0", - "@babel/plugin-transform-async-to-generator": "7.28.6", - "@babel/plugin-transform-runtime": "7.29.0", - "@babel/preset-env": "7.29.2", - "@babel/runtime": "7.29.2", - "@discoveryjs/json-ext": "0.6.3", - "@ngtools/webpack": "21.2.14", - "ansi-colors": "4.1.3", - "autoprefixer": "10.4.27", - "babel-loader": "10.0.0", - "browserslist": "^4.26.0", - "copy-webpack-plugin": "14.0.0", - "css-loader": "7.1.3", - "esbuild": "0.27.3", - "esbuild-wasm": "0.27.3", - "http-proxy-middleware": "3.0.5", - "istanbul-lib-instrument": "6.0.3", - "jsonc-parser": "3.3.1", - "karma-source-map-support": "1.4.0", - "less": "4.4.2", - "less-loader": "12.3.1", - "license-webpack-plugin": "4.0.2", - "loader-utils": "3.3.1", - "mini-css-extract-plugin": "2.10.0", - "open": "11.0.0", - "ora": "9.3.0", - "picomatch": "4.0.4", - "piscina": "5.1.4", - "postcss": "8.5.12", - "postcss-loader": "8.2.0", - "resolve-url-loader": "5.0.0", - "rxjs": "7.8.2", - "sass": "1.97.3", - "sass-loader": "16.0.7", - "semver": "7.7.4", - "source-map-loader": "5.0.0", - "source-map-support": "0.5.21", - "terser": "5.46.0", - "tinyglobby": "0.2.15", - "tree-kill": "1.2.2", - "tslib": "2.8.1", - "webpack": "5.105.2", - "webpack-dev-middleware": "7.4.5", - "webpack-dev-server": "5.2.3", - "webpack-merge": "6.0.1", - "webpack-subresource-integrity": "5.1.0" - }, - "dependencies": { - "@discoveryjs/json-ext": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.6.3.tgz", - "integrity": "sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ==", - "dev": true - }, - "autoprefixer": { - "version": "10.4.27", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.27.tgz", - "integrity": "sha512-NP9APE+tO+LuJGn7/9+cohklunJsXWiaWEfV3si4Gi/XHDwVNgkwr1J3RQYFIvPy76GmJ9/bW8vyoU1LcxwKHA==", - "dev": true, - "requires": { - "browserslist": "^4.28.1", - "caniuse-lite": "^1.0.30001774", - "fraction.js": "^5.3.4", - "picocolors": "^1.1.1", - "postcss-value-parser": "^4.2.0" - } - }, - "is-wsl": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", - "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", - "dev": true, - "requires": { - "is-inside-container": "^1.0.0" - } - }, - "istanbul-lib-instrument": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", - "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", - "dev": true, - "requires": { - "@babel/core": "^7.23.9", - "@babel/parser": "^7.23.9", - "@istanbuljs/schema": "^0.1.3", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" - } - }, - "open": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/open/-/open-11.0.0.tgz", - "integrity": "sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==", - "dev": true, - "requires": { - "default-browser": "^5.4.0", - "define-lazy-prop": "^3.0.0", - "is-in-ssh": "^1.0.0", - "is-inside-container": "^1.0.0", - "powershell-utils": "^0.1.0", - "wsl-utils": "^0.3.0" - } - }, - "picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "dev": true - }, - "wsl-utils": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.3.1.tgz", - "integrity": "sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==", - "dev": true, - "requires": { - "is-wsl": "^3.1.0", - "powershell-utils": "^0.1.0" - } - } - } - }, - "@angular-devkit/build-webpack": { - "version": "0.2102.14", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.2102.14.tgz", - "integrity": "sha512-UjZzypzYLYaWMVplu9CYpx0gxKYu9+V3GiOrtlshInuGMZe9uQy7wRgiFUUKClRSMf8CCT1jfCof9gFwqYCRuQ==", - "dev": true, - "requires": { - "@angular-devkit/architect": "0.2102.14", - "rxjs": "7.8.2" - } - }, - "@angular-devkit/core": { - "version": "21.2.14", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.2.14.tgz", - "integrity": "sha512-RSOWXB9bFc2nwRWMxbIT0RbSNFUrwfBo4N5MNxbyQ69Ndc0gVm3h+3ArHv0qotH4d+pJYbm5ttXu8YqR2kc0CA==", - "requires": { - "ajv": "8.18.0", - "ajv-formats": "3.0.1", - "jsonc-parser": "3.3.1", - "picomatch": "4.0.4", - "rxjs": "7.8.2", - "source-map": "0.7.6" - }, - "dependencies": { - "ajv": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", - "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", - "requires": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - } - }, - "ajv-formats": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", - "requires": { - "ajv": "^8.0.0" - } - }, - "picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==" - } - } - }, - "@angular-devkit/schematics": { - "version": "21.2.14", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-21.2.14.tgz", - "integrity": "sha512-KMJlQSBEzI4+Cy1Zh72gmGQNN2I1vY+nj9CoRcZPBIi1si+0ZAc49XT85eYl+eQumNTVQviUG7LQqgLDAHml+g==", - "requires": { - "@angular-devkit/core": "21.2.14", - "jsonc-parser": "3.3.1", - "magic-string": "0.30.21", - "ora": "9.3.0", - "rxjs": "7.8.2" - } - }, - "@angular-eslint/builder": { - "version": "21.4.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-21.4.0.tgz", - "integrity": "sha512-3kgGmrVaCYbLtDjC8g4BmMBbdz4thsOB8/NYly8JtXM8EuDZEk5Pz6VTRpJR02ARprwayraTTmhyvq6OGBlQ9w==", - "dev": true, - "requires": { - "@angular-devkit/architect": ">= 0.2100.0 < 0.2200.0", - "@angular-devkit/core": ">= 21.0.0 < 22.0.0" - } - }, - "@angular-eslint/bundled-angular-compiler": { - "version": "21.4.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-21.4.0.tgz", - "integrity": "sha512-/3H4BPbQ1BHJkkrUsfusZtmHc+qiFWBBZ9UDPWah4xZMjflexOK9U4GYeH7nMjcuyqFnIlMMeJJNwNLGt/hmdg==", - "dev": true - }, - "@angular-eslint/eslint-plugin": { - "version": "21.4.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-21.4.0.tgz", - "integrity": "sha512-mow2DMj+xBvGl5t7jzC34R8YfbHbaGNyCNFzpovtl9qc0JbuqLyg6htmt8xb05f8ZjATOr4nz0ESt6HV4c51hw==", - "dev": true, - "requires": { - "@angular-eslint/bundled-angular-compiler": "21.4.0", - "@angular-eslint/utils": "21.4.0", - "ts-api-utils": "^2.1.0" - } - }, - "@angular-eslint/eslint-plugin-template": { - "version": "21.4.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-21.4.0.tgz", - "integrity": "sha512-sJEHx2WYnvOgPpzP1eHnUdRS06zgKmRxbiIR0JiCcaSen5iv1HlsMieXy//FS9TtNW+abHOy4UtDuGuSPflPFA==", - "dev": true, - "requires": { - "@angular-eslint/bundled-angular-compiler": "21.4.0", - "@angular-eslint/utils": "21.4.0", - "aria-query": "5.3.2", - "axobject-query": "4.1.0" - } - }, - "@angular-eslint/schematics": { - "version": "21.4.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-21.4.0.tgz", - "integrity": "sha512-crD6Hfxs7x5bN9FCqTZI7uVSiGvprfCS3MCPOpyIQl87bRr/9aNhnicJ3ROUHv+2A713BgPHIgiCII/bxzrfPw==", - "dev": true, - "requires": { - "@angular-devkit/core": ">= 21.0.0 < 22.0.0", - "@angular-devkit/schematics": ">= 21.0.0 < 22.0.0", - "@angular-eslint/eslint-plugin": "21.4.0", - "@angular-eslint/eslint-plugin-template": "21.4.0", - "ignore": "7.0.5", - "semver": "7.7.4", - "strip-json-comments": "3.1.1" - }, - "dependencies": { - "ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", - "dev": true - } - } - }, - "@angular-eslint/template-parser": { - "version": "21.4.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-21.4.0.tgz", - "integrity": "sha512-BaUSLSyS+43fzDoJkTMkGqNdCXq3fGnUZsfXTmrlZPJf5AYFbgAlAPGZXDJyoNWw43fux+DafdlrlKcYUSgSIw==", - "dev": true, - "requires": { - "@angular-eslint/bundled-angular-compiler": "21.4.0", - "eslint-scope": "9.1.2" - } - }, - "@angular-eslint/utils": { - "version": "21.4.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-21.4.0.tgz", - "integrity": "sha512-7pi+Ga7QmdH5Ig/diau6fR5L4yubgKr9TOjdCg7OeuE/zo0O3osTCNT6JOodzS/iQM1kSCJFDoIBKFeUOttiNw==", - "dev": true, - "requires": { - "@angular-eslint/bundled-angular-compiler": "21.4.0" - } - }, - "@angular/animations": { - "version": "21.2.16", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-21.2.16.tgz", - "integrity": "sha512-YPhph/OC1A0vkT95XZW6lXMNmi5ly91JeXi+5yeG8CCxfqscVfRNPsYbRWjSueO0cQT2HJ8U1CLteQ5a1OaoHA==", - "requires": { - "tslib": "^2.3.0" - } - }, - "@angular/build": { - "version": "21.2.14", - "resolved": "https://registry.npmjs.org/@angular/build/-/build-21.2.14.tgz", - "integrity": "sha512-l8JB326iIwum2WmbopUUFdiuYsbHchix6MH8o6F6FA7LJr8QLTvipwwbw+Jx31/RE50WkGmzsZ1fBDw/cMbmUw==", - "dev": true, - "requires": { - "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.2102.14", - "@babel/core": "7.29.0", - "@babel/helper-annotate-as-pure": "7.27.3", - "@babel/helper-split-export-declaration": "7.24.7", - "@inquirer/confirm": "5.1.21", - "@vitejs/plugin-basic-ssl": "2.1.4", - "beasties": "0.4.1", - "browserslist": "^4.26.0", - "esbuild": "0.27.3", - "https-proxy-agent": "7.0.6", - "istanbul-lib-instrument": "6.0.3", - "jsonc-parser": "3.3.1", - "listr2": "9.0.5", - "lmdb": "3.5.1", - "magic-string": "0.30.21", - "mrmime": "2.0.1", - "parse5-html-rewriting-stream": "8.0.0", - "picomatch": "4.0.4", - "piscina": "5.1.4", - "rolldown": "1.0.0-rc.4", - "sass": "1.97.3", - "semver": "7.7.4", - "source-map-support": "0.5.21", - "tinyglobby": "0.2.15", - "undici": "7.24.4", - "vite": "7.3.2", - "watchpack": "2.5.1" - }, - "dependencies": { - "istanbul-lib-instrument": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", - "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", - "dev": true, - "requires": { - "@babel/core": "^7.23.9", - "@babel/parser": "^7.23.9", - "@istanbuljs/schema": "^0.1.3", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" - } - }, - "picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "dev": true - } - } - }, - "@angular/cdk": { - "version": "21.2.14", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-21.2.14.tgz", - "integrity": "sha512-806REq/CLf37nEhmmd8Q+ILN8z/RVG2vk2n8YZ/4TdHpcBCi5ux4AxLbpMmduLwGPOzPagJ6ggRzE5fnX0rmcQ==", - "requires": { - "parse5": "^8.0.0", - "tslib": "^2.3.0" - }, - "dependencies": { - "entities": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==" - }, - "parse5": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.0.tgz", - "integrity": "sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==", - "requires": { - "entities": "^6.0.0" - } - } - } - }, - "@angular/cli": { - "version": "21.2.14", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-21.2.14.tgz", - "integrity": "sha512-S8jExTjxPJILwpg2lu3DohSASVZ8DLhSNCmOe7z0qF9VskRSjC7SIQv1rq36tsJkenxuA72gjVOHZv+uSRT8HA==", - "requires": { - "@angular-devkit/architect": "0.2102.14", - "@angular-devkit/core": "21.2.14", - "@angular-devkit/schematics": "21.2.14", - "@inquirer/prompts": "7.10.1", - "@listr2/prompt-adapter-inquirer": "3.0.5", - "@modelcontextprotocol/sdk": "1.26.0", - "@schematics/angular": "21.2.14", - "@yarnpkg/lockfile": "1.1.0", - "algoliasearch": "5.48.1", - "ini": "6.0.0", - "jsonc-parser": "3.3.1", - "listr2": "9.0.5", - "npm-package-arg": "13.0.2", - "pacote": "21.3.1", - "parse5-html-rewriting-stream": "8.0.0", - "semver": "7.7.4", - "yargs": "18.0.0", - "zod": "4.3.6" - }, - "dependencies": { - "ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==" - }, - "ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==" - }, - "cliui": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", - "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", - "requires": { - "string-width": "^7.2.0", - "strip-ansi": "^7.1.0", - "wrap-ansi": "^9.0.0" - } - }, - "emoji-regex": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", - "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==" - }, - "string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "requires": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - } - }, - "strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", - "requires": { - "ansi-regex": "^6.0.1" - } - }, - "wrap-ansi": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", - "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", - "requires": { - "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" - } - }, - "yargs": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", - "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", - "requires": { - "cliui": "^9.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "string-width": "^7.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^22.0.0" - } - }, - "yargs-parser": { - "version": "22.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", - "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==" - } - } - }, - "@angular/common": { - "version": "21.2.16", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-21.2.16.tgz", - "integrity": "sha512-htHNepKzjIjkc5BQ7MKDN0bVDOfQpFr/fGUxa6irC0kFLfWt7idUTdNcxypRvjCCTuBYHkjr74fH4QKu+qvPXg==", - "requires": { - "tslib": "^2.3.0" - } - }, - "@angular/compiler": { - "version": "21.2.16", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-21.2.16.tgz", - "integrity": "sha512-hVjp93gYgNj5aRbCQUK7L+pOfdqk96lCtmSL2hOL725Pmib9NyNIrA3ISfAQHN+Qo70763WUZahOiqBBOzfAcg==", - "requires": { - "tslib": "^2.3.0" - } - }, - "@angular/compiler-cli": { - "version": "21.2.16", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-21.2.16.tgz", - "integrity": "sha512-w2ck3o+uw29AZEGK3HvOsF/ZRiPcfoq2TaDtiNjdH+svhwawt9PfMXrDbbIKF30prWzKLpT3UsCqTz1awv7Ubw==", - "requires": { - "@babel/core": "7.29.0", - "@jridgewell/sourcemap-codec": "^1.4.14", - "chokidar": "^5.0.0", - "convert-source-map": "^1.5.1", - "reflect-metadata": "^0.2.0", - "semver": "^7.0.0", - "tslib": "^2.3.0", - "yargs": "^18.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==" - }, - "ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==" - }, - "chokidar": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", - "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", - "requires": { - "readdirp": "^5.0.0" - } - }, - "cliui": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", - "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", - "requires": { - "string-width": "^7.2.0", - "strip-ansi": "^7.1.0", - "wrap-ansi": "^9.0.0" - } - }, - "emoji-regex": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", - "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==" - }, - "readdirp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", - "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==" - }, - "string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "requires": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - } - }, - "strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "requires": { - "ansi-regex": "^6.0.1" - } - }, - "wrap-ansi": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", - "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", - "requires": { - "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" - } - }, - "yargs": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", - "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", - "requires": { - "cliui": "^9.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "string-width": "^7.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^22.0.0" - } - }, - "yargs-parser": { - "version": "22.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", - "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==" - } - } - }, - "@angular/core": { - "version": "21.2.16", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-21.2.16.tgz", - "integrity": "sha512-uufKORlB0jeYdqOvjAfMYgqIqmJentOj8XvTUxsFP5k85xxzXsDarSpP199YQz6jhJJQYNOWIloDkUTQJi5rNA==", - "requires": { - "tslib": "^2.3.0" - } - }, - "@angular/elements": { - "version": "21.2.16", - "resolved": "https://registry.npmjs.org/@angular/elements/-/elements-21.2.16.tgz", - "integrity": "sha512-p9Y8KyMZQ37Tn7zjkaiQJUog+TtDlypqwD4ABzUNKKkgjLTRMVbS+xJ7rPuF5HSCsGS2tO+fsbxWcIGHIACL+Q==", - "requires": { - "tslib": "^2.3.0" - } - }, - "@angular/forms": { - "version": "21.2.16", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-21.2.16.tgz", - "integrity": "sha512-2djTJmTpg/MkQ2kdCI9k0LT4RL9/Hg03fDUNN2eN5c04FIk99D3yHXUJYLwiaErLuLQNkU8HaijluKHdH93cWQ==", - "requires": { - "@standard-schema/spec": "^1.0.0", - "tslib": "^2.3.0" - } - }, - "@angular/language-service": { - "version": "21.2.15", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-21.2.15.tgz", - "integrity": "sha512-xR2dH1xpd3zojdVztFFTS87f6SOp2SAC6ri09eIpxbHpLXl0ruuDgYFs/ug2JOWC2rIfc7UnoQjdSMs1u0XEbw==", - "dev": true - }, - "@angular/platform-browser": { - "version": "21.2.16", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-21.2.16.tgz", - "integrity": "sha512-59ToWYDb+O3fS0+Y4ubQqV0zY6sf2esLZ19AT7JKXN7Akqbz7aQ2/3k3PKmfhwKWek5o3lkuNz8YhxKQruNh8Q==", - "requires": { - "tslib": "^2.3.0" - } - }, - "@angular/platform-browser-dynamic": { - "version": "21.2.16", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-21.2.16.tgz", - "integrity": "sha512-WtTnkJOmKiGccHRQfBdkwODAkpTB4zbPN3IKhcqCjlezKaPqZB5tjrIu72Z5pmi5VIgJz1LmfO1LSVCMC5h7dA==", - "requires": { - "tslib": "^2.3.0" - } - }, - "@angular/router": { - "version": "21.2.16", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-21.2.16.tgz", - "integrity": "sha512-0+Pyh0uT4vCLabKoGCARYWlwpz4DgZI9AE01n8s9u/nKAZuEMnJtLLnaUtHEMI8nJSqpgnS/5AthuJZdDEfkYw==", - "requires": { - "tslib": "^2.3.0" - } - }, - "@apidevtools/json-schema-ref-parser": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.1.2.tgz", - "integrity": "sha512-r1w81DpR+KyRWd3f+rk6TNqMgedmAxZP5v5KWlXQWlgMUUtyEJch0DKEci1SorPMiSeM8XPl7MZ3miJ60JIpQg==", - "requires": { - "@jsdevtools/ono": "^7.1.3", - "@types/json-schema": "^7.0.6", - "call-me-maybe": "^1.0.1", - "js-yaml": "^4.1.0" - } - }, - "@appsignal/javascript": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@appsignal/javascript/-/javascript-1.6.1.tgz", - "integrity": "sha512-jRVkTYsLC7tM5no6V2Fw2Vc325KRKductkEEHzXTS+upZdBgzkxeTQ1MjuPcfN73vUEplaaP6tMkqv7Ids6frg==", - "requires": { - "tslib": "^2.3.0" - } - }, - "@appsignal/plugin-breadcrumbs-console": { - "version": "1.1.37", - "resolved": "https://registry.npmjs.org/@appsignal/plugin-breadcrumbs-console/-/plugin-breadcrumbs-console-1.1.37.tgz", - "integrity": "sha512-l8TKLJd6GScUWrlLaBysdT8Q3PyaO1RQjkmCMolN3aCNxTx4C9zw3f+CIlRITaW2sTd8LRN1NV6ee3VEMaT6nQ==", - "requires": { - "@appsignal/javascript": "=1.6.1" - } - }, - "@appsignal/plugin-breadcrumbs-network": { - "version": "1.1.24", - "resolved": "https://registry.npmjs.org/@appsignal/plugin-breadcrumbs-network/-/plugin-breadcrumbs-network-1.1.24.tgz", - "integrity": "sha512-7RYADVRYHKNuunma3cN38xP40k3BpB5pkkDc3IIePpVe8QDxlTErzgSa9SRDp69ItNr8rU9VUJWqBZb0jnF1Cg==", - "requires": { - "@appsignal/javascript": "=1.6.1" - } - }, - "@asamuzakjp/css-color": { - "version": "5.1.11", - "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-5.1.11.tgz", - "integrity": "sha512-KVw6qIiCTUQhByfTd78h2yD1/00waTmm9uy/R7Ck/ctUyAPj+AEDLkQIdJW0T8+qGgj3j5bpNKK7Q3G+LedJWg==", - "dev": true, - "requires": { - "@asamuzakjp/generational-cache": "^1.0.1", - "@csstools/css-calc": "^3.2.0", - "@csstools/css-color-parser": "^4.1.0", - "@csstools/css-parser-algorithms": "^4.0.0", - "@csstools/css-tokenizer": "^4.0.0" - } - }, - "@asamuzakjp/dom-selector": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-7.1.1.tgz", - "integrity": "sha512-67RZDnYRc8H/8MLDgQCDE//zoqVFwajkepHZgmXrbwybzXOEwOWGPYGmALYl9J2DOLfFPPs6kKCqmbzV895hTQ==", - "dev": true, - "requires": { - "@asamuzakjp/generational-cache": "^1.0.1", - "@asamuzakjp/nwsapi": "^2.3.9", - "bidi-js": "^1.0.3", - "css-tree": "^3.2.1", - "is-potential-custom-element-name": "^1.0.1" - } - }, - "@asamuzakjp/generational-cache": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@asamuzakjp/generational-cache/-/generational-cache-1.0.1.tgz", - "integrity": "sha512-wajfB8KqzMCN2KGNFdLkReeHncd0AslUSrvHVvvYWuU8ghncRJoA50kT3zP9MVL0+9g4/67H+cdvBskj9THPzg==", - "dev": true - }, - "@asamuzakjp/nwsapi": { - "version": "2.3.9", - "resolved": "https://registry.npmjs.org/@asamuzakjp/nwsapi/-/nwsapi-2.3.9.tgz", - "integrity": "sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==", - "dev": true - }, - "@authress/login": { - "version": "2.6.417", - "resolved": "https://registry.npmjs.org/@authress/login/-/login-2.6.417.tgz", - "integrity": "sha512-3iMjpwnU3iWTpVjS5nc1/7QrIresFS+TKN43R9UtV/khW2liyq9CPyX5ZCjZ74TWEXOckhTwqy9s7VpHlZ8TWw==", - "requires": { - "cookie": "<1", - "lodash.take": "^4.1.1" - } - }, - "@babel/code-frame": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", - "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", - "requires": { - "@babel/helper-validator-identifier": "^7.28.5", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - } - }, - "@babel/compat-data": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", - "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==" - }, - "@babel/core": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", - "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", - "requires": { - "@babel/code-frame": "^7.29.0", - "@babel/generator": "^7.29.0", - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-module-transforms": "^7.28.6", - "@babel/helpers": "^7.28.6", - "@babel/parser": "^7.29.0", - "@babel/template": "^7.28.6", - "@babel/traverse": "^7.29.0", - "@babel/types": "^7.29.0", - "@jridgewell/remapping": "^2.3.5", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "dependencies": { - "convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" - }, - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" - } - } - }, - "@babel/generator": { - "version": "7.29.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", - "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", - "requires": { - "@babel/parser": "^7.29.0", - "@babel/types": "^7.29.0", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", - "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", - "dev": true, - "requires": { - "@babel/types": "^7.27.3" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", - "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", - "requires": { - "@babel/compat-data": "^7.28.6", - "@babel/helper-validator-option": "^7.27.1", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" - } - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.6.tgz", - "integrity": "sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-member-expression-to-functions": "^7.28.5", - "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/helper-replace-supers": "^7.28.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/traverse": "^7.28.6", - "semver": "^6.3.1" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.28.5.tgz", - "integrity": "sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "regexpu-core": "^6.3.1", - "semver": "^6.3.1" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "@babel/helper-define-polyfill-provider": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.8.tgz", - "integrity": "sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA==", - "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6", - "debug": "^4.4.3", - "lodash.debounce": "^4.0.8", - "resolve": "^1.22.11" - } - }, - "@babel/helper-globals": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==" - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz", - "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==", - "dev": true, - "requires": { - "@babel/traverse": "^7.28.5", - "@babel/types": "^7.28.5" - } - }, - "@babel/helper-module-imports": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", - "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", - "requires": { - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6" - } - }, - "@babel/helper-module-transforms": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", - "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", - "requires": { - "@babel/helper-module-imports": "^7.28.6", - "@babel/helper-validator-identifier": "^7.28.5", - "@babel/traverse": "^7.28.6" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", - "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", - "dev": true, - "requires": { - "@babel/types": "^7.27.1" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", - "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", - "dev": true - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", - "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-wrap-function": "^7.27.1", - "@babel/traverse": "^7.27.1" - } - }, - "@babel/helper-replace-supers": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.28.6.tgz", - "integrity": "sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==", - "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.28.5", - "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/traverse": "^7.28.6" - } - }, - "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", - "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", - "dev": true, - "requires": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", - "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", - "dev": true, - "requires": { - "@babel/types": "^7.24.7" - } - }, - "@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==" - }, - "@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==" - }, - "@babel/helper-validator-option": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==" - }, - "@babel/helper-wrap-function": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.6.tgz", - "integrity": "sha512-z+PwLziMNBeSQJonizz2AGnndLsP2DeGHIxDAn+wdHOGuo4Fo1x1HBPPXeE9TAOPHNNWQKCSlA2VZyYyyibDnQ==", - "dev": true, - "requires": { - "@babel/template": "^7.28.6", - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6" - } - }, - "@babel/helpers": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", - "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", - "requires": { - "@babel/template": "^7.28.6", - "@babel/types": "^7.28.6" - } - }, - "@babel/parser": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", - "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", - "requires": { - "@babel/types": "^7.29.0" - } - }, - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.28.5.tgz", - "integrity": "sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.28.5" - } - }, - "@babel/plugin-bugfix-safari-class-field-initializer-scope": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", - "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz", - "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", - "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/plugin-transform-optional-chaining": "^7.27.1" - } - }, - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.6.tgz", - "integrity": "sha512-a0aBScVTlNaiUe35UtfxAN7A/tehvvG4/ByO6+46VPKTRSlfnAFsgKy0FUh+qAkQrDTmhDkT+IBOKlOoMUxQ0g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/traverse": "^7.28.6" - } - }, - "@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "dev": true - }, - "@babel/plugin-syntax-import-assertions": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.28.6.tgz", - "integrity": "sha512-pSJUpFHdx9z5nqTSirOCMtYVP2wFgoWhP0p3g8ONK/4IHhLIBd0B9NYqAvIUAhq+OkhO4VM1tENCt0cjlsNShw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.28.6" - } - }, - "@babel/plugin-syntax-import-attributes": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz", - "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.28.6" - } - }, - "@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", - "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-async-generator-functions": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.0.tgz", - "integrity": "sha512-va0VdWro4zlBr2JsXC+ofCPB2iG12wPtVGTWFx2WLDOM3nYQZZIGP82qku2eW/JR83sD+k2k+CsNtyEbUqhU6w==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-remap-async-to-generator": "^7.27.1", - "@babel/traverse": "^7.29.0" - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.28.6.tgz", - "integrity": "sha512-ilTRcmbuXjsMmcZ3HASTe4caH5Tpo93PkTxF9oG2VZsSWsahydmcEHhix9Ik122RcTnZnUzPbmux4wh1swfv7g==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-remap-async-to-generator": "^7.27.1" - } - }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", - "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.6.tgz", - "integrity": "sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.28.6" - } - }, - "@babel/plugin-transform-class-properties": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.28.6.tgz", - "integrity": "sha512-dY2wS3I2G7D697VHndN91TJr8/AAfXQNt5ynCTI/MpxMsSzHp+52uNivYT5wCPax3whc47DR8Ba7cmlQMg24bw==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6" - } - }, - "@babel/plugin-transform-class-static-block": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.6.tgz", - "integrity": "sha512-rfQ++ghVwTWTqQ7w8qyDxL1XGihjBss4CmTgGRCTAC9RIbhVpyp4fOeZtta0Lbf+dTNIVJer6ych2ibHwkZqsQ==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6" - } - }, - "@babel/plugin-transform-classes": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.6.tgz", - "integrity": "sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-globals": "^7.28.0", - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-replace-supers": "^7.28.6", - "@babel/traverse": "^7.28.6" - } - }, - "@babel/plugin-transform-computed-properties": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.28.6.tgz", - "integrity": "sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/template": "^7.28.6" - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.5.tgz", - "integrity": "sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.28.5" - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.28.6.tgz", - "integrity": "sha512-SljjowuNKB7q5Oayv4FoPzeB74g3QgLt8IVJw9ADvWy3QnUb/01aw8I4AVv8wYnPvQz2GDDZ/g3GhcNyDBI4Bg==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.28.6" - } - }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", - "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.29.0.tgz", - "integrity": "sha512-zBPcW2lFGxdiD8PUnPwJjag2J9otbcLQzvbiOzDxpYXyCuYX9agOwMPGn1prVH0a4qzhCKu24rlH4c1f7yA8rw==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.28.6" - } - }, - "@babel/plugin-transform-dynamic-import": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", - "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-explicit-resource-management": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.6.tgz", - "integrity": "sha512-Iao5Konzx2b6g7EPqTy40UZbcdXE126tTxVFr/nAIj+WItNxjKSYTEw3RC+A2/ZetmdJsgueL1KhaMCQHkLPIg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/plugin-transform-destructuring": "^7.28.5" - } - }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.6.tgz", - "integrity": "sha512-WitabqiGjV/vJ0aPOLSFfNY1u9U3R7W36B03r5I2KoNix+a3sOhJ3pKFB3R5It9/UiK78NiO0KE9P21cMhlPkw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.28.6" - } - }, - "@babel/plugin-transform-export-namespace-from": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", - "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-for-of": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", - "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" - } - }, - "@babel/plugin-transform-function-name": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", - "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", - "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.27.1" - } - }, - "@babel/plugin-transform-json-strings": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.28.6.tgz", - "integrity": "sha512-Nr+hEN+0geQkzhbdgQVPoqr47lZbm+5fCUmO70722xJZd0Mvb59+33QLImGj6F+DkK3xgDi1YVysP8whD6FQAw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.28.6" - } - }, - "@babel/plugin-transform-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", - "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-logical-assignment-operators": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.6.tgz", - "integrity": "sha512-+anKKair6gpi8VsM/95kmomGNMD0eLz1NQ8+Pfw5sAwWH9fGYXT50E55ZpV0pHUHWf6IUTWPM+f/7AAff+wr9A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.28.6" - } - }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", - "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-modules-amd": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", - "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.28.6.tgz", - "integrity": "sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6" - } - }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.0.tgz", - "integrity": "sha512-PrujnVFbOdUpw4UHiVwKvKRLMMic8+eC0CuNlxjsyZUiBjhFdPsewdXCkveh2KqBA9/waD0W1b4hXSOBQJezpQ==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-validator-identifier": "^7.28.5", - "@babel/traverse": "^7.29.0" - } - }, - "@babel/plugin-transform-modules-umd": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", - "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.0.tgz", - "integrity": "sha512-1CZQA5KNAD6ZYQLPw7oi5ewtDNxH/2vuCh+6SmvgDfhumForvs8a1o9n0UrEoBD8HU4djO2yWngTQlXl1NDVEQ==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.28.6" - } - }, - "@babel/plugin-transform-new-target": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", - "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.28.6.tgz", - "integrity": "sha512-3wKbRgmzYbw24mDJXT7N+ADXw8BC/imU9yo9c9X9NKaLF1fW+e5H1U5QjMUBe4Qo4Ox/o++IyUkl1sVCLgevKg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.28.6" - } - }, - "@babel/plugin-transform-numeric-separator": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.28.6.tgz", - "integrity": "sha512-SJR8hPynj8outz+SlStQSwvziMN4+Bq99it4tMIf5/Caq+3iOc0JtKyse8puvyXkk3eFRIA5ID/XfunGgO5i6w==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.28.6" - } - }, - "@babel/plugin-transform-object-rest-spread": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.6.tgz", - "integrity": "sha512-5rh+JR4JBC4pGkXLAcYdLHZjXudVxWMXbB6u6+E9lRL5TrGVbHt1TjxGbZ8CkmYw9zjkB7jutzOROArsqtncEA==", - "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/plugin-transform-destructuring": "^7.28.5", - "@babel/plugin-transform-parameters": "^7.27.7", - "@babel/traverse": "^7.28.6" - } - }, - "@babel/plugin-transform-object-super": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", - "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1" - } - }, - "@babel/plugin-transform-optional-catch-binding": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.28.6.tgz", - "integrity": "sha512-R8ja/Pyrv0OGAvAXQhSTmWyPJPml+0TMqXlO5w+AsMEiwb2fg3WkOvob7UxFSL3OIttFSGSRFKQsOhJ/X6HQdQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.28.6" - } - }, - "@babel/plugin-transform-optional-chaining": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.6.tgz", - "integrity": "sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" - } - }, - "@babel/plugin-transform-parameters": { - "version": "7.27.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", - "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-private-methods": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.28.6.tgz", - "integrity": "sha512-piiuapX9CRv7+0st8lmuUlRSmX6mBcVeNQ1b4AYzJxfCMuBfB0vBXDiGSmm03pKJw1v6cZ8KSeM+oUnM6yAExg==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6" - } - }, - "@babel/plugin-transform-private-property-in-object": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.28.6.tgz", - "integrity": "sha512-b97jvNSOb5+ehyQmBpmhOCiUC5oVK4PMnpRvO7+ymFBoqYjeDHIU9jnrNUuwHOiL9RpGDoKBpSViarV+BU+eVA==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-create-class-features-plugin": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6" - } - }, - "@babel/plugin-transform-property-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", - "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-regenerator": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.0.tgz", - "integrity": "sha512-FijqlqMA7DmRdg/aINBSs04y8XNTYw/lr1gJ2WsmBnnaNw1iS43EPkJW+zK7z65auG3AWRFXWj+NcTQwYptUog==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.28.6" - } - }, - "@babel/plugin-transform-regexp-modifiers": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.28.6.tgz", - "integrity": "sha512-QGWAepm9qxpaIs7UM9FvUSnCGlb8Ua1RhyM4/veAxLwt3gMat/LSGrZixyuj4I6+Kn9iwvqCyPTtbdxanYoWYg==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.28.6" - } - }, - "@babel/plugin-transform-reserved-words": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", - "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-runtime": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.29.0.tgz", - "integrity": "sha512-jlaRT5dJtMaMCV6fAuLbsQMSwz/QkvaHOHOSXRitGGwSpR1blCY4KUKoyP2tYO8vJcqYe8cEj96cqSztv3uF9w==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6", - "babel-plugin-polyfill-corejs2": "^0.4.14", - "babel-plugin-polyfill-corejs3": "^0.13.0", - "babel-plugin-polyfill-regenerator": "^0.6.5", - "semver": "^6.3.1" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", - "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-spread": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.28.6.tgz", - "integrity": "sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" - } - }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", - "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-template-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", - "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", - "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-unicode-escapes": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", - "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-unicode-property-regex": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.28.6.tgz", - "integrity": "sha512-4Wlbdl/sIZjzi/8St0evF0gEZrgOswVO6aOzqxh1kDZOl9WmLrHq2HtGhnOJZmHZYKP8WZ1MDLCt5DAWwRo57A==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.28.6" - } - }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", - "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-unicode-sets-regex": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.28.6.tgz", - "integrity": "sha512-/wHc/paTUmsDYN7SZkpWxogTOBNnlx7nBQYfy6JJlCT7G3mVhltk3e++N7zV0XfgGsrqBxd4rJQt9H16I21Y1Q==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.28.6" - } - }, - "@babel/preset-env": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.29.2.tgz", - "integrity": "sha512-DYD23veRYGvBFhcTY1iUvJnDNpuqNd/BzBwCvzOTKUnJjKg5kpUBh3/u9585Agdkgj+QuygG7jLfOPWMa2KVNw==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.29.0", - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-validator-option": "^7.27.1", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.28.5", - "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.6", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-import-assertions": "^7.28.6", - "@babel/plugin-syntax-import-attributes": "^7.28.6", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.27.1", - "@babel/plugin-transform-async-generator-functions": "^7.29.0", - "@babel/plugin-transform-async-to-generator": "^7.28.6", - "@babel/plugin-transform-block-scoped-functions": "^7.27.1", - "@babel/plugin-transform-block-scoping": "^7.28.6", - "@babel/plugin-transform-class-properties": "^7.28.6", - "@babel/plugin-transform-class-static-block": "^7.28.6", - "@babel/plugin-transform-classes": "^7.28.6", - "@babel/plugin-transform-computed-properties": "^7.28.6", - "@babel/plugin-transform-destructuring": "^7.28.5", - "@babel/plugin-transform-dotall-regex": "^7.28.6", - "@babel/plugin-transform-duplicate-keys": "^7.27.1", - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.29.0", - "@babel/plugin-transform-dynamic-import": "^7.27.1", - "@babel/plugin-transform-explicit-resource-management": "^7.28.6", - "@babel/plugin-transform-exponentiation-operator": "^7.28.6", - "@babel/plugin-transform-export-namespace-from": "^7.27.1", - "@babel/plugin-transform-for-of": "^7.27.1", - "@babel/plugin-transform-function-name": "^7.27.1", - "@babel/plugin-transform-json-strings": "^7.28.6", - "@babel/plugin-transform-literals": "^7.27.1", - "@babel/plugin-transform-logical-assignment-operators": "^7.28.6", - "@babel/plugin-transform-member-expression-literals": "^7.27.1", - "@babel/plugin-transform-modules-amd": "^7.27.1", - "@babel/plugin-transform-modules-commonjs": "^7.28.6", - "@babel/plugin-transform-modules-systemjs": "^7.29.0", - "@babel/plugin-transform-modules-umd": "^7.27.1", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.29.0", - "@babel/plugin-transform-new-target": "^7.27.1", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.28.6", - "@babel/plugin-transform-numeric-separator": "^7.28.6", - "@babel/plugin-transform-object-rest-spread": "^7.28.6", - "@babel/plugin-transform-object-super": "^7.27.1", - "@babel/plugin-transform-optional-catch-binding": "^7.28.6", - "@babel/plugin-transform-optional-chaining": "^7.28.6", - "@babel/plugin-transform-parameters": "^7.27.7", - "@babel/plugin-transform-private-methods": "^7.28.6", - "@babel/plugin-transform-private-property-in-object": "^7.28.6", - "@babel/plugin-transform-property-literals": "^7.27.1", - "@babel/plugin-transform-regenerator": "^7.29.0", - "@babel/plugin-transform-regexp-modifiers": "^7.28.6", - "@babel/plugin-transform-reserved-words": "^7.27.1", - "@babel/plugin-transform-shorthand-properties": "^7.27.1", - "@babel/plugin-transform-spread": "^7.28.6", - "@babel/plugin-transform-sticky-regex": "^7.27.1", - "@babel/plugin-transform-template-literals": "^7.27.1", - "@babel/plugin-transform-typeof-symbol": "^7.27.1", - "@babel/plugin-transform-unicode-escapes": "^7.27.1", - "@babel/plugin-transform-unicode-property-regex": "^7.28.6", - "@babel/plugin-transform-unicode-regex": "^7.27.1", - "@babel/plugin-transform-unicode-sets-regex": "^7.28.6", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.15", - "babel-plugin-polyfill-corejs3": "^0.14.0", - "babel-plugin-polyfill-regenerator": "^0.6.6", - "core-js-compat": "^3.48.0", - "semver": "^6.3.1" - }, - "dependencies": { - "babel-plugin-polyfill-corejs3": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.14.2.tgz", - "integrity": "sha512-coWpDLJ410R781Npmn/SIBZEsAetR4xVi0SxLMXPaMO4lSf1MwnkGYMtkFxew0Dn8B3/CpbpYxN0JCgg8mn67g==", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.6.8", - "core-js-compat": "^3.48.0" - } - }, - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - } - }, - "@babel/runtime": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz", - "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==" - }, - "@babel/runtime-corejs3": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.28.4.tgz", - "integrity": "sha512-h7iEYiW4HebClDEhtvFObtPmIvrd1SSfpI9EhOeKk4CtIK/ngBWFpuhCzhdmRKtg71ylcue+9I6dv54XYO1epQ==", - "requires": { - "core-js-pure": "^3.43.0" - } - }, - "@babel/template": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", - "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", - "requires": { - "@babel/code-frame": "^7.28.6", - "@babel/parser": "^7.28.6", - "@babel/types": "^7.28.6" - } - }, - "@babel/traverse": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", - "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", - "requires": { - "@babel/code-frame": "^7.29.0", - "@babel/generator": "^7.29.0", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.29.0", - "@babel/template": "^7.28.6", - "@babel/types": "^7.29.0", - "debug": "^4.3.1" - } - }, - "@babel/types": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", - "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", - "requires": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" - } - }, - "@bcoe/v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-1.0.2.tgz", - "integrity": "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==", - "dev": true - }, - "@blazediff/core": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@blazediff/core/-/core-1.9.1.tgz", - "integrity": "sha512-ehg3jIkYKulZh+8om/O25vkvSsXXwC+skXmyA87FFx6A/45eqOkZsBltMw/TVteb0mloiGT8oGRTcjRAz66zaA==", - "dev": true - }, - "@blocknote/core": { - "version": "0.51.4", - "resolved": "https://registry.npmjs.org/@blocknote/core/-/core-0.51.4.tgz", - "integrity": "sha512-uR7/BlW6VVlCx/JzfGbkaLGz7O5uI3bu2tbNIdzGTfSloiEp8Qc14if36Dy7DDs+dVWfZgwds0jWiGfE3AzJiw==", - "requires": { - "@emoji-mart/data": "^1.2.1", - "@handlewithcare/prosemirror-inputrules": "^0.1.4", - "@shikijs/types": "^4", - "@tanstack/store": "^0.7.7", - "@tiptap/core": "^3.13.0", - "@tiptap/extension-bold": "^3.13.0", - "@tiptap/extension-code": "^3.13.0", - "@tiptap/extension-horizontal-rule": "^3.13.0", - "@tiptap/extension-italic": "^3.13.0", - "@tiptap/extension-paragraph": "^3.13.0", - "@tiptap/extension-strike": "^3.13.0", - "@tiptap/extension-text": "^3.13.0", - "@tiptap/extension-underline": "^3.13.0", - "@tiptap/extensions": "^3.13.0", - "@tiptap/pm": "^3.13.0", - "emoji-mart": "^5.6.0", - "fast-deep-equal": "^3.1.3", - "lib0": "^0.2.99", - "prosemirror-highlight": "^0.15.1", - "prosemirror-model": "^1.25.4", - "prosemirror-state": "^1.4.4", - "prosemirror-tables": "^1.8.3", - "prosemirror-transform": "^1.11.0", - "prosemirror-view": "^1.41.4", - "y-prosemirror": "^1.3.7", - "y-protocols": "^1.0.6", - "yjs": "^13.6.27" - } - }, - "@blocknote/mantine": { - "version": "0.51.4", - "resolved": "https://registry.npmjs.org/@blocknote/mantine/-/mantine-0.51.4.tgz", - "integrity": "sha512-Ka7QjzhgB/T2ekwtXgwa9zIiiixAm4dob3FklJIedu+9j/eO4auokmRnWAhZQmNJsOdE7mQTUmnv6X4k/lHyCQ==", - "requires": { - "@blocknote/core": "0.51.4", - "@blocknote/react": "0.51.4", - "react-icons": "^5.5.0" - } - }, - "@blocknote/react": { - "version": "0.51.4", - "resolved": "https://registry.npmjs.org/@blocknote/react/-/react-0.51.4.tgz", - "integrity": "sha512-tWe039t/Gkj9YDoEXruclXQvI+toI0ctcyikbHa8dm3Q6zTgy24+T/P1t1fYSNPBkSnhq+ILz2fLLnCK994qkA==", - "requires": { - "@blocknote/core": "0.51.4", - "@emoji-mart/data": "^1.2.1", - "@floating-ui/react": "^0.27.18", - "@floating-ui/utils": "^0.2.10", - "@tanstack/react-store": "0.7.7", - "@tiptap/core": "^3.13.0", - "@tiptap/pm": "^3.13.0", - "@tiptap/react": "^3.13.0", - "@types/use-sync-external-store": "1.5.0", - "emoji-mart": "^5.6.0", - "fast-deep-equal": "^3.1.3", - "lodash.merge": "^4.6.2", - "react-icons": "^5.5.0", - "use-sync-external-store": "1.6.0" - }, - "dependencies": { - "@types/use-sync-external-store": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz", - "integrity": "sha512-5dyB8nLC/qogMrlCizZnYWQTA4lnb/v+It+sqNl5YnSRAPMlIqY/X0Xn+gZw8vOL+TgTTr28VEbn3uf8fUtAkw==" - } - } - }, - "@braintree/sanitize-url": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-7.1.2.tgz", - "integrity": "sha512-jigsZK+sMF/cuiB7sERuo9V7N9jx+dhmHHnQyDSVdpZwVutaBu7WvNYqMDLSgFgfB30n452TP3vjDAvFC973mA==" - }, - "@bramus/specificity": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@bramus/specificity/-/specificity-2.4.2.tgz", - "integrity": "sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==", - "dev": true, - "requires": { - "css-tree": "^3.0.0" - } - }, - "@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "dependencies": { - "@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - } - } - }, - "@csstools/color-helpers": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-6.0.2.tgz", - "integrity": "sha512-LMGQLS9EuADloEFkcTBR3BwV/CGHV7zyDxVRtVDTwdI2Ca4it0CCVTT9wCkxSgokjE5Ho41hEPgb8OEUwoXr6Q==", - "dev": true - }, - "@csstools/css-calc": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.2.0.tgz", - "integrity": "sha512-bR9e6o2BDB12jzN/gIbjHa5wLJ4UjD1CB9pM7ehlc0ddk6EBz+yYS1EV2MF55/HUxrHcB/hehAyt5vhsA3hx7w==", - "dev": true - }, - "@csstools/css-color-parser": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.1.0.tgz", - "integrity": "sha512-U0KhLYmy2GVj6q4T3WaAe6NPuFYCPQoE3b0dRGxejWDgcPp8TP7S5rVdM5ZrFaqu4N67X8YaPBw14dQSYx3IyQ==", - "dev": true, - "requires": { - "@csstools/color-helpers": "^6.0.2", - "@csstools/css-calc": "^3.2.0" - } - }, - "@csstools/css-parser-algorithms": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-4.0.0.tgz", - "integrity": "sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==", - "dev": true - }, - "@csstools/css-syntax-patches-for-csstree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.3.tgz", - "integrity": "sha512-SH60bMfrRCJF3morcdk57WklujF4Jr/EsQUzqkarfHXEFcAR1gg7fS/chAE922Sehgzc1/+Tz5H3Ypa1HiEKrg==", - "dev": true - }, - "@csstools/css-tokenizer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-4.0.0.tgz", - "integrity": "sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==", - "dev": true - }, - "@datorama/akita": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@datorama/akita/-/akita-8.0.1.tgz", - "integrity": "sha512-0VnPWd+Sy3ColhzjDSBNcEnzAQtbezk6bYmJHvPaLMK5Ysl90KcNls2bE4sj5vaLeGLjhMtqtfp/RgrigPXDxA==" - }, - "@emoji-mart/data": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emoji-mart/data/-/data-1.2.1.tgz", - "integrity": "sha512-no2pQMWiBy6gpBEiqGeU77/bFejDqUTRY7KX+0+iur13op3bqUsXdnwoZs6Xb1zbv0gAj5VvS1PWoUUckSr5Dw==" - }, - "@emotion/is-prop-valid": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz", - "integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==", - "requires": { - "@emotion/memoize": "^0.8.1" - } - }, - "@emotion/memoize": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", - "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" - }, - "@emotion/unitless": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", - "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" - }, - "@esbuild/aix-ppc64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", - "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", - "dev": true, - "optional": true - }, - "@esbuild/android-arm": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", - "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", - "dev": true, - "optional": true - }, - "@esbuild/android-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", - "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", - "dev": true, - "optional": true - }, - "@esbuild/android-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", - "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", - "dev": true, - "optional": true - }, - "@esbuild/darwin-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", - "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", - "dev": true, - "optional": true - }, - "@esbuild/darwin-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", - "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", - "dev": true, - "optional": true - }, - "@esbuild/freebsd-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", - "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", - "dev": true, - "optional": true - }, - "@esbuild/freebsd-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", - "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", - "dev": true, - "optional": true - }, - "@esbuild/linux-arm": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", - "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", - "dev": true, - "optional": true - }, - "@esbuild/linux-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", - "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-ia32": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", - "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-loong64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", - "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", - "dev": true, - "optional": true - }, - "@esbuild/linux-mips64el": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", - "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", - "dev": true, - "optional": true - }, - "@esbuild/linux-ppc64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", - "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", - "dev": true, - "optional": true - }, - "@esbuild/linux-riscv64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", - "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", - "dev": true, - "optional": true - }, - "@esbuild/linux-s390x": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", - "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", - "dev": true, - "optional": true - }, - "@esbuild/linux-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", - "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", - "dev": true, - "optional": true - }, - "@esbuild/netbsd-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", - "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", - "dev": true, - "optional": true - }, - "@esbuild/netbsd-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", - "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", - "dev": true, - "optional": true - }, - "@esbuild/openbsd-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", - "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", - "dev": true, - "optional": true - }, - "@esbuild/openbsd-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", - "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", - "dev": true, - "optional": true - }, - "@esbuild/openharmony-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", - "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", - "dev": true, - "optional": true - }, - "@esbuild/sunos-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", - "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", - "dev": true, - "optional": true - }, - "@esbuild/win32-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", - "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", - "dev": true, - "optional": true - }, - "@esbuild/win32-ia32": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", - "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", - "dev": true, - "optional": true - }, - "@esbuild/win32-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", - "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", - "dev": true, - "optional": true - }, - "@eslint-community/eslint-utils": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", - "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^3.4.3" - } - }, - "@eslint-community/regexpp": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", - "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", - "dev": true - }, - "@eslint/config-array": { - "version": "0.23.5", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz", - "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==", - "dev": true, - "requires": { - "@eslint/object-schema": "^3.0.5", - "debug": "^4.3.1", - "minimatch": "^10.2.4" - }, - "dependencies": { - "balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "dev": true - }, - "brace-expansion": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", - "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", - "dev": true, - "requires": { - "balanced-match": "^4.0.2" - } - }, - "minimatch": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", - "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", - "dev": true, - "requires": { - "brace-expansion": "^5.0.5" - } - } - } - }, - "@eslint/config-helpers": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.6.0.tgz", - "integrity": "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA==", - "dev": true, - "requires": { - "@eslint/core": "^1.2.1" - }, - "dependencies": { - "@eslint/core": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz", - "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.15" - } - } - } - }, - "@eslint/core": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", - "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.15" - } - }, - "@eslint/js": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-10.0.1.tgz", - "integrity": "sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==", - "dev": true - }, - "@eslint/object-schema": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz", - "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==", - "dev": true - }, - "@eslint/plugin-kit": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", - "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", - "dev": true, - "requires": { - "@eslint/core": "^0.17.0", - "levn": "^0.4.1" - } - }, - "@exodus/bytes": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.15.0.tgz", - "integrity": "sha512-UY0nlA+feH81UGSHv92sLEPLCeZFjXOuHhrIo0HQydScuQc8s0A7kL/UdgwgDq8g8ilksmuoF35YVTNphV2aBQ==", - "dev": true - }, - "@floating-ui/core": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.5.tgz", - "integrity": "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==", - "requires": { - "@floating-ui/utils": "^0.2.11" - } - }, - "@floating-ui/dom": { - "version": "1.7.6", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.6.tgz", - "integrity": "sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==", - "requires": { - "@floating-ui/core": "^1.7.5", - "@floating-ui/utils": "^0.2.11" - } - }, - "@floating-ui/react": { - "version": "0.27.19", - "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.27.19.tgz", - "integrity": "sha512-31B8h5mm8YxotlE7/AU/PhNAl8eWxAmjL/v2QOxroDNkTFLk3Uu82u63N3b6TXa4EGJeeZLVcd/9AlNlVqzeog==", - "requires": { - "@floating-ui/react-dom": "^2.1.8", - "@floating-ui/utils": "^0.2.11", - "tabbable": "^6.0.0" - } - }, - "@floating-ui/react-dom": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.8.tgz", - "integrity": "sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A==", - "requires": { - "@floating-ui/dom": "^1.7.6" - } - }, - "@floating-ui/utils": { - "version": "0.2.11", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.11.tgz", - "integrity": "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==" - }, - "@fortawesome/fontawesome-free": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.7.2.tgz", - "integrity": "sha512-JUOtgFW6k9u4Y+xeIaEiLr3+cjoUPiAuLXoyKOJSia6Duzb7pq+A76P9ZdPDoAoxHdHzq6gE9/jKBGXlZT8FbA==" - }, - "@fullcalendar/angular": { - "version": "6.1.20", - "resolved": "https://registry.npmjs.org/@fullcalendar/angular/-/angular-6.1.20.tgz", - "integrity": "sha512-/V5wZuZSzWZxD3dnVteqY844Onv6we5ah0RU9ZJdRIeNbBFknHLeVYpIjYKsAPwkGigYX7UGOJR6NNpyarBLlQ==", - "requires": { - "tslib": "^2.3.0" - } - }, - "@fullcalendar/common": { - "version": "5.11.5", - "resolved": "https://registry.npmjs.org/@fullcalendar/common/-/common-5.11.5.tgz", - "integrity": "sha512-3iAYiUbHXhjSVXnYWz27Od2cslztUPsOwiwKlfGvQxBixv2Kl6a8IPwaijKFYJHXdwYmfPoEgK7rvqAGVoIYwA==", - "requires": { - "tslib": "^2.1.0" - } - }, - "@fullcalendar/core": { - "version": "6.1.20", - "resolved": "https://registry.npmjs.org/@fullcalendar/core/-/core-6.1.20.tgz", - "integrity": "sha512-1cukXLlePFiJ8YKXn/4tMKsy0etxYLCkXk8nUCFi11nRONF2Ba2CD5b21/ovtOO2tL6afTJfwmc1ed3HG7eB1g==", - "requires": { - "preact": "~10.12.1" - } - }, - "@fullcalendar/daygrid": { - "version": "6.1.20", - "resolved": "https://registry.npmjs.org/@fullcalendar/daygrid/-/daygrid-6.1.20.tgz", - "integrity": "sha512-AO9vqhkLP77EesmJzuU+IGXgxNulsA8mgQHynclJ8U70vSwAVnbcLG9qftiTAFSlZjiY/NvhE7sflve6cJelyQ==" - }, - "@fullcalendar/interaction": { - "version": "6.1.20", - "resolved": "https://registry.npmjs.org/@fullcalendar/interaction/-/interaction-6.1.20.tgz", - "integrity": "sha512-p6txmc5txL0bMiPaJxe2ip6o0T384TyoD2KGdsU6UjZ5yoBlaY+dg7kxfnYKpYMzEJLG58n+URrHr2PgNL2fyA==" - }, - "@fullcalendar/list": { - "version": "6.1.20", - "resolved": "https://registry.npmjs.org/@fullcalendar/list/-/list-6.1.20.tgz", - "integrity": "sha512-7Hzkbb7uuSqrXwTyD0Ld/7SwWNxPD6SlU548vtkIpH55rZ4qquwtwYdMPgorHos5OynHA4OUrZNcH51CjrCf2g==" - }, - "@fullcalendar/moment": { - "version": "6.1.20", - "resolved": "https://registry.npmjs.org/@fullcalendar/moment/-/moment-6.1.20.tgz", - "integrity": "sha512-GS6gY/LKu/65TiRSW6qUJFW9SPYGkPERyOOJMrCHeoOP4sE8Ewl7g0N1H4S6HHFHDrI40T0x2bYAiPEhYZpIJA==" - }, - "@fullcalendar/moment-timezone": { - "version": "6.1.20", - "resolved": "https://registry.npmjs.org/@fullcalendar/moment-timezone/-/moment-timezone-6.1.20.tgz", - "integrity": "sha512-fGk3bQU4hf0rgw3Zd/PH6Ok0Db+s9/nsuALj3IG8GYFqInwLsHZI0Qc+ljN8jv9LrLS5sOBBOZHWDg2ncx1inw==" - }, - "@fullcalendar/multimonth": { - "version": "6.1.20", - "resolved": "https://registry.npmjs.org/@fullcalendar/multimonth/-/multimonth-6.1.20.tgz", - "integrity": "sha512-rMMiPBA71lUJ1DV/0ckPtN4/G4LozkkDKoG7/CbmTYqFJiMRskM/1WpilhtRn4iUdNe03V5K7ofFQRs0wo4ZtQ==", - "requires": { - "@fullcalendar/daygrid": "~6.1.20" - } - }, - "@fullcalendar/premium-common": { - "version": "6.1.20", - "resolved": "https://registry.npmjs.org/@fullcalendar/premium-common/-/premium-common-6.1.20.tgz", - "integrity": "sha512-rT+AitNnRyZuFEtYvsB1OJ2g1Bq2jmTR6qdn/dEU6LwkIj/4L499goLtMOena/JyJ31VBztdHrccX//36QrY3w==" - }, - "@fullcalendar/resource": { - "version": "6.1.20", - "resolved": "https://registry.npmjs.org/@fullcalendar/resource/-/resource-6.1.20.tgz", - "integrity": "sha512-vpQs1eYJbc1zGOzF3obVVr+XsHTMTG7STKVQBEGy3AeFgfosRkUz+3DUawmy98vSjJUYOAQHO+pWW0ek0n5g0w==", - "requires": { - "@fullcalendar/premium-common": "~6.1.20" - } - }, - "@fullcalendar/resource-common": { - "version": "5.11.5", - "resolved": "https://registry.npmjs.org/@fullcalendar/resource-common/-/resource-common-5.11.5.tgz", - "integrity": "sha512-r7Jsd9ge65m9AShyWAOUUdRulyOKI3p0a7lOcilQ1KXDy0d1O2KpPa27sqRzpofLoDoSrteVP7dirU8Lg20sTA==", - "requires": { - "@fullcalendar/common": "~5.11.5", - "@fullcalendar/premium-common": "~5.11.5", - "tslib": "^2.1.0" - }, - "dependencies": { - "@fullcalendar/premium-common": { - "version": "5.11.5", - "resolved": "https://registry.npmjs.org/@fullcalendar/premium-common/-/premium-common-5.11.5.tgz", - "integrity": "sha512-QMLOm+MKxvsbji4wt7YGqB73IqwHD+y2JD1DZ3t0LCq2Ul6QtQjNxRP7/7DklXPI8atXoJRRXzwqRq+8O9FFHw==", - "requires": { - "@fullcalendar/common": "~5.11.5", - "tslib": "^2.1.0" - } - } - } - }, - "@fullcalendar/resource-timeline": { - "version": "6.1.20", - "resolved": "https://registry.npmjs.org/@fullcalendar/resource-timeline/-/resource-timeline-6.1.20.tgz", - "integrity": "sha512-HAlM/I+9xJPzZx3Wry7l5oibc8n5Pv/iL8tp2dxUu/0zqS0UqADbHItJucuANfDDeL7PEbCbh/uFx9VvzRUIkQ==", - "requires": { - "@fullcalendar/premium-common": "~6.1.20", - "@fullcalendar/scrollgrid": "~6.1.20", - "@fullcalendar/timeline": "~6.1.20" - } - }, - "@fullcalendar/scrollgrid": { - "version": "6.1.20", - "resolved": "https://registry.npmjs.org/@fullcalendar/scrollgrid/-/scrollgrid-6.1.20.tgz", - "integrity": "sha512-M55m0hxpou4IPObto5f0nVcXvIj3rkSTba0ypclSFDwBz3JxuCPS6l8kaUznqlZCr2Ld/HFJr+jwyvY070AafQ==", - "requires": { - "@fullcalendar/premium-common": "~6.1.20" - } - }, - "@fullcalendar/timegrid": { - "version": "6.1.20", - "resolved": "https://registry.npmjs.org/@fullcalendar/timegrid/-/timegrid-6.1.20.tgz", - "integrity": "sha512-4H+/MWbz3ntA50lrPif+7TsvMeX3R1GSYjiLULz0+zEJ7/Yfd9pupZmAwUs/PBpA6aAcFmeRr0laWfcz1a9V1A==", - "requires": { - "@fullcalendar/daygrid": "~6.1.20" - } - }, - "@fullcalendar/timeline": { - "version": "6.1.20", - "resolved": "https://registry.npmjs.org/@fullcalendar/timeline/-/timeline-6.1.20.tgz", - "integrity": "sha512-yhTgMNDWfB+XqEUTLWrpPjM4fcvGYLOA9DvTp1ysdeqhRGoZnRK9Iv2WW5BaKT+VXhXoAPrj2Ud/lXt6youWAQ==", - "requires": { - "@fullcalendar/premium-common": "~6.1.20", - "@fullcalendar/scrollgrid": "~6.1.20" - } - }, - "@gar/promise-retry": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@gar/promise-retry/-/promise-retry-1.0.3.tgz", - "integrity": "sha512-GmzA9ckNokPypTg10pgpeHNQe7ph+iIKKmhKu3Ob9ANkswreCx7R3cKmY781K8QK3AqVL3xVh9A42JvIAbkkSA==" - }, - "@github/auto-check-element": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@github/auto-check-element/-/auto-check-element-6.0.0.tgz", - "integrity": "sha512-87mHEywJEtlG/37zFrx4PUgDqczgtv9jrauW3IojNy9y+nALIAm6e2jnWpfgcqeMWSevzph2M6reJoHpuSjyWw==", - "requires": { - "@github/mini-throttle": "^2.1.0" - } - }, - "@github/auto-complete-element": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/@github/auto-complete-element/-/auto-complete-element-3.8.0.tgz", - "integrity": "sha512-rS2Uj38V1BsenLvrIswV5IXfiYH2/KUhz6inot+JXho/fFOO+01tsW1HxqSdIXqh5EDuoY0f/GQsztZcH22AXQ==", - "requires": { - "@github/combobox-nav": "^2.1.7" - } - }, - "@github/catalyst": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@github/catalyst/-/catalyst-1.8.0.tgz", - "integrity": "sha512-uLpi/D/mKfylYaFLfzNuloXNENi0AlcM0Z7hwYLH8Z030jBCr+ueMdX2xLxCzpMH/keYXKh0uPrHSMfcbxU6KA==" - }, - "@github/clipboard-copy-element": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@github/clipboard-copy-element/-/clipboard-copy-element-1.3.0.tgz", - "integrity": "sha512-wyntkQkwoLbLo+Hqg2LIVMXDIzcvUb9bSDz+clX6nVJItwzh103rHxdXFRZD+DmxVbuEW5xSznYQXkz1jZT+xg==" - }, - "@github/combobox-nav": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@github/combobox-nav/-/combobox-nav-2.3.1.tgz", - "integrity": "sha512-gwxPzLw8XKecy1nP63i9lOBritS3bWmxl02UX6G0TwMQZbMem1BCS1tEZgYd3mkrkiDrUMWaX+DbFCuDFo3K+A==" - }, - "@github/details-menu-element": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/@github/details-menu-element/-/details-menu-element-1.0.13.tgz", - "integrity": "sha512-gMkii86w/oUP5dq8yOWZn1sgbgtFj3AYETxxtpsqRggZktgd8te4+npAn4Hm+936c/lxmEzXqfjARL/CzGR4+w==" - }, - "@github/image-crop-element": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@github/image-crop-element/-/image-crop-element-5.0.0.tgz", - "integrity": "sha512-Vgm2OwWAs1ESoib/t5sjxsAYo6YTOxxAjWDRxswX7qrqoyCejTZ3hshdo4Ep5e+Mz/GVTZC3rdMtg06dk/eT4g==" - }, - "@github/include-fragment-element": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@github/include-fragment-element/-/include-fragment-element-6.3.0.tgz", - "integrity": "sha512-BJTt8ZE/arsbC9lQtTH8c1hZS0ZigiN+kzH54ffQ6MhHLT83h0OpSdS9NEVocPl2uuO6w3qxnEKTDzUGMQ5rdQ==" - }, - "@github/mini-throttle": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@github/mini-throttle/-/mini-throttle-2.1.1.tgz", - "integrity": "sha512-KtOPaB+FiKJ6jcKm9UKyaM5fPURHGf+xcp+b4Mzoi81hOc6M1sIGpMZMAVbNzfa2lW5+RPGKq888Px0j76OZ/A==" - }, - "@github/relative-time-element": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@github/relative-time-element/-/relative-time-element-5.0.0.tgz", - "integrity": "sha512-L/2r0DNR/rMbmHWcsdmhtOiy2gESoGOhItNFD4zJ3nZfHl79Dx3N18Vfx/pYr2lruMOdk1cJZb4wEumm+Dxm1w==" - }, - "@github/remote-input-element": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@github/remote-input-element/-/remote-input-element-0.4.0.tgz", - "integrity": "sha512-apsMwsFW24F+w2wzT8oKoBi9lpm6GeFOmtuL+1YwDVmIiwixfHOD3MnEsEOv0RwmHsMdWmIjP9mxWyTWPKZHGg==" - }, - "@github/tab-container-element": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@github/tab-container-element/-/tab-container-element-3.4.0.tgz", - "integrity": "sha512-Yx70pO8A0p7Stnm9knKkUNX8i4bjuwDYZarRkM8JH0Z+ffhpe++oNAPbzGI9GEcGugRHvKuSC6p4YOdoHtTniQ==" - }, - "@github/webauthn-json": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@github/webauthn-json/-/webauthn-json-2.1.1.tgz", - "integrity": "sha512-XrftRn4z75SnaJOmZQbt7Mk+IIjqVHw+glDGOxuHwXkZBZh/MBoRS7MHjSZMDaLhT4RjN2VqiEU7EOYleuJWSQ==" - }, - "@handlewithcare/prosemirror-inputrules": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@handlewithcare/prosemirror-inputrules/-/prosemirror-inputrules-0.1.4.tgz", - "integrity": "sha512-GMqlBeG2MKM+tXEFd2N+wIv5z4VvJTg8JtfJUrdjvFq2W6v+AW8oTgiWyFw8L3iEQwvtQcVJxU873iB0LXUNNw==", - "requires": { - "prosemirror-history": "^1.4.1", - "prosemirror-transform": "^1.0.0" - } - }, - "@harperfast/extended-iterable": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@harperfast/extended-iterable/-/extended-iterable-1.0.3.tgz", - "integrity": "sha512-sSAYhQca3rDWtQUHSAPeO7axFIUJOI6hn1gjRC5APVE1a90tuyT8f5WIgRsFhhWA7htNkju2veB9eWL6YHi/Lw==", - "dev": true, - "optional": true - }, - "@hocuspocus/common": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/@hocuspocus/common/-/common-3.4.4.tgz", - "integrity": "sha512-RykIJ0tsHHMP4Xk+4UCbc7SO5LgGxGUSTdbh6anJEsaALAyqinf1Nn5HYuMjLPolAmsar1v++m9zufR09NLpXA==", - "requires": { - "lib0": "^0.2.87" - } - }, - "@hocuspocus/provider": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/@hocuspocus/provider/-/provider-3.4.4.tgz", - "integrity": "sha512-KbsMAfdYcIJD8eMU/5QnpXcSOvIWAcCNI33FSRSaKCIpYBFtAwkYIwWnZJmPZ8a1BMAtqQc+uvy9+UQf7GHnGQ==", - "requires": { - "@hocuspocus/common": "^3.4.4", - "@lifeomic/attempt": "^3.0.2", - "lib0": "^0.2.87", - "ws": "^8.17.1" - } - }, - "@hono/node-server": { - "version": "1.19.13", - "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.13.tgz", - "integrity": "sha512-TsQLe4i2gvoTtrHje625ngThGBySOgSK3Xo2XRYOdqGN1teR8+I7vchQC46uLJi8OF62YTYA3AhSpumtkhsaKQ==" - }, - "@hotwired/stimulus": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@hotwired/stimulus/-/stimulus-3.2.2.tgz", - "integrity": "sha512-eGeIqNOQpXoPAIP7tC1+1Yc1yl1xnwYqg+3mzqxyrbE5pg5YFBZcA6YoTiByJB6DKAEsiWtl6tjTJS4IYtbB7A==" - }, - "@hotwired/turbo": { - "version": "8.0.23", - "resolved": "https://registry.npmjs.org/@hotwired/turbo/-/turbo-8.0.23.tgz", - "integrity": "sha512-GZ7cijxEZ6Ig71u7rD6LHaRv/wcE/hNsc+nEfiWOkLNqUgLOwo5MNGWOy5ZV9ZUDSiQx1no7YxjTNnT4O6//cQ==" - }, - "@hotwired/turbo-rails": { - "version": "8.0.23", - "resolved": "https://registry.npmjs.org/@hotwired/turbo-rails/-/turbo-rails-8.0.23.tgz", - "integrity": "sha512-iBILwda3qmQC7FYM70+4s6kEQ7Fx9dJ6+yGxjPyrz9a5JDx1+y7OAA5TA7GGVOZJoicMLrKGdFDNorl40X35lw==", - "requires": { - "@hotwired/turbo": "^8.0.23", - "@rails/actioncable": ">=7.0" - } - }, - "@html-eslint/core": { - "version": "0.61.0", - "resolved": "https://registry.npmjs.org/@html-eslint/core/-/core-0.61.0.tgz", - "integrity": "sha512-/dcMywhcO7+CvyV5oUGUkh4641ZyeJyncQas+Ulq7z9fXorTstMrApIzIUdV9TNgkwZZ97Rd8/8XbXkxgoJo6A==", - "dev": true, - "requires": { - "@html-eslint/types": "^0.61.0", - "html-standard": "^0.0.13" - } - }, - "@html-eslint/eslint-plugin": { - "version": "0.61.0", - "resolved": "https://registry.npmjs.org/@html-eslint/eslint-plugin/-/eslint-plugin-0.61.0.tgz", - "integrity": "sha512-iIuyw42ssr3hoBs0dn+ivD4ZPyrMgq1v4Hqx8N3qVEyTcli/XYQ5C20CWPE8msYLU/TmBnvkl0VgzymiIsrRcw==", - "dev": true, - "requires": { - "@eslint/plugin-kit": "^0.4.1", - "@html-eslint/core": "^0.61.0", - "@html-eslint/parser": "^0.61.0", - "@html-eslint/template-parser": "^0.61.0", - "@html-eslint/template-syntax-parser": "^0.61.0", - "@html-eslint/types": "^0.61.0", - "@rviscomi/capo.js": "^2.1.0", - "html-standard": "^0.0.13" - } - }, - "@html-eslint/parser": { - "version": "0.61.0", - "resolved": "https://registry.npmjs.org/@html-eslint/parser/-/parser-0.61.0.tgz", - "integrity": "sha512-D+4TqU3tiAJ1QuP1IjVkOTYc9Q26FfDbBx3ZqaADzEd1Jgsb+ZdV2UGTBSOzKNHw6ojQCyGnaF3hPg4HSV9TKQ==", - "dev": true, - "requires": { - "@html-eslint/template-syntax-parser": "^0.61.0", - "@html-eslint/types": "^0.61.0", - "css-tree": "^3.1.0", - "es-html-parser": "0.3.1" - } - }, - "@html-eslint/template-parser": { - "version": "0.61.0", - "resolved": "https://registry.npmjs.org/@html-eslint/template-parser/-/template-parser-0.61.0.tgz", - "integrity": "sha512-mPN9UsW02m+WtDQb48FLzTCVDCBuXboRzDO37yPipp6ai98IDJBslrFjmHHh8dwBIs9QlQXWpTdlRiV3NvTwtA==", - "dev": true, - "requires": { - "@html-eslint/types": "^0.61.0", - "es-html-parser": "0.3.1" - } - }, - "@html-eslint/template-syntax-parser": { - "version": "0.61.0", - "resolved": "https://registry.npmjs.org/@html-eslint/template-syntax-parser/-/template-syntax-parser-0.61.0.tgz", - "integrity": "sha512-m5XAYPRyX/uRNkcPaBBrM+k2SfWHhjkTLFPMz+T7CiH3nbPm7wolcudMqDfW9QoexcxCQke+xJ/ZZz/PDOykKg==", - "dev": true, - "requires": { - "@html-eslint/types": "^0.61.0" - } - }, - "@html-eslint/types": { - "version": "0.61.0", - "resolved": "https://registry.npmjs.org/@html-eslint/types/-/types-0.61.0.tgz", - "integrity": "sha512-1cVh4dHkHwJqKrd/8t5U3wkzm0osTax+TLrmmtCaotYXQAJlZ2Cp31GQHY+lF17p71iHp3NoNYisUblV/lGzBg==", - "dev": true, - "requires": { - "@types/css-tree": "^2.3.11", - "@types/estree": "^1.0.6", - "es-html-parser": "0.3.1" - } - }, - "@humanfs/core": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", - "dev": true - }, - "@humanfs/node": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", - "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", - "dev": true, - "requires": { - "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.4.0" - } - }, - "@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true - }, - "@humanwhocodes/retry": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", - "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", - "dev": true - }, - "@inquirer/ansi": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.2.tgz", - "integrity": "sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==" - }, - "@inquirer/checkbox": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.3.2.tgz", - "integrity": "sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==", - "requires": { - "@inquirer/ansi": "^1.0.2", - "@inquirer/core": "^10.3.2", - "@inquirer/figures": "^1.0.15", - "@inquirer/type": "^3.0.10", - "yoctocolors-cjs": "^2.1.3" - } - }, - "@inquirer/confirm": { - "version": "5.1.21", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.21.tgz", - "integrity": "sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==", - "requires": { - "@inquirer/core": "^10.3.2", - "@inquirer/type": "^3.0.10" - } - }, - "@inquirer/core": { - "version": "10.3.2", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.2.tgz", - "integrity": "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==", - "requires": { - "@inquirer/ansi": "^1.0.2", - "@inquirer/figures": "^1.0.15", - "@inquirer/type": "^3.0.10", - "cli-width": "^4.1.0", - "mute-stream": "^2.0.0", - "signal-exit": "^4.1.0", - "wrap-ansi": "^6.2.0", - "yoctocolors-cjs": "^2.1.3" - }, - "dependencies": { - "signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==" - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - } - } - }, - "@inquirer/editor": { - "version": "4.2.23", - "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.23.tgz", - "integrity": "sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==", - "requires": { - "@inquirer/core": "^10.3.2", - "@inquirer/external-editor": "^1.0.3", - "@inquirer/type": "^3.0.10" - } - }, - "@inquirer/expand": { - "version": "4.0.23", - "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.23.tgz", - "integrity": "sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==", - "requires": { - "@inquirer/core": "^10.3.2", - "@inquirer/type": "^3.0.10", - "yoctocolors-cjs": "^2.1.3" - } - }, - "@inquirer/external-editor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz", - "integrity": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==", - "requires": { - "chardet": "^2.1.1", - "iconv-lite": "^0.7.0" - }, - "dependencies": { - "iconv-lite": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", - "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - } - } - }, - "@inquirer/figures": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.15.tgz", - "integrity": "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==" - }, - "@inquirer/input": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.3.1.tgz", - "integrity": "sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==", - "requires": { - "@inquirer/core": "^10.3.2", - "@inquirer/type": "^3.0.10" - } - }, - "@inquirer/number": { - "version": "3.0.23", - "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.23.tgz", - "integrity": "sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==", - "requires": { - "@inquirer/core": "^10.3.2", - "@inquirer/type": "^3.0.10" - } - }, - "@inquirer/password": { - "version": "4.0.23", - "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.23.tgz", - "integrity": "sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==", - "requires": { - "@inquirer/ansi": "^1.0.2", - "@inquirer/core": "^10.3.2", - "@inquirer/type": "^3.0.10" - } - }, - "@inquirer/prompts": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.10.1.tgz", - "integrity": "sha512-Dx/y9bCQcXLI5ooQ5KyvA4FTgeo2jYj/7plWfV5Ak5wDPKQZgudKez2ixyfz7tKXzcJciTxqLeK7R9HItwiByg==", - "requires": { - "@inquirer/checkbox": "^4.3.2", - "@inquirer/confirm": "^5.1.21", - "@inquirer/editor": "^4.2.23", - "@inquirer/expand": "^4.0.23", - "@inquirer/input": "^4.3.1", - "@inquirer/number": "^3.0.23", - "@inquirer/password": "^4.0.23", - "@inquirer/rawlist": "^4.1.11", - "@inquirer/search": "^3.2.2", - "@inquirer/select": "^4.4.2" - } - }, - "@inquirer/rawlist": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.11.tgz", - "integrity": "sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==", - "requires": { - "@inquirer/core": "^10.3.2", - "@inquirer/type": "^3.0.10", - "yoctocolors-cjs": "^2.1.3" - } - }, - "@inquirer/search": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.2.2.tgz", - "integrity": "sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==", - "requires": { - "@inquirer/core": "^10.3.2", - "@inquirer/figures": "^1.0.15", - "@inquirer/type": "^3.0.10", - "yoctocolors-cjs": "^2.1.3" - } - }, - "@inquirer/select": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.4.2.tgz", - "integrity": "sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==", - "requires": { - "@inquirer/ansi": "^1.0.2", - "@inquirer/core": "^10.3.2", - "@inquirer/figures": "^1.0.15", - "@inquirer/type": "^3.0.10", - "yoctocolors-cjs": "^2.1.3" - } - }, - "@inquirer/type": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.10.tgz", - "integrity": "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==" - }, - "@isaacs/fs-minipass": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", - "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", - "requires": { - "minipass": "^7.0.4" - } - }, - "@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true - }, - "@jridgewell/gen-mapping": { - "version": "0.3.12", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz", - "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==", - "requires": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "requires": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==" - }, - "@jridgewell/source-map": { - "version": "0.3.11", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", - "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" - } - }, - "@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==" - }, - "@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "requires": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "@jsdevtools/ono": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", - "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==" - }, - "@jsonjoy.com/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", - "dev": true - }, - "@jsonjoy.com/buffers": { - "version": "17.67.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-17.67.0.tgz", - "integrity": "sha512-tfExRpYxBvi32vPs9ZHaTjSP4fHAfzSmcahOfNxtvGHcyJel+aibkPlGeBB+7AoC6hL7lXIE++8okecBxx7lcw==", - "dev": true - }, - "@jsonjoy.com/codegen": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-1.0.0.tgz", - "integrity": "sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==", - "dev": true - }, - "@jsonjoy.com/fs-core": { - "version": "4.57.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-core/-/fs-core-4.57.2.tgz", - "integrity": "sha512-SVjwklkpIV5wrynpYtuYnfYH1QF4/nDuLBX7VXdb+3miglcAgBVZb/5y0cOsehRV/9Vb+3UqhkMq3/NR3ztdkQ==", - "dev": true, - "requires": { - "@jsonjoy.com/fs-node-builtins": "4.57.2", - "@jsonjoy.com/fs-node-utils": "4.57.2", - "thingies": "^2.5.0" - } - }, - "@jsonjoy.com/fs-fsa": { - "version": "4.57.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-fsa/-/fs-fsa-4.57.2.tgz", - "integrity": "sha512-fhO8+iR2I+OCw668ISDJdn1aArc9zx033sWejIyzQ8RBeXa9bDSaUeA3ix0poYOfrj1KdOzytmYNv2/uLDfV6g==", - "dev": true, - "requires": { - "@jsonjoy.com/fs-core": "4.57.2", - "@jsonjoy.com/fs-node-builtins": "4.57.2", - "@jsonjoy.com/fs-node-utils": "4.57.2", - "thingies": "^2.5.0" - } - }, - "@jsonjoy.com/fs-node": { - "version": "4.57.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node/-/fs-node-4.57.2.tgz", - "integrity": "sha512-nX2AdL6cOFwLdju9G4/nbRnYevmCJbh7N7hvR3gGm97Cs60uEjyd0rpR+YBS7cTg175zzl22pGKXR5USaQMvKg==", - "dev": true, - "requires": { - "@jsonjoy.com/fs-core": "4.57.2", - "@jsonjoy.com/fs-node-builtins": "4.57.2", - "@jsonjoy.com/fs-node-utils": "4.57.2", - "@jsonjoy.com/fs-print": "4.57.2", - "@jsonjoy.com/fs-snapshot": "4.57.2", - "glob-to-regex.js": "^1.0.0", - "thingies": "^2.5.0" - } - }, - "@jsonjoy.com/fs-node-builtins": { - "version": "4.57.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-builtins/-/fs-node-builtins-4.57.2.tgz", - "integrity": "sha512-xhiegylRmhw43Ki2HO1ZBL7DQ5ja/qpRsL29VtQ2xuUHiuDGbgf2uD4p9Qd8hJI5P6RCtGYD50IXHXVq/Ocjcg==", - "dev": true - }, - "@jsonjoy.com/fs-node-to-fsa": { - "version": "4.57.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-to-fsa/-/fs-node-to-fsa-4.57.2.tgz", - "integrity": "sha512-18LmWTSONhoAPW+IWRuf8w/+zRolPFGPeGwMxlAhhfY11EKzX+5XHDBPAw67dBF5dxDErHJbl40U+3IXSDRXSQ==", - "dev": true, - "requires": { - "@jsonjoy.com/fs-fsa": "4.57.2", - "@jsonjoy.com/fs-node-builtins": "4.57.2", - "@jsonjoy.com/fs-node-utils": "4.57.2" - } - }, - "@jsonjoy.com/fs-node-utils": { - "version": "4.57.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-utils/-/fs-node-utils-4.57.2.tgz", - "integrity": "sha512-rsPSJgekz43IlNbLyAM/Ab+ouYLWGp5DDBfYBNNEqDaSpsbXfthBn29Q4muFA9L0F+Z3mKo+CWlgSCXrf+mOyQ==", - "dev": true, - "requires": { - "@jsonjoy.com/fs-node-builtins": "4.57.2" - } - }, - "@jsonjoy.com/fs-print": { - "version": "4.57.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-print/-/fs-print-4.57.2.tgz", - "integrity": "sha512-wK9NSow48i4DbDl9F1CQE5TqnyZOJ04elU3WFG5aJ76p+YxO/ulyBBQvKsessPxdo381Bc2pcEoyPujMOhcRqQ==", - "dev": true, - "requires": { - "@jsonjoy.com/fs-node-utils": "4.57.2", - "tree-dump": "^1.1.0" - } - }, - "@jsonjoy.com/fs-snapshot": { - "version": "4.57.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-snapshot/-/fs-snapshot-4.57.2.tgz", - "integrity": "sha512-GdduDZuoP5V/QCgJkx9+BZ6SC0EZ/smXAdTS7PfMqgMTGXLlt/bH/FqMYaqB9JmLf05sJPtO0XRbAwwkEEPbVw==", - "dev": true, - "requires": { - "@jsonjoy.com/buffers": "^17.65.0", - "@jsonjoy.com/fs-node-utils": "4.57.2", - "@jsonjoy.com/json-pack": "^17.65.0", - "@jsonjoy.com/util": "^17.65.0" - }, - "dependencies": { - "@jsonjoy.com/base64": { - "version": "17.67.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-17.67.0.tgz", - "integrity": "sha512-5SEsJGsm15aP8TQGkDfJvz9axgPwAEm98S5DxOuYe8e1EbfajcDmgeXXzccEjh+mLnjqEKrkBdjHWS5vFNwDdw==", - "dev": true - }, - "@jsonjoy.com/codegen": { - "version": "17.67.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-17.67.0.tgz", - "integrity": "sha512-idnkUplROpdBOV0HMcwhsCUS5TRUi9poagdGs70A6S4ux9+/aPuKbh8+UYRTLYQHtXvAdNfQWXDqZEx5k4Dj2Q==", - "dev": true - }, - "@jsonjoy.com/json-pack": { - "version": "17.67.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-17.67.0.tgz", - "integrity": "sha512-t0ejURcGaZsn1ClbJ/3kFqSOjlryd92eQY465IYrezsXmPcfHPE/av4twRSxf6WE+TkZgLY+71vCZbiIiFKA/w==", - "dev": true, - "requires": { - "@jsonjoy.com/base64": "17.67.0", - "@jsonjoy.com/buffers": "17.67.0", - "@jsonjoy.com/codegen": "17.67.0", - "@jsonjoy.com/json-pointer": "17.67.0", - "@jsonjoy.com/util": "17.67.0", - "hyperdyperid": "^1.2.0", - "thingies": "^2.5.0", - "tree-dump": "^1.1.0" - } - }, - "@jsonjoy.com/json-pointer": { - "version": "17.67.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-17.67.0.tgz", - "integrity": "sha512-+iqOFInH+QZGmSuaybBUNdh7yvNrXvqR+h3wjXm0N/3JK1EyyFAeGJvqnmQL61d1ARLlk/wJdFKSL+LHJ1eaUA==", - "dev": true, - "requires": { - "@jsonjoy.com/util": "17.67.0" - } - }, - "@jsonjoy.com/util": { - "version": "17.67.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-17.67.0.tgz", - "integrity": "sha512-6+8xBaz1rLSohlGh68D1pdw3AwDi9xydm8QNlAFkvnavCJYSze+pxoW2VKP8p308jtlMRLs5NTHfPlZLd4w7ew==", - "dev": true, - "requires": { - "@jsonjoy.com/buffers": "17.67.0", - "@jsonjoy.com/codegen": "17.67.0" - } - } - } - }, - "@jsonjoy.com/json-pack": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.21.0.tgz", - "integrity": "sha512-+AKG+R2cfZMShzrF2uQw34v3zbeDYUqnQ+jg7ORic3BGtfw9p/+N6RJbq/kkV8JmYZaINknaEQ2m0/f693ZPpg==", - "dev": true, - "requires": { - "@jsonjoy.com/base64": "^1.1.2", - "@jsonjoy.com/buffers": "^1.2.0", - "@jsonjoy.com/codegen": "^1.0.0", - "@jsonjoy.com/json-pointer": "^1.0.2", - "@jsonjoy.com/util": "^1.9.0", - "hyperdyperid": "^1.2.0", - "thingies": "^2.5.0", - "tree-dump": "^1.1.0" - }, - "dependencies": { - "@jsonjoy.com/buffers": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz", - "integrity": "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==", - "dev": true - } - } - }, - "@jsonjoy.com/json-pointer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-1.0.2.tgz", - "integrity": "sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg==", - "dev": true, - "requires": { - "@jsonjoy.com/codegen": "^1.0.0", - "@jsonjoy.com/util": "^1.9.0" - } - }, - "@jsonjoy.com/util": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.9.0.tgz", - "integrity": "sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ==", - "dev": true, - "requires": { - "@jsonjoy.com/buffers": "^1.0.0", - "@jsonjoy.com/codegen": "^1.0.0" - }, - "dependencies": { - "@jsonjoy.com/buffers": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz", - "integrity": "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==", - "dev": true - } - } - }, - "@knowledgecode/delegate": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/@knowledgecode/delegate/-/delegate-0.10.3.tgz", - "integrity": "sha512-iuee+vI4XhtiSHv+UpjTU4mDl2Og9FS+Rgvk645At92P3U+GJ3YJfYgC/Gi+fNdAzXCXK2yPHSyc4fF4x93crw==" - }, - "@kolkov/ngx-gallery": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@kolkov/ngx-gallery/-/ngx-gallery-2.0.1.tgz", - "integrity": "sha512-mTigRy9Ha7bqCF/+GNKeW2Oe8ZILuM5GGMw+ZbvTQWq3X5hngeFFgv8GFG49Py3biX67kb0NhqCP+msLe4wbXQ==", - "requires": { - "tslib": "^2.3.0" - } - }, - "@kurkle/color": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.2.tgz", - "integrity": "sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==" - }, - "@leichtgewicht/ip-codec": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", - "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", - "dev": true - }, - "@lifeomic/attempt": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@lifeomic/attempt/-/attempt-3.1.0.tgz", - "integrity": "sha512-QZqem4QuAnAyzfz+Gj5/+SLxqwCAw2qmt7732ZXodr6VDWGeYLG6w1i/vYLa55JQM9wRuBKLmXmiZ2P0LtE5rw==" - }, - "@listr2/prompt-adapter-inquirer": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@listr2/prompt-adapter-inquirer/-/prompt-adapter-inquirer-3.0.5.tgz", - "integrity": "sha512-WELs+hj6xcilkloBXYf9XXK8tYEnKsgLj01Xl5ONUJpKjmT5hGVUzNUS5tooUxs7pGMrw+jFD/41WpqW4V3LDA==", - "requires": { - "@inquirer/type": "^3.0.8" - } - }, - "@lit-labs/ssr-dom-shim": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.3.0.tgz", - "integrity": "sha512-nQIWonJ6eFAvUUrSlwyHDm/aE8PBDu5kRpL0vHMg6K8fK3Diq1xdPjTnsJSwxABhaZ+5eBi1btQB5ShUTKo4nQ==" - }, - "@lit/reactive-element": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-1.6.3.tgz", - "integrity": "sha512-QuTgnG52Poic7uM1AN5yJ09QMe0O28e10XzSvWDz02TJiiKee4stsiownEIadWm8nYzyDAyT+gKzUoZmiWQtsQ==", - "requires": { - "@lit-labs/ssr-dom-shim": "^1.0.0" - } - }, - "@lmdb/lmdb-darwin-arm64": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.5.1.tgz", - "integrity": "sha512-tpfN4kKrrMpQ+If1l8bhmoNkECJi0iOu6AEdrTJvWVC+32sLxTARX5Rsu579mPImRP9YFWfWgeRQ5oav7zApQQ==", - "dev": true, - "optional": true - }, - "@lmdb/lmdb-darwin-x64": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.5.1.tgz", - "integrity": "sha512-+a2tTfc3rmWhLAolFUWRgJtpSuu+Fw/yjn4rF406NMxhfjbMuiOUTDRvRlMFV+DzyjkwnokisskHbCWkS3Ly5w==", - "dev": true, - "optional": true - }, - "@lmdb/lmdb-linux-arm": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.5.1.tgz", - "integrity": "sha512-0EgcE6reYr8InjD7V37EgXcYrloqpxVPINy3ig1MwDSbl6LF/vXTYRH9OE1Ti1D8YZnB35ZH9aTcdfSb5lql2A==", - "dev": true, - "optional": true - }, - "@lmdb/lmdb-linux-arm64": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.5.1.tgz", - "integrity": "sha512-aoERa5B6ywXdyFeYGQ1gbQpkMkDbEo45qVoXE5QpIRavqjnyPwjOulMkmkypkmsbJ5z4Wi0TBztON8agCTG0Vg==", - "dev": true, - "optional": true - }, - "@lmdb/lmdb-linux-x64": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.5.1.tgz", - "integrity": "sha512-SqNDY1+vpji7bh0sFH5wlWyFTOzjbDOl0/kB5RLLYDAFyd/uw3n7wyrmas3rYPpAW7z18lMOi1yKlTPv967E3g==", - "dev": true, - "optional": true - }, - "@lmdb/lmdb-win32-arm64": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-arm64/-/lmdb-win32-arm64-3.5.1.tgz", - "integrity": "sha512-50v0O1Lt37cwrmR9vWZK5hRW0Aw+KEmxJJ75fge/zIYdvNKB/0bSMSVR5Uc2OV9JhosIUyklOmrEvavwNJ8D6w==", - "dev": true, - "optional": true - }, - "@lmdb/lmdb-win32-x64": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.5.1.tgz", - "integrity": "sha512-qwosvPyl+zpUlp3gRb7UcJ3H8S28XHCzkv0Y0EgQToXjQP91ZD67EHSCDmaLjtKhe+GVIW5om1KUpzVLA0l6pg==", - "dev": true, - "optional": true - }, - "@loaders.gl/core": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/@loaders.gl/core/-/core-4.3.4.tgz", - "integrity": "sha512-cG0C5fMZ1jyW6WCsf4LoHGvaIAJCEVA/ioqKoYRwoSfXkOf+17KupK1OUQyUCw5XoRn+oWA1FulJQOYlXnb9Gw==", - "requires": { - "@loaders.gl/loader-utils": "4.3.4", - "@loaders.gl/schema": "4.3.4", - "@loaders.gl/worker-utils": "4.3.4", - "@probe.gl/log": "^4.0.2" - } - }, - "@loaders.gl/draco": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/@loaders.gl/draco/-/draco-4.3.4.tgz", - "integrity": "sha512-4Lx0rKmYENGspvcgV5XDpFD9o+NamXoazSSl9Oa3pjVVjo+HJuzCgrxTQYD/3JvRrolW/QRehZeWD/L/cEC6mw==", - "requires": { - "@loaders.gl/loader-utils": "4.3.4", - "@loaders.gl/schema": "4.3.4", - "@loaders.gl/worker-utils": "4.3.4", - "draco3d": "1.5.7" - } - }, - "@loaders.gl/gltf": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/@loaders.gl/gltf/-/gltf-4.3.4.tgz", - "integrity": "sha512-EiUTiLGMfukLd9W98wMpKmw+hVRhQ0dJ37wdlXK98XPeGGB+zTQxCcQY+/BaMhsSpYt/OOJleHhTfwNr8RgzRg==", - "requires": { - "@loaders.gl/draco": "4.3.4", - "@loaders.gl/images": "4.3.4", - "@loaders.gl/loader-utils": "4.3.4", - "@loaders.gl/schema": "4.3.4", - "@loaders.gl/textures": "4.3.4", - "@math.gl/core": "^4.1.0" - } - }, - "@loaders.gl/images": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/@loaders.gl/images/-/images-4.3.4.tgz", - "integrity": "sha512-qgc33BaNsqN9cWa/xvcGvQ50wGDONgQQdzHCKDDKhV2w/uptZoR5iofJfuG8UUV2vUMMd82Uk9zbopRx2rS4Ag==", - "requires": { - "@loaders.gl/loader-utils": "4.3.4" - } - }, - "@loaders.gl/las": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/@loaders.gl/las/-/las-4.3.4.tgz", - "integrity": "sha512-KGyVuSQwpnVO/RCHYF8ITkDd7DpXnhAPDpgGMCBrpWvBubAbIY38oP0uGecNO/HVfRVAovDEobZICN3uQx2Weg==", - "requires": { - "@loaders.gl/loader-utils": "4.3.4", - "@loaders.gl/schema": "4.3.4", - "laz-perf": "^0.0.6" - } - }, - "@loaders.gl/loader-utils": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/@loaders.gl/loader-utils/-/loader-utils-4.3.4.tgz", - "integrity": "sha512-tjMZvlKQSaMl2qmYTAxg+ySR6zd6hQn5n3XaU8+Ehp90TD3WzxvDKOMNDqOa72fFmIV+KgPhcmIJTpq4lAdC4Q==", - "requires": { - "@loaders.gl/schema": "4.3.4", - "@loaders.gl/worker-utils": "4.3.4", - "@probe.gl/log": "^4.0.2", - "@probe.gl/stats": "^4.0.2" - } - }, - "@loaders.gl/schema": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/@loaders.gl/schema/-/schema-4.3.4.tgz", - "integrity": "sha512-1YTYoatgzr/6JTxqBLwDiD3AVGwQZheYiQwAimWdRBVB0JAzych7s1yBuE0CVEzj4JDPKOzVAz8KnU1TiBvJGw==", - "requires": { - "@types/geojson": "^7946.0.7" - } - }, - "@loaders.gl/textures": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/@loaders.gl/textures/-/textures-4.3.4.tgz", - "integrity": "sha512-arWIDjlE7JaDS6v9by7juLfxPGGnjT9JjleaXx3wq/PTp+psLOpGUywHXm38BNECos3MFEQK3/GFShWI+/dWPw==", - "requires": { - "@loaders.gl/images": "4.3.4", - "@loaders.gl/loader-utils": "4.3.4", - "@loaders.gl/schema": "4.3.4", - "@loaders.gl/worker-utils": "4.3.4", - "@math.gl/types": "^4.1.0", - "ktx-parse": "^0.7.0", - "texture-compressor": "^1.0.2" - } - }, - "@loaders.gl/worker-utils": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/@loaders.gl/worker-utils/-/worker-utils-4.3.4.tgz", - "integrity": "sha512-EbsszrASgT85GH3B7jkx7YXfQyIYo/rlobwMx6V3ewETapPUwdSAInv+89flnk5n2eu2Lpdeh+2zS6PvqbL2RA==" - }, - "@mantine/core": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/@mantine/core/-/core-9.3.1.tgz", - "integrity": "sha512-4rBoHpggSohayE+Os7lKdbsHTw7m/uZRKYjk9DN6cKBhQIjdiULdcG+b4b5CMVZSqZDHPgT70uWGI7yqkn8Ufw==", - "requires": { - "@floating-ui/react": "^0.27.19", - "clsx": "^2.1.1", - "react-number-format": "^5.4.5", - "react-remove-scroll": "^2.7.2", - "type-fest": "^5.6.0" - } - }, - "@mantine/hooks": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/@mantine/hooks/-/hooks-9.3.1.tgz", - "integrity": "sha512-zAOlxV59j5CDgAnExN+ypaR6dVW1vwMKDvKUxIlUVd/e52qxYnPyYRD+shJmyOLaZRuQmVF0R/7mJAjt2jw9cA==" - }, - "@mantine/utils": { - "version": "6.0.22", - "resolved": "https://registry.npmjs.org/@mantine/utils/-/utils-6.0.22.tgz", - "integrity": "sha512-RSKlNZvxhMCkOFZ6slbYvZYbWjHUM+PxDQnupIOxIdsTZQQjx/BFfrfJ7kQFOP+g7MtpOds8weAetEs5obwMOQ==" - }, - "@math.gl/core": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@math.gl/core/-/core-4.1.0.tgz", - "integrity": "sha512-FrdHBCVG3QdrworwrUSzXIaK+/9OCRLscxI2OUy6sLOHyHgBMyfnEGs99/m3KNvs+95BsnQLWklVfpKfQzfwKA==", - "requires": { - "@math.gl/types": "4.1.0" - } - }, - "@math.gl/types": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@math.gl/types/-/types-4.1.0.tgz", - "integrity": "sha512-clYZdHcmRvMzVK5fjeDkQlHUzXQSNdZ7s4xOqC3nJPgz4C/TZkUecTo9YS4PruZqtDda/ag4erndP0MIn40dGA==" - }, - "@modelcontextprotocol/sdk": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.26.0.tgz", - "integrity": "sha512-Y5RmPncpiDtTXDbLKswIJzTqu2hyBKxTNsgKqKclDbhIgg1wgtf1fRuvxgTnRfcnxtvvgbIEcqUOzZrJ6iSReg==", - "requires": { - "@hono/node-server": "^1.19.9", - "ajv": "^8.17.1", - "ajv-formats": "^3.0.1", - "content-type": "^1.0.5", - "cors": "^2.8.5", - "cross-spawn": "^7.0.5", - "eventsource": "^3.0.2", - "eventsource-parser": "^3.0.0", - "express": "^5.2.1", - "express-rate-limit": "^8.2.1", - "hono": "^4.11.4", - "jose": "^6.1.3", - "json-schema-typed": "^8.0.2", - "pkce-challenge": "^5.0.0", - "raw-body": "^3.0.0", - "zod": "^3.25 || ^4.0", - "zod-to-json-schema": "^3.25.1" - }, - "dependencies": { - "accepts": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", - "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", - "requires": { - "mime-types": "^3.0.0", - "negotiator": "^1.0.0" - } - }, - "ajv-formats": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", - "requires": { - "ajv": "^8.0.0" - } - }, - "body-parser": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz", - "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==", - "requires": { - "bytes": "^3.1.2", - "content-type": "^1.0.5", - "debug": "^4.4.3", - "http-errors": "^2.0.0", - "iconv-lite": "^0.7.0", - "on-finished": "^2.4.1", - "qs": "^6.14.1", - "raw-body": "^3.0.1", - "type-is": "^2.0.1" - } - }, - "content-disposition": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", - "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==" - }, - "cookie-signature": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", - "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==" - }, - "encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==" - }, - "express": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", - "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", - "requires": { - "accepts": "^2.0.0", - "body-parser": "^2.2.1", - "content-disposition": "^1.0.0", - "content-type": "^1.0.5", - "cookie": "^0.7.1", - "cookie-signature": "^1.2.1", - "debug": "^4.4.0", - "depd": "^2.0.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "finalhandler": "^2.1.0", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "merge-descriptors": "^2.0.0", - "mime-types": "^3.0.0", - "on-finished": "^2.4.1", - "once": "^1.4.0", - "parseurl": "^1.3.3", - "proxy-addr": "^2.0.7", - "qs": "^6.14.0", - "range-parser": "^1.2.1", - "router": "^2.2.0", - "send": "^1.1.0", - "serve-static": "^2.2.0", - "statuses": "^2.0.1", - "type-is": "^2.0.1", - "vary": "^1.1.2" - } - }, - "finalhandler": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", - "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", - "requires": { - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "on-finished": "^2.4.1", - "parseurl": "^1.3.3", - "statuses": "^2.0.1" - } - }, - "fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", - "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==" - }, - "iconv-lite": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", - "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - }, - "media-typer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==" - }, - "merge-descriptors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", - "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==" - }, - "mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==" - }, - "mime-types": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", - "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", - "requires": { - "mime-db": "^1.54.0" - } - }, - "negotiator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", - "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==" - }, - "raw-body": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", - "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", - "requires": { - "bytes": "~3.1.2", - "http-errors": "~2.0.1", - "iconv-lite": "~0.7.0", - "unpipe": "~1.0.0" - } - }, - "send": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", - "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", - "requires": { - "debug": "^4.4.3", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "fresh": "^2.0.0", - "http-errors": "^2.0.1", - "mime-types": "^3.0.2", - "ms": "^2.1.3", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "statuses": "^2.0.2" - } - }, - "serve-static": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", - "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", - "requires": { - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "parseurl": "^1.3.3", - "send": "^1.2.0" - } - }, - "type-is": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", - "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", - "requires": { - "content-type": "^1.0.5", - "media-typer": "^1.1.0", - "mime-types": "^3.0.0" - } - } - } - }, - "@msgpackr-extract/msgpackr-extract-darwin-arm64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz", - "integrity": "sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==", - "dev": true, - "optional": true - }, - "@msgpackr-extract/msgpackr-extract-darwin-x64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.3.tgz", - "integrity": "sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==", - "dev": true, - "optional": true - }, - "@msgpackr-extract/msgpackr-extract-linux-arm": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.3.tgz", - "integrity": "sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==", - "dev": true, - "optional": true - }, - "@msgpackr-extract/msgpackr-extract-linux-arm64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.3.tgz", - "integrity": "sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==", - "dev": true, - "optional": true - }, - "@msgpackr-extract/msgpackr-extract-linux-x64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.3.tgz", - "integrity": "sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==", - "dev": true, - "optional": true - }, - "@msgpackr-extract/msgpackr-extract-win32-x64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.3.tgz", - "integrity": "sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==", - "dev": true, - "optional": true - }, - "@napi-rs/nice": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice/-/nice-1.1.1.tgz", - "integrity": "sha512-xJIPs+bYuc9ASBl+cvGsKbGrJmS6fAKaSZCnT0lhahT5rhA2VVy9/EcIgd2JhtEuFOJNx7UHNn/qiTPTY4nrQw==", - "dev": true, - "optional": true, - "requires": { - "@napi-rs/nice-android-arm-eabi": "1.1.1", - "@napi-rs/nice-android-arm64": "1.1.1", - "@napi-rs/nice-darwin-arm64": "1.1.1", - "@napi-rs/nice-darwin-x64": "1.1.1", - "@napi-rs/nice-freebsd-x64": "1.1.1", - "@napi-rs/nice-linux-arm-gnueabihf": "1.1.1", - "@napi-rs/nice-linux-arm64-gnu": "1.1.1", - "@napi-rs/nice-linux-arm64-musl": "1.1.1", - "@napi-rs/nice-linux-ppc64-gnu": "1.1.1", - "@napi-rs/nice-linux-riscv64-gnu": "1.1.1", - "@napi-rs/nice-linux-s390x-gnu": "1.1.1", - "@napi-rs/nice-linux-x64-gnu": "1.1.1", - "@napi-rs/nice-linux-x64-musl": "1.1.1", - "@napi-rs/nice-openharmony-arm64": "1.1.1", - "@napi-rs/nice-win32-arm64-msvc": "1.1.1", - "@napi-rs/nice-win32-ia32-msvc": "1.1.1", - "@napi-rs/nice-win32-x64-msvc": "1.1.1" - } - }, - "@napi-rs/nice-android-arm-eabi": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm-eabi/-/nice-android-arm-eabi-1.1.1.tgz", - "integrity": "sha512-kjirL3N6TnRPv5iuHw36wnucNqXAO46dzK9oPb0wj076R5Xm8PfUVA9nAFB5ZNMmfJQJVKACAPd/Z2KYMppthw==", - "dev": true, - "optional": true - }, - "@napi-rs/nice-android-arm64": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm64/-/nice-android-arm64-1.1.1.tgz", - "integrity": "sha512-blG0i7dXgbInN5urONoUCNf+DUEAavRffrO7fZSeoRMJc5qD+BJeNcpr54msPF6qfDD6kzs9AQJogZvT2KD5nw==", - "dev": true, - "optional": true - }, - "@napi-rs/nice-darwin-arm64": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-arm64/-/nice-darwin-arm64-1.1.1.tgz", - "integrity": "sha512-s/E7w45NaLqTGuOjC2p96pct4jRfo61xb9bU1unM/MJ/RFkKlJyJDx7OJI/O0ll/hrfpqKopuAFDV8yo0hfT7A==", - "dev": true, - "optional": true - }, - "@napi-rs/nice-darwin-x64": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-x64/-/nice-darwin-x64-1.1.1.tgz", - "integrity": "sha512-dGoEBnVpsdcC+oHHmW1LRK5eiyzLwdgNQq3BmZIav+9/5WTZwBYX7r5ZkQC07Nxd3KHOCkgbHSh4wPkH1N1LiQ==", - "dev": true, - "optional": true - }, - "@napi-rs/nice-freebsd-x64": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-freebsd-x64/-/nice-freebsd-x64-1.1.1.tgz", - "integrity": "sha512-kHv4kEHAylMYmlNwcQcDtXjklYp4FCf0b05E+0h6nDHsZ+F0bDe04U/tXNOqrx5CmIAth4vwfkjjUmp4c4JktQ==", - "dev": true, - "optional": true - }, - "@napi-rs/nice-linux-arm-gnueabihf": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm-gnueabihf/-/nice-linux-arm-gnueabihf-1.1.1.tgz", - "integrity": "sha512-E1t7K0efyKXZDoZg1LzCOLxgolxV58HCkaEkEvIYQx12ht2pa8hoBo+4OB3qh7e+QiBlp1SRf+voWUZFxyhyqg==", - "dev": true, - "optional": true - }, - "@napi-rs/nice-linux-arm64-gnu": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm64-gnu/-/nice-linux-arm64-gnu-1.1.1.tgz", - "integrity": "sha512-CIKLA12DTIZlmTaaKhQP88R3Xao+gyJxNWEn04wZwC2wmRapNnxCUZkVwggInMJvtVElA+D4ZzOU5sX4jV+SmQ==", - "dev": true, - "optional": true - }, - "@napi-rs/nice-linux-arm64-musl": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm64-musl/-/nice-linux-arm64-musl-1.1.1.tgz", - "integrity": "sha512-+2Rzdb3nTIYZ0YJF43qf2twhqOCkiSrHx2Pg6DJaCPYhhaxbLcdlV8hCRMHghQ+EtZQWGNcS2xF4KxBhSGeutg==", - "dev": true, - "optional": true - }, - "@napi-rs/nice-linux-ppc64-gnu": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-ppc64-gnu/-/nice-linux-ppc64-gnu-1.1.1.tgz", - "integrity": "sha512-4FS8oc0GeHpwvv4tKciKkw3Y4jKsL7FRhaOeiPei0X9T4Jd619wHNe4xCLmN2EMgZoeGg+Q7GY7BsvwKpL22Tg==", - "dev": true, - "optional": true - }, - "@napi-rs/nice-linux-riscv64-gnu": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-riscv64-gnu/-/nice-linux-riscv64-gnu-1.1.1.tgz", - "integrity": "sha512-HU0nw9uD4FO/oGCCk409tCi5IzIZpH2agE6nN4fqpwVlCn5BOq0MS1dXGjXaG17JaAvrlpV5ZeyZwSon10XOXw==", - "dev": true, - "optional": true - }, - "@napi-rs/nice-linux-s390x-gnu": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-s390x-gnu/-/nice-linux-s390x-gnu-1.1.1.tgz", - "integrity": "sha512-2YqKJWWl24EwrX0DzCQgPLKQBxYDdBxOHot1KWEq7aY2uYeX+Uvtv4I8xFVVygJDgf6/92h9N3Y43WPx8+PAgQ==", - "dev": true, - "optional": true - }, - "@napi-rs/nice-linux-x64-gnu": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-x64-gnu/-/nice-linux-x64-gnu-1.1.1.tgz", - "integrity": "sha512-/gaNz3R92t+dcrfCw/96pDopcmec7oCcAQ3l/M+Zxr82KT4DljD37CpgrnXV+pJC263JkW572pdbP3hP+KjcIg==", - "dev": true, - "optional": true - }, - "@napi-rs/nice-linux-x64-musl": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-x64-musl/-/nice-linux-x64-musl-1.1.1.tgz", - "integrity": "sha512-xScCGnyj/oppsNPMnevsBe3pvNaoK7FGvMjT35riz9YdhB2WtTG47ZlbxtOLpjeO9SqqQ2J2igCmz6IJOD5JYw==", - "dev": true, - "optional": true - }, - "@napi-rs/nice-openharmony-arm64": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-openharmony-arm64/-/nice-openharmony-arm64-1.1.1.tgz", - "integrity": "sha512-6uJPRVwVCLDeoOaNyeiW0gp2kFIM4r7PL2MczdZQHkFi9gVlgm+Vn+V6nTWRcu856mJ2WjYJiumEajfSm7arPQ==", - "dev": true, - "optional": true - }, - "@napi-rs/nice-win32-arm64-msvc": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-arm64-msvc/-/nice-win32-arm64-msvc-1.1.1.tgz", - "integrity": "sha512-uoTb4eAvM5B2aj/z8j+Nv8OttPf2m+HVx3UjA5jcFxASvNhQriyCQF1OB1lHL43ZhW+VwZlgvjmP5qF3+59atA==", - "dev": true, - "optional": true - }, - "@napi-rs/nice-win32-ia32-msvc": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-ia32-msvc/-/nice-win32-ia32-msvc-1.1.1.tgz", - "integrity": "sha512-CNQqlQT9MwuCsg1Vd/oKXiuH+TcsSPJmlAFc5frFyX/KkOh0UpBLEj7aoY656d5UKZQMQFP7vJNa1DNUNORvug==", - "dev": true, - "optional": true - }, - "@napi-rs/nice-win32-x64-msvc": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-x64-msvc/-/nice-win32-x64-msvc-1.1.1.tgz", - "integrity": "sha512-vB+4G/jBQCAh0jelMTY3+kgFy00Hlx2f2/1zjMoH821IbplbWZOkLiTYXQkygNTzQJTq5cvwBDgn2ppHD+bglQ==", - "dev": true, - "optional": true - }, - "@napi-rs/wasm-runtime": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz", - "integrity": "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==", - "dev": true, - "optional": true, - "requires": { - "@tybys/wasm-util": "^0.10.1" - } - }, - "@ng-select/ng-option-highlight": { - "version": "21.8.2", - "resolved": "https://registry.npmjs.org/@ng-select/ng-option-highlight/-/ng-option-highlight-21.8.2.tgz", - "integrity": "sha512-x9fH607cr6BgFWADMkzPK5wrZCpkBJkNzAXfEiD+gX+MWzgyE74WdY7H5ismrMkT2bMJJ1xysc/ypMzt0E7z7Q==", - "requires": { - "tslib": "^2.3.0" - } - }, - "@ng-select/ng-select": { - "version": "21.8.0", - "resolved": "https://registry.npmjs.org/@ng-select/ng-select/-/ng-select-21.8.0.tgz", - "integrity": "sha512-PXJFfitM7VO/ynqjJ3wKGoRETU6y0ARjcz5bA5V420fX0H6WyU3O91Ex5uFDNx08DzT4fU1GHPs0KXxI+LYOVg==", - "requires": { - "tslib": "^2.8.1" - } - }, - "@ngneat/content-loader": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@ngneat/content-loader/-/content-loader-7.0.0.tgz", - "integrity": "sha512-CfwsDxh2hsQfUwca3SWnyjQD5jcG6Vb6Ew0JIztj/spr3YIC9Obz7AqEVMDYPKch4QzPJiJ6OVRuLRM2DKiG9g==", - "requires": { - "tslib": "^2.3.0" - } - }, - "@ngtools/webpack": { - "version": "21.2.14", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-21.2.14.tgz", - "integrity": "sha512-HXt4pYLlWCJphO6TZoTsi2Z9Lyq/PqYpiKlqUmNoo/oIiSuXtoT/8+84Z/SfBdzeZpiVrAFz+/QGTVFoD8RSGg==", - "dev": true - }, - "@noble/hashes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", - "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", - "dev": true - }, - "@npmcli/agent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-4.0.0.tgz", - "integrity": "sha512-kAQTcEN9E8ERLVg5AsGwLNoFb+oEG6engbqAU2P43gD4JEIkNGMHdVQ096FsOAAYpZPB0RSt0zgInKIAS1l5QA==", - "requires": { - "agent-base": "^7.1.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.1", - "lru-cache": "^11.2.1", - "socks-proxy-agent": "^8.0.3" - }, - "dependencies": { - "lru-cache": { - "version": "11.3.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.5.tgz", - "integrity": "sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==" - } - } - }, - "@npmcli/fs": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-5.0.0.tgz", - "integrity": "sha512-7OsC1gNORBEawOa5+j2pXN9vsicaIOH5cPXxoR6fJOmH6/EXpJB2CajXOu1fPRFun2m1lktEFX11+P89hqO/og==", - "requires": { - "semver": "^7.3.5" - } - }, - "@npmcli/git": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-7.0.2.tgz", - "integrity": "sha512-oeolHDjExNAJAnlYP2qzNjMX/Xi9bmu78C9dIGr4xjobrSKbuMYCph8lTzn4vnW3NjIqVmw/f8BCfouqyJXlRg==", - "requires": { - "@gar/promise-retry": "^1.0.0", - "@npmcli/promise-spawn": "^9.0.0", - "ini": "^6.0.0", - "lru-cache": "^11.2.1", - "npm-pick-manifest": "^11.0.1", - "proc-log": "^6.0.0", - "semver": "^7.3.5", - "which": "^6.0.0" - }, - "dependencies": { - "isexe": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-4.0.0.tgz", - "integrity": "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==" - }, - "lru-cache": { - "version": "11.3.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.5.tgz", - "integrity": "sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==" - }, - "which": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/which/-/which-6.0.1.tgz", - "integrity": "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==", - "requires": { - "isexe": "^4.0.0" - } - } - } - }, - "@npmcli/installed-package-contents": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-4.0.0.tgz", - "integrity": "sha512-yNyAdkBxB72gtZ4GrwXCM0ZUedo9nIbOMKfGjt6Cu6DXf0p8y1PViZAKDC8q8kv/fufx0WTjRBdSlyrvnP7hmA==", - "requires": { - "npm-bundled": "^5.0.0", - "npm-normalize-package-bin": "^5.0.0" - } - }, - "@npmcli/node-gyp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-5.0.0.tgz", - "integrity": "sha512-uuG5HZFXLfyFKqg8QypsmgLQW7smiRjVc45bqD/ofZZcR/uxEjgQU8qDPv0s9TEeMUiAAU/GC5bR6++UdTirIQ==" - }, - "@npmcli/package-json": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-7.0.5.tgz", - "integrity": "sha512-iVuTlG3ORq2iaVa1IWUxAO/jIp77tUKBhoMjuzYW2kL4MLN1bi/ofqkZ7D7OOwh8coAx1/S2ge0rMdGv8sLSOQ==", - "requires": { - "@npmcli/git": "^7.0.0", - "glob": "^13.0.0", - "hosted-git-info": "^9.0.0", - "json-parse-even-better-errors": "^5.0.0", - "proc-log": "^6.0.0", - "semver": "^7.5.3", - "spdx-expression-parse": "^4.0.0" - } - }, - "@npmcli/promise-spawn": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-9.0.1.tgz", - "integrity": "sha512-OLUaoqBuyxeTqUvjA3FZFiXUfYC1alp3Sa99gW3EUDz3tZ3CbXDdcZ7qWKBzicrJleIgucoWamWH1saAmH/l2Q==", - "requires": { - "which": "^6.0.0" - }, - "dependencies": { - "isexe": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-4.0.0.tgz", - "integrity": "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==" - }, - "which": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/which/-/which-6.0.1.tgz", - "integrity": "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==", - "requires": { - "isexe": "^4.0.0" - } - } - } - }, - "@npmcli/redact": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-4.0.0.tgz", - "integrity": "sha512-gOBg5YHMfZy+TfHArfVogwgfBeQnKbbGo3pSUyK/gSI0AVu+pEiDVcKlQb0D8Mg1LNRZILZ6XG8I5dJ4KuAd9Q==" - }, - "@npmcli/run-script": { - "version": "10.0.4", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-10.0.4.tgz", - "integrity": "sha512-mGUWr1uMnf0le2TwfOZY4SFxZGXGfm4Jtay/nwAa2FLNAKXUoUwaGwBMNH36UHPtinWfTSJ3nqFQr0091CxVGg==", - "requires": { - "@npmcli/node-gyp": "^5.0.0", - "@npmcli/package-json": "^7.0.0", - "@npmcli/promise-spawn": "^9.0.0", - "node-gyp": "^12.1.0", - "proc-log": "^6.0.0" - } - }, - "@oddbird/popover-polyfill": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@oddbird/popover-polyfill/-/popover-polyfill-0.5.2.tgz", - "integrity": "sha512-iFrvar5SOMtKFOSjYvs4z9UlLqDdJbMx0mgISLcPedv+g0ac5sgeETLGtipHCVIae6HJPclNEH5aCyD1RZaEHw==" - }, - "@openproject/octicons-angular": { - "version": "19.35.0", - "resolved": "https://registry.npmjs.org/@openproject/octicons-angular/-/octicons-angular-19.35.0.tgz", - "integrity": "sha512-oN6bkZeOcrWUAJtfuXsMHmHWpuJMxIt1gvToJpsDgOXFY9Wj1DVO2Di/hMYgG/8k+xv2UZ3kAgks43ENImgLmw==", - "requires": { - "tslib": "^2.3.0" - } - }, - "@openproject/primer-view-components": { - "version": "0.86.2", - "resolved": "https://registry.npmjs.org/@openproject/primer-view-components/-/primer-view-components-0.86.2.tgz", - "integrity": "sha512-xNkNQm0fkDuBjksGr8UaINdOn1/mjs1FEaJCAXhNWkcZrxaEXgx76mxijt7y4T7I4QNXYgNlaQj/tYlmVJjHsw==", - "requires": { - "@github/auto-check-element": "^6.0.0", - "@github/auto-complete-element": "^3.8.0", - "@github/catalyst": "^1.8.0", - "@github/clipboard-copy-element": "^1.3.0", - "@github/details-menu-element": "^1.0.12", - "@github/image-crop-element": "^5.0.0", - "@github/include-fragment-element": "^6.3.0", - "@github/relative-time-element": "^5.0.0", - "@github/remote-input-element": "^0.4.0", - "@github/tab-container-element": "^3.1.2", - "@oddbird/popover-polyfill": "^0.5.2", - "@primer/behaviors": "^1.3.4", - "@primer/live-region-element": "^0.8.0" - } - }, - "@openproject/reactivestates": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@openproject/reactivestates/-/reactivestates-3.0.1.tgz", - "integrity": "sha512-Ov9TyxGCDSPU6Uv83bUN7dEn8ntAZsFAioPtZ0F6ZBJ+OU7NS7raDz/5gGjbmk8ESRcmcZvWSmncRHG2rj74Fw==", - "requires": { - "rxjs": "^7.8.0" - } - }, - "@oxc-project/types": { - "version": "0.113.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.113.0.tgz", - "integrity": "sha512-Tp3XmgxwNQ9pEN9vxgJBAqdRamHibi76iowQ38O2I4PMpcvNRQNVsU2n1x1nv9yh0XoTrGFzf7cZSGxmixxrhA==", - "dev": true - }, - "@parcel/watcher": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.6.tgz", - "integrity": "sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==", - "dev": true, - "optional": true, - "requires": { - "@parcel/watcher-android-arm64": "2.5.6", - "@parcel/watcher-darwin-arm64": "2.5.6", - "@parcel/watcher-darwin-x64": "2.5.6", - "@parcel/watcher-freebsd-x64": "2.5.6", - "@parcel/watcher-linux-arm-glibc": "2.5.6", - "@parcel/watcher-linux-arm-musl": "2.5.6", - "@parcel/watcher-linux-arm64-glibc": "2.5.6", - "@parcel/watcher-linux-arm64-musl": "2.5.6", - "@parcel/watcher-linux-x64-glibc": "2.5.6", - "@parcel/watcher-linux-x64-musl": "2.5.6", - "@parcel/watcher-win32-arm64": "2.5.6", - "@parcel/watcher-win32-ia32": "2.5.6", - "@parcel/watcher-win32-x64": "2.5.6", - "detect-libc": "^2.0.3", - "is-glob": "^4.0.3", - "node-addon-api": "^7.0.0", - "picomatch": "^4.0.3" - }, - "dependencies": { - "node-addon-api": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", - "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", - "dev": true, - "optional": true - }, - "picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "dev": true, - "optional": true - } - } - }, - "@parcel/watcher-android-arm64": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.6.tgz", - "integrity": "sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==", - "dev": true, - "optional": true - }, - "@parcel/watcher-darwin-arm64": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.6.tgz", - "integrity": "sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==", - "dev": true, - "optional": true - }, - "@parcel/watcher-darwin-x64": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.6.tgz", - "integrity": "sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==", - "dev": true, - "optional": true - }, - "@parcel/watcher-freebsd-x64": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.6.tgz", - "integrity": "sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==", - "dev": true, - "optional": true - }, - "@parcel/watcher-linux-arm-glibc": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.6.tgz", - "integrity": "sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==", - "dev": true, - "optional": true - }, - "@parcel/watcher-linux-arm-musl": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.6.tgz", - "integrity": "sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==", - "dev": true, - "optional": true - }, - "@parcel/watcher-linux-arm64-glibc": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.6.tgz", - "integrity": "sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==", - "dev": true, - "optional": true - }, - "@parcel/watcher-linux-arm64-musl": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.6.tgz", - "integrity": "sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==", - "dev": true, - "optional": true - }, - "@parcel/watcher-linux-x64-glibc": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.6.tgz", - "integrity": "sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==", - "dev": true, - "optional": true - }, - "@parcel/watcher-linux-x64-musl": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.6.tgz", - "integrity": "sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==", - "dev": true, - "optional": true - }, - "@parcel/watcher-win32-arm64": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.6.tgz", - "integrity": "sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==", - "dev": true, - "optional": true - }, - "@parcel/watcher-win32-ia32": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.6.tgz", - "integrity": "sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==", - "dev": true, - "optional": true - }, - "@parcel/watcher-win32-x64": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.6.tgz", - "integrity": "sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==", - "dev": true, - "optional": true - }, - "@peculiar/asn1-cms": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-cms/-/asn1-cms-2.6.1.tgz", - "integrity": "sha512-vdG4fBF6Lkirkcl53q6eOdn3XYKt+kJTG59edgRZORlg/3atWWEReRCx5rYE1ZzTTX6vLK5zDMjHh7vbrcXGtw==", - "dev": true, - "requires": { - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.1", - "@peculiar/asn1-x509-attr": "^2.6.1", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" - } - }, - "@peculiar/asn1-csr": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-csr/-/asn1-csr-2.6.1.tgz", - "integrity": "sha512-WRWnKfIocHyzFYQTka8O/tXCiBquAPSrRjXbOkHbO4qdmS6loffCEGs+rby6WxxGdJCuunnhS2duHURhjyio6w==", - "dev": true, - "requires": { - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.1", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" - } - }, - "@peculiar/asn1-ecc": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-ecc/-/asn1-ecc-2.6.1.tgz", - "integrity": "sha512-+Vqw8WFxrtDIN5ehUdvlN2m73exS2JVG0UAyfVB31gIfor3zWEAQPD+K9ydCxaj3MLen9k0JhKpu9LqviuCE1g==", - "dev": true, - "requires": { - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.1", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" - } - }, - "@peculiar/asn1-pfx": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-pfx/-/asn1-pfx-2.6.1.tgz", - "integrity": "sha512-nB5jVQy3MAAWvq0KY0R2JUZG8bO/bTLpnwyOzXyEh/e54ynGTatAR+csOnXkkVD9AFZ2uL8Z7EV918+qB1qDvw==", - "dev": true, - "requires": { - "@peculiar/asn1-cms": "^2.6.1", - "@peculiar/asn1-pkcs8": "^2.6.1", - "@peculiar/asn1-rsa": "^2.6.1", - "@peculiar/asn1-schema": "^2.6.0", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" - } - }, - "@peculiar/asn1-pkcs8": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs8/-/asn1-pkcs8-2.6.1.tgz", - "integrity": "sha512-JB5iQ9Izn5yGMw3ZG4Nw3Xn/hb/G38GYF3lf7WmJb8JZUydhVGEjK/ZlFSWhnlB7K/4oqEs8HnfFIKklhR58Tw==", - "dev": true, - "requires": { - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.1", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" - } - }, - "@peculiar/asn1-pkcs9": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs9/-/asn1-pkcs9-2.6.1.tgz", - "integrity": "sha512-5EV8nZoMSxeWmcxWmmcolg22ojZRgJg+Y9MX2fnE2bGRo5KQLqV5IL9kdSQDZxlHz95tHvIq9F//bvL1OeNILw==", - "dev": true, - "requires": { - "@peculiar/asn1-cms": "^2.6.1", - "@peculiar/asn1-pfx": "^2.6.1", - "@peculiar/asn1-pkcs8": "^2.6.1", - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.1", - "@peculiar/asn1-x509-attr": "^2.6.1", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" - } - }, - "@peculiar/asn1-rsa": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-rsa/-/asn1-rsa-2.6.1.tgz", - "integrity": "sha512-1nVMEh46SElUt5CB3RUTV4EG/z7iYc7EoaDY5ECwganibQPkZ/Y2eMsTKB/LeyrUJ+W/tKoD9WUqIy8vB+CEdA==", - "dev": true, - "requires": { - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.1", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" - } - }, - "@peculiar/asn1-schema": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.6.0.tgz", - "integrity": "sha512-xNLYLBFTBKkCzEZIw842BxytQQATQv+lDTCEMZ8C196iJcJJMBUZxrhSTxLaohMyKK8QlzRNTRkUmanucnDSqg==", - "dev": true, - "requires": { - "asn1js": "^3.0.6", - "pvtsutils": "^1.3.6", - "tslib": "^2.8.1" - } - }, - "@peculiar/asn1-x509": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509/-/asn1-x509-2.6.1.tgz", - "integrity": "sha512-O9jT5F1A2+t3r7C4VT7LYGXqkGLK7Kj1xFpz7U0isPrubwU5PbDoyYtx6MiGst29yq7pXN5vZbQFKRCP+lLZlA==", - "dev": true, - "requires": { - "@peculiar/asn1-schema": "^2.6.0", - "asn1js": "^3.0.6", - "pvtsutils": "^1.3.6", - "tslib": "^2.8.1" - } - }, - "@peculiar/asn1-x509-attr": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509-attr/-/asn1-x509-attr-2.6.1.tgz", - "integrity": "sha512-tlW6cxoHwgcQghnJwv3YS+9OO1737zgPogZ+CgWRUK4roEwIPzRH4JEiG770xe5HX2ATfCpmX60gurfWIF9dcQ==", - "dev": true, - "requires": { - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.1", - "asn1js": "^3.0.6", - "tslib": "^2.8.1" - } - }, - "@peculiar/x509": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/@peculiar/x509/-/x509-1.14.3.tgz", - "integrity": "sha512-C2Xj8FZ0uHWeCXXqX5B4/gVFQmtSkiuOolzAgutjTfseNOHT3pUjljDZsTSxXFGgio54bCzVFqmEOUrIVk8RDA==", - "dev": true, - "requires": { - "@peculiar/asn1-cms": "^2.6.0", - "@peculiar/asn1-csr": "^2.6.0", - "@peculiar/asn1-ecc": "^2.6.0", - "@peculiar/asn1-pkcs9": "^2.6.0", - "@peculiar/asn1-rsa": "^2.6.0", - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.0", - "pvtsutils": "^1.3.6", - "reflect-metadata": "^0.2.2", - "tslib": "^2.8.1", - "tsyringe": "^4.10.0" - } - }, - "@polka/url": { - "version": "1.0.0-next.29", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", - "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", - "dev": true - }, - "@primer/behaviors": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@primer/behaviors/-/behaviors-1.3.5.tgz", - "integrity": "sha512-HWwz+6MrfK5NTWcg9GdKFpMBW/yrAV937oXiw2eDtsd88P3SRwoCt6ZO6QmKp9RP3nDU9cbqmuGZ0xBh0eIFeg==" - }, - "@primer/css": { - "version": "22.1.0", - "resolved": "https://registry.npmjs.org/@primer/css/-/css-22.1.0.tgz", - "integrity": "sha512-Nwg9QaRiBeu0BU6h+Su0X07daihX1obiuqGRG8y+SexOnvWhN2J5n4OFAvGfQsit07Y7Q6gGoK+yVU5tb8CtDA==" - }, - "@primer/live-region-element": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@primer/live-region-element/-/live-region-element-0.8.0.tgz", - "integrity": "sha512-DIp04IeZvZ+gwCUcBchIvRwJA2PikP/6hnFhcLKgwttcg5OYjBH9t0cZjLnv10Aq1jN0rAFFG+WPMd3bw4hXcA==", - "requires": { - "@lit-labs/ssr-dom-shim": "^1.2.1" - } - }, - "@primer/octicons-react": { - "version": "19.21.0", - "resolved": "https://registry.npmjs.org/@primer/octicons-react/-/octicons-react-19.21.0.tgz", - "integrity": "sha512-KMWYYEIDKNIY0N3fMmNGPWJGHgoJF5NHkJllpOM3upDXuLtAe26Riogp1cfYdhp+sVjGZMt32DxcUhTX7ZhLOQ==" - }, - "@primer/primitives": { - "version": "11.5.1", - "resolved": "https://registry.npmjs.org/@primer/primitives/-/primitives-11.5.1.tgz", - "integrity": "sha512-NB9uYfJ01FVY6zp+33EoUbJ0paS3JrWY+PqdHPebTvyRtQgL3sX8//3jWqjt3/jL81UMEulJRM2A0hPj0/vFpQ==" - }, - "@primer/view-components": { - "version": "npm:@openproject/primer-view-components@0.86.2", - "resolved": "https://registry.npmjs.org/@openproject/primer-view-components/-/primer-view-components-0.86.2.tgz", - "integrity": "sha512-xNkNQm0fkDuBjksGr8UaINdOn1/mjs1FEaJCAXhNWkcZrxaEXgx76mxijt7y4T7I4QNXYgNlaQj/tYlmVJjHsw==", - "requires": { - "@github/auto-check-element": "^6.0.0", - "@github/auto-complete-element": "^3.8.0", - "@github/catalyst": "^1.8.0", - "@github/clipboard-copy-element": "^1.3.0", - "@github/details-menu-element": "^1.0.12", - "@github/image-crop-element": "^5.0.0", - "@github/include-fragment-element": "^6.3.0", - "@github/relative-time-element": "^5.0.0", - "@github/remote-input-element": "^0.4.0", - "@github/tab-container-element": "^3.1.2", - "@oddbird/popover-polyfill": "^0.5.2", - "@primer/behaviors": "^1.3.4", - "@primer/live-region-element": "^0.8.0" - } - }, - "@probe.gl/env": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@probe.gl/env/-/env-4.1.0.tgz", - "integrity": "sha512-5ac2Jm2K72VCs4eSMsM7ykVRrV47w32xOGMvcgqn8vQdEMF9PRXyBGYEV9YbqRKWNKpNKmQJVi4AHM/fkCxs9w==" - }, - "@probe.gl/log": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@probe.gl/log/-/log-4.1.0.tgz", - "integrity": "sha512-r4gRReNY6f+OZEMgfWEXrAE2qJEt8rX0HsDJQXUBMoc+5H47bdB7f/5HBHAmapK8UydwPKL9wCDoS22rJ0yq7Q==", - "requires": { - "@probe.gl/env": "4.1.0" - } - }, - "@probe.gl/stats": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@probe.gl/stats/-/stats-4.1.0.tgz", - "integrity": "sha512-EI413MkWKBDVNIfLdqbeNSJTs7ToBz/KVGkwi3D+dQrSIkRI2IYbWGAU3xX+D6+CI4ls8ehxMhNpUVMaZggDvQ==" - }, - "@rails/actioncable": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@rails/actioncable/-/actioncable-7.0.6.tgz", - "integrity": "sha512-ybBsUrIsu5geM8BtqnpM7ZA9D8uzSz+e1B4JR57NaCmasHKWap6AX5DT7NHIbp21opVet1qqoVSdsoLDqXeB2A==" - }, - "@rails/request.js": { - "version": "0.0.13", - "resolved": "https://registry.npmjs.org/@rails/request.js/-/request.js-0.0.13.tgz", - "integrity": "sha512-7MXmjFOPuaxpjG8brqKJG0EfIe9ak6R0wRnjCBtRuADNFbdlRxETdKx1T5NVU4Ato3iZOkEpeSUEuLboL3tCGA==" - }, - "@rolldown/binding-android-arm64": { - "version": "1.0.0-rc.4", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.4.tgz", - "integrity": "sha512-vRq9f4NzvbdZavhQbjkJBx7rRebDKYR9zHfO/Wg486+I7bSecdUapzCm5cyXoK+LHokTxgSq7A5baAXUZkIz0w==", - "dev": true, - "optional": true - }, - "@rolldown/binding-darwin-arm64": { - "version": "1.0.0-rc.4", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.4.tgz", - "integrity": "sha512-kFgEvkWLqt3YCgKB5re9RlIrx9bRsvyVUnaTakEpOPuLGzLpLapYxE9BufJNvPg8GjT6mB1alN4yN1NjzoeM8Q==", - "dev": true, - "optional": true - }, - "@rolldown/binding-darwin-x64": { - "version": "1.0.0-rc.4", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.4.tgz", - "integrity": "sha512-JXmaOJGsL/+rsmMfutcDjxWM2fTaVgCHGoXS7nE8Z3c9NAYjGqHvXrAhMUZvMpHS/k7Mg+X7n/MVKb7NYWKKww==", - "dev": true, - "optional": true - }, - "@rolldown/binding-freebsd-x64": { - "version": "1.0.0-rc.4", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.4.tgz", - "integrity": "sha512-ep3Catd6sPnHTM0P4hNEvIv5arnDvk01PfyJIJ+J3wVCG1eEaPo09tvFqdtcaTrkwQy0VWR24uz+cb4IsK53Qw==", - "dev": true, - "optional": true - }, - "@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.0.0-rc.4", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.4.tgz", - "integrity": "sha512-LwA5ayKIpnsgXJEwWc3h8wPiS33NMIHd9BhsV92T8VetVAbGe2qXlJwNVDGHN5cOQ22R9uYvbrQir2AB+ntT2w==", - "dev": true, - "optional": true - }, - "@rolldown/binding-linux-arm64-gnu": { - "version": "1.0.0-rc.4", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.4.tgz", - "integrity": "sha512-AC1WsGdlV1MtGay/OQ4J9T7GRadVnpYRzTcygV1hKnypbYN20Yh4t6O1Sa2qRBMqv1etulUknqXjc3CTIsBu6A==", - "dev": true, - "optional": true - }, - "@rolldown/binding-linux-arm64-musl": { - "version": "1.0.0-rc.4", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.4.tgz", - "integrity": "sha512-lU+6rgXXViO61B4EudxtVMXSOfiZONR29Sys5VGSetUY7X8mg9FCKIIjcPPj8xNDeYzKl+H8F/qSKOBVFJChCQ==", - "dev": true, - "optional": true - }, - "@rolldown/binding-linux-x64-gnu": { - "version": "1.0.0-rc.4", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.4.tgz", - "integrity": "sha512-DZaN1f0PGp/bSvKhtw50pPsnln4T13ycDq1FrDWRiHmWt1JeW+UtYg9touPFf8yt993p8tS2QjybpzKNTxYEwg==", - "dev": true, - "optional": true - }, - "@rolldown/binding-linux-x64-musl": { - "version": "1.0.0-rc.4", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.4.tgz", - "integrity": "sha512-RnGxwZLN7fhMMAItnD6dZ7lvy+TI7ba+2V54UF4dhaWa/p8I/ys1E73KO6HmPmgz92ZkfD8TXS1IMV8+uhbR9g==", - "dev": true, - "optional": true - }, - "@rolldown/binding-openharmony-arm64": { - "version": "1.0.0-rc.4", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.4.tgz", - "integrity": "sha512-6lcI79+X8klGiGd8yHuTgQRjuuJYNggmEml+RsyN596P23l/zf9FVmJ7K0KVKkFAeYEdg0iMUKyIxiV5vebDNQ==", - "dev": true, - "optional": true - }, - "@rolldown/binding-wasm32-wasi": { - "version": "1.0.0-rc.4", - "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.4.tgz", - "integrity": "sha512-wz7ohsKCAIWy91blZ/1FlpPdqrsm1xpcEOQVveWoL6+aSPKL4VUcoYmmzuLTssyZxRpEwzuIxL/GDsvpjaBtOw==", - "dev": true, - "optional": true, - "requires": { - "@napi-rs/wasm-runtime": "^1.1.1" - } - }, - "@rolldown/binding-win32-arm64-msvc": { - "version": "1.0.0-rc.4", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.4.tgz", - "integrity": "sha512-cfiMrfuWCIgsFmcVG0IPuO6qTRHvF7NuG3wngX1RZzc6dU8FuBFb+J3MIR5WrdTNozlumfgL4cvz+R4ozBCvsQ==", - "dev": true, - "optional": true - }, - "@rolldown/binding-win32-x64-msvc": { - "version": "1.0.0-rc.4", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.4.tgz", - "integrity": "sha512-p6UeR9y7ht82AH57qwGuFYn69S6CZ7LLKdCKy/8T3zS9VTrJei2/CGsTUV45Da4Z9Rbhc7G4gyWQ/Ioamqn09g==", - "dev": true, - "optional": true - }, - "@rolldown/pluginutils": { - "version": "1.0.0-rc.4", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.4.tgz", - "integrity": "sha512-1BrrmTu0TWfOP1riA8uakjFc9bpIUGzVKETsOtzY39pPga8zELGDl8eu1Dx7/gjM5CAz14UknsUMpBO8L+YntQ==", - "dev": true - }, - "@rollup/rollup-android-arm-eabi": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.2.tgz", - "integrity": "sha512-dnlp69efPPg6Uaw2dVqzWRfAWRnYVb1XJ8CyyhIbZeaq4CA5/mLeZ1IEt9QqQxmbdvagjLIm2ZL8BxXv5lH4Yw==", - "dev": true, - "optional": true - }, - "@rollup/rollup-android-arm64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.2.tgz", - "integrity": "sha512-OqZTwDRDchGRHHm/hwLOL7uVPB9aUvI0am/eQuWMNyFHf5PSEQmyEeYYheA0EPPKUO/l0uigCp+iaTjoLjVoHg==", - "dev": true, - "optional": true - }, - "@rollup/rollup-darwin-arm64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.2.tgz", - "integrity": "sha512-UwRE7CGpvSVEQS8gUMBe1uADWjNnVgP3Iusyda1nSRwNDCsRjnGc7w6El6WLQsXmZTbLZx9cecegumcitNfpmA==", - "dev": true, - "optional": true - }, - "@rollup/rollup-darwin-x64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.2.tgz", - "integrity": "sha512-gjEtURKLCC5VXm1I+2i1u9OhxFsKAQJKTVB8WvDAHF+oZlq0GTVFOlTlO1q3AlCTE/DF32c16ESvfgqR7343/g==", - "dev": true, - "optional": true - }, - "@rollup/rollup-freebsd-arm64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.2.tgz", - "integrity": "sha512-Bcl6CYDeAgE70cqZaMojOi/eK63h5Me97ZqAQoh77VPjMysA/4ORQBRGo3rRy45x4MzVlU9uZxs8Uwy7ZaKnBw==", - "dev": true, - "optional": true - }, - "@rollup/rollup-freebsd-x64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.2.tgz", - "integrity": "sha512-LU+TPda3mAE2QB0/Hp5VyeKJivpC6+tlOXd1VMoXV/YFMvk/MNk5iXeBfB4MQGRWyOYVJ01625vjkr0Az98OJQ==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.2.tgz", - "integrity": "sha512-2QxQrM+KQ7DAW4o22j+XZ6RKdxjLD7BOWTP0Bv0tmjdyhXSsr2Ul1oJDQqh9Zf5qOwTuTc7Ek83mOFaKnodPjg==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-arm-musleabihf": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.2.tgz", - "integrity": "sha512-TbziEu2DVsTEOPif2mKWkMeDMLoYjx95oESa9fkQQK7r/Orta0gnkcDpzwufEcAO2BLBsD7mZkXGFqEdMRRwfw==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-arm64-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.2.tgz", - "integrity": "sha512-bO/rVDiDUuM2YfuCUwZ1t1cP+/yqjqz+Xf2VtkdppefuOFS2OSeAfgafaHNkFn0t02hEyXngZkxtGqXcXwO8Rg==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-arm64-musl": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.2.tgz", - "integrity": "sha512-hr26p7e93Rl0Za+JwW7EAnwAvKkehh12BU1Llm9Ykiibg4uIr2rbpxG9WCf56GuvidlTG9KiiQT/TXT1yAWxTA==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-loong64-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.2.tgz", - "integrity": "sha512-pOjB/uSIyDt+ow3k/RcLvUAOGpysT2phDn7TTUB3n75SlIgZzM6NKAqlErPhoFU+npgY3/n+2HYIQVbF70P9/A==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-loong64-musl": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.2.tgz", - "integrity": "sha512-2/w+q8jszv9Ww1c+6uJT3OwqhdmGP2/4T17cu8WuwyUuuaCDDJ2ojdyYwZzCxx0GcsZBhzi3HmH+J5pZNXnd+Q==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-ppc64-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.2.tgz", - "integrity": "sha512-11+aL5vKheYgczxtPVVRhdptAM2H7fcDR5Gw4/bTcteuZBlH4oP9f5s9zYO9aGZvoGeBpqXI/9TZZihZ609wKw==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-ppc64-musl": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.2.tgz", - "integrity": "sha512-i16fokAGK46IVZuV8LIIwMdtqhin9hfYkCh8pf8iC3QU3LpwL+1FSFGej+O7l3E/AoknL6Dclh2oTdnRMpTzFQ==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-riscv64-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.2.tgz", - "integrity": "sha512-49FkKS6RGQoriDSK/6E2GkAsAuU5kETFCh7pG4yD/ylj9rKhTmO3elsnmBvRD4PgJPds5W2PkhC82aVwmUcJ7A==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-riscv64-musl": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.2.tgz", - "integrity": "sha512-mjYNkHPfGpUR00DuM1ZZIgs64Hpf4bWcz9Z41+4Q+pgDx73UwWdAYyf6EG/lRFldmdHHzgrYyge5akFUW0D3mQ==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-s390x-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.2.tgz", - "integrity": "sha512-ALyvJz965BQk8E9Al/JDKKDLH2kfKFLTGMlgkAbbYtZuJt9LU8DW3ZoDMCtQpXAltZxwBHevXz5u+gf0yA0YoA==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-x64-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.2.tgz", - "integrity": "sha512-UQjrkIdWrKI626Du8lCQ6MJp/6V1LAo2bOK9OTu4mSn8GGXIkPXk/Vsp4bLHCd9Z9Iz2OTEaokUE90VweJgIYQ==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-x64-musl": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.2.tgz", - "integrity": "sha512-bTsRGj6VlSdn/XD4CGyzMnzaBs9bsRxy79eTqTCBsA8TMIEky7qg48aPkvJvFe1HyzQ5oMZdg7AnVlWQSKLTnw==", - "dev": true, - "optional": true - }, - "@rollup/rollup-openbsd-x64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.2.tgz", - "integrity": "sha512-6d4Z3534xitaA1FcMWP7mQPq5zGwBmGbhphh2DwaA1aNIXUu3KTOfwrWpbwI4/Gr0uANo7NTtaykFyO2hPuFLg==", - "dev": true, - "optional": true - }, - "@rollup/rollup-openharmony-arm64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.2.tgz", - "integrity": "sha512-NetAg5iO2uN7eB8zE5qrZ3CSil+7IJt4WDFLcC75Ymywq1VZVD6qJ6EvNLjZ3rEm6gB7XW5JdT60c6MN35Z85Q==", - "dev": true, - "optional": true - }, - "@rollup/rollup-win32-arm64-msvc": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.2.tgz", - "integrity": "sha512-NCYhOotpgWZ5kdxCZsv6Iudx0wX8980Q/oW4pNFNihpBKsDbEA1zpkfxJGC0yugsUuyDZ7gL37dbzwhR0VI7pQ==", - "dev": true, - "optional": true - }, - "@rollup/rollup-win32-ia32-msvc": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.2.tgz", - "integrity": "sha512-RXsaOqXxfoUBQoOgvmmijVxJnW2IGB0eoMO7F8FAjaj0UTywUO/luSqimWBJn04WNgUkeNhh7fs7pESXajWmkg==", - "dev": true, - "optional": true - }, - "@rollup/rollup-win32-x64-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.2.tgz", - "integrity": "sha512-qdAzEULD+/hzObedtmV6iBpdL5TIbKVztGiK7O3/KYSf+HIzU257+MX1EXJcyIiDbMAqmbwaufcYPvyRryeZtA==", - "dev": true, - "optional": true - }, - "@rollup/rollup-win32-x64-msvc": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.2.tgz", - "integrity": "sha512-Nd/SgG27WoA9e+/TdK74KnHz852TLa94ovOYySo/yMPuTmpckK/jIF2jSwS3g7ELSKXK13/cVdmg1Z/DaCWKxA==", - "dev": true, - "optional": true - }, - "@rtsao/scc": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", - "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", - "dev": true - }, - "@rviscomi/capo.js": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@rviscomi/capo.js/-/capo.js-2.1.0.tgz", - "integrity": "sha512-y6J+KJqsrY8AcDswLKkvd8KdpFindjS4Q9rSuK8CIpsQOepEjgRaMR4S8OtuLOQoVYLCROT3ffMQqRWrUMQdQA==", - "dev": true - }, - "@schematics/angular": { - "version": "21.2.14", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-21.2.14.tgz", - "integrity": "sha512-rIEdtNTdCCTwuo7B4tMoq5qmbLXdBgmW6Ays1hyno//4OE+HFtvlWZd+hl6KceEyN00IcZ2HRaPnfd71E1JnoA==", - "requires": { - "@angular-devkit/core": "21.2.14", - "@angular-devkit/schematics": "21.2.14", - "jsonc-parser": "3.3.1" - } - }, - "@shikijs/types": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-4.1.0.tgz", - "integrity": "sha512-3EQWX54fMpniOrDblzAhiwiJwpiTMW6+B9DWyUd9ska483tbayFYuw47UxwuPknI31bKnySfVQ/QW+jFL4rFdA==", - "requires": { - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4" - } - }, - "@shikijs/vscode-textmate": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", - "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==" - }, - "@sigstore/bundle": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-4.0.0.tgz", - "integrity": "sha512-NwCl5Y0V6Di0NexvkTqdoVfmjTaQwoLM236r89KEojGmq/jMls8S+zb7yOwAPdXvbwfKDlP+lmXgAL4vKSQT+A==", - "requires": { - "@sigstore/protobuf-specs": "^0.5.0" - } - }, - "@sigstore/core": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-3.2.0.tgz", - "integrity": "sha512-kxHrDQ9YgfrWUSXU0cjsQGv8JykOFZQ9ErNKbFPWzk3Hgpwu8x2hHrQ9IdA8yl+j9RTLTC3sAF3Tdq1IQCP4oA==" - }, - "@sigstore/protobuf-specs": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.5.1.tgz", - "integrity": "sha512-/ScWUhhoFasJsSRGTVBwId1loQjjnjAfE4djL6ZhrXRpNCmPTnUKF5Jokd58ILseOMjzET3UrMOtJPS9sYeI0g==" - }, - "@sigstore/sign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-4.1.1.tgz", - "integrity": "sha512-Hf4xglukg0XXQ2RiD5vSoLjdPe8OBUPA8XeVjUObheuDcWdYWrnH/BNmxZCzkAy68MzmNCxXLeurJvs6hcP2OQ==", - "requires": { - "@gar/promise-retry": "^1.0.2", - "@sigstore/bundle": "^4.0.0", - "@sigstore/core": "^3.2.0", - "@sigstore/protobuf-specs": "^0.5.0", - "make-fetch-happen": "^15.0.4", - "proc-log": "^6.1.0" - } - }, - "@sigstore/tuf": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-4.0.2.tgz", - "integrity": "sha512-TCAzTy0xzdP79EnxSjq9KQ3eaR7+FmudLC6eRKknVKZbV7ZNlGLClAAQb/HMNJ5n2OBNk2GT1tEmU0xuPr+SLQ==", - "requires": { - "@sigstore/protobuf-specs": "^0.5.0", - "tuf-js": "^4.1.0" - } - }, - "@sigstore/verify": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-3.1.0.tgz", - "integrity": "sha512-mNe0Iigql08YupSOGv197YdHpPPr+EzDZmfCgMc7RPNaZTw5aLN01nBl6CHJOh3BGtnMIj83EeN4butBchc8Ag==", - "requires": { - "@sigstore/bundle": "^4.0.0", - "@sigstore/core": "^3.1.0", - "@sigstore/protobuf-specs": "^0.5.0" - } - }, - "@standard-schema/spec": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", - "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==" - }, - "@stimulus-components/auto-submit": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@stimulus-components/auto-submit/-/auto-submit-6.0.0.tgz", - "integrity": "sha512-GBwjjnNuDZey9kdJinTGyrkIMCNVnPrTQvqihC0pBiwieIMfZIp+TT7Giee0Z0DS+pX6WdJweIeo8xEYD/VZJg==" - }, - "@stimulus-components/reveal": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@stimulus-components/reveal/-/reveal-5.0.0.tgz", - "integrity": "sha512-0ShvvDiG4qNLyFUTDrjGiR9MWR6D9EiAJRUSKxTPHA5Cc2Ci/A4Qj7cHDCoK2ZGHhpESfK0LsR9xtySCN6FTQw==" - }, - "@stylistic/eslint-plugin": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-5.10.0.tgz", - "integrity": "sha512-nPK52ZHvot8Ju/0A4ucSX1dcPV2/1clx0kLcH5wDmrE4naKso7TUC/voUyU1O9OTKTrR6MYip6LP0ogEMQ9jPQ==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/types": "^8.56.0", - "eslint-visitor-keys": "^4.2.1", - "espree": "^10.4.0", - "estraverse": "^5.3.0", - "picomatch": "^4.0.3" - }, - "dependencies": { - "@typescript-eslint/types": { - "version": "8.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.61.0.tgz", - "integrity": "sha512-9QTQpZ5Iin4CdIodfbDQFSeiSJKidgYJYug1P9CC2xWgUTvlmixViqDZNciMjwLBZyJnG4tGmPl97rVAFb1AJg==", - "dev": true - }, - "eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true - }, - "picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true - } - } - }, - "@tanstack/react-store": { - "version": "0.7.7", - "resolved": "https://registry.npmjs.org/@tanstack/react-store/-/react-store-0.7.7.tgz", - "integrity": "sha512-qqT0ufegFRDGSof9D/VqaZgjNgp4tRPHZIJq2+QIHkMUtHjaJ0lYrrXjeIUJvjnTbgPfSD1XgOMEt0lmANn6Zg==", - "requires": { - "@tanstack/store": "0.7.7", - "use-sync-external-store": "^1.5.0" - } - }, - "@tanstack/store": { - "version": "0.7.7", - "resolved": "https://registry.npmjs.org/@tanstack/store/-/store-0.7.7.tgz", - "integrity": "sha512-xa6pTan1bcaqYDS9BDpSiS63qa6EoDkPN9RsRaxHuDdVDNntzq3xNwR5YKTU/V3SkSyC9T4YVOPh2zRQN0nhIQ==" - }, - "@testing-library/dom": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz", - "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^5.0.1", - "aria-query": "5.3.0", - "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.5.0", - "picocolors": "1.1.1", - "pretty-format": "^27.0.2" - }, - "dependencies": { - "aria-query": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", - "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", - "dev": true, - "requires": { - "dequal": "^2.0.3" - } - } - } - }, - "@testing-library/jest-dom": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.9.1.tgz", - "integrity": "sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==", - "dev": true, - "requires": { - "@adobe/css-tools": "^4.4.0", - "aria-query": "^5.0.0", - "css.escape": "^1.5.1", - "dom-accessibility-api": "^0.6.3", - "picocolors": "^1.1.1", - "redent": "^3.0.0" - }, - "dependencies": { - "dom-accessibility-api": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", - "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", - "dev": true - } - } - }, - "@testing-library/react": { - "version": "16.3.2", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.3.2.tgz", - "integrity": "sha512-XU5/SytQM+ykqMnAnvB2umaJNIOsLF3PVv//1Ew4CTcpz0/BRyy/af40qqrt7SjKpDdT1saBMc42CUok5gaw+g==", - "dev": true, - "requires": { - "@babel/runtime": "^7.12.5" - } - }, - "@tiptap/core": { - "version": "3.24.0", - "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-3.24.0.tgz", - "integrity": "sha512-GTAsXAI32p4hEZgPzvUv2RPrObxamy9AFhmhG10fXSvN/cDUs8naEYVIqDV3Sh99jMwQEbTFKW1E1mcspsY6ow==" - }, - "@tiptap/extension-bold": { - "version": "3.24.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-3.24.0.tgz", - "integrity": "sha512-CujogYaynasklFKHADUseuvj8X2FnWktTCCo3Hl+nlyRvBTmm5TK2aqiamg3v2P4dBh3O6a70mo8BfRJPuiR1g==" - }, - "@tiptap/extension-bubble-menu": { - "version": "3.24.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-bubble-menu/-/extension-bubble-menu-3.24.0.tgz", - "integrity": "sha512-jRXD+JPu9ayvq78g8hsCxx4q/qUFtrdfIYirRSf5YUseuuUbtfrq83AsGabcygpUTefjJkMQoXNITkh6294Ggw==", - "optional": true, - "requires": { - "@floating-ui/dom": "^1.0.0" - } - }, - "@tiptap/extension-code": { - "version": "3.24.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-code/-/extension-code-3.24.0.tgz", - "integrity": "sha512-MAQtrPRQ+HRmcGotWbksdIGeH1gqayFAdvi4lNGeFT7taHXP1o1XD7CQp7iYIKmg8IU4/MQ+RdetSfuC1A9edQ==" - }, - "@tiptap/extension-floating-menu": { - "version": "3.24.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-floating-menu/-/extension-floating-menu-3.24.0.tgz", - "integrity": "sha512-7QEbf3mUzFAkejjQGX9f0L507oMtnOBRwHt2skUTR+9yXgudsN8zaDBSSRHLeMWGk9b7L293ZMA6zCRrZaHrfA==", - "optional": true - }, - "@tiptap/extension-horizontal-rule": { - "version": "3.24.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-3.24.0.tgz", - "integrity": "sha512-DFzWJTrb23x+qssLLs85vEyho8ItUGp3RY9XUsVTIAGZn5IsoUw8wMsvIBlH1ux4Ch7gLchtcD6kpTdMdrL9kw==" - }, - "@tiptap/extension-italic": { - "version": "3.24.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-3.24.0.tgz", - "integrity": "sha512-mf3cbNlbMPUNj3IyUkIke+o3ZpOUrtVeY5Yqs5IM/VhkUUh/PdIzqw74VuqEAJ0Z4oZ6nNDHeYLrl3Be1j99lQ==" - }, - "@tiptap/extension-paragraph": { - "version": "3.24.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-3.24.0.tgz", - "integrity": "sha512-wD06aB6hO7LgcrlhGiw7I64k2tus9kNoICX5R+UecBSB1DVJdzKvXoXL2kPNv4DqYvljHdkIeK/OpuOTQd6MJA==" - }, - "@tiptap/extension-strike": { - "version": "3.24.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-3.24.0.tgz", - "integrity": "sha512-sfN1iQs6Fdlorrfe8wipDkTPwu/Egx3s2fkY7TAWusTGFHwlovuRUGFKqCL9dI4N3u6uqUMpEuWmQNgv+aQGjQ==" - }, - "@tiptap/extension-text": { - "version": "3.24.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-3.24.0.tgz", - "integrity": "sha512-Im7keLPEihxm3+LyF+drYCoaOY5hlq35lvHAp/el6M8pJ/scts88HrYpdR1Yc4BtpZBIhfHSyWgPaupI4qwdeg==" - }, - "@tiptap/extension-underline": { - "version": "3.24.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-underline/-/extension-underline-3.24.0.tgz", - "integrity": "sha512-D4W4X3UMq9dLVIOfPB9+UodQ4eAJ8yDcm8qFWAwq0a15YWH6bnwulCuIdV+U5dEG+yaRxN8haB9GrrID9jmrSA==" - }, - "@tiptap/extensions": { - "version": "3.26.0", - "resolved": "https://registry.npmjs.org/@tiptap/extensions/-/extensions-3.26.0.tgz", - "integrity": "sha512-4wajuqnO2X0+LVvsBjW/xk3/tmdb16bNL939QhicAay4YYqXITeV2v3XJsryzmG4L5GkK1yLxvRGk4aLoxWrnA==" - }, - "@tiptap/pm": { - "version": "3.24.0", - "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-3.24.0.tgz", - "integrity": "sha512-QQP/78ryOZDN99gNBV7dgh69/8AYaOYQYFklq/iR+ZRFaaL3+qqHFvPVJapGkzPdymBgNJ34xjFM8n5pJ4QmMg==", - "requires": { - "prosemirror-changeset": "^2.3.0", - "prosemirror-commands": "^1.6.2", - "prosemirror-dropcursor": "^1.8.1", - "prosemirror-gapcursor": "^1.3.2", - "prosemirror-history": "^1.4.1", - "prosemirror-inputrules": "^1.4.0", - "prosemirror-keymap": "^1.2.2", - "prosemirror-model": "^1.24.1", - "prosemirror-schema-list": "^1.5.0", - "prosemirror-state": "^1.4.3", - "prosemirror-tables": "^1.6.4", - "prosemirror-transform": "^1.10.2", - "prosemirror-view": "^1.38.1" - } - }, - "@tiptap/react": { - "version": "3.24.0", - "resolved": "https://registry.npmjs.org/@tiptap/react/-/react-3.24.0.tgz", - "integrity": "sha512-KxnrlQbzOgA02EMsfuGGHtNhfkJQGqVlQttmQctI9DOl/F3gcaRqg+wNTBY1Fof8yDaZ8Z1LL1F0C05W0o3vUw==", - "requires": { - "@tiptap/extension-bubble-menu": "^3.24.0", - "@tiptap/extension-floating-menu": "^3.24.0", - "@types/use-sync-external-store": "^0.0.6", - "fast-equals": "^5.3.3", - "use-sync-external-store": "^1.4.0" - } - }, - "@tsconfig/node10": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", - "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", - "dev": true - }, - "@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true - }, - "@tufjs/canonical-json": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz", - "integrity": "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==" - }, - "@tufjs/models": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-4.1.0.tgz", - "integrity": "sha512-Y8cK9aggNRsqJVaKUlEYs4s7CvQ1b1ta2DVPyAimb0I2qhzjNk+A+mxvll/klL0RlfuIUei8BF7YWiua4kQqww==", - "requires": { - "@tufjs/canonical-json": "2.0.0", - "minimatch": "^10.1.1" - }, - "dependencies": { - "balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==" - }, - "brace-expansion": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", - "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", - "requires": { - "balanced-match": "^4.0.2" - } - }, - "minimatch": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", - "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", - "requires": { - "brace-expansion": "^5.0.5" - } - } - } - }, - "@tybys/wasm-util": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", - "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", - "dev": true, - "optional": true, - "requires": { - "tslib": "^2.4.0" - } - }, - "@types/aria-query": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", - "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", - "dev": true - }, - "@types/body-parser": { - "version": "1.19.6", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", - "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", - "dev": true, - "requires": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "@types/bonjour": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", - "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/chai": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", - "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", - "dev": true, - "requires": { - "@types/deep-eql": "*", - "assertion-error": "^2.0.1" - } - }, - "@types/codemirror": { - "version": "5.60.17", - "resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-5.60.17.tgz", - "integrity": "sha512-AZq2FIsUHVMlp7VSe2hTfl5w4pcUkoFkM3zVsRKsn1ca8CXRDYvnin04+HP2REkwsxemuHqvDofdlhUWNpbwfw==", - "dev": true, - "requires": { - "@types/tern": "*" - } - }, - "@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/connect-history-api-fallback": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", - "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", - "dev": true, - "requires": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, - "@types/css-tree": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/@types/css-tree/-/css-tree-2.3.11.tgz", - "integrity": "sha512-aEokibJOI77uIlqoBOkVbaQGC9zII0A+JH1kcTNKW2CwyYWD8KM6qdo+4c77wD3wZOQfJuNWAr9M4hdk+YhDIg==", - "dev": true - }, - "@types/deep-eql": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", - "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", - "dev": true - }, - "@types/dom-navigation": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@types/dom-navigation/-/dom-navigation-1.0.7.tgz", - "integrity": "sha512-Di4W+i2faYquHUnyWUg3bBQp5pTNvjDDA7mIYfD/1WlLgan6sKkeVjGbdL78K0CuNEk5Pfc/c0rfelwkz10mnQ==", - "dev": true - }, - "@types/dragula": { - "version": "3.7.5", - "resolved": "https://registry.npmjs.org/@types/dragula/-/dragula-3.7.5.tgz", - "integrity": "sha512-jojr2JVJB8DawAKXApGnollMvVOMyiMKpchH8gLeoExx35Eq0BQ4WgAiAHoBoEn7h/9eDrIl0yz//cM6ALIJbg==", - "dev": true - }, - "@types/eslint": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", - "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", - "dev": true, - "requires": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "dev": true, - "requires": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "@types/esrecurse": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", - "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==", - "dev": true - }, - "@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true - }, - "@types/express": { - "version": "4.17.25", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz", - "integrity": "sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==", - "dev": true, - "requires": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "^1" - } - }, - "@types/express-serve-static-core": { - "version": "4.19.8", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.8.tgz", - "integrity": "sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA==", - "dev": true, - "requires": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "@types/flot": { - "version": "0.0.36", - "resolved": "https://registry.npmjs.org/@types/flot/-/flot-0.0.36.tgz", - "integrity": "sha512-xRo4MUIMnRPGXJCuQXAWvo+uKRmziRGHAy9LQHsLgbKanknpe5z3EThqVuYkVCC6ZWPZ/8pllBXnzQmGzFkJ/Q==", - "dev": true, - "requires": { - "@types/jquery": "*" - } - }, - "@types/geojson": { - "version": "7946.0.16", - "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", - "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==" - }, - "@types/hammerjs": { - "version": "2.0.46", - "resolved": "https://registry.npmjs.org/@types/hammerjs/-/hammerjs-2.0.46.tgz", - "integrity": "sha512-ynRvcq6wvqexJ9brDMS4BnBLzmr0e14d6ZJTEShTBWKymQiHwlAyGu0ZPEFI2Fh1U53F7tN9ufClWM5KvqkKOw==", - "dev": true - }, - "@types/hast": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", - "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", - "requires": { - "@types/unist": "*" - } - }, - "@types/hotwired__turbo": { - "version": "8.0.10", - "resolved": "https://registry.npmjs.org/@types/hotwired__turbo/-/hotwired__turbo-8.0.10.tgz", - "integrity": "sha512-ZnNDmfE2mwvbpmq55ntbTwP82Y4U+g3lcGMTWvS+Vo5LEuO6YQrWVhCmrTae3IH19/nNcHvzbNuroNWEwRylFg==", - "dev": true - }, - "@types/http-errors": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", - "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", - "dev": true - }, - "@types/http-proxy": { - "version": "1.17.16", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.16.tgz", - "integrity": "sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/jquery": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-4.0.1.tgz", - "integrity": "sha512-9a59A/tycXgYuPABcp6/3spSShn0NT2UOM4EfHvMumjYi4lJWTsK5SZWjhx3yRm9IHGCeWXdV2YfNsrWrft/CA==", - "dev": true - }, - "@types/jquery-migrate": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@types/jquery-migrate/-/jquery-migrate-3.3.3.tgz", - "integrity": "sha512-0CRPTHKGaK831+bxIbRerQpyLHwkNr/vSYZD5JAYpWw/TL2RUGiyWdwR8dAoGC4MpoyH5S+ato3+SyQDBmrZNQ==", - "dev": true, - "requires": { - "@types/jquery": "*" - } - }, - "@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" - }, - "@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true - }, - "@types/lodash": { - "version": "4.17.24", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.24.tgz", - "integrity": "sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ==", - "dev": true - }, - "@types/mime": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", - "dev": true - }, - "@types/mousetrap": { - "version": "1.6.15", - "resolved": "https://registry.npmjs.org/@types/mousetrap/-/mousetrap-1.6.15.tgz", - "integrity": "sha512-qL0hyIMNPow317QWW/63RvL1x5MVMV+Ru3NaY9f/CuEpCqrmb7WeuK2071ZY5hczOnm38qExWM2i2WtkXLSqFw==", - "dev": true - }, - "@types/node": { - "version": "14.18.63", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.63.tgz", - "integrity": "sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==", - "dev": true - }, - "@types/pako": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/pako/-/pako-2.0.4.tgz", - "integrity": "sha512-VWDCbrLeVXJM9fihYodcLiIv0ku+AlOa/TQ1SvYOaBuyrSKgEcro95LJyIsJ4vSo6BXIxOKxiJAat04CmST9Fw==", - "dev": true - }, - "@types/qs": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.15.0.tgz", - "integrity": "sha512-JawvT8iBVWpzTrz3EGw9BTQFg3BQNmwERdKE22vlTxawwtbyUSlMppvZYKLZzB5zgACXdXxbD3m1bXaMqP/9ow==", - "dev": true - }, - "@types/rails__request.js": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/@types/rails__request.js/-/rails__request.js-0.0.1.tgz", - "integrity": "sha512-s9KX0falKcyDO2SjER/3HSfcJ8MAm+V05hxW1jJd/Rt+X7QeSSf9g6d2EZ6/uLJiDnXAqc+WPlxT1oYswV2T9A==", - "dev": true - }, - "@types/range-parser": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", - "dev": true - }, - "@types/react": { - "version": "19.2.17", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.17.tgz", - "integrity": "sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==", - "dev": true, - "requires": { - "csstype": "^3.2.2" - }, - "dependencies": { - "csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "dev": true - } - } - }, - "@types/react-dom": { - "version": "19.2.3", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", - "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", - "dev": true - }, - "@types/resize-observer-browser": { - "version": "0.1.11", - "resolved": "https://registry.npmjs.org/@types/resize-observer-browser/-/resize-observer-browser-0.1.11.tgz", - "integrity": "sha512-cNw5iH8JkMkb3QkCoe7DaZiawbDQEUX8t7iuQaRTyLOyQCR2h+ibBD4GJt7p5yhUHrlOeL7ZtbxNHeipqNsBzQ==", - "dev": true - }, - "@types/retry": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", - "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", - "dev": true - }, - "@types/send": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", - "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/serve-index": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", - "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", - "dev": true, - "requires": { - "@types/express": "*" - } - }, - "@types/serve-static": { - "version": "1.15.10", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.10.tgz", - "integrity": "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==", - "dev": true, - "requires": { - "@types/http-errors": "*", - "@types/node": "*", - "@types/send": "<1" - }, - "dependencies": { - "@types/send": { - "version": "0.17.6", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.6.tgz", - "integrity": "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==", - "dev": true, - "requires": { - "@types/mime": "^1", - "@types/node": "*" - } - } - } - }, - "@types/sockjs": { - "version": "0.3.36", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", - "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/stylis": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@types/stylis/-/stylis-4.2.5.tgz", - "integrity": "sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw==" - }, - "@types/tern": { - "version": "0.23.4", - "resolved": "https://registry.npmjs.org/@types/tern/-/tern-0.23.4.tgz", - "integrity": "sha512-JAUw1iXGO1qaWwEOzxTKJZ/5JxVeON9kvGZ/osgZaJImBnyjyn0cjovPsf6FNLmyGY8Vw9DoXZCMlfMkMwHRWg==", - "dev": true, - "requires": { - "@types/estree": "*" - } - }, - "@types/trusted-types": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", - "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==" - }, - "@types/unist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", - "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==" - }, - "@types/urijs": { - "version": "1.19.26", - "resolved": "https://registry.npmjs.org/@types/urijs/-/urijs-1.19.26.tgz", - "integrity": "sha512-wkXrVzX5yoqLnndOwFsieJA7oKM8cNkOKJtf/3vVGSUFkWDKZvFHpIl9Pvqb/T9UsawBBFMTTD8xu7sK5MWuvg==", - "dev": true - }, - "@types/use-sync-external-store": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz", - "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==" - }, - "@types/uuid": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-11.0.0.tgz", - "integrity": "sha512-HVyk8nj2m+jcFRNazzqyVKiZezyhDKrGUA3jlEcg/nZ6Ms+qHwocba1Y/AaVaznJTAM9xpdFSh+ptbNrhOGvZA==", - "dev": true, - "requires": { - "uuid": "*" - } - }, - "@types/webpack-env": { - "version": "1.18.8", - "resolved": "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.18.8.tgz", - "integrity": "sha512-G9eAoJRMLjcvN4I08wB5I7YofOb/kaJNd5uoCMX+LbKXTPCF+ZIHuqTnFaK9Jz1rgs035f9JUPUhNFtqgucy/A==", - "dev": true - }, - "@types/ws": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@typescript-eslint/eslint-plugin": { - "version": "8.59.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.4.tgz", - "integrity": "sha512-PegsU+XfyJJNjd4+u/k6f9yTyp0lEXXiPopUNobZcIAUJFGICFLN+sP0Rb3JehVmiij1Ph0dFGYqODoRo/2+6A==", - "dev": true, - "requires": { - "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.59.4", - "@typescript-eslint/type-utils": "8.59.4", - "@typescript-eslint/utils": "8.59.4", - "@typescript-eslint/visitor-keys": "8.59.4", - "ignore": "^7.0.5", - "natural-compare": "^1.4.0", - "ts-api-utils": "^2.5.0" - }, - "dependencies": { - "@typescript-eslint/utils": { - "version": "8.59.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.4.tgz", - "integrity": "sha512-cYXeNAUsG4lJo5dbc1FcKm+JwIWrj1/UpTORsC6tGMjEZ81DYcvIr9/ueikhMa/Y/gDQYGp+YX9/xQrXje5BJw==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.59.4", - "@typescript-eslint/types": "8.59.4", - "@typescript-eslint/typescript-estree": "8.59.4" - } - }, - "ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", - "dev": true - } - } - }, - "@typescript-eslint/parser": { - "version": "8.59.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.4.tgz", - "integrity": "sha512-zORHqO/tuhxY1zWuTvMUqddRxpiFJ72xVfcNoWpqdLjs6lfPbuQBJuW4pk+49/uBMy7Ssr4bzgjiKmmDB1UbZQ==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "8.59.4", - "@typescript-eslint/types": "8.59.4", - "@typescript-eslint/typescript-estree": "8.59.4", - "@typescript-eslint/visitor-keys": "8.59.4", - "debug": "^4.4.3" - } - }, - "@typescript-eslint/project-service": { - "version": "8.59.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.4.tgz", - "integrity": "sha512-Ly00Vu4oAacfDeHp2Zg85ioNG6l8HG+tN1D7J+xTHSxu9y0awYKJ2zH1rFBn8ZSfuGK+7FxK3Cgl3uAz0aZZLg==", - "dev": true, - "requires": { - "@typescript-eslint/tsconfig-utils": "^8.59.4", - "@typescript-eslint/types": "^8.59.4", - "debug": "^4.4.3" - } - }, - "@typescript-eslint/scope-manager": { - "version": "8.59.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.4.tgz", - "integrity": "sha512-mUeR/3H1WrTAddJrwut8OoPjfauaztMQmRwV5fQTUyNVJCLiUXXe4lGEyYIL2oFDpP7UtgbGJXCt72wT0z2S3Q==", - "dev": true, - "requires": { - "@typescript-eslint/types": "8.59.4", - "@typescript-eslint/visitor-keys": "8.59.4" - } - }, - "@typescript-eslint/tsconfig-utils": { - "version": "8.59.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.4.tgz", - "integrity": "sha512-DLCpnKgD4alVxTBSKulK+gU1KCqOgUXfDRDXh2mZgzokQKa/70ax93I2uVO3m/LLvIAtWZIFoiifudmIqAxpMA==", - "dev": true - }, - "@typescript-eslint/type-utils": { - "version": "8.59.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.4.tgz", - "integrity": "sha512-uonTuPAAKr9XaBGqJ3LjYTh72zy5DyGesljO9gtmk/eFW0W1fRHjnwVYKB35Lm8d5Q5CluEW3gPHjTvZTmgrfA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "8.59.4", - "@typescript-eslint/typescript-estree": "8.59.4", - "@typescript-eslint/utils": "8.59.4", - "debug": "^4.4.3", - "ts-api-utils": "^2.5.0" - }, - "dependencies": { - "@typescript-eslint/utils": { - "version": "8.59.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.4.tgz", - "integrity": "sha512-cYXeNAUsG4lJo5dbc1FcKm+JwIWrj1/UpTORsC6tGMjEZ81DYcvIr9/ueikhMa/Y/gDQYGp+YX9/xQrXje5BJw==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.59.4", - "@typescript-eslint/types": "8.59.4", - "@typescript-eslint/typescript-estree": "8.59.4" - } - } - } - }, - "@typescript-eslint/types": { - "version": "8.59.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.4.tgz", - "integrity": "sha512-F1o7WJcCq+bc8dwcO/YsSEOudAH8RDtaOhM6wcAQhcUsFhnWQl81JKy48q1hoxAU0qrzM89+31GYh1515Zde3Q==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "8.59.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.4.tgz", - "integrity": "sha512-F+RuOmcDXo4+TPdfd/TCLS3m2nw8gE9XXyZLrA3JBfaA5tz9TtdkyD3YJFmPxulyc2cKbEok/CvFE3MgSLWnag==", - "dev": true, - "requires": { - "@typescript-eslint/project-service": "8.59.4", - "@typescript-eslint/tsconfig-utils": "8.59.4", - "@typescript-eslint/types": "8.59.4", - "@typescript-eslint/visitor-keys": "8.59.4", - "debug": "^4.4.3", - "minimatch": "^10.2.2", - "semver": "^7.7.3", - "tinyglobby": "^0.2.15", - "ts-api-utils": "^2.5.0" - }, - "dependencies": { - "balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "dev": true - }, - "brace-expansion": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", - "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", - "dev": true, - "requires": { - "balanced-match": "^4.0.2" - } - }, - "minimatch": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", - "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", - "dev": true, - "requires": { - "brace-expansion": "^5.0.5" - } - } - } - }, - "@typescript-eslint/utils": { - "version": "8.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.61.0.tgz", - "integrity": "sha512-3bzFt7ImFMW/jVYwJamDoe/dMOdFLSC6pom6rRjdh4SZJEYupyMzem8e7vKZLclLfpHjlwSAXOUxtKxGXUiLqA==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.61.0", - "@typescript-eslint/types": "8.61.0", - "@typescript-eslint/typescript-estree": "8.61.0" - }, - "dependencies": { - "@typescript-eslint/project-service": { - "version": "8.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.61.0.tgz", - "integrity": "sha512-DV42F7MLJO6Rax7SK1yg43tcnEfGUrurSpSxKuVX+a3RCTzBlH3fuxprrOJXKCJGAaw82xXocikJ0uQaqwXgGA==", - "dev": true, - "requires": { - "@typescript-eslint/tsconfig-utils": "^8.61.0", - "@typescript-eslint/types": "^8.61.0", - "debug": "^4.4.3" - } - }, - "@typescript-eslint/scope-manager": { - "version": "8.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.61.0.tgz", - "integrity": "sha512-IWdXFHFSb6mlC3HPc7QsLDm5zYEbUla6trDEHf32D3/dnuUyXd87plScSNXSbm0/RxMvObpI17sv/EDTGrGZkA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "8.61.0", - "@typescript-eslint/visitor-keys": "8.61.0" - } - }, - "@typescript-eslint/tsconfig-utils": { - "version": "8.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.61.0.tgz", - "integrity": "sha512-O5Amvdv9ztMpxpf+vmFULGG78IE6Qwdr3bCGvqwG4nwc9H2qXkOYJJnRbRHyMkQTjv1d03olqwwwzHLMqpFePQ==", - "dev": true - }, - "@typescript-eslint/types": { - "version": "8.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.61.0.tgz", - "integrity": "sha512-9QTQpZ5Iin4CdIodfbDQFSeiSJKidgYJYug1P9CC2xWgUTvlmixViqDZNciMjwLBZyJnG4tGmPl97rVAFb1AJg==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "8.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.61.0.tgz", - "integrity": "sha512-42zatd5qSvvcV1JdDBCLxYRznvP4eIHpPoZXdkPFnAmanA4FuZ5dibSnCBggY8hQnqajPpoGjXFdZ7fIJKQnlA==", - "dev": true, - "requires": { - "@typescript-eslint/project-service": "8.61.0", - "@typescript-eslint/tsconfig-utils": "8.61.0", - "@typescript-eslint/types": "8.61.0", - "@typescript-eslint/visitor-keys": "8.61.0", - "debug": "^4.4.3", - "minimatch": "^10.2.2", - "semver": "^7.7.3", - "tinyglobby": "^0.2.15", - "ts-api-utils": "^2.5.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "8.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.61.0.tgz", - "integrity": "sha512-QVLZu3ZPQEE+HICQyAMZ2yLQhxf0meY/wx6Hx14YcTNj13JB3qHlX3lJ02L3fLGHgERRH71kvYDwiXIguT3AjQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "8.61.0", - "eslint-visitor-keys": "^5.0.0" - } - }, - "balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "dev": true - }, - "brace-expansion": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", - "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", - "dev": true, - "requires": { - "balanced-match": "^4.0.2" - } - }, - "eslint-visitor-keys": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", - "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", - "dev": true - }, - "minimatch": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", - "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", - "dev": true, - "requires": { - "brace-expansion": "^5.0.5" - } - } - } - }, - "@typescript-eslint/visitor-keys": { - "version": "8.59.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.4.tgz", - "integrity": "sha512-U3gxVaDVnuZKhSspW/MzMxE1kq7zOdc072FcSNoqA1I9p8HyKbBFfEHoWckBAMgNMph4MamwS5iTVzFmrnt8TQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "8.59.4", - "eslint-visitor-keys": "^5.0.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", - "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", - "dev": true - } - } - }, - "@uirouter/angular": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@uirouter/angular/-/angular-21.0.0.tgz", - "integrity": "sha512-KUvyNb5lJ293Lzym+UwfgzX7U/5LpOp4nmp8EAzwAOBu/K8A+wZeVTS1NYQAf/ziO+N3nqI0I8+GnXYOzSOtaA==", - "requires": { - "tslib": "^2.3.0" - } - }, - "@uirouter/core": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/@uirouter/core/-/core-6.1.2.tgz", - "integrity": "sha512-pYcg+cxVd9E9poC7AJf7ZrlQQrwAV6KVkiPvlbLJX5km+pBWrUOGQhdd87oIGc7/5iVQ7qSiAdl9QD+l55yegg==" - }, - "@uirouter/rx": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@uirouter/rx/-/rx-1.0.0.tgz", - "integrity": "sha512-dqPmLFC+qqF6RIdJVKktXSON6WILy2oyLhADDk74F3GAUZ/VvOu3QSPLDtZEP3LMSo6vkGQvwcUdjgNVWL3YJA==" - }, - "@vitejs/plugin-basic-ssl": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-2.1.4.tgz", - "integrity": "sha512-HXciTXN/sDBYWgeAD4V4s0DN0g72x5mlxQhHxtYu3Tt8BLa6MzcJZUyDVFCdtjNs3bfENVHVzOsmooTVuNgAAw==", - "dev": true - }, - "@vitest/browser": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.1.8.tgz", - "integrity": "sha512-u21VzX07HzlJYpFgkxmjEXar/tG2UqWGgyGG/46SrrPc7rSdCTPw5vuowopO9CIqF8UCUQzDFdbVnNpw6N0BfQ==", - "dev": true, - "requires": { - "@blazediff/core": "1.9.1", - "@vitest/mocker": "4.1.8", - "@vitest/utils": "4.1.8", - "magic-string": "^0.30.21", - "pngjs": "^7.0.0", - "sirv": "^3.0.2", - "tinyrainbow": "^3.1.0", - "ws": "^8.19.0" - } - }, - "@vitest/browser-playwright": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@vitest/browser-playwright/-/browser-playwright-4.1.8.tgz", - "integrity": "sha512-SR7FqgegaexEg73xvf3ArtygXegagMdXnL0EZMpxrWvvhQxvicD/E8p0ib0J91riPRtQUViyh67Xjw3NqvyhVg==", - "dev": true, - "requires": { - "@vitest/browser": "4.1.8", - "@vitest/mocker": "4.1.8", - "tinyrainbow": "^3.1.0" - } - }, - "@vitest/coverage-v8": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-4.1.8.tgz", - "integrity": "sha512-lt3kovsyHwYe00wq4D1ti0Z974fWj4NLp6siqiyEufUpyFwK9Yhi7rBhac9JL5aA0zoMrJqc4vYPZRUnI7l7nw==", - "dev": true, - "requires": { - "@bcoe/v8-coverage": "^1.0.2", - "@vitest/utils": "4.1.8", - "ast-v8-to-istanbul": "^1.0.0", - "istanbul-lib-coverage": "^3.2.2", - "istanbul-lib-report": "^3.0.1", - "istanbul-reports": "^3.2.0", - "magicast": "^0.5.2", - "obug": "^2.1.1", - "std-env": "^4.0.0-rc.1", - "tinyrainbow": "^3.1.0" - } - }, - "@vitest/eslint-plugin": { - "version": "1.6.19", - "resolved": "https://registry.npmjs.org/@vitest/eslint-plugin/-/eslint-plugin-1.6.19.tgz", - "integrity": "sha512-zodmXRsVKFsuHxHJILuTFaaKsrsxm0YsiOX65clk+LpCW9JrVXaf6ERXr0caDs+NEk0S62Jyk0K7XYQ7gWXheA==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "^8.58.0", - "@typescript-eslint/utils": "^8.58.0" - }, - "dependencies": { - "@typescript-eslint/scope-manager": { - "version": "8.59.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.2.tgz", - "integrity": "sha512-JzfyEpEtOU89CcFSwyNS3mu4MLvLSXqnmX05+aKBDM+TdR5jzcGOEBwxwGNxrEQ7p/z6kK2WyioCGBf2zZBnvg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "8.59.2", - "@typescript-eslint/visitor-keys": "8.59.2" - } - }, - "@typescript-eslint/types": { - "version": "8.59.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.2.tgz", - "integrity": "sha512-e82GVOE8Ps3E++Egvb6Y3Dw0S10u8NkQ9KXmtRhCWJJ8kDhOJTvtMAWnFL16kB1583goCWXsr0NieKCZMs2/0Q==", - "dev": true - }, - "@typescript-eslint/visitor-keys": { - "version": "8.59.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.2.tgz", - "integrity": "sha512-NwjLUnGy8/Zfx23fl50tRC8rYaYnM52xNRYFAXvmiil9yh1+K6aRVQMnzW6gQB/1DLgWt977lYQn7C+wtgXZiA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "8.59.2", - "eslint-visitor-keys": "^5.0.0" - } - }, - "eslint-visitor-keys": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", - "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", - "dev": true - } - } - }, - "@vitest/expect": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.8.tgz", - "integrity": "sha512-h3nDO677RDLEGlBxyQ5CW8RlMThSKSRLUePLOx09gNIWRL40edgA1GCZSZgf1W55MFAG6/Sw14KeaAnqv0NKdQ==", - "dev": true, - "requires": { - "@standard-schema/spec": "^1.1.0", - "@types/chai": "^5.2.2", - "@vitest/spy": "4.1.8", - "@vitest/utils": "4.1.8", - "chai": "^6.2.2", - "tinyrainbow": "^3.1.0" - } - }, - "@vitest/mocker": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.8.tgz", - "integrity": "sha512-LEiN/xe4OSIbKe9HQIp5OC24agGD9J5CnmMgsLohVVoOPWL9a2sBoR6VBx43jQZb7Kr1l4RCuyCJzcAa0+dojw==", - "dev": true, - "requires": { - "@vitest/spy": "4.1.8", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.21" - } - }, - "@vitest/pretty-format": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.8.tgz", - "integrity": "sha512-9GasEBxpZ1VYIpqHf/0+YGg121uSNwCKOJqIrTwWP/TB7DmFCiaBpNl3aPZzoLWfWkuqhbH8vJIVobZkvdo2cA==", - "dev": true, - "requires": { - "tinyrainbow": "^3.1.0" - } - }, - "@vitest/runner": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.8.tgz", - "integrity": "sha512-EmVxeBAfMJvycdjd6Hm+RbFBbA9fKvo0Kx37hNpBYoYeavH3RNsBXWDooR1mgD52dCrxIIuP7UotpfiwOikvcg==", - "dev": true, - "requires": { - "@vitest/utils": "4.1.8", - "pathe": "^2.0.3" - } - }, - "@vitest/snapshot": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.8.tgz", - "integrity": "sha512-acfZboRmAIf05DEKcBQy33VXojFJjtUdLyo7oOmV9kebb2xdU01UknNiPuPZoJZQyO7DF0gZdTGTpeAzET9QPQ==", - "dev": true, - "requires": { - "@vitest/pretty-format": "4.1.8", - "@vitest/utils": "4.1.8", - "magic-string": "^0.30.21", - "pathe": "^2.0.3" - } - }, - "@vitest/spy": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.8.tgz", - "integrity": "sha512-6EevtBp6OZOPF7bmz36HrGMeP3txgVSrgebWxHOafDXGkhIzfXK14f8KF6MuFfgXXUeHxmpD3BQxkV00/3s5mA==", - "dev": true - }, - "@vitest/utils": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.8.tgz", - "integrity": "sha512-uOJamYALNhfJ6iolExyQM40yIQwDqYnkKtQ5VCiSe17E33H0aQ/u+1GlRuz4LZBk6Mm3sg90G9hEbmEt37C1Zg==", - "dev": true, - "requires": { - "@vitest/pretty-format": "4.1.8", - "convert-source-map": "^2.0.0", - "tinyrainbow": "^3.1.0" - }, - "dependencies": { - "convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - } - } - }, - "@vscode/l10n": { - "version": "0.0.18", - "resolved": "https://registry.npmjs.org/@vscode/l10n/-/l10n-0.0.18.tgz", - "integrity": "sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==", - "dev": true - }, - "@w11k/ngx-componentdestroyed": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@w11k/ngx-componentdestroyed/-/ngx-componentdestroyed-5.0.2.tgz", - "integrity": "sha512-njpK7h6hSpF8LQp2bayb47T7rTxOwx7745TOiUP88y8YAT2JOY5OeJpYqlK2WrQQBeD7CT+DxozD6yNBN283dA==", - "requires": { - "rxjs": ">=6.5.0" - } - }, - "@webassemblyjs/ast": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", - "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", - "dev": true, - "requires": { - "@webassemblyjs/helper-numbers": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", - "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", - "dev": true - }, - "@webassemblyjs/helper-api-error": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", - "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", - "dev": true - }, - "@webassemblyjs/helper-buffer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", - "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", - "dev": true - }, - "@webassemblyjs/helper-numbers": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", - "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", - "dev": true, - "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.13.2", - "@webassemblyjs/helper-api-error": "1.13.2", - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", - "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", - "dev": true - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", - "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/wasm-gen": "1.14.1" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", - "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", - "dev": true, - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", - "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", - "dev": true, - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/utf8": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", - "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", - "dev": true - }, - "@webassemblyjs/wasm-edit": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", - "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/helper-wasm-section": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-opt": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1", - "@webassemblyjs/wast-printer": "1.14.1" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", - "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", - "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", - "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-api-error": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", - "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.14.1", - "@xtuc/long": "4.2.2" - } - }, - "@xeokit/xeokit-bim-viewer": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/@xeokit/xeokit-bim-viewer/-/xeokit-bim-viewer-2.7.1.tgz", - "integrity": "sha512-qvlYjYt8EpRmrQqPLQ3/lpmZzpjS8Pfr0zwpHm5mO3fIC7m6Vo7a3nQRHu2JlsSfB88/2ujl59MAj63B/JTFUw==", - "requires": { - "@fortawesome/fontawesome-free": "^6.7.2", - "@xeokit/xeokit-sdk": "^2.6.78", - "http-server": "^13.0.2" - } - }, - "@xeokit/xeokit-sdk": { - "version": "2.6.90", - "resolved": "https://registry.npmjs.org/@xeokit/xeokit-sdk/-/xeokit-sdk-2.6.90.tgz", - "integrity": "sha512-wkZmsWr0fhefrKjlByUs+6j2mizbUQiQJ4nihYwcQrkuECy52e7ntBdpfWVVOXd1eIcV5R2a62AhqR/SjOP0Ww==", - "requires": { - "@loaders.gl/core": "^4.3.3", - "@loaders.gl/gltf": "^4.3.3", - "@loaders.gl/las": "^4.3.3", - "html2canvas": "^1.4.1" - } - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "@yarnpkg/lockfile": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", - "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==" - }, - "abbrev": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-4.0.0.tgz", - "integrity": "sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA==" - }, - "accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, - "requires": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - } - }, - "acorn": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", - "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", - "dev": true - }, - "acorn-import-phases": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", - "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", - "dev": true - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true - }, - "acorn-walk": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", - "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", - "dev": true - }, - "adjust-sourcemap-loader": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", - "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", - "dev": true, - "requires": { - "loader-utils": "^2.0.0", - "regex-parser": "^2.2.11" - }, - "dependencies": { - "loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - } - } - }, - "agent-base": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", - "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==" - }, - "ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "requires": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - } - }, - "ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "requires": { - "ajv": "^8.0.0" - } - }, - "algoliasearch": { - "version": "5.48.1", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.48.1.tgz", - "integrity": "sha512-Rf7xmeuIo7nb6S4mp4abW2faW8DauZyE2faBIKFaUfP3wnpOvNSbiI5AwVhqBNj0jPgBWEvhyCu0sLjN2q77Rg==", - "requires": { - "@algolia/abtesting": "1.14.1", - "@algolia/client-abtesting": "5.48.1", - "@algolia/client-analytics": "5.48.1", - "@algolia/client-common": "5.48.1", - "@algolia/client-insights": "5.48.1", - "@algolia/client-personalization": "5.48.1", - "@algolia/client-query-suggestions": "5.48.1", - "@algolia/client-search": "5.48.1", - "@algolia/ingestion": "1.48.1", - "@algolia/monitoring": "1.48.1", - "@algolia/recommend": "5.48.1", - "@algolia/requester-browser-xhr": "5.48.1", - "@algolia/requester-fetch": "5.48.1", - "@algolia/requester-node-http": "5.48.1" - } - }, - "angular-eslint": { - "version": "21.4.0", - "resolved": "https://registry.npmjs.org/angular-eslint/-/angular-eslint-21.4.0.tgz", - "integrity": "sha512-LH7bWmtJvsubzwPoztnl1pWgI5X0VrfGTUITGSYcwn2J+SXuN/avzrKrxJmhUiIrNvLtfV+18GG6xZS1IGZdKg==", - "dev": true, - "requires": { - "@angular-devkit/core": ">= 21.0.0 < 22.0.0", - "@angular-devkit/schematics": ">= 21.0.0 < 22.0.0", - "@angular-eslint/builder": "21.4.0", - "@angular-eslint/eslint-plugin": "21.4.0", - "@angular-eslint/eslint-plugin-template": "21.4.0", - "@angular-eslint/schematics": "21.4.0", - "@angular-eslint/template-parser": "21.4.0", - "@typescript-eslint/types": "^8.0.0", - "@typescript-eslint/utils": "^8.0.0" - } - }, - "animation-frame-polyfill": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/animation-frame-polyfill/-/animation-frame-polyfill-1.0.2.tgz", - "integrity": "sha512-PvO5poSMoHhaoNNgHPo+oqs/0L9UqjsUbqv0iOXVqLh6HX85fsOVQTUrzSBvjdZz7hydARlgLELyzJJKIrPJAQ==" - }, - "ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true - }, - "ansi-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", - "dev": true - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "aria-query": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", - "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", - "dev": true - }, - "array-buffer-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", - "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", - "dev": true, - "requires": { - "call-bound": "^1.0.3", - "is-array-buffer": "^3.0.5" - } - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true - }, - "array-from": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", - "integrity": "sha512-GQTc6Uupx1FCavi5mPzBvVT7nEOeWMmUA9P95wpfpW1XwMSKs+KaymD5C2Up7KAUKg/mYwbsUYzdZWcoajlNZg==" - }, - "array-includes": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", - "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.24.0", - "es-object-atoms": "^1.1.1", - "get-intrinsic": "^1.3.0", - "is-string": "^1.1.1", - "math-intrinsics": "^1.1.0" - } - }, - "array.prototype.findlast": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", - "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" - } - }, - "array.prototype.findlastindex": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", - "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "es-shim-unscopables": "^1.1.0" - } - }, - "array.prototype.flat": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", - "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", - "dev": true, - "requires": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-shim-unscopables": "^1.0.2" - } - }, - "array.prototype.flatmap": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", - "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", - "dev": true, - "requires": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-shim-unscopables": "^1.0.2" - } - }, - "array.prototype.tosorted": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", - "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", - "dev": true, - "requires": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.3", - "es-errors": "^1.3.0", - "es-shim-unscopables": "^1.0.2" - } - }, - "arraybuffer.prototype.slice": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", - "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", - "dev": true, - "requires": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "is-array-buffer": "^3.0.4" - } - }, - "asn1js": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.10.tgz", - "integrity": "sha512-S2s3aOytiKdFRdulw2qPE51MzjzVOisppcVv7jVFR+Kw0kxwvFrDcYA0h7Ndqbmj0HkMIXYWaoj7fli8kgx1eg==", - "dev": true, - "requires": { - "pvtsutils": "^1.3.6", - "pvutils": "^1.1.5", - "tslib": "^2.8.1" - } - }, - "assertion-error": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", - "dev": true - }, - "ast-types-flow": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", - "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", - "dev": true - }, - "ast-v8-to-istanbul": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-1.0.0.tgz", - "integrity": "sha512-1fSfIwuDICFA4LKkCzRPO7F0hzFf0B7+Xqrl27ynQaa+Rh0e1Es0v6kWHPott3lU10AyAr7oKHa65OppjLn3Rg==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.31", - "estree-walker": "^3.0.3", - "js-tokens": "^10.0.0" - }, - "dependencies": { - "js-tokens": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-10.0.0.tgz", - "integrity": "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==", - "dev": true - } - } - }, - "async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "dev": true - }, - "atoa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/atoa/-/atoa-1.0.0.tgz", - "integrity": "sha512-VVE1H6cc4ai+ZXo/CRWoJiHXrA1qfA31DPnx6D20+kSI547hQN5Greh51LQ1baMRMfxO5K5M4ImMtZbZt2DODQ==" - }, - "autoprefixer": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.5.0.tgz", - "integrity": "sha512-FMhOoZV4+qR6aTUALKX2rEqGG+oyATvwBt9IIzVR5rMa2HRWPkxf+P+PAJLD1I/H5/II+HuZcBJYEFBpq39ong==", - "requires": { - "browserslist": "^4.28.2", - "caniuse-lite": "^1.0.30001787", - "fraction.js": "^5.3.4", - "picocolors": "^1.1.1", - "postcss-value-parser": "^4.2.0" - } - }, - "available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dev": true, - "requires": { - "possible-typed-array-names": "^1.0.0" - } - }, - "axe-core": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.0.tgz", - "integrity": "sha512-Mr2ZakwQ7XUAjp7pAwQWRhhK8mQQ6JAaNWSjmjxil0R8BPioMtQsTLOolGYkji1rcL++3dCqZA3zWqpT+9Ew6g==", - "dev": true - }, - "axobject-query": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", - "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", - "dev": true - }, - "babel-loader": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-10.0.0.tgz", - "integrity": "sha512-z8jt+EdS61AMw22nSfoNJAZ0vrtmhPRVi6ghL3rCeRZI8cdNYFiV5xeV3HbE7rlZZNmGH8BVccwWt8/ED0QOHA==", - "dev": true, - "requires": { - "find-up": "^5.0.0" - } - }, - "babel-plugin-polyfill-corejs2": { - "version": "0.4.17", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.17.tgz", - "integrity": "sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.28.6", - "@babel/helper-define-polyfill-provider": "^0.6.8", - "semver": "^6.3.1" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "babel-plugin-polyfill-corejs3": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", - "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.6.5", - "core-js-compat": "^3.43.0" - } - }, - "babel-plugin-polyfill-regenerator": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.8.tgz", - "integrity": "sha512-M762rNHfSF1EV3SLtnCJXFoQbbIIz0OyRwnCmV0KPC7qosSfCO0QLTSuJX3ayAebubhE6oYBAYPrBA5ljowaZg==", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.6.8" - } - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "base64-arraybuffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", - "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==" - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" - }, - "base64url": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz", - "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==" - }, - "baseline-browser-mapping": { - "version": "2.10.34", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.34.tgz", - "integrity": "sha512-IMDedajPifLnHNY0X9n8hKxRTQ6/eTHwr5bDo04WnuqxyKw6LYtQywCuuqPZwhl3aBXMvQpJov42GLCwRRdQzw==" - }, - "basic-auth": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-1.1.0.tgz", - "integrity": "sha512-CtGuTyWf3ig+sgRyC7uP6DM3N+5ur/p8L+FPfsd+BbIfIs74TFfCajZTHnCw6K5dqM0bZEbRIqRy1fAdiUJhTA==" - }, - "batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", - "dev": true - }, - "beasties": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/beasties/-/beasties-0.4.1.tgz", - "integrity": "sha512-2Imdcw3LznDuxAbJM26RHniOLAzE6WgrK8OuvVXCQtNBS8rsnD9zsSEa3fHl4hHpUY7BYTlrpvtPVbvu9G6neg==", - "dev": true, - "requires": { - "css-select": "^6.0.0", - "css-what": "^7.0.0", - "dom-serializer": "^2.0.0", - "domhandler": "^5.0.3", - "htmlparser2": "^10.0.0", - "picocolors": "^1.1.1", - "postcss": "^8.4.49", - "postcss-media-query-parser": "^0.2.3", - "postcss-safe-parser": "^7.0.1" - } - }, - "bidi-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", - "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==", - "dev": true, - "requires": { - "require-from-string": "^2.0.2" - } - }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true - }, - "bignumber.js": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz", - "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==" - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "body-parser": { - "version": "1.20.4", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", - "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", - "dev": true, - "requires": { - "bytes": "~3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "~1.2.0", - "http-errors": "~2.0.1", - "iconv-lite": "~0.4.24", - "on-finished": "~2.4.1", - "qs": "~6.14.0", - "raw-body": "~2.5.3", - "type-is": "~1.6.18", - "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "bonjour-service": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz", - "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" - } - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true - }, - "brace-expansion": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", - "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "requires": { - "fill-range": "^7.1.1" - } - }, - "browserslist": { - "version": "4.28.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", - "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", - "requires": { - "baseline-browser-mapping": "^2.10.12", - "caniuse-lite": "^1.0.30001782", - "electron-to-chromium": "^1.5.328", - "node-releases": "^2.0.36", - "update-browserslist-db": "^1.2.3" - } - }, - "btoa": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz", - "integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==", - "dev": true - }, - "buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "bundle-name": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", - "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", - "dev": true, - "requires": { - "run-applescript": "^7.0.0" - } - }, - "byte-base64": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/byte-base64/-/byte-base64-1.1.0.tgz", - "integrity": "sha512-56cXelkJrVMdCY9V/3RfDxTh4VfMFCQ5km7B7GkIGfo4bcPL9aACyJLB0Ms3Ezu5rsHmLB2suis96z4fLM03DA==" - }, - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" - }, - "bytestreamjs": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/bytestreamjs/-/bytestreamjs-2.0.1.tgz", - "integrity": "sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ==", - "dev": true - }, - "cacache": { - "version": "20.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-20.0.4.tgz", - "integrity": "sha512-M3Lab8NPYlZU2exsL3bMVvMrMqgwCnMWfdZbK28bn3pK6APT/Te/I8hjRPNu1uwORY9a1eEQoifXbKPQMfMTOA==", - "requires": { - "@npmcli/fs": "^5.0.0", - "fs-minipass": "^3.0.0", - "glob": "^13.0.0", - "lru-cache": "^11.1.0", - "minipass": "^7.0.3", - "minipass-collect": "^2.0.1", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^7.0.2", - "ssri": "^13.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "11.3.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.5.tgz", - "integrity": "sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==" - } - } - }, - "call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", - "dev": true, - "requires": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.2" - } - }, - "call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "requires": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - } - }, - "call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "requires": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - } - }, - "call-me-maybe": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", - "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==" - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelize": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", - "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==" - }, - "caniuse-lite": { - "version": "1.0.30001797", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001797.tgz", - "integrity": "sha512-l8xKG+gwAIExZGl9FrF7KUwuOmk6wbEPC9Xoy/RtnWv1XG0Q4LFlagaLpUv3Kiza3W/wm27zy0yWJEieYKAP6w==" - }, - "chai": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", - "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", - "dev": true - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "chardet": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.1.tgz", - "integrity": "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==" - }, - "chart.js": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.5.1.tgz", - "integrity": "sha512-GIjfiT9dbmHRiYi6Nl2yFCq7kkwdkp1W/lp2J99rX0yo9tgJGn3lKQATztIjb5tVtevcBtIdICNWqlq5+E8/Pw==", - "requires": { - "@kurkle/color": "^0.3.0" - } - }, - "chartjs-adapter-luxon": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/chartjs-adapter-luxon/-/chartjs-adapter-luxon-1.3.1.tgz", - "integrity": "sha512-yxHov3X8y+reIibl1o+j18xzrcdddCLqsXhriV2+aQ4hCR66IYFchlRXUvrJVoxglJ380pgytU7YWtoqdIgqhg==" - }, - "chartjs-plugin-datalabels": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/chartjs-plugin-datalabels/-/chartjs-plugin-datalabels-2.2.0.tgz", - "integrity": "sha512-14ZU30lH7n89oq+A4bWaJPnAG8a7ZTk7dKf48YAzMvJjQtjrgg5Dpk9f+LbjCF6bpx3RAGTeL13IXpKQYyRvlw==" - }, - "chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "chownr": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", - "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==" - }, - "chrome-trace-event": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", - "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", - "dev": true - }, - "cli-cursor": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", - "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", - "requires": { - "restore-cursor": "^5.0.0" - } - }, - "cli-spinners": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-3.4.0.tgz", - "integrity": "sha512-bXfOC4QcT1tKXGorxL3wbJm6XJPDqEnij2gQ2m7ESQuE+/z9YFIWnl/5RpTiKWbMq3EVKR4fRLJGn6DVfu0mpw==" - }, - "cli-truncate": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-5.1.1.tgz", - "integrity": "sha512-SroPvNHxUnk+vIW/dOSfNqdy1sPEFkrTk6TUtqLCnBlo3N7TNYYkzzN7uSD6+jVjrdO4+p8nH7JzH6cIvUem6A==", - "requires": { - "slice-ansi": "^7.1.0", - "string-width": "^8.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==" - }, - "string-width": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.1.0.tgz", - "integrity": "sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==", - "requires": { - "get-east-asian-width": "^1.3.0", - "strip-ansi": "^7.1.0" - } - }, - "strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", - "requires": { - "ansi-regex": "^6.0.1" - } - } - } - }, - "cli-width": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", - "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==" - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - } - }, - "clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==" - }, - "codemirror": { - "version": "5.65.21", - "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.65.21.tgz", - "integrity": "sha512-6teYk0bA0nR3QP0ihGMoxuKzpl5W80FpnHpBJpgy66NK3cZv5b/d/HY8PnRvfSsCG1MTfr92u2WUl+wT0E40mQ==" - }, - "color": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", - "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", - "requires": { - "color-convert": "^2.0.1", - "color-string": "^1.9.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", - "requires": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" - }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dev": true, - "requires": { - "mime-db": ">= 1.43.0 < 2" - } - }, - "compression": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", - "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", - "dev": true, - "requires": { - "bytes": "3.1.2", - "compressible": "~2.0.18", - "debug": "2.6.9", - "negotiator": "~0.6.4", - "on-headers": "~1.1.0", - "safe-buffer": "5.2.1", - "vary": "~1.1.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "negotiator": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", - "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", - "dev": true - } - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "connect-history-api-fallback": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", - "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", - "dev": true - }, - "content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dev": true, - "requires": { - "safe-buffer": "5.2.1" - } - }, - "content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" - }, - "contra": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/contra/-/contra-1.9.4.tgz", - "integrity": "sha512-N9ArHAqwR/lhPq4OdIAwH4e1btn6EIZMAz4TazjnzCiVECcWUPTma+dRAM38ERImEJBh8NiCCpjoQruSZ+agYg==", - "requires": { - "atoa": "1.0.0", - "ticky": "1.0.1" - } - }, - "convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" - }, - "cookie": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", - "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==" - }, - "cookie-signature": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", - "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", - "dev": true - }, - "copy-anything": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", - "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", - "dev": true, - "requires": { - "is-what": "^3.14.1" - } - }, - "copy-text-to-clipboard": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.2.2.tgz", - "integrity": "sha512-T6SqyLd1iLuqPA90J5N4cTalrtovCySh58iiZDGJ6FGznbclKh4UI+FGacQSgFzwKG77W7XT5gwbVEbd9cIH1A==" - }, - "copy-webpack-plugin": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-14.0.0.tgz", - "integrity": "sha512-3JLW90aBGeaTLpM7mYQKpnVdgsUZRExY55giiZgLuX/xTQRUs1dOCwbBnWnvY6Q6rfZoXMNwzOQJCSZPppfqXA==", - "dev": true, - "requires": { - "glob-parent": "^6.0.1", - "normalize-path": "^3.0.0", - "schema-utils": "^4.2.0", - "serialize-javascript": "^7.0.3", - "tinyglobby": "^0.2.12" - }, - "dependencies": { - "ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.3" - } - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "schema-utils": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", - "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - } - } - } - }, - "core-js": { - "version": "3.49.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.49.0.tgz", - "integrity": "sha512-es1U2+YTtzpwkxVLwAFdSpaIMyQaq0PBgm3YD1W3Qpsn1NAmO3KSgZfu+oGSWVu6NvLHoHCV/aYcsE5wiB7ALg==" - }, - "core-js-compat": { - "version": "3.49.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.49.0.tgz", - "integrity": "sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA==", - "dev": true, - "requires": { - "browserslist": "^4.28.1" - } - }, - "core-js-pure": { - "version": "3.47.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.47.0.tgz", - "integrity": "sha512-BcxeDbzUrRnXGYIVAGFtcGQVNpFcUhVjr6W7F8XktvQW2iJP9e66GP6xdKotCRFlrxBvNIBrhwKteRXqMV86Nw==" - }, - "core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, - "cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "requires": { - "object-assign": "^4", - "vary": "^1" - } - }, - "corser": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz", - "integrity": "sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ==" - }, - "cosmiconfig": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", - "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", - "dev": true, - "requires": { - "env-paths": "^2.2.1", - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0" - } - }, - "create-point-cb": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-point-cb/-/create-point-cb-1.2.0.tgz", - "integrity": "sha512-r4l6IO/YGI7hIZRMLggOzwM6XO80+Fdcv4hx1fXCEdU+hKd7zZki6i+cbYfK9OliMwMYx1wPfQLU/snvS+Dygw==", - "requires": { - "type-func": "^1.0.1" - } - }, - "create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "crossvent": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/crossvent/-/crossvent-1.5.5.tgz", - "integrity": "sha512-MY4xhBYEnVi+pmTpHCOCsCLYczc0PVtGdPBz6NXNXxikLaUZo4HdAeUb1UqAo3t3yXAloSelTmfxJ+/oUqkW5w==", - "requires": { - "custom-event": "^1.0.0" - } - }, - "css-color-keywords": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", - "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==" - }, - "css-line-break": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-line-break/-/css-line-break-2.1.0.tgz", - "integrity": "sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==", - "requires": { - "utrie": "^1.0.2" - } - }, - "css-loader": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-7.1.3.tgz", - "integrity": "sha512-frbERmjT0UC5lMheWpJmMilnt9GEhbZJN/heUb7/zaJYeIzj5St9HvDcfshzzOqbsS+rYpMk++2SD3vGETDSyA==", - "dev": true, - "requires": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.40", - "postcss-modules-extract-imports": "^3.1.0", - "postcss-modules-local-by-default": "^4.0.5", - "postcss-modules-scope": "^3.2.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.6.3" - } - }, - "css-select": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-6.0.0.tgz", - "integrity": "sha512-rZZVSLle8v0+EY8QAkDWrKhpgt6SA5OtHsgBnsj6ZaLb5dmDVOWUDtQitd9ydxxvEjhewNudS6eTVU7uOyzvXw==", - "dev": true, - "requires": { - "boolbase": "^1.0.0", - "css-what": "^7.0.0", - "domhandler": "^5.0.3", - "domutils": "^3.2.2", - "nth-check": "^2.1.1" - } - }, - "css-to-react-native": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", - "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", - "requires": { - "camelize": "^1.0.0", - "css-color-keywords": "^1.0.0", - "postcss-value-parser": "^4.0.2" - } - }, - "css-tree": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", - "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", - "dev": true, - "requires": { - "mdn-data": "2.27.1", - "source-map-js": "^1.2.1" - } - }, - "css-what": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-7.0.0.tgz", - "integrity": "sha512-wD5oz5xibMOPHzy13CyGmogB3phdvcDaB5t0W/Nr5Z2O/agcB8YwOz6e2Lsp10pNDzBoDO9nVa3RGs/2BttpHQ==", - "dev": true - }, - "css.escape": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", - "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", - "dev": true - }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true - }, - "csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" - }, - "custom-event": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", - "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==" - }, - "d": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/d/-/d-0.1.1.tgz", - "integrity": "sha512-0SdM9V9pd/OXJHoWmTfNPTAeD+lw6ZqHg+isPyBFuJsZLSE0Ygg1cYZ/0l6DrKQXMOqGOu1oWupMoOfoRfMZrQ==", - "requires": { - "es5-ext": "~0.10.2" - } - }, - "damerau-levenshtein": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", - "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", - "dev": true - }, - "data-urls": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-7.0.0.tgz", - "integrity": "sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA==", - "dev": true, - "requires": { - "whatwg-mimetype": "^5.0.0", - "whatwg-url": "^16.0.0" - } - }, - "data-view-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", - "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", - "dev": true, - "requires": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - } - }, - "data-view-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", - "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", - "dev": true, - "requires": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - } - }, - "data-view-byte-offset": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", - "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", - "dev": true, - "requires": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - } - }, - "debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "requires": { - "ms": "^2.1.3" - } - }, - "decimal.js": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", - "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", - "dev": true - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "default-browser": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.4.0.tgz", - "integrity": "sha512-XDuvSq38Hr1MdN47EDvYtx3U0MTqpCEn+F6ft8z2vYDzMrvQhVp0ui9oQdqW3MvK3vqUETglt1tVGgjLuJ5izg==", - "dev": true, - "requires": { - "bundle-name": "^4.1.0", - "default-browser-id": "^5.0.0" - } - }, - "default-browser-id": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", - "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", - "dev": true - }, - "define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, - "requires": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - } - }, - "define-lazy-prop": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", - "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", - "dev": true - }, - "define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "requires": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" - }, - "dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "dev": true - }, - "destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true - }, - "detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "dev": true, - "optional": true - }, - "detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true - }, - "detect-node-es": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", - "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" - }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - }, - "dns-packet": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", - "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", - "dev": true, - "requires": { - "@leichtgewicht/ip-codec": "^2.0.1" - } - }, - "dom-accessibility-api": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", - "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", - "dev": true - }, - "dom-autoscroller": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/dom-autoscroller/-/dom-autoscroller-2.3.4.tgz", - "integrity": "sha512-HcAdt/2Dq9x4CG6LWXc2x9Iq0MJPAu8fuzHncclq7byufqYEYVtx9sZ/dyzR+gdj4qwEC9p27Lw1G2HRRYX6jQ==", - "requires": { - "animation-frame-polyfill": "^1.0.0", - "create-point-cb": "^1.0.0", - "dom-mousemove-dispatcher": "^1.0.1", - "dom-plane": "^1.0.1", - "dom-set": "^1.0.1", - "type-func": "^1.0.1" - } - }, - "dom-mousemove-dispatcher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dom-mousemove-dispatcher/-/dom-mousemove-dispatcher-1.0.1.tgz", - "integrity": "sha512-NMdqqMbgW8kqOdmod2hkS+9hD/v7h4XoSvwU9qqe+wAA/O+ba0jhpbfW0Kb/fCyR0RX9jf4dwfQrl04LQX4FzQ==" - }, - "dom-plane": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/dom-plane/-/dom-plane-1.0.2.tgz", - "integrity": "sha512-/tR67G6ZGSciXoZLsD706yLxEXvX3mG/OWE8YNYj3A1yU/RAimtPXzklVTu5Y5xoeMoloA/Y+MaNjQm9apgAww==", - "requires": { - "create-point-cb": "^1.0.0" - } - }, - "dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dev": true, - "requires": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - } - }, - "dom-set": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/dom-set/-/dom-set-1.1.1.tgz", - "integrity": "sha512-sUi2aSvRsK3Ixx++gwX9cnaWk9ZxGVFry8+HnTRVmDimybU5PaiI4wX0o00mVtjFKlQNZLmtGoPTLorYbN0+Rw==", - "requires": { - "array-from": "^2.1.1", - "is-array": "^1.0.1", - "iselement": "^1.1.4" - } - }, - "domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true - }, - "domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dev": true, - "requires": { - "domelementtype": "^2.3.0" - } - }, - "domutils": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", - "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", - "dev": true, - "requires": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - } - }, - "draco3d": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/draco3d/-/draco3d-1.5.7.tgz", - "integrity": "sha512-m6WCKt/erDXcw+70IJXnG7M3awwQPAsZvJGX5zY7beBqpELw6RDGkYVU0W43AFxye4pDZ5i2Lbyc/NNGqwjUVQ==" - }, - "dragula": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/dragula/-/dragula-3.7.3.tgz", - "integrity": "sha512-/rRg4zRhcpf81TyDhaHLtXt6sEywdfpv1cRUMeFFy7DuypH2U0WUL0GTdyAQvXegviT4PJK4KuMmOaIDpICseQ==", - "requires": { - "contra": "1.9.4", - "crossvent": "1.5.5" - } - }, - "drange": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/drange/-/drange-1.1.1.tgz", - "integrity": "sha512-pYxfDYpued//QpnLIm4Avk7rsNtAtQkUES2cwAYSvD/wd2pKD71gN2Ebj3e7klzXwjocvE8c5vx/1fxwpqmSxA==" - }, - "dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "requires": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - } - }, - "duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "dev": true - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "ejs": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", - "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", - "dev": true, - "requires": { - "jake": "^10.8.5" - } - }, - "electron-to-chromium": { - "version": "1.5.369", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.369.tgz", - "integrity": "sha512-XM22K9FNaaCOvMMrBn1caIc8v0g6+pKt660ZbfQqUZvfil0hEzr8ZoiY7VcSLGM3L/x3rz5PqZrk+bKOOmVM9w==" - }, - "emoji-mart": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/emoji-mart/-/emoji-mart-5.6.0.tgz", - "integrity": "sha512-eJp3QRe79pjwa+duv+n7+5YsNhRcMl812EcFVwrnRvYKoNPoQb5qxU8DG6Bgwji0akHdp6D4Ln6tYLG58MFSow==" - }, - "emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true - }, - "enhanced-resolve": { - "version": "5.21.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.21.0.tgz", - "integrity": "sha512-otxSQPw4lkOZWkHpB3zaEQs6gWYEsmX4xQF68ElXC/TWvGxGMSGOvoNbaLXm6/cS/fSfHtsEdw90y20PCd+sCA==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.4", - "tapable": "^2.3.3" - } - }, - "entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true - }, - "env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==" - }, - "environment": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", - "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==" - }, - "err-code": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==" - }, - "errno": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", - "dev": true, - "optional": true, - "requires": { - "prr": "~1.0.1" - } - }, - "error-ex": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", - "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-abstract": { - "version": "1.24.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", - "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", - "dev": true, - "requires": { - "array-buffer-byte-length": "^1.0.2", - "arraybuffer.prototype.slice": "^1.0.4", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "data-view-buffer": "^1.0.2", - "data-view-byte-length": "^1.0.2", - "data-view-byte-offset": "^1.0.1", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "es-set-tostringtag": "^2.1.0", - "es-to-primitive": "^1.3.0", - "function.prototype.name": "^1.1.8", - "get-intrinsic": "^1.3.0", - "get-proto": "^1.0.1", - "get-symbol-description": "^1.1.0", - "globalthis": "^1.0.4", - "gopd": "^1.2.0", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "internal-slot": "^1.1.0", - "is-array-buffer": "^3.0.5", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.2", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.2.1", - "is-set": "^2.0.3", - "is-shared-array-buffer": "^1.0.4", - "is-string": "^1.1.1", - "is-typed-array": "^1.1.15", - "is-weakref": "^1.1.1", - "math-intrinsics": "^1.1.0", - "object-inspect": "^1.13.4", - "object-keys": "^1.1.1", - "object.assign": "^4.1.7", - "own-keys": "^1.0.1", - "regexp.prototype.flags": "^1.5.4", - "safe-array-concat": "^1.1.3", - "safe-push-apply": "^1.0.0", - "safe-regex-test": "^1.1.0", - "set-proto": "^1.0.0", - "stop-iteration-iterator": "^1.1.0", - "string.prototype.trim": "^1.2.10", - "string.prototype.trimend": "^1.0.9", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.3", - "typed-array-byte-length": "^1.0.3", - "typed-array-byte-offset": "^1.0.4", - "typed-array-length": "^1.0.7", - "unbox-primitive": "^1.1.0", - "which-typed-array": "^1.1.19" - } - }, - "es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==" - }, - "es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" - }, - "es-html-parser": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/es-html-parser/-/es-html-parser-0.3.1.tgz", - "integrity": "sha512-YTEasG4xt7FEN4b6qJIPbFo/fzQ5kjRMEQ33QMqSXTvfXqAbC2rHxo32x2/1Rhq7Mlu6wI3MIpM5Kf2VHPXrUQ==", - "dev": true - }, - "es-iterator-helpers": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", - "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", - "dev": true, - "requires": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.6", - "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.0.3", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.6", - "globalthis": "^1.0.4", - "gopd": "^1.2.0", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.2.0", - "has-symbols": "^1.1.0", - "internal-slot": "^1.1.0", - "iterator.prototype": "^1.1.4", - "safe-array-concat": "^1.1.3" - } - }, - "es-module-lexer": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz", - "integrity": "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==", - "dev": true - }, - "es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "requires": { - "es-errors": "^1.3.0" - } - }, - "es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "dev": true, - "requires": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - } - }, - "es-shim-unscopables": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", - "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", - "dev": true, - "requires": { - "hasown": "^2.0.2" - } - }, - "es-to-primitive": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", - "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", - "dev": true, - "requires": { - "is-callable": "^1.2.7", - "is-date-object": "^1.0.5", - "is-symbol": "^1.0.4" - } - }, - "es-toolkit": { - "version": "1.46.1", - "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.46.1.tgz", - "integrity": "sha512-5eNtXOs3tbfxXOj04tjjseeWkRWaoCjdEI+96DgwzZoe6c9juL49pXlzAFTI72aWC9Y8p7168g6XIKjh7k6pyQ==" - }, - "es5-ext": { - "version": "0.10.64", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", - "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", - "requires": { - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.3", - "esniff": "^2.0.1", - "next-tick": "^1.1.0" - } - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - }, - "dependencies": { - "d": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz", - "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==", - "requires": { - "es5-ext": "^0.10.64", - "type": "^2.7.2" - } - } - } - }, - "es6-slide-up-down": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es6-slide-up-down/-/es6-slide-up-down-1.0.0.tgz", - "integrity": "sha512-s86t2F+GjPRxiSodC59JRZZaP07Ht03EDU2RDrRCXYk9o3CfTCNjtwqrpoV1BjbCnzXcBoDGj1aZhzZkHzMpWQ==" - }, - "es6-symbol": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz", - "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==", - "requires": { - "d": "^1.0.2", - "ext": "^1.7.0" - }, - "dependencies": { - "d": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz", - "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==", - "requires": { - "es5-ext": "^0.10.64", - "type": "^2.7.2" - } - } - } - }, - "es6-weak-map": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-0.1.4.tgz", - "integrity": "sha512-P+N5Cd2TXeb7G59euFiM7snORspgbInS29Nbf3KNO2JQp/DyhvMCDWd58nsVAXwYJ6W3Bx7qDdy6QQ3PCJ7jKQ==", - "requires": { - "d": "~0.1.1", - "es5-ext": "~0.10.6", - "es6-iterator": "~0.1.3", - "es6-symbol": "~2.0.1" - }, - "dependencies": { - "es6-iterator": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-0.1.3.tgz", - "integrity": "sha512-6TOmbFM6OPWkTe+bQ3ZuUkvqcWUjAnYjKUCLdbvRsAUz2Pr+fYIibwNXNkLNtIK9PPFbNMZZddaRNkyJhlGJhA==", - "requires": { - "d": "~0.1.1", - "es5-ext": "~0.10.5", - "es6-symbol": "~2.0.1" - } - }, - "es6-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-2.0.1.tgz", - "integrity": "sha512-wjobO4zO8726HVU7mI2OA/B6QszqwHJuKab7gKHVx+uRfVVYGcWJkCIFxV2Madqb9/RUSrhJ/r6hPfG7FsWtow==", - "requires": { - "d": "~0.1.1", - "es5-ext": "~0.10.5" - } - } - } - }, - "esbuild": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", - "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", - "dev": true, - "requires": { - "@esbuild/aix-ppc64": "0.27.3", - "@esbuild/android-arm": "0.27.3", - "@esbuild/android-arm64": "0.27.3", - "@esbuild/android-x64": "0.27.3", - "@esbuild/darwin-arm64": "0.27.3", - "@esbuild/darwin-x64": "0.27.3", - "@esbuild/freebsd-arm64": "0.27.3", - "@esbuild/freebsd-x64": "0.27.3", - "@esbuild/linux-arm": "0.27.3", - "@esbuild/linux-arm64": "0.27.3", - "@esbuild/linux-ia32": "0.27.3", - "@esbuild/linux-loong64": "0.27.3", - "@esbuild/linux-mips64el": "0.27.3", - "@esbuild/linux-ppc64": "0.27.3", - "@esbuild/linux-riscv64": "0.27.3", - "@esbuild/linux-s390x": "0.27.3", - "@esbuild/linux-x64": "0.27.3", - "@esbuild/netbsd-arm64": "0.27.3", - "@esbuild/netbsd-x64": "0.27.3", - "@esbuild/openbsd-arm64": "0.27.3", - "@esbuild/openbsd-x64": "0.27.3", - "@esbuild/openharmony-arm64": "0.27.3", - "@esbuild/sunos-x64": "0.27.3", - "@esbuild/win32-arm64": "0.27.3", - "@esbuild/win32-ia32": "0.27.3", - "@esbuild/win32-x64": "0.27.3" - } - }, - "esbuild-wasm": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.27.3.tgz", - "integrity": "sha512-AUXuOxZ145/5Az+lIqk6TdJbxKTyDGkXMJpTExmBdbnHR6n6qAFx+F4oG9ORpVYJ9dQYeQAqzv51TO4DFKsbXw==", - "dev": true - }, - "escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==" - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "eslint": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.4.1.tgz", - "integrity": "sha512-AyIKhnOBuOAdueD7RB3xB+YeAWScb9jHsJBgH2Hcde8InP5JYhqrRR6iTMHyTEwgENK54Cp44e4v8BwNhsuHuw==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.8.0", - "@eslint-community/regexpp": "^4.12.2", - "@eslint/config-array": "^0.23.5", - "@eslint/config-helpers": "^0.6.0", - "@eslint/core": "^1.2.1", - "@eslint/plugin-kit": "^0.7.2", - "@humanfs/node": "^0.16.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.2", - "@types/estree": "^1.0.6", - "ajv": "^6.14.0", - "cross-spawn": "^7.0.6", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^9.1.2", - "eslint-visitor-keys": "^5.0.1", - "espree": "^11.2.0", - "esquery": "^1.7.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "minimatch": "^10.2.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3" - }, - "dependencies": { - "@eslint/core": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz", - "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.15" - } - }, - "@eslint/plugin-kit": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.2.tgz", - "integrity": "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==", - "dev": true, - "requires": { - "@eslint/core": "^1.2.1", - "levn": "^0.4.1" - } - }, - "ajv": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", - "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "dev": true - }, - "brace-expansion": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", - "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", - "dev": true, - "requires": { - "balanced-match": "^4.0.2" - } - }, - "eslint-visitor-keys": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", - "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", - "dev": true - }, - "espree": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", - "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", - "dev": true, - "requires": { - "acorn": "^8.16.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^5.0.1" - } - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "minimatch": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", - "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", - "dev": true, - "requires": { - "brace-expansion": "^5.0.5" - } - } - } - }, - "eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", - "dev": true, - "requires": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "eslint-module-utils": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", - "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", - "dev": true, - "requires": { - "debug": "^3.2.7" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "eslint-plugin-import": { - "version": "2.32.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", - "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", - "dev": true, - "requires": { - "@rtsao/scc": "^1.1.0", - "array-includes": "^3.1.9", - "array.prototype.findlastindex": "^1.2.6", - "array.prototype.flat": "^1.3.3", - "array.prototype.flatmap": "^1.3.3", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.12.1", - "hasown": "^2.0.2", - "is-core-module": "^2.16.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.8", - "object.groupby": "^1.0.3", - "object.values": "^1.2.1", - "semver": "^6.3.1", - "string.prototype.trimend": "^1.0.9", - "tsconfig-paths": "^3.15.0" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - }, - "tsconfig-paths": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", - "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", - "dev": true, - "requires": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - } - } - }, - "eslint-plugin-jsx-a11y": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", - "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", - "dev": true, - "requires": { - "aria-query": "^5.3.2", - "array-includes": "^3.1.8", - "array.prototype.flatmap": "^1.3.2", - "ast-types-flow": "^0.0.8", - "axe-core": "^4.10.0", - "axobject-query": "^4.1.0", - "damerau-levenshtein": "^1.0.8", - "emoji-regex": "^9.2.2", - "hasown": "^2.0.2", - "jsx-ast-utils": "^3.3.5", - "language-tags": "^1.0.9", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.8", - "safe-regex-test": "^1.0.3", - "string.prototype.includes": "^2.0.1" - } - }, - "eslint-plugin-react": { - "version": "7.37.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", - "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", - "dev": true, - "requires": { - "array-includes": "^3.1.8", - "array.prototype.findlast": "^1.2.5", - "array.prototype.flatmap": "^1.3.3", - "array.prototype.tosorted": "^1.1.4", - "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.2.1", - "estraverse": "^5.3.0", - "hasown": "^2.0.2", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.9", - "object.fromentries": "^2.0.8", - "object.values": "^1.2.1", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.5", - "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.12", - "string.prototype.repeat": "^1.0.0" - }, - "dependencies": { - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "resolve": { - "version": "2.0.0-next.5", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", - "dev": true, - "requires": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "eslint-plugin-react-hooks": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.1.1.tgz", - "integrity": "sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==", - "dev": true, - "requires": { - "@babel/core": "^7.24.4", - "@babel/parser": "^7.24.4", - "hermes-parser": "^0.25.1", - "zod": "^3.25.0 || ^4.0.0", - "zod-validation-error": "^3.5.0 || ^4.0.0" - } - }, - "eslint-scope": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", - "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", - "dev": true, - "requires": { - "@types/esrecurse": "^4.3.1", - "@types/estree": "^1.0.8", - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true - }, - "esniff": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", - "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", - "requires": { - "d": "^1.0.1", - "es5-ext": "^0.10.62", - "event-emitter": "^0.3.5", - "type": "^2.7.2" - }, - "dependencies": { - "d": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz", - "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==", - "requires": { - "es5-ext": "^0.10.64", - "type": "^2.7.2" - } - } - } - }, - "espree": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", - "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", - "dev": true, - "requires": { - "acorn": "^8.15.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.1" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true - } - } - }, - "esquery": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", - "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "requires": { - "@types/estree": "^1.0.0" - } - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" - }, - "event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - }, - "dependencies": { - "d": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz", - "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==", - "requires": { - "es5-ext": "^0.10.64", - "type": "^2.7.2" - } - } - } - }, - "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" - }, - "events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true - }, - "eventsource": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", - "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", - "requires": { - "eventsource-parser": "^3.0.1" - } - }, - "eventsource-parser": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.6.tgz", - "integrity": "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==" - }, - "expect-type": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", - "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", - "dev": true - }, - "exponential-backoff": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", - "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==" - }, - "express": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", - "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", - "dev": true, - "requires": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "~1.20.3", - "content-disposition": "~0.5.4", - "content-type": "~1.0.4", - "cookie": "~0.7.1", - "cookie-signature": "~1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.3.1", - "fresh": "~0.5.2", - "http-errors": "~2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "~2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "~0.1.12", - "proxy-addr": "~2.0.7", - "qs": "~6.14.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "~0.19.0", - "serve-static": "~1.16.2", - "setprototypeof": "1.2.0", - "statuses": "~2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "dev": true - }, - "finalhandler": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", - "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "~2.4.1", - "parseurl": "~1.3.3", - "statuses": "~2.0.2", - "unpipe": "~1.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "express-rate-limit": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.3.1.tgz", - "integrity": "sha512-D1dKN+cmyPWuvB+G2SREQDzPY1agpBIcTa9sJxOPMCNeH3gwzhqJRDWCXW3gg0y//+LQ/8j52JbMROWyrKdMdw==", - "requires": { - "ip-address": "10.1.0" - } - }, - "ext": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", - "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", - "requires": { - "type": "^2.7.2" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "fast-equals": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.4.0.tgz", - "integrity": "sha512-jt2DW/aNFNwke7AUd+Z+e6pz39KO5rzdbbFCg2sGafS4mk13MI7Z8O5z9cADNn5lhGODIgLwug6TZO2ctf7kcw==" - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "fast-uri": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", - "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==" - }, - "faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" - } - }, - "fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==" - }, - "file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", - "dev": true, - "requires": { - "flat-cache": "^4.0.0" - } - }, - "filelist": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", - "dev": true, - "requires": { - "minimatch": "^5.0.1" - }, - "dependencies": { - "brace-expansion": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", - "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "minimatch": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", - "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - } - } - }, - "fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true - }, - "flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - "dev": true, - "requires": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - } - }, - "flatpickr": { - "version": "4.6.13", - "resolved": "https://registry.npmjs.org/flatpickr/-/flatpickr-4.6.13.tgz", - "integrity": "sha512-97PMG/aywoYpB4IvbvUJi0RQi8vearvU0oov1WW3k0WZPBMrTQVqekSX5CjSG/M4Q3i6A/0FKXC7RyAoAUUSPw==" - }, - "flatted": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", - "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", - "dev": true - }, - "follow-redirects": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", - "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==" - }, - "for-each": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", - "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", - "dev": true, - "requires": { - "is-callable": "^1.2.7" - } - }, - "forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" - }, - "fraction.js": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", - "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==" - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "dev": true - }, - "fs-minipass": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", - "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", - "requires": { - "minipass": "^7.0.3" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "optional": true - }, - "function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" - }, - "function.prototype.name": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", - "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", - "dev": true, - "requires": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "functions-have-names": "^1.2.3", - "hasown": "^2.0.2", - "is-callable": "^1.2.7" - } - }, - "functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" - }, - "get-east-asian-width": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.5.0.tgz", - "integrity": "sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==" - }, - "get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "requires": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - } - }, - "get-nonce": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", - "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==" - }, - "get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "requires": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - } - }, - "get-symbol-description": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", - "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", - "dev": true, - "requires": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6" - } - }, - "glob": { - "version": "13.0.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", - "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", - "requires": { - "minimatch": "^10.2.2", - "minipass": "^7.1.3", - "path-scurry": "^2.0.2" - }, - "dependencies": { - "balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==" - }, - "brace-expansion": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", - "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", - "requires": { - "balanced-match": "^4.0.2" - } - }, - "minimatch": { - "version": "10.2.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", - "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", - "requires": { - "brace-expansion": "^5.0.2" - } - } - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "glob-to-regex.js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/glob-to-regex.js/-/glob-to-regex.js-1.2.0.tgz", - "integrity": "sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ==", - "dev": true - }, - "glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true - }, - "globals": { - "version": "17.6.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-17.6.0.tgz", - "integrity": "sha512-sepffkT8stwnIYbsMBpoCHJuJM5l98FUF2AnE07hfvE0m/qp3R586hw4jF4uadbhvg1ooIdzuu7CsfD2jzCaNA==", - "dev": true - }, - "globalthis": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", - "dev": true, - "requires": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" - } - }, - "gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==" - }, - "graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - }, - "gzip-size": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", - "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", - "dev": true, - "requires": { - "duplexer": "^0.1.2" - } - }, - "hammerjs": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/hammerjs/-/hammerjs-2.0.8.tgz", - "integrity": "sha512-tSQXBXS/MWQOn/RKckawJ61vvsDpCom87JgxiYdGwHdOa0ht0vzUWDlfioofFCRU0L+6NGDt6XzbgoJvZkMeRQ==" - }, - "handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "dev": true - }, - "has-bigints": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", - "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, - "requires": { - "es-define-property": "^1.0.0" - } - }, - "has-proto": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", - "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", - "dev": true, - "requires": { - "dunder-proto": "^1.0.0" - } - }, - "has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==" - }, - "has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, - "requires": { - "has-symbols": "^1.0.3" - } - }, - "hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "requires": { - "function-bind": "^1.1.2" - } - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" - }, - "hermes-estree": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", - "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", - "dev": true - }, - "hermes-parser": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", - "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", - "dev": true, - "requires": { - "hermes-estree": "0.25.1" - } - }, - "hono": { - "version": "4.12.14", - "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.14.tgz", - "integrity": "sha512-am5zfg3yu6sqn5yjKBNqhnTX7Cv+m00ox+7jbaKkrLMRJ4rAdldd1xPd/JzbBWspqaQv6RSTrgFN95EsfhC+7w==" - }, - "hosted-git-info": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-9.0.2.tgz", - "integrity": "sha512-M422h7o/BR3rmCQ8UHi7cyyMqKltdP9Uo+J2fXK+RSAY+wTcKOIRyhTuKv4qn+DJf3g+PL890AzId5KZpX+CBg==", - "requires": { - "lru-cache": "^11.1.0" - }, - "dependencies": { - "lru-cache": { - "version": "11.3.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.5.tgz", - "integrity": "sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==" - } - } - }, - "hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "html-encoding-sniffer": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-6.0.0.tgz", - "integrity": "sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==", - "dev": true, - "requires": { - "@exodus/bytes": "^1.6.0" - } - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "html-parse-stringify": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz", - "integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==", - "requires": { - "void-elements": "3.1.0" - }, - "dependencies": { - "void-elements": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", - "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==" - } - } - }, - "html-standard": { - "version": "0.0.13", - "resolved": "https://registry.npmjs.org/html-standard/-/html-standard-0.0.13.tgz", - "integrity": "sha512-6oNfW3c1t44O7jVXu0tp4E5MbHifWlXrHlZBPt6y7vFdgLOUUh8hyzoRhfUgozlBUK6oLLYhqP1uIqbZ8ggcBA==", - "dev": true, - "requires": { - "vscode-css-languageservice": "^6.3.9", - "vscode-languageserver-textdocument": "^1.0.12" - } - }, - "html2canvas": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/html2canvas/-/html2canvas-1.4.1.tgz", - "integrity": "sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==", - "requires": { - "css-line-break": "^2.1.0", - "text-segmentation": "^1.0.3" - } - }, - "htmlparser2": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.1.0.tgz", - "integrity": "sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==", - "dev": true, - "requires": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.2.2", - "entities": "^7.0.1" - }, - "dependencies": { - "entities": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", - "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", - "dev": true - } - } - }, - "http-cache-semantics": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", - "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==" - }, - "http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", - "dev": true - }, - "http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", - "requires": { - "depd": "~2.0.0", - "inherits": "~2.0.4", - "setprototypeof": "~1.2.0", - "statuses": "~2.0.2", - "toidentifier": "~1.0.1" - } - }, - "http-parser-js": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", - "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", - "dev": true - }, - "http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "requires": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - } - }, - "http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "requires": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - } - }, - "http-proxy-middleware": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-3.0.5.tgz", - "integrity": "sha512-GLZZm1X38BPY4lkXA01jhwxvDoOkkXqjgVyUzVxiEK4iuRu03PZoYHhHRwxnfhQMDuaxi3vVri0YgSro/1oWqg==", - "dev": true, - "requires": { - "@types/http-proxy": "^1.17.15", - "debug": "^4.3.6", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.3", - "is-plain-object": "^5.0.0", - "micromatch": "^4.0.8" - }, - "dependencies": { - "is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "dev": true - } - } - }, - "http-server": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/http-server/-/http-server-13.1.0.tgz", - "integrity": "sha512-MLqBMXeY/YN0FYMz4ifeOQCcg8pKj8YdmzX1pr/Vb2VrNnbxHN1s4K9BuZRVSyK/j3DQ8UVrrABb8m6EmFjWog==", - "requires": { - "basic-auth": "^1.0.3", - "chalk": "^4.1.2", - "corser": "^2.0.1", - "he": "^1.1.0", - "http-proxy": "^1.18.0", - "mime": "^1.6.0", - "minimist": "^1.2.5", - "opener": "^1.5.1", - "portfinder": "^1.0.25", - "secure-compare": "3.0.1", - "union": "~0.5.0", - "url-join": "^2.0.5" - }, - "dependencies": { - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" - } - } - }, - "https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", - "requires": { - "agent-base": "^7.1.2", - "debug": "4" - } - }, - "hyperdyperid": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", - "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==", - "dev": true - }, - "i18n-js": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/i18n-js/-/i18n-js-4.5.1.tgz", - "integrity": "sha512-n7jojFj1WC0tztgr0I8jqTXuIlY1xNzXnC3mjKX/YjJhimdM+jXM8vOmn9d3xQFNC6qDHJ4ovhdrGXrRXLIGkA==", - "requires": { - "bignumber.js": "*", - "lodash": "*", - "make-plural": "*" - } - }, - "i18next": { - "version": "25.6.3", - "resolved": "https://registry.npmjs.org/i18next/-/i18next-25.6.3.tgz", - "integrity": "sha512-AEQvoPDljhp67a1+NsnG/Wb1Nh6YoSvtrmeEd24sfGn3uujCtXCF3cXpr7ulhMywKNFF7p3TX1u2j7y+caLOJg==", - "requires": { - "@babel/runtime": "^7.28.4" - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true - }, - "idiomorph": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/idiomorph/-/idiomorph-0.7.4.tgz", - "integrity": "sha512-uCdSpLo3uMfqOmrwXTpR1k/sq4sSmKC7l4o/LdJOEU+MMMq+wkevRqOQYn3lP7vfz9Mv+USBEqPvi0XhdL9ENw==" - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" - }, - "ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true - }, - "ignore-walk": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-8.0.0.tgz", - "integrity": "sha512-FCeMZT4NiRQGh+YkeKMtWrOmBgWjHjMJ26WQWrRQyoyzqevdaGSakUaJW5xQYmjLlUVk2qUnCjYVBax9EKKg8A==", - "requires": { - "minimatch": "^10.0.3" - }, - "dependencies": { - "balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==" - }, - "brace-expansion": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", - "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", - "requires": { - "balanced-match": "^4.0.2" - } - }, - "minimatch": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", - "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", - "requires": { - "brace-expansion": "^5.0.5" - } - } - } - }, - "image-size": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", - "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", - "dev": true, - "optional": true - }, - "immutable": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.5.tgz", - "integrity": "sha512-t7xcm2siw+hlUM68I+UEOK+z84RzmN59as9DZ7P1l0994DKUWV7UXBMQZVxaoMSRQ+PBZbHCOoBt7a2wxOMt+A==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "ini": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-6.0.0.tgz", - "integrity": "sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==" - }, - "internal-slot": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", - "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", - "dev": true, - "requires": { - "es-errors": "^1.3.0", - "hasown": "^2.0.2", - "side-channel": "^1.1.0" - } - }, - "ip-address": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", - "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==" - }, - "ipaddr.js": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.3.0.tgz", - "integrity": "sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg==", - "dev": true - }, - "is-array": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-array/-/is-array-1.0.1.tgz", - "integrity": "sha512-gxiZ+y/u67AzpeFmAmo4CbtME/bs7J2C++su5zQzvQyaxUqVzkh69DI+jN+KZuSO6JaH6TIIU6M6LhqxMjxEpw==" - }, - "is-array-buffer": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", - "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", - "dev": true, - "requires": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "is-async-function": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.0.tgz", - "integrity": "sha512-GExz9MtyhlZyXYLxzlJRj5WUCE661zhDa1Yna52CN57AJsymh+DvXXjyveSioqSRdxvUrdKdvqB1b5cVKsNpWQ==", - "dev": true, - "requires": { - "call-bound": "^1.0.3", - "get-proto": "^1.0.1", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - } - }, - "is-bigint": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", - "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", - "dev": true, - "requires": { - "has-bigints": "^1.0.2" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-boolean-object": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.1.tgz", - "integrity": "sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==", - "dev": true, - "requires": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - } - }, - "is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true - }, - "is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "dev": true, - "requires": { - "hasown": "^2.0.2" - } - }, - "is-data-view": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", - "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", - "dev": true, - "requires": { - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "is-typed-array": "^1.1.13" - } - }, - "is-date-object": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", - "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", - "dev": true, - "requires": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - } - }, - "is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true - }, - "is-finalizationregistry": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", - "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", - "dev": true, - "requires": { - "call-bound": "^1.0.3" - } - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "is-generator-function": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", - "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", - "dev": true, - "requires": { - "call-bound": "^1.0.3", - "get-proto": "^1.0.0", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - } - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-in-ssh": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-in-ssh/-/is-in-ssh-1.0.0.tgz", - "integrity": "sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==", - "dev": true - }, - "is-inside-container": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", - "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", - "dev": true, - "requires": { - "is-docker": "^3.0.0" - }, - "dependencies": { - "is-docker": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", - "dev": true - } - } - }, - "is-interactive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", - "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==" - }, - "is-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", - "dev": true - }, - "is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - "dev": true - }, - "is-network-error": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.3.1.tgz", - "integrity": "sha512-6QCxa49rQbmUWLfk0nuGqzql9U8uaV2H6279bRErPBHe/109hCzsLUBUHfbEtvLIHBd6hyXbgedBSHevm43Edw==", - "dev": true - }, - "is-number-object": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", - "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", - "dev": true, - "requires": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - } - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true - }, - "is-promise": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", - "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==" - }, - "is-regex": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", - "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", - "dev": true, - "requires": { - "call-bound": "^1.0.2", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - } - }, - "is-set": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", - "dev": true - }, - "is-shared-array-buffer": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", - "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", - "dev": true, - "requires": { - "call-bound": "^1.0.3" - } - }, - "is-string": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", - "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", - "dev": true, - "requires": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - } - }, - "is-symbol": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", - "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", - "dev": true, - "requires": { - "call-bound": "^1.0.2", - "has-symbols": "^1.1.0", - "safe-regex-test": "^1.1.0" - } - }, - "is-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", - "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", - "dev": true, - "requires": { - "which-typed-array": "^1.1.16" - } - }, - "is-unicode-supported": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", - "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==" - }, - "is-weakmap": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", - "dev": true - }, - "is-weakref": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", - "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", - "dev": true, - "requires": { - "call-bound": "^1.0.3" - } - }, - "is-weakset": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", - "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", - "dev": true, - "requires": { - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - } - }, - "is-what": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", - "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", - "dev": true - }, - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "requires": { - "is-docker": "^2.0.0" - } - }, - "isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "iselement": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/iselement/-/iselement-1.1.4.tgz", - "integrity": "sha512-4Q519eWmbHO1pbimiz7H1iJRUHVmAmfh0viSsUD+oAwVO4ntZt7gpf8i8AShVBTyOvRTZNYNBpUxOIvwZR+ffw==" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true - }, - "isomorphic.js": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/isomorphic.js/-/isomorphic.js-0.2.5.tgz", - "integrity": "sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==" - }, - "istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true - }, - "istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "requires": { - "semver": "^7.5.3" - } - } - } - }, - "istanbul-reports": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", - "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "iterator.prototype": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", - "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", - "dev": true, - "requires": { - "define-data-property": "^1.1.4", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.6", - "get-proto": "^1.0.0", - "has-symbols": "^1.1.0", - "set-function-name": "^2.0.2" - } - }, - "jake": { - "version": "10.8.7", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", - "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", - "dev": true, - "requires": { - "async": "^3.2.3", - "chalk": "^4.0.2", - "filelist": "^1.0.4", - "minimatch": "^3.1.2" - } - }, - "jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "dependencies": { - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jiti": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", - "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", - "dev": true - }, - "jose": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/jose/-/jose-6.1.3.tgz", - "integrity": "sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==" - }, - "jquery": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-4.0.0.tgz", - "integrity": "sha512-TXCHVR3Lb6TZdtw1l3RTLf8RBWVGexdxL6AC8/e0xZKEpBflBsjh9/8LXw+dkNFuOyW9B7iB3O1sP7hS0Kiacg==" - }, - "jquery-migrate": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/jquery-migrate/-/jquery-migrate-4.0.2.tgz", - "integrity": "sha512-J15ilpECoAsObLv2robklj0qf1qt9QCnZwwNcJAXkM7dIiOgcac2dqC3HgDtUF0fmRwKZa/ggTkxTj9S4Vk+HQ==" - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", - "requires": { - "argparse": "^2.0.1" - }, - "dependencies": { - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - } - } - }, - "jsdom": { - "version": "29.1.1", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-29.1.1.tgz", - "integrity": "sha512-ECi4Fi2f7BdJtUKTflYRTiaMxIB0O6zfR1fX0GXpUrf6flp8QIYn1UT20YQqdSOfk2dfkCwS8LAFoJDEppNK5Q==", - "dev": true, - "requires": { - "@asamuzakjp/css-color": "^5.1.11", - "@asamuzakjp/dom-selector": "^7.1.1", - "@bramus/specificity": "^2.4.2", - "@csstools/css-syntax-patches-for-csstree": "^1.1.3", - "@exodus/bytes": "^1.15.0", - "css-tree": "^3.2.1", - "data-urls": "^7.0.0", - "decimal.js": "^10.6.0", - "html-encoding-sniffer": "^6.0.0", - "is-potential-custom-element-name": "^1.0.1", - "lru-cache": "^11.3.5", - "parse5": "^8.0.1", - "saxes": "^6.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^6.0.1", - "undici": "^7.25.0", - "w3c-xmlserializer": "^5.0.0", - "webidl-conversions": "^8.0.1", - "whatwg-mimetype": "^5.0.0", - "whatwg-url": "^16.0.1", - "xml-name-validator": "^5.0.0" - }, - "dependencies": { - "entities": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-8.0.0.tgz", - "integrity": "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==", - "dev": true - }, - "lru-cache": { - "version": "11.3.6", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.6.tgz", - "integrity": "sha512-Gf/KoL3C/MlI7Bt0PGI9I+TeTC/I6r/csU58N4BSNc4lppLBeKsOdFYkK+dX0ABDUMJNfCHTyPpzwwO21Awd3A==", - "dev": true - }, - "parse5": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.1.tgz", - "integrity": "sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==", - "dev": true, - "requires": { - "entities": "^8.0.0" - } - }, - "undici": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.25.0.tgz", - "integrity": "sha512-xXnp4kTyor2Zq+J1FfPI6Eq3ew5h6Vl0F/8d9XU5zZQf1tX9s2Su1/3PiMmUANFULpmksxkClamIZcaUqryHsQ==", - "dev": true - } - } - }, - "jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==" - }, - "json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "json-parse-even-better-errors": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-5.0.0.tgz", - "integrity": "sha512-ZF1nxZ28VhQouRWhUcVlUIN3qwSgPuswK05s/HIaoetAoE/9tngVmCHjSxmSQPav1nd+lPtTL0YZ/2AFdR/iYQ==" - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "json-schema-typed": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.2.tgz", - "integrity": "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==" - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" - }, - "jsonc-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", - "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==" - }, - "jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==" - }, - "jsx-ast-utils": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", - "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", - "dev": true, - "requires": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "object.assign": "^4.1.4", - "object.values": "^1.1.6" - } - }, - "karma-source-map-support": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", - "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==", - "dev": true, - "requires": { - "source-map-support": "^0.5.5" - } - }, - "keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "requires": { - "json-buffer": "3.0.1" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "ktx-parse": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ktx-parse/-/ktx-parse-0.7.1.tgz", - "integrity": "sha512-FeA3g56ksdFNwjXJJsc1CCc7co+AJYDp6ipIp878zZ2bU8kWROatLYf39TQEd4/XRSUvBXovQ8gaVKWPXsCLEQ==" - }, - "language-subtag-registry": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", - "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==", - "dev": true - }, - "language-tags": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", - "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", - "dev": true, - "requires": { - "language-subtag-registry": "^0.3.20" - } - }, - "launch-editor": { - "version": "2.13.2", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.13.2.tgz", - "integrity": "sha512-4VVDnbOpLXy/s8rdRCSXb+zfMeFR0WlJWpET1iA9CQdlZDfwyLjUuGQzXU4VeOoey6AicSAluWan7Etga6Kcmg==", - "dev": true, - "requires": { - "picocolors": "^1.1.1", - "shell-quote": "^1.8.3" - } - }, - "laz-perf": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/laz-perf/-/laz-perf-0.0.6.tgz", - "integrity": "sha512-ZBqC+BBlofznDIY3SfjXDBVdIhYfz7bq8HAHztlw4XOnu++nHiWtCGPgzpdeAhPkByc68DaKNy3E3rY4XrdRtQ==" - }, - "less": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/less/-/less-4.4.2.tgz", - "integrity": "sha512-j1n1IuTX1VQjIy3tT7cyGbX7nvQOsFLoIqobZv4ttI5axP923gA44zUj6miiA6R5Aoms4sEGVIIcucXUbRI14g==", - "dev": true, - "requires": { - "copy-anything": "^2.0.1", - "errno": "^0.1.1", - "graceful-fs": "^4.1.2", - "image-size": "~0.5.0", - "make-dir": "^2.1.0", - "mime": "^1.4.1", - "needle": "^3.1.0", - "parse-node-version": "^1.0.1", - "source-map": "~0.6.0", - "tslib": "^2.3.0" - }, - "dependencies": { - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true, - "optional": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true - } - } - }, - "less-loader": { - "version": "12.3.1", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-12.3.1.tgz", - "integrity": "sha512-JZZmG7gMzoDP3VGeEG8Sh6FW5wygB5jYL7Wp29FFihuRTsIBacqO3LbRPr2yStYD11riVf13selLm/CPFRDBRQ==", - "dev": true - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "lib0": { - "version": "0.2.109", - "resolved": "https://registry.npmjs.org/lib0/-/lib0-0.2.109.tgz", - "integrity": "sha512-jP0gbnyW0kwlx1Atc4dcHkBbrVAkdHjuyHxtClUPYla7qCmwIif1qZ6vQeJdR5FrOVdn26HvQT0ko01rgW7/Xw==", - "requires": { - "isomorphic.js": "^0.2.4" - } - }, - "license-webpack-plugin": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-4.0.2.tgz", - "integrity": "sha512-771TFWFD70G1wLTC4oU2Cw4qvtmNrIw+wRvBtn+okgHl7slJVi7zfNcdmqDL72BojM30VNJ2UHylr1o77U37Jw==", - "dev": true, - "requires": { - "webpack-sources": "^3.0.0" - } - }, - "lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "listr2": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-9.0.5.tgz", - "integrity": "sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g==", - "requires": { - "cli-truncate": "^5.0.0", - "colorette": "^2.0.20", - "eventemitter3": "^5.0.1", - "log-update": "^6.1.0", - "rfdc": "^1.4.1", - "wrap-ansi": "^9.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==" - }, - "ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==" - }, - "emoji-regex": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", - "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==" - }, - "eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" - }, - "string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "requires": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - } - }, - "strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", - "requires": { - "ansi-regex": "^6.0.1" - } - }, - "wrap-ansi": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", - "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", - "requires": { - "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" - } - } - } - }, - "lit": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/lit/-/lit-2.8.0.tgz", - "integrity": "sha512-4Sc3OFX9QHOJaHbmTMk28SYgVxLN3ePDjg7hofEft2zWlehFL3LiAuapWc4U/kYwMYJSh2hTCPZ6/LIC7ii0MA==", - "requires": { - "@lit/reactive-element": "^1.6.0", - "lit-element": "^3.3.0", - "lit-html": "^2.8.0" - }, - "dependencies": { - "lit-html": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-2.8.0.tgz", - "integrity": "sha512-o9t+MQM3P4y7M7yNzqAyjp7z+mQGa4NS4CxiyLqFPyFWyc4O+nodLrkrxSaCTrla6M5YOLaT3RpbbqjszB5g3Q==", - "requires": { - "@types/trusted-types": "^2.0.2" - } - } - } - }, - "lit-element": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-3.3.3.tgz", - "integrity": "sha512-XbeRxmTHubXENkV4h8RIPyr8lXc+Ff28rkcQzw3G6up2xg5E8Zu1IgOWIwBLEQsu3cOVFqdYwiVi0hv0SlpqUA==", - "requires": { - "@lit-labs/ssr-dom-shim": "^1.1.0", - "@lit/reactive-element": "^1.3.0", - "lit-html": "^2.8.0" - }, - "dependencies": { - "lit-html": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-2.8.0.tgz", - "integrity": "sha512-o9t+MQM3P4y7M7yNzqAyjp7z+mQGa4NS4CxiyLqFPyFWyc4O+nodLrkrxSaCTrla6M5YOLaT3RpbbqjszB5g3Q==", - "requires": { - "@types/trusted-types": "^2.0.2" - } - } - } - }, - "lit-html": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.3.3.tgz", - "integrity": "sha512-el8M6jK2o3RXBnrSHX3ZKrsN8zEV63pSExTO1wYJz7QndGYZ8353e2a5PPX+qHe2aGayfnchQmkAojaWAREOIA==", - "requires": { - "@types/trusted-types": "^2.0.2" - } - }, - "lmdb": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.5.1.tgz", - "integrity": "sha512-NYHA0MRPjvNX+vSw8Xxg6FLKxzAG+e7Pt8RqAQA/EehzHVXq9SxDqJIN3JL1hK0dweb884y8kIh6rkWvPyg9Wg==", - "dev": true, - "optional": true, - "requires": { - "@harperfast/extended-iterable": "^1.0.3", - "@lmdb/lmdb-darwin-arm64": "3.5.1", - "@lmdb/lmdb-darwin-x64": "3.5.1", - "@lmdb/lmdb-linux-arm": "3.5.1", - "@lmdb/lmdb-linux-arm64": "3.5.1", - "@lmdb/lmdb-linux-x64": "3.5.1", - "@lmdb/lmdb-win32-arm64": "3.5.1", - "@lmdb/lmdb-win32-x64": "3.5.1", - "msgpackr": "^1.11.2", - "node-addon-api": "^6.1.0", - "node-gyp-build-optional-packages": "5.2.2", - "ordered-binary": "^1.5.3", - "weak-lru-cache": "^1.2.2" - } - }, - "loader-runner": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.2.tgz", - "integrity": "sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w==", - "dev": true - }, - "loader-utils": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.3.1.tgz", - "integrity": "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==", - "dev": true - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "lodash": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", - "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==" - }, - "lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==" - }, - "lodash.clonedeepwith": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeepwith/-/lodash.clonedeepwith-4.5.0.tgz", - "integrity": "sha512-QRBRSxhbtsX1nc0baxSkkK5WlVTTm/s48DSukcGcWZwIyI8Zz+lB+kFiELJXtzfH4Aj6kMWQ1VWW4U5uUDgZMA==" - }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true - }, - "lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==" - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" - }, - "lodash.take": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.take/-/lodash.take-4.1.1.tgz", - "integrity": "sha512-3T118EQjnhr9c0aBKCCMhQn0OBwRMz/O2WaRU6VH0TSKoMCmFtUpr0iUp+eWKODEiRXtYOK7R7SiBneKHdk7og==" - }, - "log-symbols": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-7.0.1.tgz", - "integrity": "sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==", - "requires": { - "is-unicode-supported": "^2.0.0", - "yoctocolors": "^2.1.1" - } - }, - "log-update": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", - "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", - "requires": { - "ansi-escapes": "^7.0.0", - "cli-cursor": "^5.0.0", - "slice-ansi": "^7.1.0", - "strip-ansi": "^7.1.0", - "wrap-ansi": "^9.0.0" - }, - "dependencies": { - "ansi-escapes": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", - "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", - "requires": { - "environment": "^1.0.0" - } - }, - "ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==" - }, - "ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==" - }, - "emoji-regex": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", - "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==" - }, - "string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "requires": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - } - }, - "strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "requires": { - "ansi-regex": "^6.0.1" - } - }, - "wrap-ansi": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", - "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", - "requires": { - "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" - } - } - } - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "requires": { - "yallist": "^3.0.2" - } - }, - "lru-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", - "integrity": "sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==", - "requires": { - "es5-ext": "~0.10.2" - } - }, - "luxon": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.7.2.tgz", - "integrity": "sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==" - }, - "lz-string": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", - "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", - "dev": true - }, - "magic-string": { - "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", - "requires": { - "@jridgewell/sourcemap-codec": "^1.5.5" - } - }, - "magicast": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.2.tgz", - "integrity": "sha512-E3ZJh4J3S9KfwdjZhe2afj6R9lGIN5Pher1pF39UGrXRqq/VDaGVIGN13BjHd2u8B61hArAGOnso7nBOouW3TQ==", - "dev": true, - "requires": { - "@babel/parser": "^7.29.0", - "@babel/types": "^7.29.0", - "source-map-js": "^1.2.1" - } - }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "optional": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "dependencies": { - "semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "optional": true - } - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "make-fetch-happen": { - "version": "15.0.5", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-15.0.5.tgz", - "integrity": "sha512-uCbIa8jWWmQZt4dSnEStkVC6gdakiinAm4PiGsywIkguF0eWMdcjDz0ECYhUolFU3pFLOev9VNPCEygydXnddg==", - "requires": { - "@gar/promise-retry": "^1.0.0", - "@npmcli/agent": "^4.0.0", - "@npmcli/redact": "^4.0.0", - "cacache": "^20.0.1", - "http-cache-semantics": "^4.1.1", - "minipass": "^7.0.2", - "minipass-fetch": "^5.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^1.0.0", - "proc-log": "^6.0.0", - "ssri": "^13.0.0" - }, - "dependencies": { - "negotiator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", - "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==" - } - } - }, - "make-plural": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/make-plural/-/make-plural-7.3.0.tgz", - "integrity": "sha512-/K3BC0KIsO+WK2i94LkMPv3wslMrazrQhfi5We9fMbLlLjzoOSJWr7TAdupLlDWaJcWxwoNosBkhFDejiu5VDw==" - }, - "marked": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", - "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==" - }, - "math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==" - }, - "mdn-data": { - "version": "2.27.1", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", - "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", - "dev": true - }, - "mdx-embed": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/mdx-embed/-/mdx-embed-1.1.2.tgz", - "integrity": "sha512-AAronHC/sh4py+RhJOuX8+9+lyUbJsmCLquXNPCEHZ0llPWjMuwls77hII/lWI2kwBSPZPahrqti8kGTv1pi1w==" - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "dev": true - }, - "memfs": { - "version": "4.57.2", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.57.2.tgz", - "integrity": "sha512-2nWzSsJzrukurSDna4Z0WywuScK4Id3tSKejgu74u8KCdW4uNrseKRSIDg75C6Yw5ZRqBe0F0EtMNlTbUq8bAQ==", - "dev": true, - "requires": { - "@jsonjoy.com/fs-core": "4.57.2", - "@jsonjoy.com/fs-fsa": "4.57.2", - "@jsonjoy.com/fs-node": "4.57.2", - "@jsonjoy.com/fs-node-builtins": "4.57.2", - "@jsonjoy.com/fs-node-to-fsa": "4.57.2", - "@jsonjoy.com/fs-node-utils": "4.57.2", - "@jsonjoy.com/fs-print": "4.57.2", - "@jsonjoy.com/fs-snapshot": "4.57.2", - "@jsonjoy.com/json-pack": "^1.11.0", - "@jsonjoy.com/util": "^1.9.0", - "glob-to-regex.js": "^1.0.1", - "thingies": "^2.5.0", - "tree-dump": "^1.0.3", - "tslib": "^2.0.0" - } - }, - "memoizee": { - "version": "0.3.10", - "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.3.10.tgz", - "integrity": "sha512-LLzVUuWwGBKK188spgOK/ukrp5zvd9JGsiLDH41pH9vt5jvhZfsu5pxDuAnYAMG8YEGce72KO07sSBy9KkvOfw==", - "requires": { - "d": "~0.1.1", - "es5-ext": "~0.10.11", - "es6-weak-map": "~0.1.4", - "event-emitter": "~0.3.4", - "lru-queue": "0.1", - "next-tick": "~0.2.2", - "timers-ext": "0.1" - }, - "dependencies": { - "next-tick": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-0.2.2.tgz", - "integrity": "sha512-f7h4svPtl+QidoBv4taKXUjJ70G2asaZ8G28nS0OkqaalX8dwwrtWtyxEDPK62AC00ur/+/E0pUwBwY5EPn15Q==" - } - } - }, - "merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", - "dev": true - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "dev": true - }, - "micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "requires": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - } - }, - "mime": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-4.1.0.tgz", - "integrity": "sha512-X5ju04+cAzsojXKes0B/S4tcYtFAJ6tTMuSPBEn9CPGlrWr8Fiw7qYeLT0XyH80HSoAoqWCaz+MWKh22P7G1cw==" - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "requires": { - "mime-db": "1.52.0" - } - }, - "mimic-function": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", - "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==" - }, - "min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true - }, - "mini-css-extract-plugin": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.10.0.tgz", - "integrity": "sha512-540P2c5dYnJlyJxTaSloliZexv8rji6rY8FhQN+WF/82iHQfA23j/xtJx97L+mXOML27EqksSek/g4eK7jaL3g==", - "dev": true, - "requires": { - "schema-utils": "^4.0.0", - "tapable": "^2.2.1" - }, - "dependencies": { - "ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.3" - } - }, - "schema-utils": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", - "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - } - } - } - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" - }, - "minipass": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", - "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==" - }, - "minipass-collect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", - "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", - "requires": { - "minipass": "^7.0.3" - } - }, - "minipass-fetch": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-5.0.2.tgz", - "integrity": "sha512-2d0q2a8eCi2IRg/IGubCNRJoYbA1+YPXAzQVRFmB45gdGZafyivnZ5YSEfo3JikbjGxOdntGFvBQGqaSMXlAFQ==", - "requires": { - "iconv-lite": "^0.7.2", - "minipass": "^7.0.3", - "minipass-sized": "^2.0.0", - "minizlib": "^3.0.1" - }, - "dependencies": { - "iconv-lite": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", - "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - } - } - }, - "minipass-flush": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.7.tgz", - "integrity": "sha512-TbqTz9cUwWyHS2Dy89P3ocAGUGxKjjLuR9z8w4WUTGAVgEj17/4nhgo2Du56i0Fm3Pm30g4iA8Lcqctc76jCzA==", - "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } - } - }, - "minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } - } - }, - "minipass-sized": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-2.0.0.tgz", - "integrity": "sha512-zSsHhto5BcUVM2m1LurnXY6M//cGhVaegT71OfOXoprxT6o780GZd792ea6FfrQkuU4usHZIUczAQMRUE2plzA==", - "requires": { - "minipass": "^7.1.2" - } - }, - "minizlib": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", - "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", - "requires": { - "minipass": "^7.1.2" - } - }, - "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "requires": { - "minimist": "^1.2.6" - } - }, - "moment": { - "version": "2.30.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", - "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==" - }, - "moment-timezone": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.6.2.tgz", - "integrity": "sha512-lDsQv8FoGdBUdf0+TjGsq2orxKuXdwFlQ6Zw6TX3xIcTwTfEpCLyKqvEauvCHJ8iu3KBV8+uPhlv70YsNGdUBQ==", - "requires": { - "moment": "^2.29.4" - } - }, - "mousetrap": { - "version": "1.6.5", - "resolved": "https://registry.npmjs.org/mousetrap/-/mousetrap-1.6.5.tgz", - "integrity": "sha512-QNo4kEepaIBwiT8CDhP98umTetp+JNfQYBWvC1pc6/OAibuXtRcxZ58Qz8skvEHYvURne/7R8T5VoOI7rDsEUA==" - }, - "mrmime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", - "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", - "dev": true - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "msgpackr": { - "version": "1.11.10", - "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.11.10.tgz", - "integrity": "sha512-iCZNq+HszvF+fC3anCm4nBmWEnbeIAfpDs6IStAEKhQ2YSgkjzVG2FF9XJqwwQh5bH3N9OUTUt4QwVN6MLMLtA==", - "dev": true, - "optional": true, - "requires": { - "msgpackr-extract": "^3.0.2" - } - }, - "msgpackr-extract": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.3.tgz", - "integrity": "sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==", - "dev": true, - "optional": true, - "requires": { - "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.3", - "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.3", - "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.3", - "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.3", - "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.3", - "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.3", - "node-gyp-build-optional-packages": "5.2.2" - } - }, - "multicast-dns": { - "version": "7.2.5", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", - "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", - "dev": true, - "requires": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" - } - }, - "mute-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", - "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==" - }, - "nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==" - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "needle": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/needle/-/needle-3.3.1.tgz", - "integrity": "sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==", - "dev": true, - "optional": true, - "requires": { - "iconv-lite": "^0.6.3", - "sax": "^1.2.4" - }, - "dependencies": { - "iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - } - } - }, - "negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true - }, - "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "next-tick": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", - "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" - }, - "ng-dynamic-component": { - "version": "10.7.0", - "resolved": "https://registry.npmjs.org/ng-dynamic-component/-/ng-dynamic-component-10.7.0.tgz", - "integrity": "sha512-shkht4L2nA632qo5GNendZdQXoHUBuKz6SLLh20qi5oESBm3b5AWyhHu0fb/7tb+f+zAcwtVVe1M0819/bnK9A==", - "requires": { - "tslib": "^2.0.0" - } - }, - "ng2-charts": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/ng2-charts/-/ng2-charts-10.0.0.tgz", - "integrity": "sha512-mdL75XJrk/0s0YO2ySPQpAHPja85ECDEGNWFlcElJiy/bYliTNGEpeCtctAqZuozTff/E2CwGjyfPFM1ScP2og==", - "requires": { - "es-toolkit": "^1.39.7", - "tslib": "^2.3.0" - } - }, - "ng2-dragula": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/ng2-dragula/-/ng2-dragula-6.0.0.tgz", - "integrity": "sha512-DRWw0rTZrpIReecgE4771flOrpa3rgSkY3TDyZBNPBEkPIAFOePfPm9W96IhlWEXgQEL7fjWaz2HyZI89YGDUg==", - "requires": { - "tslib": "^2.3.0" - } - }, - "ngx-cookie-service": { - "version": "21.3.1", - "resolved": "https://registry.npmjs.org/ngx-cookie-service/-/ngx-cookie-service-21.3.1.tgz", - "integrity": "sha512-8VEA2W7W2W3yPXhemJoVtXxr+3WW2DNLV4OaCIKDzLdzUUxJ6SzPHMmXXa26Pg8pa+fZxHK1hZfqJfUxr9RMBw==", - "requires": { - "tslib": "^2.8.1" - } - }, - "node-addon-api": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", - "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", - "dev": true, - "optional": true - }, - "node-gyp": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-12.3.0.tgz", - "integrity": "sha512-QNcUWM+HgJplcPzBvFBZ9VXacyGZ4+VTOb80PwWR+TlVzoHbRKULNEzpRsnaoxG3Wzr7Qh7BYxGDU3CbKib2Yg==", - "requires": { - "env-paths": "^2.2.0", - "exponential-backoff": "^3.1.1", - "graceful-fs": "^4.2.6", - "nopt": "^9.0.0", - "proc-log": "^6.0.0", - "semver": "^7.3.5", - "tar": "^7.5.4", - "tinyglobby": "^0.2.12", - "undici": "^6.25.0", - "which": "^6.0.0" - }, - "dependencies": { - "isexe": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-4.0.0.tgz", - "integrity": "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==" - }, - "undici": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.25.0.tgz", - "integrity": "sha512-ZgpWDC5gmNiuY9CnLVXEH8rl50xhRCuLNA97fAUnKi8RRuV4E6KG31pDTsLVUKnohJE0I3XDrTeEydAXRw47xg==" - }, - "which": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/which/-/which-6.0.1.tgz", - "integrity": "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==", - "requires": { - "isexe": "^4.0.0" - } - } - } - }, - "node-gyp-build-optional-packages": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz", - "integrity": "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==", - "dev": true, - "optional": true, - "requires": { - "detect-libc": "^2.0.1" - } - }, - "node-releases": { - "version": "2.0.47", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.47.tgz", - "integrity": "sha512-Uzmd6LXpouKo8EUK68IjH4+E01w/hXyV3R3g/geCJo+rXLNfh1xucB+LOzYEOQPSiUK3h/xZf0cQGcSsmyL2Og==" - }, - "nopt": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-9.0.0.tgz", - "integrity": "sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw==", - "requires": { - "abbrev": "^4.0.0" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "npm-bundled": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-5.0.0.tgz", - "integrity": "sha512-JLSpbzh6UUXIEoqPsYBvVNVmyrjVZ1fzEFbqxKkTJQkWBO3xFzFT+KDnSKQWwOQNbuWRwt5LSD6HOTLGIWzfrw==", - "requires": { - "npm-normalize-package-bin": "^5.0.0" - } - }, - "npm-install-checks": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-8.0.0.tgz", - "integrity": "sha512-ScAUdMpyzkbpxoNekQ3tNRdFI8SJ86wgKZSQZdUxT+bj0wVFpsEMWnkXP0twVe1gJyNF5apBWDJhhIbgrIViRA==", - "requires": { - "semver": "^7.1.1" - } - }, - "npm-normalize-package-bin": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-5.0.0.tgz", - "integrity": "sha512-CJi3OS4JLsNMmr2u07OJlhcrPxCeOeP/4xq67aWNai6TNWWbTrlNDgl8NcFKVlcBKp18GPj+EzbNIgrBfZhsag==" - }, - "npm-package-arg": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-13.0.2.tgz", - "integrity": "sha512-IciCE3SY3uE84Ld8WZU23gAPPV9rIYod4F+rc+vJ7h7cwAJt9Vk6TVsK60ry7Uj3SRS3bqRRIGuTp9YVlk6WNA==", - "requires": { - "hosted-git-info": "^9.0.0", - "proc-log": "^6.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^7.0.0" - } - }, - "npm-packlist": { - "version": "10.0.4", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-10.0.4.tgz", - "integrity": "sha512-uMW73iajD8hiH4ZBxEV3HC+eTnppIqwakjOYuvgddnalIw2lJguKviK1pcUJDlIWm1wSJkchpDZDSVVsZEYRng==", - "requires": { - "ignore-walk": "^8.0.0", - "proc-log": "^6.0.0" - } - }, - "npm-pick-manifest": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-11.0.3.tgz", - "integrity": "sha512-buzyCfeoGY/PxKqmBqn1IUJrZnUi1VVJTdSSRPGI60tJdUhUoSQFhs0zycJokDdOznQentgrpf8LayEHyyYlqQ==", - "requires": { - "npm-install-checks": "^8.0.0", - "npm-normalize-package-bin": "^5.0.0", - "npm-package-arg": "^13.0.0", - "semver": "^7.3.5" - } - }, - "npm-registry-fetch": { - "version": "19.1.1", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-19.1.1.tgz", - "integrity": "sha512-TakBap6OM1w0H73VZVDf44iFXsOS3h+L4wVMXmbWOQroZgFhMch0juN6XSzBNlD965yIKvWg2dfu7NSiaYLxtw==", - "requires": { - "@npmcli/redact": "^4.0.0", - "jsonparse": "^1.3.1", - "make-fetch-happen": "^15.0.0", - "minipass": "^7.0.2", - "minipass-fetch": "^5.0.0", - "minizlib": "^3.0.1", - "npm-package-arg": "^13.0.0", - "proc-log": "^6.0.0" - } - }, - "nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dev": true, - "requires": { - "boolbase": "^1.0.0" - } - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" - }, - "object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==" - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object.assign": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", - "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", - "dev": true, - "requires": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0", - "has-symbols": "^1.1.0", - "object-keys": "^1.1.1" - } - }, - "object.entries": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", - "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", - "dev": true, - "requires": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.1.1" - } - }, - "object.fromentries": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", - "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" - } - }, - "object.groupby": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", - "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2" - } - }, - "object.values": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", - "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", - "dev": true, - "requires": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - } - }, - "observable-array": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/observable-array/-/observable-array-0.0.4.tgz", - "integrity": "sha512-sZYd1/Vw5jIXkmV6IGe/JU0Ked5RejTGbBJju6nZorNQXRH41XN5NRMVfC4O4hdXTV89LgnFGvljHrWx4/Q+/A==", - "requires": { - "d": "^0.1.1", - "es5-ext": "^0.10.8", - "event-emitter": "^0.3.4", - "memoizee": "^0.3.9", - "observable-value": "0.0.5" - } - }, - "observable-value": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/observable-value/-/observable-value-0.0.5.tgz", - "integrity": "sha512-A550SjCfty4Kqe9lWx/G0y7H0T+V6FXs/rFxjGUoxsjh4TRp/ykD6atHTvNDbEPfh9OG9BLTn1CG2b1IJNSOWg==", - "requires": { - "d": "^0.1.1", - "es5-ext": "^0.10.8", - "es6-symbol": "3", - "event-emitter": "^0.3.4", - "memoizee": "^0.3.9" - } - }, - "obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true - }, - "obug": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", - "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", - "dev": true - }, - "on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", - "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "requires": { - "wrappy": "1" - } - }, - "op-blocknote-extensions": { - "version": "https://github.com/opf/op-blocknote-extensions/releases/download/v0.1.1/op-blocknote-extensions-0.1.1.tgz", - "integrity": "sha512-4VO5Qf51Z8WQGD24AYhNmGHGGwnfnB3q8KwL48hWTifZq/9IL5rKpwKB+QkxvVUCaT8iwFYwB6QPzGgLJKRVFA==", - "requires": { - "@primer/octicons-react": "^19.20.0", - "i18next": "^25.6.3", - "react-i18next": "^16.3.5", - "styled-components": "^6.1.19" - } - }, - "open": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", - "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", - "dev": true, - "requires": { - "default-browser": "^5.2.1", - "define-lazy-prop": "^3.0.0", - "is-inside-container": "^1.0.0", - "wsl-utils": "^0.1.0" - } - }, - "openapi-data-validator": { - "version": "2.0.54", - "resolved": "https://registry.npmjs.org/openapi-data-validator/-/openapi-data-validator-2.0.54.tgz", - "integrity": "sha512-JsqqILn+NwgsjA2wJsY+qvVqtkaWz7cnf7gbT+1Nm54+NSsQNguV+fd3Y6WefTkLug6PLws+zylfZ7QjD0s71Q==", - "requires": { - "@apidevtools/json-schema-ref-parser": "^9.0", - "ajv": "^8.5", - "ajv-formats": "^2.1", - "content-type": "^1.0", - "lodash.clonedeep": "^4.5", - "lodash.get": "^4.4", - "media-typer": "^1.1", - "require-from-string": "^2.0.2" - }, - "dependencies": { - "media-typer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==" - } - } - }, - "openapi-explorer": { - "version": "2.4.799", - "resolved": "https://registry.npmjs.org/openapi-explorer/-/openapi-explorer-2.4.799.tgz", - "integrity": "sha512-HIfQ2XMBZ0eCKi0hUgdEHP4yRmNkkwy4t0OQpXtJiRBNr3T/Q/1/49iNOGlE77ehLLS7RWlx7I5tk7Og3oupHA==", - "requires": { - "@authress/login": "^2.0", - "base64url": "^3.0.1", - "buffer": "^6.0.3", - "color": "^4.2.3", - "i18next": "^21.9.0", - "json5": "^2.2.3", - "lit": "^2.3.1", - "lodash.clonedeep": "^4.5.0", - "lodash.merge": "^4.6.2", - "marked": "^4.0.16", - "openapi-data-validator": "^2.0.40", - "openapi-resolver": "^4.1.71", - "prismjs": "^1.29.0", - "randexp": "^0.5.3", - "toposort": "^2.0.2", - "xml-but-prettier": "^1.0.1" - }, - "dependencies": { - "i18next": { - "version": "21.10.0", - "resolved": "https://registry.npmjs.org/i18next/-/i18next-21.10.0.tgz", - "integrity": "sha512-YeuIBmFsGjUfO3qBmMOc0rQaun4mIpGKET5WDwvu8lU7gvwpcariZLNtL0Fzj+zazcHUrlXHiptcFhBMFaxzfg==", - "requires": { - "@babel/runtime": "^7.17.2" - } - } - } - }, - "openapi-resolver": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/openapi-resolver/-/openapi-resolver-4.2.4.tgz", - "integrity": "sha512-AjR/hIVI5qfyI6VmTjpQIXjTmxmWjqXqxSqkRdeWQrUATYsTVNQ3uSxK8NJ7QEXwfiKyID/iWf9iPuBxoWWoiA==", - "requires": { - "@apidevtools/json-schema-ref-parser": "^9.0.9", - "@babel/runtime-corejs3": "^7.18.9", - "js-yaml": "^4.1.1", - "lodash.clonedeepwith": "^4.5.0" - } - }, - "opener": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", - "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==" - }, - "optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - } - }, - "ora": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-9.3.0.tgz", - "integrity": "sha512-lBX72MWFduWEf7v7uWf5DHp9Jn5BI8bNPGuFgtXMmr2uDz2Gz2749y3am3agSDdkhHPHYmmxEGSKH85ZLGzgXw==", - "requires": { - "chalk": "^5.6.2", - "cli-cursor": "^5.0.0", - "cli-spinners": "^3.2.0", - "is-interactive": "^2.0.0", - "is-unicode-supported": "^2.1.0", - "log-symbols": "^7.0.1", - "stdin-discarder": "^0.3.1", - "string-width": "^8.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==" - }, - "chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==" - }, - "string-width": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.1.tgz", - "integrity": "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA==", - "requires": { - "get-east-asian-width": "^1.5.0", - "strip-ansi": "^7.1.2" - } - }, - "strip-ansi": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", - "requires": { - "ansi-regex": "^6.2.2" - } - } - } - }, - "ordered-binary": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.6.1.tgz", - "integrity": "sha512-QkCdPooczexPLiXIrbVOPYkR3VO3T6v2OyKRkR1Xbhpy7/LAVXwahnRCgRp78Oe/Ehf0C/HATAxfSr6eA1oX+w==", - "dev": true, - "optional": true - }, - "orderedmap": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/orderedmap/-/orderedmap-2.1.1.tgz", - "integrity": "sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==" - }, - "own-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", - "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", - "dev": true, - "requires": { - "get-intrinsic": "^1.2.6", - "object-keys": "^1.1.1", - "safe-push-apply": "^1.0.0" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "p-map": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.4.tgz", - "integrity": "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==" - }, - "p-retry": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz", - "integrity": "sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==", - "dev": true, - "requires": { - "@types/retry": "0.12.2", - "is-network-error": "^1.0.0", - "retry": "^0.13.1" - }, - "dependencies": { - "retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "dev": true - } - } - }, - "pacote": { - "version": "21.3.1", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-21.3.1.tgz", - "integrity": "sha512-O0EDXi85LF4AzdjG74GUwEArhdvawi/YOHcsW6IijKNj7wm8IvEWNF5GnfuxNpQ/ZpO3L37+v8hqdVh8GgWYhg==", - "requires": { - "@npmcli/git": "^7.0.0", - "@npmcli/installed-package-contents": "^4.0.0", - "@npmcli/package-json": "^7.0.0", - "@npmcli/promise-spawn": "^9.0.0", - "@npmcli/run-script": "^10.0.0", - "cacache": "^20.0.0", - "fs-minipass": "^3.0.0", - "minipass": "^7.0.2", - "npm-package-arg": "^13.0.0", - "npm-packlist": "^10.0.1", - "npm-pick-manifest": "^11.0.1", - "npm-registry-fetch": "^19.0.0", - "proc-log": "^6.0.0", - "promise-retry": "^2.0.1", - "sigstore": "^4.0.0", - "ssri": "^13.0.0", - "tar": "^7.4.3" - } - }, - "pako": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", - "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==" - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "dependencies": { - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - } - } - }, - "parse-node-version": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", - "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", - "dev": true - }, - "parse5-html-rewriting-stream": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-8.0.0.tgz", - "integrity": "sha512-wzh11mj8KKkno1pZEu+l2EVeWsuKDfR5KNWZOTsslfUX8lPDZx77m9T0kIoAVkFtD1nx6YF8oh4BnPHvxMtNMw==", - "requires": { - "entities": "^6.0.0", - "parse5": "^8.0.0", - "parse5-sax-parser": "^8.0.0" - }, - "dependencies": { - "entities": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==" - }, - "parse5": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.0.tgz", - "integrity": "sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==", - "requires": { - "entities": "^6.0.0" - } - } - } - }, - "parse5-sax-parser": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-8.0.0.tgz", - "integrity": "sha512-/dQ8UzHZwnrzs3EvDj6IkKrD/jIZyTlB+8XrHJvcjNgRdmWruNdN9i9RK/JtxakmlUdPwKubKPTCqvbTgzGhrw==", - "requires": { - "parse5": "^8.0.0" - }, - "dependencies": { - "entities": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==" - }, - "parse5": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.0.tgz", - "integrity": "sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==", - "requires": { - "entities": "^6.0.0" - } - } - } - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "path-scurry": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", - "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", - "requires": { - "lru-cache": "^11.0.0", - "minipass": "^7.1.2" - }, - "dependencies": { - "lru-cache": { - "version": "11.5.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.1.tgz", - "integrity": "sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==" - } - } - }, - "path-to-regexp": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.13.tgz", - "integrity": "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==", - "dev": true - }, - "pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "dev": true - }, - "picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, - "optional": true - }, - "piscina": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/piscina/-/piscina-5.1.4.tgz", - "integrity": "sha512-7uU4ZnKeQq22t9AsmHGD2w4OYQGonwFnTypDypaWi7Qr2EvQIFVtG8J5D/3bE7W123Wdc9+v4CZDu5hJXVCtBg==", - "dev": true, - "requires": { - "@napi-rs/nice": "^1.0.4" - } - }, - "pkce-challenge": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.1.tgz", - "integrity": "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==" - }, - "pkijs": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/pkijs/-/pkijs-3.4.0.tgz", - "integrity": "sha512-emEcLuomt2j03vxD54giVB4SxTjnsqkU692xZOZXHDVoYyypEm+b3jpiTcc+Cf+myooc+/Ly0z01jqeNHVgJGw==", - "dev": true, - "requires": { - "@noble/hashes": "1.4.0", - "asn1js": "^3.0.6", - "bytestreamjs": "^2.0.1", - "pvtsutils": "^1.3.6", - "pvutils": "^1.1.3", - "tslib": "^2.8.1" - } - }, - "playwright": { - "version": "1.60.0", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.60.0.tgz", - "integrity": "sha512-hheHdokM8cdqCb0lcE3s+zT4t4W+vvjpGxsZlDnikarzx8tSzMebh3UiFtgqwFwnTnjYQcsyMF8ei2mCO/tpeA==", - "dev": true, - "requires": { - "fsevents": "2.3.2", - "playwright-core": "1.60.0" - }, - "dependencies": { - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - } - } - }, - "playwright-core": { - "version": "1.60.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.60.0.tgz", - "integrity": "sha512-9bW6zvX/m0lEbgTKJ6YppOKx8H3VOPBMOCFh2irXFOT4BbHgrx5hPjwJYLT40Lu+4qtD36qKc/Hn56StUW57IA==", - "dev": true - }, - "pngjs": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-7.0.0.tgz", - "integrity": "sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==", - "dev": true - }, - "portfinder": { - "version": "1.0.32", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz", - "integrity": "sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==", - "requires": { - "async": "^2.6.4", - "debug": "^3.2.7", - "mkdirp": "^0.5.6" - }, - "dependencies": { - "async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "requires": { - "lodash": "^4.17.14" - } - }, - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "possible-typed-array-names": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", - "dev": true - }, - "postcss": { - "version": "8.5.12", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.12.tgz", - "integrity": "sha512-W62t/Se6rA0Az3DfCL0AqJwXuKwBeYg6nOaIgzP+xZ7N5BFCI7DYi1qs6ygUYT6rvfi6t9k65UMLJC+PHZpDAA==", - "dev": true, - "requires": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - } - }, - "postcss-loader": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-8.2.0.tgz", - "integrity": "sha512-tHX+RkpsXVcc7st4dSdDGliI+r4aAQDuv+v3vFYHixb6YgjreG5AG4SEB0kDK8u2s6htqEEpKlkhSBUTvWKYnA==", - "dev": true, - "requires": { - "cosmiconfig": "^9.0.0", - "jiti": "^2.5.1", - "semver": "^7.6.2" - } - }, - "postcss-media-query-parser": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", - "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", - "dev": true - }, - "postcss-modules-extract-imports": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", - "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", - "dev": true - }, - "postcss-modules-local-by-default": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", - "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", - "dev": true, - "requires": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^7.0.0", - "postcss-value-parser": "^4.1.0" - } - }, - "postcss-modules-scope": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", - "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", - "dev": true, - "requires": { - "postcss-selector-parser": "^7.0.0" - } - }, - "postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "dev": true, - "requires": { - "icss-utils": "^5.0.0" - } - }, - "postcss-safe-parser": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.1.tgz", - "integrity": "sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==", - "dev": true - }, - "postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - } - }, - "postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" - }, - "powershell-utils": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/powershell-utils/-/powershell-utils-0.1.0.tgz", - "integrity": "sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==", - "dev": true - }, - "preact": { - "version": "10.12.1", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.12.1.tgz", - "integrity": "sha512-l8386ixSsBdbreOAkqtrwqHwdvR35ID8c3rKPa8lCWuO86dBi32QWHV4vfsZK1utLLFMvw+Z5Ad4XLkZzchscg==" - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - } - } - }, - "prismjs": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", - "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==" - }, - "proc-log": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-6.1.0.tgz", - "integrity": "sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==" - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "promise-retry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", - "requires": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - } - }, - "prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dev": true, - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - }, - "dependencies": { - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true - } - } - }, - "prosemirror-changeset": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/prosemirror-changeset/-/prosemirror-changeset-2.4.1.tgz", - "integrity": "sha512-96WBLhOaYhJ+kPhLg3uW359Tz6I/MfcrQfL4EGv4SrcqKEMC1gmoGrXHecPE8eOwTVCJ4IwgfzM8fFad25wNfw==", - "requires": { - "prosemirror-transform": "^1.0.0" - } - }, - "prosemirror-commands": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.7.1.tgz", - "integrity": "sha512-rT7qZnQtx5c0/y/KlYaGvtG411S97UaL6gdp6RIZ23DLHanMYLyfGBV5DtSnZdthQql7W+lEVbpSfwtO8T+L2w==", - "requires": { - "prosemirror-model": "^1.0.0", - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.10.2" - } - }, - "prosemirror-dropcursor": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/prosemirror-dropcursor/-/prosemirror-dropcursor-1.8.2.tgz", - "integrity": "sha512-CCk6Gyx9+Tt2sbYk5NK0nB1ukHi2ryaRgadV/LvyNuO3ena1payM2z6Cg0vO1ebK8cxbzo41ku2DE5Axj1Zuiw==", - "requires": { - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.1.0", - "prosemirror-view": "^1.1.0" - } - }, - "prosemirror-gapcursor": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/prosemirror-gapcursor/-/prosemirror-gapcursor-1.4.1.tgz", - "integrity": "sha512-pMdYaEnjNMSwl11yjEGtgTmLkR08m/Vl+Jj443167p9eB3HVQKhYCc4gmHVDsLPODfZfjr/MmirsdyZziXbQKw==", - "requires": { - "prosemirror-keymap": "^1.0.0", - "prosemirror-model": "^1.0.0", - "prosemirror-state": "^1.0.0", - "prosemirror-view": "^1.0.0" - } - }, - "prosemirror-highlight": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/prosemirror-highlight/-/prosemirror-highlight-0.15.1.tgz", - "integrity": "sha512-KcJUGNgqLED+eK/cisNtY3M+eDNLkZyWCdyi7B3RoW3rKHnhkKawnJAcr9p1F/e3q+oDB5Y5OiIrC11bxP7tFA==" - }, - "prosemirror-history": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/prosemirror-history/-/prosemirror-history-1.5.0.tgz", - "integrity": "sha512-zlzTiH01eKA55UAf1MEjtssJeHnGxO0j4K4Dpx+gnmX9n+SHNlDqI2oO1Kv1iPN5B1dm5fsljCfqKF9nFL6HRg==", - "requires": { - "prosemirror-state": "^1.2.2", - "prosemirror-transform": "^1.0.0", - "prosemirror-view": "^1.31.0", - "rope-sequence": "^1.3.0" - } - }, - "prosemirror-inputrules": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/prosemirror-inputrules/-/prosemirror-inputrules-1.5.1.tgz", - "integrity": "sha512-7wj4uMjKaXWAQ1CDgxNzNtR9AlsuwzHfdFH1ygEHA2KHF2DOEaXl1CJfNPAKCg9qNEh4rum975QLaCiQPyY6Fw==", - "requires": { - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.0.0" - } - }, - "prosemirror-keymap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/prosemirror-keymap/-/prosemirror-keymap-1.2.3.tgz", - "integrity": "sha512-4HucRlpiLd1IPQQXNqeo81BGtkY8Ai5smHhKW9jjPKRc2wQIxksg7Hl1tTI2IfT2B/LgX6bfYvXxEpJl7aKYKw==", - "requires": { - "prosemirror-state": "^1.0.0", - "w3c-keyname": "^2.2.0" - } - }, - "prosemirror-model": { - "version": "1.25.4", - "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.25.4.tgz", - "integrity": "sha512-PIM7E43PBxKce8OQeezAs9j4TP+5yDpZVbuurd1h5phUxEKIu+G2a+EUZzIC5nS1mJktDJWzbqS23n1tsAf5QA==", - "requires": { - "orderedmap": "^2.0.0" - } - }, - "prosemirror-schema-list": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/prosemirror-schema-list/-/prosemirror-schema-list-1.5.1.tgz", - "integrity": "sha512-927lFx/uwyQaGwJxLWCZRkjXG0p48KpMj6ueoYiu4JX05GGuGcgzAy62dfiV8eFZftgyBUvLx76RsMe20fJl+Q==", - "requires": { - "prosemirror-model": "^1.0.0", - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.7.3" - } - }, - "prosemirror-state": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.4.4.tgz", - "integrity": "sha512-6jiYHH2CIGbCfnxdHbXZ12gySFY/fz/ulZE333G6bPqIZ4F+TXo9ifiR86nAHpWnfoNjOb3o5ESi7J8Uz1jXHw==", - "requires": { - "prosemirror-model": "^1.0.0", - "prosemirror-transform": "^1.0.0", - "prosemirror-view": "^1.27.0" - } - }, - "prosemirror-tables": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/prosemirror-tables/-/prosemirror-tables-1.8.5.tgz", - "integrity": "sha512-V/0cDCsHKHe/tfWkeCmthNUcEp1IVO3p6vwN8XtwE9PZQLAZJigbw3QoraAdfJPir4NKJtNvOB8oYGKRl+t0Dw==", - "requires": { - "prosemirror-keymap": "^1.2.3", - "prosemirror-model": "^1.25.4", - "prosemirror-state": "^1.4.4", - "prosemirror-transform": "^1.10.5", - "prosemirror-view": "^1.41.4" - } - }, - "prosemirror-transform": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.12.0.tgz", - "integrity": "sha512-GxboyN4AMIsoHNtz5uf2r2Ru551i5hWeCMD6E2Ib4Eogqoub0NflniaBPVQ4MrGE5yZ8JV9tUHg9qcZTTrcN4w==", - "requires": { - "prosemirror-model": "^1.21.0" - } - }, - "prosemirror-view": { - "version": "1.41.8", - "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.41.8.tgz", - "integrity": "sha512-TnKDdohEatgyZNGCDWIdccOHXhYloJwbwU+phw/a23KBvJIR9lWQWW7WHHK3vBdOLDNuF7TaX98GObUZOWkOnA==", - "requires": { - "prosemirror-model": "^1.20.0", - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.1.0" - } - }, - "proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "requires": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "dependencies": { - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" - } - } - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", - "dev": true, - "optional": true - }, - "punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true - }, - "pvtsutils": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.6.tgz", - "integrity": "sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==", - "dev": true, - "requires": { - "tslib": "^2.8.1" - } - }, - "pvutils": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.1.5.tgz", - "integrity": "sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA==", - "dev": true - }, - "qr-creator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/qr-creator/-/qr-creator-1.0.0.tgz", - "integrity": "sha512-C0cqfbS1P5hfqN4NhsYsUXePlk9BO+a45bAQ3xLYjBL3bOIFzoVEjs79Fado9u9BPBD3buHi3+vY+C8tHh4qMQ==" - }, - "qs": { - "version": "6.14.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.2.tgz", - "integrity": "sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==", - "requires": { - "side-channel": "^1.1.0" - } - }, - "randexp": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.5.3.tgz", - "integrity": "sha512-U+5l2KrcMNOUPYvazA3h5ekF80FHTUG+87SEAmHZmolh1M+i/WyTCxVzmi+tidIa1tM4BSe8g2Y/D3loWDjj+w==", - "requires": { - "drange": "^1.0.2", - "ret": "^0.2.0" - } - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" - }, - "raw-body": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", - "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", - "dev": true, - "requires": { - "bytes": "~3.1.2", - "http-errors": "~2.0.1", - "iconv-lite": "~0.4.24", - "unpipe": "~1.0.0" - } - }, - "react": { - "version": "19.2.7", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.7.tgz", - "integrity": "sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==" - }, - "react-dom": { - "version": "19.2.7", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.7.tgz", - "integrity": "sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==", - "requires": { - "scheduler": "^0.27.0" - } - }, - "react-i18next": { - "version": "16.3.5", - "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-16.3.5.tgz", - "integrity": "sha512-F7Kglc+T0aE6W2rO5eCAFBEuWRpNb5IFmXOYEgztjZEuiuSLTe/xBIEG6Q3S0fbl8GXMNo+Q7gF8bpokFNWJww==", - "requires": { - "@babel/runtime": "^7.27.6", - "html-parse-stringify": "^3.0.1", - "use-sync-external-store": "^1.6.0" - } - }, - "react-icons": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.5.0.tgz", - "integrity": "sha512-MEFcXdkP3dLo8uumGI5xN3lDFNsRtrjbOEKDLD7yv76v4wpnEq2Lt2qeHaQOr34I/wPN3s3+N08WkQ+CW37Xiw==" - }, - "react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true - }, - "react-number-format": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/react-number-format/-/react-number-format-5.4.5.tgz", - "integrity": "sha512-y8O2yHHj3w0aE9XO8d2BCcUOOdQTRSVq+WIuMlLVucAm5XNjJAy+BoOJiuQMldVYVOKTMyvVNfnbl2Oqp+YxGw==" - }, - "react-remove-scroll": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz", - "integrity": "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==", - "requires": { - "react-remove-scroll-bar": "^2.3.7", - "react-style-singleton": "^2.2.3", - "tslib": "^2.1.0", - "use-callback-ref": "^1.3.3", - "use-sidecar": "^1.1.3" - } - }, - "react-remove-scroll-bar": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", - "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", - "requires": { - "react-style-singleton": "^2.2.2", - "tslib": "^2.0.0" - } - }, - "react-style-singleton": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", - "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", - "requires": { - "get-nonce": "^1.0.0", - "tslib": "^2.0.0" - } - }, - "read": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/read/-/read-4.1.0.tgz", - "integrity": "sha512-uRfX6K+f+R8OOrYScaM3ixPY4erg69f8DN6pgTvMcA9iRc8iDhwrA4m3Yu8YYKsXJgVvum+m8PkRboZwwuLzYA==", - "dev": true, - "requires": { - "mute-stream": "^2.0.0" - } - }, - "readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "requires": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - } - }, - "reflect-metadata": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", - "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==" - }, - "reflect.getprototypeof": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", - "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", - "dev": true, - "requires": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.7", - "get-proto": "^1.0.1", - "which-builtin-type": "^1.2.1" - } - }, - "regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true - }, - "regenerate-unicode-properties": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", - "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", - "dev": true, - "requires": { - "regenerate": "^1.4.2" - } - }, - "regex-parser": { - "version": "2.2.11", - "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", - "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==", - "dev": true - }, - "regexp.prototype.flags": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", - "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", - "dev": true, - "requires": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "set-function-name": "^2.0.2" - } - }, - "regexpu-core": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", - "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", - "dev": true, - "requires": { - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.2.2", - "regjsgen": "^0.8.0", - "regjsparser": "^0.13.0", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.2.1" - } - }, - "regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", - "dev": true - }, - "regjsparser": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.1.tgz", - "integrity": "sha512-dLsljMd9sqwRkby8zhO1gSg3PnJIBFid8f4CQj/sXx+7cKx+E7u0PKhZ+U4wmhx7EfmtvnA318oVaIkAB1lRJw==", - "dev": true, - "requires": { - "jsesc": "~3.1.0" - } - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==" - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" - }, - "resolve": { - "version": "1.22.11", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", - "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", - "dev": true, - "requires": { - "is-core-module": "^2.16.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "resolve-url-loader": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz", - "integrity": "sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==", - "dev": true, - "requires": { - "adjust-sourcemap-loader": "^4.0.0", - "convert-source-map": "^1.7.0", - "loader-utils": "^2.0.0", - "postcss": "^8.2.14", - "source-map": "0.6.1" - }, - "dependencies": { - "loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "restore-cursor": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", - "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", - "requires": { - "onetime": "^7.0.0", - "signal-exit": "^4.1.0" - }, - "dependencies": { - "onetime": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", - "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", - "requires": { - "mimic-function": "^5.0.0" - } - }, - "signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==" - } - } - }, - "ret": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.2.2.tgz", - "integrity": "sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ==" - }, - "retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==" - }, - "rfdc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", - "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==" - }, - "rolldown": { - "version": "1.0.0-rc.4", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.4.tgz", - "integrity": "sha512-V2tPDUrY3WSevrvU2E41ijZlpF+5PbZu4giH+VpNraaadsJGHa4fR6IFwsocVwEXDoAdIv5qgPPxgrvKAOIPtA==", - "dev": true, - "requires": { - "@oxc-project/types": "=0.113.0", - "@rolldown/binding-android-arm64": "1.0.0-rc.4", - "@rolldown/binding-darwin-arm64": "1.0.0-rc.4", - "@rolldown/binding-darwin-x64": "1.0.0-rc.4", - "@rolldown/binding-freebsd-x64": "1.0.0-rc.4", - "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.4", - "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.4", - "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.4", - "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.4", - "@rolldown/binding-linux-x64-musl": "1.0.0-rc.4", - "@rolldown/binding-openharmony-arm64": "1.0.0-rc.4", - "@rolldown/binding-wasm32-wasi": "1.0.0-rc.4", - "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.4", - "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.4", - "@rolldown/pluginutils": "1.0.0-rc.4" - } - }, - "rollup": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.2.tgz", - "integrity": "sha512-J9qZyW++QK/09NyN/zeO0dG/1GdGfyp9lV8ajHnRVLfo/uFsbji5mHnDgn/qYdUHyCkM2N+8VyspgZclfAh0eQ==", - "dev": true, - "requires": { - "@rollup/rollup-android-arm-eabi": "4.60.2", - "@rollup/rollup-android-arm64": "4.60.2", - "@rollup/rollup-darwin-arm64": "4.60.2", - "@rollup/rollup-darwin-x64": "4.60.2", - "@rollup/rollup-freebsd-arm64": "4.60.2", - "@rollup/rollup-freebsd-x64": "4.60.2", - "@rollup/rollup-linux-arm-gnueabihf": "4.60.2", - "@rollup/rollup-linux-arm-musleabihf": "4.60.2", - "@rollup/rollup-linux-arm64-gnu": "4.60.2", - "@rollup/rollup-linux-arm64-musl": "4.60.2", - "@rollup/rollup-linux-loong64-gnu": "4.60.2", - "@rollup/rollup-linux-loong64-musl": "4.60.2", - "@rollup/rollup-linux-ppc64-gnu": "4.60.2", - "@rollup/rollup-linux-ppc64-musl": "4.60.2", - "@rollup/rollup-linux-riscv64-gnu": "4.60.2", - "@rollup/rollup-linux-riscv64-musl": "4.60.2", - "@rollup/rollup-linux-s390x-gnu": "4.60.2", - "@rollup/rollup-linux-x64-gnu": "4.60.2", - "@rollup/rollup-linux-x64-musl": "4.60.2", - "@rollup/rollup-openbsd-x64": "4.60.2", - "@rollup/rollup-openharmony-arm64": "4.60.2", - "@rollup/rollup-win32-arm64-msvc": "4.60.2", - "@rollup/rollup-win32-ia32-msvc": "4.60.2", - "@rollup/rollup-win32-x64-gnu": "4.60.2", - "@rollup/rollup-win32-x64-msvc": "4.60.2", - "@types/estree": "1.0.8", - "fsevents": "~2.3.2" - } - }, - "rope-sequence": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/rope-sequence/-/rope-sequence-1.3.4.tgz", - "integrity": "sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==" - }, - "router": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", - "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", - "requires": { - "debug": "^4.4.0", - "depd": "^2.0.0", - "is-promise": "^4.0.0", - "parseurl": "^1.3.3", - "path-to-regexp": "^8.0.0" - }, - "dependencies": { - "path-to-regexp": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.4.0.tgz", - "integrity": "sha512-PuseHIvAnz3bjrM2rGJtSgo1zjgxapTLZ7x2pjhzWwlp4SJQgK3f3iZIQwkpEnBaKz6seKBADpM4B4ySkuYypg==" - } - } - }, - "run-applescript": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", - "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==", - "dev": true - }, - "rxjs": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", - "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", - "requires": { - "tslib": "^2.1.0" - } - }, - "safe-array-concat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", - "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", - "dev": true, - "requires": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "has-symbols": "^1.1.0", - "isarray": "^2.0.5" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "safe-push-apply": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", - "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", - "dev": true, - "requires": { - "es-errors": "^1.3.0", - "isarray": "^2.0.5" - } - }, - "safe-regex-test": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", - "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", - "dev": true, - "requires": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-regex": "^1.2.1" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "sass": { - "version": "1.97.3", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.97.3.tgz", - "integrity": "sha512-fDz1zJpd5GycprAbu4Q2PV/RprsRtKC/0z82z0JLgdytmcq0+ujJbJ/09bPGDxCLkKY3Np5cRAOcWiVkLXJURg==", - "dev": true, - "requires": { - "@parcel/watcher": "^2.4.1", - "chokidar": "^4.0.0", - "immutable": "^5.0.2", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "dependencies": { - "chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - "dev": true, - "requires": { - "readdirp": "^4.0.1" - } - }, - "readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", - "dev": true - } - } - }, - "sass-loader": { - "version": "16.0.7", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.7.tgz", - "integrity": "sha512-w6q+fRHourZ+e+xA1kcsF27iGM6jdB8teexYCfdUw0sYgcDNeZESnDNT9sUmmPm3ooziwUJXGwZJSTF3kOdBfA==", - "dev": true, - "requires": { - "neo-async": "^2.6.2" - } - }, - "sax": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.4.tgz", - "integrity": "sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==", - "dev": true, - "optional": true - }, - "saxes": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", - "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", - "dev": true, - "requires": { - "xmlchars": "^2.2.0" - } - }, - "scheduler": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", - "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==" - }, - "screenfull": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/screenfull/-/screenfull-6.0.2.tgz", - "integrity": "sha512-AQdy8s4WhNvUZ6P8F6PB21tSPIYKniic+Ogx0AacBMjKP1GUHN2E9URxQHtCusiwxudnCKkdy4GrHXPPJSkCCw==" - }, - "secure-compare": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/secure-compare/-/secure-compare-3.0.1.tgz", - "integrity": "sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==" - }, - "select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", - "dev": true - }, - "selfsigned": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-5.5.0.tgz", - "integrity": "sha512-ftnu3TW4+3eBfLRFnDEkzGxSF/10BJBkaLJuBHZX0kiPS7bRdlpZGu6YGt4KngMkdTwJE6MbjavFpqHvqVt+Ew==", - "dev": true, - "requires": { - "@peculiar/x509": "^1.14.2", - "pkijs": "^3.3.3" - } - }, - "semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==" - }, - "send": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", - "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", - "dev": true, - "requires": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "~0.5.2", - "http-errors": "~2.0.1", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "~2.4.1", - "range-parser": "~1.2.1", - "statuses": "~2.0.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "dev": true - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true - } - } - }, - "serialize-javascript": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-7.0.5.tgz", - "integrity": "sha512-F4LcB0UqUl1zErq+1nYEEzSHJnIwb3AF2XWB94b+afhrekOUijwooAYqFyRbjYkm2PAKBabx6oYv/xDxNi8IBw==", - "dev": true - }, - "serve-index": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.2.tgz", - "integrity": "sha512-KDj11HScOaLmrPxl70KYNW1PksP4Nb/CLL2yvC+Qd2kHMPEEpfc4Re2e4FOay+bC/+XQl/7zAcWON3JVo5v3KQ==", - "dev": true, - "requires": { - "accepts": "~1.3.8", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.8.0", - "mime-types": "~2.1.35", - "parseurl": "~1.3.3" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "dev": true - }, - "http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "dev": true - } - } - }, - "serve-static": { - "version": "1.16.3", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", - "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", - "dev": true, - "requires": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "~0.19.1" - }, - "dependencies": { - "encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "dev": true - } - } - }, - "set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dev": true, - "requires": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - } - }, - "set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "dev": true, - "requires": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" - } - }, - "set-proto": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", - "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", - "dev": true, - "requires": { - "dunder-proto": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0" - } - }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - } - }, - "shallowequal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" - }, - "shell-quote": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", - "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", - "dev": true - }, - "side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "requires": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - } - }, - "side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "requires": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - } - }, - "side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "requires": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - } - }, - "side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "requires": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - } - }, - "siginfo": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true - }, - "sigstore": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-4.1.0.tgz", - "integrity": "sha512-/fUgUhYghuLzVT/gaJoeVehLCgZiUxPCPMcyVNY0lIf/cTCz58K/WTI7PefDarXxp9nUKpEwg1yyz3eSBMTtgA==", - "requires": { - "@sigstore/bundle": "^4.0.0", - "@sigstore/core": "^3.1.0", - "@sigstore/protobuf-specs": "^0.5.0", - "@sigstore/sign": "^4.1.0", - "@sigstore/tuf": "^4.0.1", - "@sigstore/verify": "^3.1.0" - } - }, - "simple-swizzle": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.4.tgz", - "integrity": "sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==", - "requires": { - "is-arrayish": "^0.3.1" - }, - "dependencies": { - "is-arrayish": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.4.tgz", - "integrity": "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==" - } - } - }, - "sirv": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.2.tgz", - "integrity": "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==", - "dev": true, - "requires": { - "@polka/url": "^1.0.0-next.24", - "mrmime": "^2.0.0", - "totalist": "^3.0.0" - } - }, - "slice-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", - "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", - "requires": { - "ansi-styles": "^6.2.1", - "is-fullwidth-code-point": "^5.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==" - }, - "is-fullwidth-code-point": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", - "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", - "requires": { - "get-east-asian-width": "^1.3.1" - } - } - } - }, - "smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==" - }, - "sockjs": { - "version": "0.3.24", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", - "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", - "dev": true, - "requires": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" - }, - "dependencies": { - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true - } - } - }, - "socks": { - "version": "2.8.7", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", - "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", - "requires": { - "ip-address": "^10.0.1", - "smart-buffer": "^4.2.0" - } - }, - "socks-proxy-agent": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", - "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", - "requires": { - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "socks": "^2.8.3" - } - }, - "source-map": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", - "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==" - }, - "source-map-explorer": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/source-map-explorer/-/source-map-explorer-2.5.3.tgz", - "integrity": "sha512-qfUGs7UHsOBE5p/lGfQdaAj/5U/GWYBw2imEpD6UQNkqElYonkow8t+HBL1qqIl3CuGZx7n8/CQo4x1HwSHhsg==", - "dev": true, - "requires": { - "btoa": "^1.2.1", - "chalk": "^4.1.0", - "convert-source-map": "^1.7.0", - "ejs": "^3.1.5", - "escape-html": "^1.0.3", - "glob": "^7.1.6", - "gzip-size": "^6.0.0", - "lodash": "^4.17.20", - "open": "^7.3.1", - "source-map": "^0.7.4", - "temp": "^0.9.4", - "yargs": "^16.2.0" - }, - "dependencies": { - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "open": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", - "dev": true, - "requires": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - } - }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "temp": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.4.tgz", - "integrity": "sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==", - "dev": true, - "requires": { - "mkdirp": "^0.5.1", - "rimraf": "~2.6.2" - } - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - }, - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true - } - } - }, - "source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==" - }, - "source-map-loader": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-5.0.0.tgz", - "integrity": "sha512-k2Dur7CbSLcAH73sBcIkV5xjPV4SzqO1NJ7+XaQl8if3VODDUj3FNchNGpqgJSKbvUfJuhVdv8K2Eu8/TNl2eA==", - "dev": true, - "requires": { - "iconv-lite": "^0.6.3", - "source-map-js": "^1.0.2" - }, - "dependencies": { - "iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - } - } - }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "spdx-exceptions": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==" - }, - "spdx-expression-parse": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz", - "integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==", - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.23", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz", - "integrity": "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==" - }, - "spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - } - }, - "spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" - }, - "ssri": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-13.0.1.tgz", - "integrity": "sha512-QUiRf1+u9wPTL/76GTYlKttDEBWV1ga9ZXW8BG6kfdeyyM8LGPix9gROyg9V2+P0xNyF3X2Go526xKFdMZrHSQ==", - "requires": { - "minipass": "^7.0.3" - } - }, - "stackback": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", - "dev": true - }, - "statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==" - }, - "std-env": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.1.0.tgz", - "integrity": "sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==", - "dev": true - }, - "stdin-discarder": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.3.2.tgz", - "integrity": "sha512-eCPu1qRxPVkl5605OTWF8Wz40b4Mf45NY5LQmVPQ599knfs5QhASUm9GbJ5BDMDOXgrnh0wyEdvzmL//YMlw0A==" - }, - "stimulus-use": { - "version": "0.52.3", - "resolved": "https://registry.npmjs.org/stimulus-use/-/stimulus-use-0.52.3.tgz", - "integrity": "sha512-stZ5dID6FUrGCR/ChWUa0FT5Z8iqkzT6lputOAb50eF+Ayg7RzJj4U/HoRlp2NV333QfvoRidru9HLbom4hZVw==" - }, - "stop-iteration-iterator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", - "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", - "dev": true, - "requires": { - "es-errors": "^1.3.0", - "internal-slot": "^1.1.0" - } - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - } - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - } - } - }, - "string.prototype.includes": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", - "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", - "dev": true, - "requires": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.3" - } - }, - "string.prototype.matchall": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", - "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", - "dev": true, - "requires": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.6", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.6", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "internal-slot": "^1.1.0", - "regexp.prototype.flags": "^1.5.3", - "set-function-name": "^2.0.2", - "side-channel": "^1.1.0" - } - }, - "string.prototype.repeat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", - "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "string.prototype.trim": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", - "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", - "dev": true, - "requires": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-data-property": "^1.1.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-object-atoms": "^1.0.0", - "has-property-descriptors": "^1.0.2" - } - }, - "string.prototype.trimend": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", - "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - } - }, - "string.prototype.trimstart": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", - "dev": true, - "requires": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true - }, - "strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "requires": { - "min-indent": "^1.0.0" - } - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "styled-components": { - "version": "6.1.19", - "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.1.19.tgz", - "integrity": "sha512-1v/e3Dl1BknC37cXMhwGomhO8AkYmN41CqyX9xhUDxry1ns3BFQy2lLDRQXJRdVVWB9OHemv/53xaStimvWyuA==", - "requires": { - "@emotion/is-prop-valid": "1.2.2", - "@emotion/unitless": "0.8.1", - "@types/stylis": "4.2.5", - "css-to-react-native": "3.2.0", - "csstype": "3.1.3", - "postcss": "8.4.49", - "shallowequal": "1.1.0", - "stylis": "4.3.2", - "tslib": "2.6.2" - }, - "dependencies": { - "postcss": { - "version": "8.4.49", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", - "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", - "requires": { - "nanoid": "^3.3.7", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - } - }, - "tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - } - } - }, - "stylis": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.2.tgz", - "integrity": "sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true - }, - "symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true - }, - "tabbable": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", - "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==" - }, - "tablesorter": { - "version": "2.32.0", - "resolved": "https://registry.npmjs.org/tablesorter/-/tablesorter-2.32.0.tgz", - "integrity": "sha512-tKjx6H+ZVoxND5ukDIVvF4AKEIw0ZJde/e6YlAZlUOKI0o0xD2RZLTb2tKB1hiDHkHGLHGQ7ndvd0Pnkj5Xzjw==", - "requires": { - "jquery": ">=1.2.6" - } - }, - "tagged-tag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz", - "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==" - }, - "tapable": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", - "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", - "dev": true - }, - "tar": { - "version": "7.5.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.13.tgz", - "integrity": "sha512-tOG/7GyXpFevhXVh8jOPJrmtRpOTsYqUIkVdVooZYJS/z8WhfQUX8RJILmeuJNinGAMSu1veBr4asSHFt5/hng==", - "requires": { - "@isaacs/fs-minipass": "^4.0.0", - "chownr": "^3.0.0", - "minipass": "^7.1.2", - "minizlib": "^3.1.0", - "yallist": "^5.0.0" - }, - "dependencies": { - "yallist": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", - "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==" - } - } - }, - "terser": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.46.0.tgz", - "integrity": "sha512-jTwoImyr/QbOWFFso3YoU3ik0jBBDJ6JTOQiy/J2YxVJdZCc+5u7skhNwiOR3FQIygFqVUPHl7qbbxtjW2K3Qg==", - "dev": true, - "requires": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.15.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - } - }, - "terser-webpack-plugin": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.5.0.tgz", - "integrity": "sha512-UYhptBwhWvfIjKd/UuFo6D8uq9xpGLDK+z8EDsj/zWhrTaH34cKEbrkMKfV5YWqGBvAYA3tlzZbs2R+qYrbQJA==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.25", - "jest-worker": "^27.4.5", - "schema-utils": "^4.3.0", - "terser": "^5.31.1" - }, - "dependencies": { - "ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.3" - } - }, - "schema-utils": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", - "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - } - } - } - }, - "text-segmentation": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/text-segmentation/-/text-segmentation-1.0.3.tgz", - "integrity": "sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==", - "requires": { - "utrie": "^1.0.2" - } - }, - "texture-compressor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/texture-compressor/-/texture-compressor-1.0.2.tgz", - "integrity": "sha512-dStVgoaQ11mA5htJ+RzZ51ZxIZqNOgWKAIvtjLrW1AliQQLCmrDqNzQZ8Jh91YealQ95DXt4MEduLzJmbs6lig==", - "requires": { - "argparse": "^1.0.10", - "image-size": "^0.7.4" - }, - "dependencies": { - "image-size": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.7.5.tgz", - "integrity": "sha512-Hiyv+mXHfFEP7LzUL/llg9RwFxxY+o9N3JVLIeG5E7iFIFAalxvRU9UZthBdYDEVnzHMgjnKJPPpay5BWf1g9g==" - } - } - }, - "thingies": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/thingies/-/thingies-2.6.0.tgz", - "integrity": "sha512-rMHRjmlFLM1R96UYPvpmnc3LYtdFrT33JIB7L9hetGue1qAPfn1N2LJeEjxUSidu1Iku+haLZXDuEXUHNGO/lg==", - "dev": true - }, - "thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "dev": true - }, - "ticky": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ticky/-/ticky-1.0.1.tgz", - "integrity": "sha512-RX35iq/D+lrsqhcPWIazM9ELkjOe30MSeoBHQHSsRwd1YuhJO5ui1K1/R0r7N3mFvbLBs33idw+eR6j+w6i/DA==" - }, - "timers-ext": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", - "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", - "requires": { - "es5-ext": "~0.10.46", - "next-tick": "1" - } - }, - "tiny-invariant": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", - "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==" - }, - "tinybench": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", - "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", - "dev": true - }, - "tinyexec": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.1.2.tgz", - "integrity": "sha512-dAqSqE/RabpBKI8+h26GfLq6Vb3JVXs30XYQjdMjaj/c2tS8IYYMbIzP599KtRj7c57/wYApb3QjgRgXmrCukA==", - "dev": true - }, - "tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", - "requires": { - "fdir": "^6.5.0", - "picomatch": "^4.0.3" - }, - "dependencies": { - "picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==" - } - } - }, - "tinyrainbow": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", - "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", - "dev": true - }, - "tldts": { - "version": "7.0.30", - "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.0.30.tgz", - "integrity": "sha512-ELrFxuqsDdHUwoh0XxDbxuLD3Wnz49Z57IFvTtvWy1hJdcMZjXLIuonjilCiWHlT2GbE4Wlv1wKVTzDFnXH1aw==", - "dev": true, - "requires": { - "tldts-core": "^7.0.30" - } - }, - "tldts-core": { - "version": "7.0.30", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.30.tgz", - "integrity": "sha512-uiHN8PIB1VmWyS98eZYja4xzlYqeFZVjb4OuYlJQnZAuJhMw4PbKQOKgHKhBdJR3FE/t5mUQ1Kd80++B+qhD1Q==", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - }, - "dependencies": { - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - } - } - }, - "toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" - }, - "toposort": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz", - "integrity": "sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==" - }, - "totalist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", - "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", - "dev": true - }, - "tough-cookie": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.1.tgz", - "integrity": "sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==", - "dev": true, - "requires": { - "tldts": "^7.0.5" - } - }, - "tr46": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-6.0.0.tgz", - "integrity": "sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==", - "dev": true, - "requires": { - "punycode": "^2.3.1" - } - }, - "tree-dump": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.1.0.tgz", - "integrity": "sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA==", - "dev": true - }, - "tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true - }, - "ts-action": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/ts-action/-/ts-action-11.0.0.tgz", - "integrity": "sha512-TDxvzZ5UtKsBuw0McRs/L+iASj80m60nV8EXCP680ZdIl+oRHPGnBk85sZJWXLzqQwb6yQ+CcMzPTfBr0dEaAA==" - }, - "ts-action-operators": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/ts-action-operators/-/ts-action-operators-9.1.2.tgz", - "integrity": "sha512-DZ+sJvBdOluThwCBcCdDnz0NiVeQxEwveL+cmkJGLO1ps+x/D0xwSefmOIa1S7p2nXFHH52ZPr/8VEvxZHaNgg==" - }, - "ts-api-utils": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", - "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", - "dev": true - }, - "ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "dev": true, - "requires": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - } - }, - "tsconfig-paths": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", - "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", - "dev": true, - "requires": { - "json5": "^2.2.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" - }, - "tsyringe": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/tsyringe/-/tsyringe-4.10.0.tgz", - "integrity": "sha512-axr3IdNuVIxnaK5XGEUFTu3YmAQ6lllgrvqfEoR16g/HGnYY/6We4oWENtAnzK6/LpJ2ur9PAb80RBt7/U4ugw==", - "dev": true, - "requires": { - "tslib": "^1.9.3" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "tuf-js": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-4.1.0.tgz", - "integrity": "sha512-50QV99kCKH5P/Vs4E2Gzp7BopNV+KzTXqWeaxrfu5IQJBOULRsTIS9seSsOVT8ZnGXzCyx55nYWAi4qJzpZKEQ==", - "requires": { - "@tufjs/models": "4.1.0", - "debug": "^4.4.3", - "make-fetch-happen": "^15.0.1" - } - }, - "turbo_power": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/turbo_power/-/turbo_power-0.7.1.tgz", - "integrity": "sha512-xnB1Yb3xXSVcDQyiqZV8kLjbHdCmyBfQYZJeJklEnEz+jM5xl6JUNo2yy5vc/8ZPKKMzS05INvvvLxafQYJVuQ==" - }, - "type": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/type/-/type-2.7.3.tgz", - "integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==" - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-fest": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.7.0.tgz", - "integrity": "sha512-1URUxUqfHFM1c+zfSPsa3gnkO7Aq21qyH75SIduNYz4SzY964rn1X2vCMQaHSHhktiw+0kPa2iyb6PUpXqB6Vg==", - "requires": { - "tagged-tag": "^1.0.0" - } - }, - "type-func": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/type-func/-/type-func-1.0.3.tgz", - "integrity": "sha512-YA90CUk+i00tWESPNRMahywXhAz+12NLJLKlOWrgHIbqaFXjdZrWstRghaibOW/IxhPjui4SmXxO/03XSGRIjA==" - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typed-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", - "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", - "dev": true, - "requires": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.14" - } - }, - "typed-array-byte-length": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", - "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", - "dev": true, - "requires": { - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.14" - } - }, - "typed-array-byte-offset": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", - "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", - "dev": true, - "requires": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.15", - "reflect.getprototypeof": "^1.0.9" - } - }, - "typed-array-length": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", - "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", - "dev": true, - "requires": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0", - "reflect.getprototypeof": "^1.0.6" - } - }, - "typed-assert": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/typed-assert/-/typed-assert-1.0.9.tgz", - "integrity": "sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==", - "dev": true - }, - "typedjson": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/typedjson/-/typedjson-1.8.0.tgz", - "integrity": "sha512-taVJVGebQDagEmVc3Cu6vVVLkWLnxqPcTrkVgbpAsI02ZDDrnHy5zvt1JVqXv4/yztBgZAX1oR07+bkiusGJLQ==", - "requires": { - "tslib": "^2.0.1" - } - }, - "typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true - }, - "typescript-eslint": { - "version": "8.61.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.61.0.tgz", - "integrity": "sha512-8y31Rd0eGTrDKqhy6vT0HtzhN+YLjQizwX3aA3hPXP/ynSfnrBXcQY5IzsP9/DM7+klX4IUncZZjkchP0z+rUw==", - "dev": true, - "requires": { - "@typescript-eslint/eslint-plugin": "8.61.0", - "@typescript-eslint/parser": "8.61.0", - "@typescript-eslint/typescript-estree": "8.61.0", - "@typescript-eslint/utils": "8.61.0" - }, - "dependencies": { - "@typescript-eslint/eslint-plugin": { - "version": "8.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.61.0.tgz", - "integrity": "sha512-bFNvl9ZczlVb+wR2Akszf3gHfKVj/8WanXaGJ3UstTA7brNKg0cNdk6X1Psu5V7MZ2oQtzZKOEzIUehaoxbDGw==", - "dev": true, - "requires": { - "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.61.0", - "@typescript-eslint/type-utils": "8.61.0", - "@typescript-eslint/utils": "8.61.0", - "@typescript-eslint/visitor-keys": "8.61.0", - "ignore": "^7.0.5", - "natural-compare": "^1.4.0", - "ts-api-utils": "^2.5.0" - } - }, - "@typescript-eslint/parser": { - "version": "8.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.61.0.tgz", - "integrity": "sha512-5B7PfA2e1NQGCnDHd/0lW7W3gvp3d59Ryw54FYO8Uswxo9f6ikw3AZV+Xj/TvpImmpsiYyUqAfhC6kJID1jF6w==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "8.61.0", - "@typescript-eslint/types": "8.61.0", - "@typescript-eslint/typescript-estree": "8.61.0", - "@typescript-eslint/visitor-keys": "8.61.0", - "debug": "^4.4.3" - } - }, - "@typescript-eslint/project-service": { - "version": "8.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.61.0.tgz", - "integrity": "sha512-DV42F7MLJO6Rax7SK1yg43tcnEfGUrurSpSxKuVX+a3RCTzBlH3fuxprrOJXKCJGAaw82xXocikJ0uQaqwXgGA==", - "dev": true, - "requires": { - "@typescript-eslint/tsconfig-utils": "^8.61.0", - "@typescript-eslint/types": "^8.61.0", - "debug": "^4.4.3" - } - }, - "@typescript-eslint/scope-manager": { - "version": "8.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.61.0.tgz", - "integrity": "sha512-IWdXFHFSb6mlC3HPc7QsLDm5zYEbUla6trDEHf32D3/dnuUyXd87plScSNXSbm0/RxMvObpI17sv/EDTGrGZkA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "8.61.0", - "@typescript-eslint/visitor-keys": "8.61.0" - } - }, - "@typescript-eslint/tsconfig-utils": { - "version": "8.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.61.0.tgz", - "integrity": "sha512-O5Amvdv9ztMpxpf+vmFULGG78IE6Qwdr3bCGvqwG4nwc9H2qXkOYJJnRbRHyMkQTjv1d03olqwwwzHLMqpFePQ==", - "dev": true - }, - "@typescript-eslint/type-utils": { - "version": "8.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.61.0.tgz", - "integrity": "sha512-TuBiQYIkd97yBfInHCTKVYMbX4kvEmpOEuixIuzCU9p8BGT1SfyyO0d0IfDMbPIHcjn/hWnusUX5e8v5Xg+X8A==", - "dev": true, - "requires": { - "@typescript-eslint/types": "8.61.0", - "@typescript-eslint/typescript-estree": "8.61.0", - "@typescript-eslint/utils": "8.61.0", - "debug": "^4.4.3", - "ts-api-utils": "^2.5.0" - } - }, - "@typescript-eslint/types": { - "version": "8.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.61.0.tgz", - "integrity": "sha512-9QTQpZ5Iin4CdIodfbDQFSeiSJKidgYJYug1P9CC2xWgUTvlmixViqDZNciMjwLBZyJnG4tGmPl97rVAFb1AJg==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "8.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.61.0.tgz", - "integrity": "sha512-42zatd5qSvvcV1JdDBCLxYRznvP4eIHpPoZXdkPFnAmanA4FuZ5dibSnCBggY8hQnqajPpoGjXFdZ7fIJKQnlA==", - "dev": true, - "requires": { - "@typescript-eslint/project-service": "8.61.0", - "@typescript-eslint/tsconfig-utils": "8.61.0", - "@typescript-eslint/types": "8.61.0", - "@typescript-eslint/visitor-keys": "8.61.0", - "debug": "^4.4.3", - "minimatch": "^10.2.2", - "semver": "^7.7.3", - "tinyglobby": "^0.2.15", - "ts-api-utils": "^2.5.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "8.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.61.0.tgz", - "integrity": "sha512-QVLZu3ZPQEE+HICQyAMZ2yLQhxf0meY/wx6Hx14YcTNj13JB3qHlX3lJ02L3fLGHgERRH71kvYDwiXIguT3AjQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "8.61.0", - "eslint-visitor-keys": "^5.0.0" - } - }, - "balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "dev": true - }, - "brace-expansion": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", - "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", - "dev": true, - "requires": { - "balanced-match": "^4.0.2" - } - }, - "eslint-visitor-keys": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", - "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", - "dev": true - }, - "ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", - "dev": true - }, - "minimatch": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", - "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", - "dev": true, - "requires": { - "brace-expansion": "^5.0.5" - } - } - } - }, - "unbox-primitive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", - "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", - "dev": true, - "requires": { - "call-bound": "^1.0.3", - "has-bigints": "^1.0.2", - "has-symbols": "^1.1.0", - "which-boxed-primitive": "^1.1.1" - } - }, - "undici": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.24.4.tgz", - "integrity": "sha512-BM/JzwwaRXxrLdElV2Uo6cTLEjhSb3WXboncJamZ15NgUURmvlXvxa6xkwIOILIjPNo9i8ku136ZvWV0Uly8+w==", - "dev": true - }, - "unicode-canonical-property-names-ecmascript": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", - "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", - "dev": true - }, - "unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dev": true, - "requires": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - } - }, - "unicode-match-property-value-ecmascript": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", - "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", - "dev": true - }, - "unicode-property-aliases-ecmascript": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", - "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", - "dev": true - }, - "union": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/union/-/union-0.5.0.tgz", - "integrity": "sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==", - "requires": { - "qs": "^6.4.0" - } - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" - }, - "update-browserslist-db": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", - "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", - "requires": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "urijs": { - "version": "1.19.11", - "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.11.tgz", - "integrity": "sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==" - }, - "url-join": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-2.0.5.tgz", - "integrity": "sha512-c2H1fIgpUdwFRIru9HFno5DT73Ok8hg5oOb5AT3ayIgvCRfxgs2jyt5Slw8kEB7j3QUr6yJmMPDT/odjk7jXow==" - }, - "use-callback-ref": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", - "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", - "requires": { - "tslib": "^2.0.0" - } - }, - "use-sidecar": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", - "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", - "requires": { - "detect-node-es": "^1.1.0", - "tslib": "^2.0.0" - } - }, - "use-sync-external-store": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", - "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==" - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "dev": true - }, - "utrie": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/utrie/-/utrie-1.0.2.tgz", - "integrity": "sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==", - "requires": { - "base64-arraybuffer": "^1.0.2" - } - }, - "uuid": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-14.0.0.tgz", - "integrity": "sha512-Qo+uWgilfSmAhXCMav1uYFynlQO7fMFiMVZsQqZRMIXp0O7rR7qjkj+cPvBHLgBqi960QCoo/PH2/6ZtVqKvrg==" - }, - "v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true - }, - "validate-npm-package-name": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-7.0.2.tgz", - "integrity": "sha512-hVDIBwsRruT73PbK7uP5ebUt+ezEtCmzZz3F59BSr2F6OVFnJ/6h8liuvdLrQ88Xmnk6/+xGGuq+pG9WwTuy3A==" - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" - }, - "vite": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.2.tgz", - "integrity": "sha512-Bby3NOsna2jsjfLVOHKes8sGwgl4TT0E6vvpYgnAYDIF/tie7MRaFthmKuHx1NSXjiTueXH3do80FMQgvEktRg==", - "dev": true, - "requires": { - "esbuild": "^0.27.0", - "fdir": "^6.5.0", - "fsevents": "~2.3.3", - "picomatch": "^4.0.3", - "postcss": "^8.5.6", - "rollup": "^4.43.0", - "tinyglobby": "^0.2.15" - }, - "dependencies": { - "picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "dev": true - } - } - }, - "vitest": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.8.tgz", - "integrity": "sha512-flY6ScbCIt9HThs+C5HS7jvGOB560DJtk/Z15IQROTA6zEy49Nh8T/dofWTQL+n3vswqn87sbJNiuqw1SDp5Ig==", - "dev": true, - "requires": { - "@vitest/expect": "4.1.8", - "@vitest/mocker": "4.1.8", - "@vitest/pretty-format": "4.1.8", - "@vitest/runner": "4.1.8", - "@vitest/snapshot": "4.1.8", - "@vitest/spy": "4.1.8", - "@vitest/utils": "4.1.8", - "es-module-lexer": "^2.0.0", - "expect-type": "^1.3.0", - "magic-string": "^0.30.21", - "obug": "^2.1.1", - "pathe": "^2.0.3", - "picomatch": "^4.0.3", - "std-env": "^4.0.0-rc.1", - "tinybench": "^2.9.0", - "tinyexec": "^1.0.2", - "tinyglobby": "^0.2.15", - "tinyrainbow": "^3.1.0", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", - "why-is-node-running": "^2.3.0" - }, - "dependencies": { - "picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "dev": true - } - } - }, - "vscode-css-languageservice": { - "version": "6.3.10", - "resolved": "https://registry.npmjs.org/vscode-css-languageservice/-/vscode-css-languageservice-6.3.10.tgz", - "integrity": "sha512-eq5N9Er3fC4vA9zd9EFhyBG90wtCCuXgRSpAndaOgXMh1Wgep5lBgRIeDgjZBW9pa+332yC9+49cZMW8jcL3MA==", - "dev": true, - "requires": { - "@vscode/l10n": "^0.0.18", - "vscode-languageserver-textdocument": "^1.0.12", - "vscode-languageserver-types": "3.17.5", - "vscode-uri": "^3.1.0" - } - }, - "vscode-languageserver-textdocument": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz", - "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==", - "dev": true - }, - "vscode-languageserver-types": { - "version": "3.17.5", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", - "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", - "dev": true - }, - "vscode-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", - "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", - "dev": true - }, - "w3c-keyname": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", - "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==" - }, - "w3c-xmlserializer": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", - "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", - "dev": true, - "requires": { - "xml-name-validator": "^5.0.0" - } - }, - "watchpack": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz", - "integrity": "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==", - "dev": true, - "requires": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - } - }, - "wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "dev": true, - "requires": { - "minimalistic-assert": "^1.0.0" - } - }, - "weak-lru-cache": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz", - "integrity": "sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==", - "dev": true, - "optional": true - }, - "webidl-conversions": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-8.0.1.tgz", - "integrity": "sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==", - "dev": true - }, - "webpack": { - "version": "5.105.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.105.2.tgz", - "integrity": "sha512-dRXm0a2qcHPUBEzVk8uph0xWSjV/xZxenQQbLwnwP7caQCYpqG1qddwlyEkIDkYn0K8tvmcrZ+bOrzoQ3HxCDw==", - "dev": true, - "requires": { - "@types/eslint-scope": "^3.7.7", - "@types/estree": "^1.0.8", - "@types/json-schema": "^7.0.15", - "@webassemblyjs/ast": "^1.14.1", - "@webassemblyjs/wasm-edit": "^1.14.1", - "@webassemblyjs/wasm-parser": "^1.14.1", - "acorn": "^8.15.0", - "acorn-import-phases": "^1.0.3", - "browserslist": "^4.28.1", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.19.0", - "es-module-lexer": "^2.0.0", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.11", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.3.1", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^4.3.3", - "tapable": "^2.3.0", - "terser-webpack-plugin": "^5.3.16", - "watchpack": "^2.5.1", - "webpack-sources": "^3.3.3" - }, - "dependencies": { - "ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.3" - } - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "schema-utils": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", - "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - } - } - } - }, - "webpack-dev-middleware": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.5.tgz", - "integrity": "sha512-uxQ6YqGdE4hgDKNf7hUiPXOdtkXvBJXrfEGYSx7P7LC8hnUYGK70X6xQXUvXeNyBDDcsiQXpG2m3G9vxowaEuA==", - "dev": true, - "requires": { - "colorette": "^2.0.10", - "memfs": "^4.43.1", - "mime-types": "^3.0.1", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" - }, - "dependencies": { - "ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.3" - } - }, - "mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "dev": true - }, - "mime-types": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", - "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", - "dev": true, - "requires": { - "mime-db": "^1.54.0" - } - }, - "schema-utils": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", - "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - } - } - } - }, - "webpack-dev-server": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.3.tgz", - "integrity": "sha512-9Gyu2F7+bg4Vv+pjbovuYDhHX+mqdqITykfzdM9UyKqKHlsE5aAjRhR+oOEfXW5vBeu8tarzlJFIZva4ZjAdrQ==", - "dev": true, - "requires": { - "@types/bonjour": "^3.5.13", - "@types/connect-history-api-fallback": "^1.5.4", - "@types/express": "^4.17.25", - "@types/express-serve-static-core": "^4.17.21", - "@types/serve-index": "^1.9.4", - "@types/serve-static": "^1.15.5", - "@types/sockjs": "^0.3.36", - "@types/ws": "^8.5.10", - "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.2.1", - "chokidar": "^3.6.0", - "colorette": "^2.0.10", - "compression": "^1.8.1", - "connect-history-api-fallback": "^2.0.0", - "express": "^4.22.1", - "graceful-fs": "^4.2.6", - "http-proxy-middleware": "^2.0.9", - "ipaddr.js": "^2.1.0", - "launch-editor": "^2.6.1", - "open": "^10.0.3", - "p-retry": "^6.2.0", - "schema-utils": "^4.2.0", - "selfsigned": "^5.5.0", - "serve-index": "^1.9.1", - "sockjs": "^0.3.24", - "spdy": "^4.0.2", - "webpack-dev-middleware": "^7.4.2", - "ws": "^8.18.0" - }, - "dependencies": { - "ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.3" - } - }, - "http-proxy-middleware": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz", - "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==", - "dev": true, - "requires": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" - } - }, - "is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "dev": true - }, - "schema-utils": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", - "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - } - } - } - }, - "webpack-merge": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", - "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==", - "dev": true, - "requires": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.1" - } - }, - "webpack-sources": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", - "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", - "dev": true - }, - "webpack-subresource-integrity": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-5.1.0.tgz", - "integrity": "sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q==", - "dev": true, - "requires": { - "typed-assert": "^1.0.8" - } - }, - "websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "dev": true, - "requires": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - } - }, - "websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "dev": true - }, - "whatwg-mimetype": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-5.0.0.tgz", - "integrity": "sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==", - "dev": true - }, - "whatwg-url": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-16.0.1.tgz", - "integrity": "sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==", - "dev": true, - "requires": { - "@exodus/bytes": "^1.11.0", - "tr46": "^6.0.0", - "webidl-conversions": "^8.0.1" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "requires": { - "isexe": "^2.0.0" - } - }, - "which-boxed-primitive": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", - "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", - "dev": true, - "requires": { - "is-bigint": "^1.1.0", - "is-boolean-object": "^1.2.1", - "is-number-object": "^1.1.1", - "is-string": "^1.1.1", - "is-symbol": "^1.1.1" - } - }, - "which-builtin-type": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", - "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", - "dev": true, - "requires": { - "call-bound": "^1.0.2", - "function.prototype.name": "^1.1.6", - "has-tostringtag": "^1.0.2", - "is-async-function": "^2.0.0", - "is-date-object": "^1.1.0", - "is-finalizationregistry": "^1.1.0", - "is-generator-function": "^1.0.10", - "is-regex": "^1.2.1", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.1.0", - "which-collection": "^1.0.2", - "which-typed-array": "^1.1.16" - } - }, - "which-collection": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", - "dev": true, - "requires": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" - } - }, - "which-typed-array": { - "version": "1.1.19", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", - "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", - "dev": true, - "requires": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "for-each": "^0.3.5", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2" - } - }, - "why-is-node-running": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", - "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", - "dev": true, - "requires": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" - } - }, - "wildcard": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", - "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", - "dev": true - }, - "word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "ws": { - "version": "8.20.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.1.tgz", - "integrity": "sha512-It4dO0K5v//JtTXuPkfEOaI3uUN87iYPnqo/ZzqCoG3g8uhA66QUMs/SrM0YK7/NAu+r4LMh/9dq2A7k+rHs+w==" - }, - "wscat": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/wscat/-/wscat-6.1.0.tgz", - "integrity": "sha512-x6gEZvITvqWslR38DoBfnMi37ZBUGsG9rTkGc/200sEfSs1JwgKLZYQeqa0vlu3bxXQV7hEHI4NF7KQmYIzB2A==", - "dev": true, - "requires": { - "commander": "^12.1.0", - "https-proxy-agent": "^7.0.5", - "read": "^4.0.0", - "ws": "^8.0.0" - }, - "dependencies": { - "commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "dev": true - } - } - }, - "wsl-utils": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", - "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", - "dev": true, - "requires": { - "is-wsl": "^3.1.0" - }, - "dependencies": { - "is-wsl": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", - "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", - "dev": true, - "requires": { - "is-inside-container": "^1.0.0" - } - } - } - }, - "xml-but-prettier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/xml-but-prettier/-/xml-but-prettier-1.0.1.tgz", - "integrity": "sha512-C2CJaadHrZTqESlH03WOyw0oZTtoy2uEg6dSDF6YRg+9GnYNub53RRemLpnvtbHDFelxMx4LajiFsYeR6XJHgQ==", - "requires": { - "repeat-string": "^1.5.2" - } - }, - "xml-name-validator": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", - "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", - "dev": true - }, - "xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true - }, - "y-prosemirror": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/y-prosemirror/-/y-prosemirror-1.3.7.tgz", - "integrity": "sha512-NpM99WSdD4Fx4if5xOMDpPtU3oAmTSjlzh5U4353ABbRHl1HtAFUx6HlebLZfyFxXN9jzKMDkVbcRjqOZVkYQg==", - "requires": { - "lib0": "^0.2.109" - } - }, - "y-protocols": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/y-protocols/-/y-protocols-1.0.6.tgz", - "integrity": "sha512-vHRF2L6iT3rwj1jub/K5tYcTT/mEYDUppgNPXwp8fmLpui9f7Yeq3OEtTLVF012j39QnV+KEQpNqoN7CWU7Y9Q==", - "requires": { - "lib0": "^0.2.85" - } - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - }, - "yjs": { - "version": "13.6.27", - "resolved": "https://registry.npmjs.org/yjs/-/yjs-13.6.27.tgz", - "integrity": "sha512-OIDwaflOaq4wC6YlPBy2L6ceKeKuF7DeTxx+jPzv1FHn9tCZ0ZwSRnUBxD05E3yed46fv/FWJbvR+Ud7x0L7zw==", - "requires": { - "lib0": "^0.2.99" - } - }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true - }, - "yoctocolors": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.2.tgz", - "integrity": "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==" - }, - "yoctocolors-cjs": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", - "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==" - }, - "zod": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", - "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==" - }, - "zod-to-json-schema": { - "version": "3.25.1", - "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.1.tgz", - "integrity": "sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==" - }, - "zod-validation-error": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", - "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", - "dev": true - } } } From dd0b94692c092dfa64baa4732109a06009731ac6 Mon Sep 17 00:00:00 2001 From: Marcello Rocha Date: Tue, 9 Jun 2026 10:03:42 +0200 Subject: [PATCH 094/107] Implements GET /wiki_page_links (#23597) * Create tests for the endpoint * Filter by PageLink#type * Implements the endpoint --- .../filter/wiki_page_link_type_filter.rb | 59 +++++++++++++++++ .../lib/api/v3/page_links/page_links_api.rb | 28 +++++++++ .../wikis/lib/open_project/wikis/engine.rb | 1 + .../api/v3/page_links/page_links_api_spec.rb | 63 ++++++++++++++++--- 4 files changed, 143 insertions(+), 8 deletions(-) create mode 100644 modules/wikis/app/models/queries/wikis/page_links/filter/wiki_page_link_type_filter.rb diff --git a/modules/wikis/app/models/queries/wikis/page_links/filter/wiki_page_link_type_filter.rb b/modules/wikis/app/models/queries/wikis/page_links/filter/wiki_page_link_type_filter.rb new file mode 100644 index 00000000000..c3c41356874 --- /dev/null +++ b/modules/wikis/app/models/queries/wikis/page_links/filter/wiki_page_link_type_filter.rb @@ -0,0 +1,59 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +module Queries + module Wikis + module PageLinks + module Filter + class WikiPageLinkTypeFilter < Filters::Base + self.model = ::Wikis::PageLink + + def type = :list + + def human_name + ::Wikis::PageLink.human_attribute_name(:type) + end + + def allowed_values + API::V3::PageLinks::URN_PAGE_LINK_TYPE.invert.to_a + end + + def values=(values) + @values = Array(values).map { API::V3::PageLinks::URN_PAGE_LINK_TYPE.invert[it] } + end + + def where + operator_strategy.sql_for_field(values, model.table_name, "type") + end + end + end + end + end +end diff --git a/modules/wikis/lib/api/v3/page_links/page_links_api.rb b/modules/wikis/lib/api/v3/page_links/page_links_api.rb index b6a44e086d4..bacde89be2e 100644 --- a/modules/wikis/lib/api/v3/page_links/page_links_api.rb +++ b/modules/wikis/lib/api/v3/page_links/page_links_api.rb @@ -32,6 +32,12 @@ module API module V3 module PageLinks class PageLinksAPI < OpenProjectAPI + helpers do + def enrich_models_with_wiki_metadata(relation) + Wikis::PageLinkMetadataService.new(relation).call + end + end + resources :wiki_page_links do post &::API::V3::PageLinks::CreateEndpoint.new( model: ::Wikis::RelationPageLink, @@ -42,6 +48,28 @@ module API process_contract: ::Wikis::RelationPageLinks::CreateContract, render_representer: PageLinkCollectionRepresenter ).mount + + get do + query = ParamsToQueryService.new( + ::Wikis::PageLink, + current_user, + query_class: ::Queries::Wikis::PageLinks::PageLinkQuery + ).call(params) + + unless query.valid? + message = I18n.t("api_v3.errors.missing_or_malformed_parameter", parameter: "filters") + raise ::API::Errors::InvalidQuery.new(message) + end + + relation = query.results.where(linkable: Authorization.work_packages(:view_work_packages, current_user)) + + PageLinkCollectionRepresenter.new( + enrich_models_with_wiki_metadata(relation).result, + per_page: params[:pageSize], + self_link: api_v3_paths.wiki_page_links, + current_user: + ) + end end end end diff --git a/modules/wikis/lib/open_project/wikis/engine.rb b/modules/wikis/lib/open_project/wikis/engine.rb index 9150153b2a2..c0818091d09 100644 --- a/modules/wikis/lib/open_project/wikis/engine.rb +++ b/modules/wikis/lib/open_project/wikis/engine.rb @@ -64,6 +64,7 @@ module OpenProject::Wikis # Registering queries and filters ::Queries::Register.register(::Queries::Wikis::PageLinks::PageLinkQuery) do filter ::Queries::Wikis::PageLinks::Filter::ProviderFilter + filter ::Queries::Wikis::PageLinks::Filter::WikiPageLinkTypeFilter end end diff --git a/modules/wikis/spec/requests/api/v3/page_links/page_links_api_spec.rb b/modules/wikis/spec/requests/api/v3/page_links/page_links_api_spec.rb index 3ba6cb3f773..fea0363f170 100644 --- a/modules/wikis/spec/requests/api/v3/page_links/page_links_api_spec.rb +++ b/modules/wikis/spec/requests/api/v3/page_links/page_links_api_spec.rb @@ -34,18 +34,18 @@ require_module_spec_helper RSpec.describe "API v3 wiki page links resource", content_type: :json do include API::V3::Utilities::PathHelper - let(:work_package) { create(:work_package) } - let(:internal_wiki) { create(:internal_wiki_provider) } - let(:xwiki_provider) { create(:xwiki_provider) } + shared_let(:work_package) { create(:work_package) } + shared_let(:internal_wiki) { create(:internal_wiki_provider) } + shared_let(:xwiki_provider) { create(:xwiki_provider) } - let(:project) { work_package.project } + shared_let(:project) { work_package.project } - let(:user) { create(:user, member_with_permissions: { project => %i(view_work_packages manage_wiki_page_links) }) } + shared_let(:user) { create(:user, member_with_permissions: { project => %i(view_work_packages manage_wiki_page_links) }) } - let(:relation_page_links) { create_list(:relation_wiki_page_link, 3, provider: xwiki_provider, linkable: work_package) } - let(:inline_page_links) { create_list(:inline_wiki_page_link, 3, provider: internal_wiki, linkable: work_package) } + shared_let(:relation_page_links) { create_list(:relation_wiki_page_link, 3, provider: xwiki_provider, linkable: work_package) } + shared_let(:inline_page_links) { create_list(:inline_wiki_page_link, 3, provider: internal_wiki, linkable: work_package) } - let(:unrelated_page_links) do + shared_let(:unrelated_page_links) do create_list(:inline_wiki_page_link, 3, provider: internal_wiki, linkable: create(:work_package, project: project)) end @@ -79,6 +79,52 @@ RSpec.describe "API v3 wiki page links resource", content_type: :json do end end + describe "GET /api/v3/wiki_page_links" do + let(:unaccessible_links) { create_list(:relation_wiki_page_link, 2, provider: xwiki_provider) } + let(:path) { api_v3_paths.wiki_page_links } + + context "with all preconditions met (happy path)" do + before do + unaccessible_links + get path + end + + it_behaves_like "API V3 collection response", 9, 9, "WikiPageLink", "WikiPageLinkCollection" do + let(:elements) { Wikis::PageLink.where.not(id: unaccessible_links.pluck(:id)).order(id: :desc).all } + end + end + + context "when filtered by provider" do + let(:filter) { [{ provider: { operator: "=", values: [internal_wiki.universal_identifier] } }] } + + before { get "#{path}?filters=#{CGI.escape(filter.to_json)}" } + + it_behaves_like "API V3 collection response", 6, 6, "WikiPageLink", "WikiPageLinkCollection" do + let(:elements) { Wikis::PageLink.where(provider: internal_wiki).order(id: :desc).all } + end + end + + context "when filtered by link type" do + let(:filter) do + [{ wiki_page_link_type: + { operator: "=", values: [API::V3::PageLinks::URN_PAGE_LINK_TYPE["Wikis::RelationPageLink"]] } }] + end + + before { get "#{path}?filters=#{CGI.escape(filter.to_json)}" } + + it_behaves_like "API V3 collection response", 3, 3, "WikiPageLink", "WikiPageLinkCollection" do + let(:elements) { Wikis::RelationPageLink.where.not(id: unaccessible_links.pluck(:id)).order(id: :desc).all } + end + + it "only returns the filtered type" do + json = MultiJson.load(last_response.body, symbolize_keys: true) + + expect(json.dig(:_embedded, :elements)) + .to all(include(wikiPageLinkType: API::V3::PageLinks::URN_PAGE_LINK_TYPE["Wikis::RelationPageLink"])) + end + end + end + describe "POST /api/v3/wiki_page_links" do let(:user) { create(:user, member_with_permissions: { project => %i(view_work_packages manage_wiki_page_links) }) } @@ -180,6 +226,7 @@ RSpec.describe "API v3 wiki page links resource", content_type: :json do allow(xwiki_class).to receive(:new).and_return(xwiki_query) stub_query_calls(inline_page_links, internal_query) stub_query_calls(relation_page_links, xwiki_query) + stub_query_calls(unrelated_page_links, internal_query) end def stub_query_calls(links, query) From 1feba4d963164421be7ecde056453feda0c0cd5d Mon Sep 17 00:00:00 2001 From: Jan Sandbrink Date: Tue, 9 Jun 2026 13:15:28 +0200 Subject: [PATCH 095/107] Move CanonicalPageInfo query into internal namespace Making it more clear that this is a query for internal usage --- .../xwiki/queries/canonical_page_info.rb | 76 ------------------ .../queries/internal/canonical_page_info.rb | 78 +++++++++++++++++++ .../providers/xwiki/queries/search_pages.rb | 2 +- .../canonical_page_info_spec.rb | 2 +- 4 files changed, 80 insertions(+), 78 deletions(-) delete mode 100644 modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/canonical_page_info.rb create mode 100644 modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/internal/canonical_page_info.rb rename modules/wikis/spec/services/wikis/adapters/providers/xwiki/queries/{ => internal}/canonical_page_info_spec.rb (98%) diff --git a/modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/canonical_page_info.rb b/modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/canonical_page_info.rb deleted file mode 100644 index 85260412e22..00000000000 --- a/modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/canonical_page_info.rb +++ /dev/null @@ -1,76 +0,0 @@ -# frozen_string_literal: true - -#-- copyright -# OpenProject is an open source project management software. -# Copyright (C) the OpenProject GmbH -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License version 3. -# -# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: -# Copyright (C) 2006-2013 Jean-Philippe Lang -# Copyright (C) 2010-2013 the ChiliProject Team -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# -# See COPYRIGHT and LICENSE files for more details. -#++ - -module Wikis - module Adapters - module Providers - module XWiki - module Queries - # Fetch page information using a canonical XWiki identifier - class CanonicalPageInfo < BaseQuery - include Concerns::XWikiQuery - - def call(input_data:, auth_strategy:) - ref = CanonicalPageReference.parse(input_data.identifier) - return failure(code: :not_found) unless ref - - perform_request(ref, auth_strategy:) do |data| - success( - Results::PageInfo.new( - identifier: StablePageReference.parse(fetch_json(data, "id")).to_s, - title: data.fetch("title"), - href: data.fetch("xwikiAbsoluteUrl"), - provider: - ) - ) - end - end - - def perform_request(reference, auth_strategy:, &) - authenticated(auth_strategy) do |http| - handle_response( - # This query is implemented as a PUT on the XWiki side, because it dynamically creates the - # stable identifier that it returns. Passing an empty JSON body is also required for the - # endpoint to not raise an error 🤷 - http.with(headers: { "Content-Type": "application/json" }) - .put( - rest_url("openproject/documents", query: { docRef: reference.to_s }), - body: "{}" - ), - & - ) - end - end - end - end - end - end - end -end diff --git a/modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/internal/canonical_page_info.rb b/modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/internal/canonical_page_info.rb new file mode 100644 index 00000000000..4513f8eede9 --- /dev/null +++ b/modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/internal/canonical_page_info.rb @@ -0,0 +1,78 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +module Wikis + module Adapters + module Providers + module XWiki + module Queries + module Internal + # Fetch page information using a canonical XWiki identifier + class CanonicalPageInfo < BaseQuery + include Concerns::XWikiQuery + + def call(input_data:, auth_strategy:) + ref = CanonicalPageReference.parse(input_data.identifier) + return failure(code: :not_found) unless ref + + perform_request(ref, auth_strategy:) do |data| + success( + Results::PageInfo.new( + identifier: StablePageReference.parse(fetch_json(data, "id")).to_s, + title: data.fetch("title"), + href: data.fetch("xwikiAbsoluteUrl"), + provider: + ) + ) + end + end + + def perform_request(reference, auth_strategy:, &) + authenticated(auth_strategy) do |http| + handle_response( + # This query is implemented as a PUT on the XWiki side, because it dynamically creates the + # stable identifier that it returns. Passing an empty JSON body is also required for the + # endpoint to not raise an error 🤷 + http.with(headers: { "Content-Type": "application/json" }) + .put( + rest_url("openproject/documents", query: { docRef: reference.to_s }), + body: "{}" + ), + & + ) + end + end + end + end + end + end + end + end +end diff --git a/modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/search_pages.rb b/modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/search_pages.rb index 9029f99636f..e0f3c7b02e9 100644 --- a/modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/search_pages.rb +++ b/modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/search_pages.rb @@ -67,7 +67,7 @@ module Wikis def canonical_page_info(identifier:, auth_strategy:) Input::PageInfo.build(identifier:).bind do |input_data| - CanonicalPageInfo.new(model: provider).call(input_data:, auth_strategy:) + Internal::CanonicalPageInfo.new(model: provider).call(input_data:, auth_strategy:) end end end diff --git a/modules/wikis/spec/services/wikis/adapters/providers/xwiki/queries/canonical_page_info_spec.rb b/modules/wikis/spec/services/wikis/adapters/providers/xwiki/queries/internal/canonical_page_info_spec.rb similarity index 98% rename from modules/wikis/spec/services/wikis/adapters/providers/xwiki/queries/canonical_page_info_spec.rb rename to modules/wikis/spec/services/wikis/adapters/providers/xwiki/queries/internal/canonical_page_info_spec.rb index cc4e7648e14..d8052d555aa 100644 --- a/modules/wikis/spec/services/wikis/adapters/providers/xwiki/queries/canonical_page_info_spec.rb +++ b/modules/wikis/spec/services/wikis/adapters/providers/xwiki/queries/internal/canonical_page_info_spec.rb @@ -31,7 +31,7 @@ require "spec_helper" require_module_spec_helper -RSpec.describe Wikis::Adapters::Providers::XWiki::Queries::CanonicalPageInfo, :webmock do +RSpec.describe Wikis::Adapters::Providers::XWiki::Queries::Internal::CanonicalPageInfo, :webmock do it "is not registered" do expect(Wikis::Adapters::Registry.resolve("xwiki.queries.page_info")).not_to eq(described_class) end From 16707c02243b2931c64a6492073e2caaff666e2e Mon Sep 17 00:00:00 2001 From: OpenProject Actions CI Date: Tue, 9 Jun 2026 12:39:31 +0000 Subject: [PATCH 096/107] update locales from crowdin [ci skip] --- config/locales/crowdin/af.yml | 1 + config/locales/crowdin/ar.yml | 1 + config/locales/crowdin/az.yml | 1 + config/locales/crowdin/be.yml | 1 + config/locales/crowdin/bg.yml | 1 + config/locales/crowdin/ca.yml | 1 + config/locales/crowdin/ckb-IR.yml | 1 + config/locales/crowdin/cs.yml | 1 + config/locales/crowdin/da.yml | 1 + config/locales/crowdin/de.yml | 137 +++++++------- config/locales/crowdin/el.yml | 1 + config/locales/crowdin/eo.yml | 1 + config/locales/crowdin/es.yml | 1 + config/locales/crowdin/et.yml | 1 + config/locales/crowdin/eu.yml | 1 + config/locales/crowdin/fa.yml | 1 + config/locales/crowdin/fi.yml | 1 + config/locales/crowdin/fil.yml | 1 + config/locales/crowdin/fr.yml | 1 + config/locales/crowdin/he.yml | 1 + config/locales/crowdin/hi.yml | 1 + config/locales/crowdin/hr.yml | 1 + config/locales/crowdin/hu.yml | 1 + config/locales/crowdin/hy.yml | 1 + config/locales/crowdin/id.yml | 1 + config/locales/crowdin/it.yml | 1 + config/locales/crowdin/ja.yml | 1 + config/locales/crowdin/ka.yml | 1 + config/locales/crowdin/kk.yml | 1 + config/locales/crowdin/ko.yml | 1 + config/locales/crowdin/lt.yml | 1 + config/locales/crowdin/lv.yml | 1 + config/locales/crowdin/mn.yml | 1 + config/locales/crowdin/ms.yml | 1 + config/locales/crowdin/ne.yml | 1 + config/locales/crowdin/nl.yml | 1 + config/locales/crowdin/no.yml | 1 + config/locales/crowdin/pl.yml | 1 + config/locales/crowdin/pt-BR.yml | 1 + config/locales/crowdin/pt-PT.yml | 1 + config/locales/crowdin/ro.yml | 1 + config/locales/crowdin/ru.yml | 1 + config/locales/crowdin/rw.yml | 1 + config/locales/crowdin/si.yml | 1 + config/locales/crowdin/sk.yml | 1 + config/locales/crowdin/sl.yml | 1 + config/locales/crowdin/sr.yml | 1 + config/locales/crowdin/sv.yml | 1 + config/locales/crowdin/th.yml | 1 + config/locales/crowdin/tr.yml | 1 + config/locales/crowdin/uk.yml | 1 + config/locales/crowdin/uz.yml | 1 + config/locales/crowdin/vi.yml | 1 + config/locales/crowdin/zh-CN.yml | 1 + config/locales/crowdin/zh-TW.yml | 1 + .../auth_saml/config/locales/crowdin/af.yml | 8 + .../auth_saml/config/locales/crowdin/ar.yml | 8 + .../auth_saml/config/locales/crowdin/az.yml | 8 + .../auth_saml/config/locales/crowdin/be.yml | 8 + .../auth_saml/config/locales/crowdin/bg.yml | 8 + .../auth_saml/config/locales/crowdin/ca.yml | 8 + .../config/locales/crowdin/ckb-IR.yml | 8 + .../auth_saml/config/locales/crowdin/cs.yml | 8 + .../auth_saml/config/locales/crowdin/da.yml | 8 + .../auth_saml/config/locales/crowdin/de.yml | 8 + .../auth_saml/config/locales/crowdin/el.yml | 8 + .../auth_saml/config/locales/crowdin/eo.yml | 8 + .../auth_saml/config/locales/crowdin/es.yml | 8 + .../auth_saml/config/locales/crowdin/et.yml | 8 + .../auth_saml/config/locales/crowdin/eu.yml | 8 + .../auth_saml/config/locales/crowdin/fa.yml | 8 + .../auth_saml/config/locales/crowdin/fi.yml | 8 + .../auth_saml/config/locales/crowdin/fil.yml | 8 + .../auth_saml/config/locales/crowdin/fr.yml | 8 + .../auth_saml/config/locales/crowdin/he.yml | 8 + .../auth_saml/config/locales/crowdin/hi.yml | 8 + .../auth_saml/config/locales/crowdin/hr.yml | 8 + .../auth_saml/config/locales/crowdin/hu.yml | 8 + .../auth_saml/config/locales/crowdin/hy.yml | 8 + .../auth_saml/config/locales/crowdin/id.yml | 8 + .../auth_saml/config/locales/crowdin/it.yml | 8 + .../auth_saml/config/locales/crowdin/ja.yml | 8 + .../auth_saml/config/locales/crowdin/ka.yml | 8 + .../auth_saml/config/locales/crowdin/kk.yml | 8 + .../auth_saml/config/locales/crowdin/ko.yml | 8 + .../auth_saml/config/locales/crowdin/lt.yml | 8 + .../auth_saml/config/locales/crowdin/lv.yml | 8 + .../auth_saml/config/locales/crowdin/mn.yml | 8 + .../auth_saml/config/locales/crowdin/ms.yml | 8 + .../auth_saml/config/locales/crowdin/ne.yml | 8 + .../auth_saml/config/locales/crowdin/nl.yml | 8 + .../auth_saml/config/locales/crowdin/no.yml | 8 + .../auth_saml/config/locales/crowdin/pl.yml | 8 + .../config/locales/crowdin/pt-BR.yml | 8 + .../config/locales/crowdin/pt-PT.yml | 8 + .../auth_saml/config/locales/crowdin/ro.yml | 8 + .../auth_saml/config/locales/crowdin/ru.yml | 8 + .../auth_saml/config/locales/crowdin/rw.yml | 8 + .../auth_saml/config/locales/crowdin/si.yml | 8 + .../auth_saml/config/locales/crowdin/sk.yml | 8 + .../auth_saml/config/locales/crowdin/sl.yml | 8 + .../auth_saml/config/locales/crowdin/sr.yml | 8 + .../auth_saml/config/locales/crowdin/sv.yml | 8 + .../auth_saml/config/locales/crowdin/th.yml | 8 + .../auth_saml/config/locales/crowdin/tr.yml | 8 + .../auth_saml/config/locales/crowdin/uk.yml | 8 + .../auth_saml/config/locales/crowdin/uz.yml | 8 + .../auth_saml/config/locales/crowdin/vi.yml | 8 + .../config/locales/crowdin/zh-CN.yml | 8 + .../config/locales/crowdin/zh-TW.yml | 8 + .../backlogs/config/locales/crowdin/af.yml | 15 +- .../backlogs/config/locales/crowdin/ar.yml | 15 +- .../backlogs/config/locales/crowdin/az.yml | 15 +- .../backlogs/config/locales/crowdin/be.yml | 15 +- .../backlogs/config/locales/crowdin/bg.yml | 15 +- .../backlogs/config/locales/crowdin/ca.yml | 15 +- .../config/locales/crowdin/ckb-IR.yml | 15 +- .../backlogs/config/locales/crowdin/cs.yml | 15 +- .../backlogs/config/locales/crowdin/da.yml | 15 +- .../backlogs/config/locales/crowdin/de.yml | 17 +- .../backlogs/config/locales/crowdin/el.yml | 15 +- .../backlogs/config/locales/crowdin/eo.yml | 15 +- .../backlogs/config/locales/crowdin/es.yml | 15 +- .../backlogs/config/locales/crowdin/et.yml | 15 +- .../backlogs/config/locales/crowdin/eu.yml | 15 +- .../backlogs/config/locales/crowdin/fa.yml | 15 +- .../backlogs/config/locales/crowdin/fi.yml | 15 +- .../backlogs/config/locales/crowdin/fil.yml | 15 +- .../backlogs/config/locales/crowdin/fr.yml | 15 +- .../backlogs/config/locales/crowdin/he.yml | 15 +- .../backlogs/config/locales/crowdin/hi.yml | 15 +- .../backlogs/config/locales/crowdin/hr.yml | 15 +- .../backlogs/config/locales/crowdin/hu.yml | 15 +- .../backlogs/config/locales/crowdin/hy.yml | 15 +- .../backlogs/config/locales/crowdin/id.yml | 15 +- .../backlogs/config/locales/crowdin/it.yml | 15 +- .../backlogs/config/locales/crowdin/ja.yml | 15 +- .../backlogs/config/locales/crowdin/ka.yml | 15 +- .../backlogs/config/locales/crowdin/kk.yml | 15 +- .../backlogs/config/locales/crowdin/ko.yml | 15 +- .../backlogs/config/locales/crowdin/lt.yml | 15 +- .../backlogs/config/locales/crowdin/lv.yml | 15 +- .../backlogs/config/locales/crowdin/mn.yml | 15 +- .../backlogs/config/locales/crowdin/ms.yml | 15 +- .../backlogs/config/locales/crowdin/ne.yml | 15 +- .../backlogs/config/locales/crowdin/nl.yml | 15 +- .../backlogs/config/locales/crowdin/no.yml | 15 +- .../backlogs/config/locales/crowdin/pl.yml | 15 +- .../backlogs/config/locales/crowdin/pt-BR.yml | 15 +- .../backlogs/config/locales/crowdin/pt-PT.yml | 15 +- .../backlogs/config/locales/crowdin/ro.yml | 17 +- .../backlogs/config/locales/crowdin/ru.yml | 15 +- .../backlogs/config/locales/crowdin/rw.yml | 15 +- .../backlogs/config/locales/crowdin/si.yml | 15 +- .../backlogs/config/locales/crowdin/sk.yml | 15 +- .../backlogs/config/locales/crowdin/sl.yml | 15 +- .../backlogs/config/locales/crowdin/sr.yml | 15 +- .../backlogs/config/locales/crowdin/sv.yml | 15 +- .../backlogs/config/locales/crowdin/th.yml | 15 +- .../backlogs/config/locales/crowdin/tr.yml | 15 +- .../backlogs/config/locales/crowdin/uk.yml | 15 +- .../backlogs/config/locales/crowdin/uz.yml | 15 +- .../backlogs/config/locales/crowdin/vi.yml | 15 +- .../backlogs/config/locales/crowdin/zh-CN.yml | 15 +- .../backlogs/config/locales/crowdin/zh-TW.yml | 17 +- modules/bim/config/locales/crowdin/af.yml | 4 + modules/bim/config/locales/crowdin/ar.yml | 4 + modules/bim/config/locales/crowdin/az.yml | 4 + modules/bim/config/locales/crowdin/be.yml | 4 + modules/bim/config/locales/crowdin/bg.yml | 4 + modules/bim/config/locales/crowdin/ca.yml | 4 + modules/bim/config/locales/crowdin/ckb-IR.yml | 4 + modules/bim/config/locales/crowdin/cs.yml | 4 + modules/bim/config/locales/crowdin/da.yml | 4 + modules/bim/config/locales/crowdin/de.yml | 4 + modules/bim/config/locales/crowdin/el.yml | 4 + modules/bim/config/locales/crowdin/eo.yml | 4 + modules/bim/config/locales/crowdin/es.yml | 4 + modules/bim/config/locales/crowdin/et.yml | 4 + modules/bim/config/locales/crowdin/eu.yml | 4 + modules/bim/config/locales/crowdin/fa.yml | 4 + modules/bim/config/locales/crowdin/fi.yml | 4 + modules/bim/config/locales/crowdin/fil.yml | 4 + modules/bim/config/locales/crowdin/fr.yml | 6 +- modules/bim/config/locales/crowdin/he.yml | 4 + modules/bim/config/locales/crowdin/hi.yml | 4 + modules/bim/config/locales/crowdin/hr.yml | 4 + modules/bim/config/locales/crowdin/hu.yml | 4 + modules/bim/config/locales/crowdin/hy.yml | 4 + modules/bim/config/locales/crowdin/id.yml | 4 + modules/bim/config/locales/crowdin/it.yml | 3 + modules/bim/config/locales/crowdin/ja.yml | 4 + modules/bim/config/locales/crowdin/ka.yml | 4 + modules/bim/config/locales/crowdin/kk.yml | 4 + modules/bim/config/locales/crowdin/ko.yml | 4 + modules/bim/config/locales/crowdin/lt.yml | 4 + modules/bim/config/locales/crowdin/lv.yml | 4 + modules/bim/config/locales/crowdin/mn.yml | 4 + modules/bim/config/locales/crowdin/ms.yml | 4 + modules/bim/config/locales/crowdin/ne.yml | 4 + modules/bim/config/locales/crowdin/nl.yml | 4 + modules/bim/config/locales/crowdin/no.yml | 4 + modules/bim/config/locales/crowdin/pl.yml | 3 + modules/bim/config/locales/crowdin/pt-BR.yml | 3 + modules/bim/config/locales/crowdin/pt-PT.yml | 3 + modules/bim/config/locales/crowdin/ro.yml | 4 + modules/bim/config/locales/crowdin/ru.yml | 4 + modules/bim/config/locales/crowdin/rw.yml | 4 + modules/bim/config/locales/crowdin/si.yml | 4 + modules/bim/config/locales/crowdin/sk.yml | 4 + modules/bim/config/locales/crowdin/sl.yml | 4 + modules/bim/config/locales/crowdin/sr.yml | 4 + modules/bim/config/locales/crowdin/sv.yml | 4 + modules/bim/config/locales/crowdin/th.yml | 4 + modules/bim/config/locales/crowdin/tr.yml | 4 + modules/bim/config/locales/crowdin/uk.yml | 3 + modules/bim/config/locales/crowdin/uz.yml | 4 + modules/bim/config/locales/crowdin/vi.yml | 4 + modules/bim/config/locales/crowdin/zh-CN.yml | 4 + modules/bim/config/locales/crowdin/zh-TW.yml | 4 + modules/budgets/config/locales/crowdin/cs.yml | 2 +- modules/costs/config/locales/crowdin/af.yml | 29 ++- modules/costs/config/locales/crowdin/ar.yml | 29 ++- modules/costs/config/locales/crowdin/az.yml | 29 ++- modules/costs/config/locales/crowdin/be.yml | 29 ++- modules/costs/config/locales/crowdin/bg.yml | 29 ++- modules/costs/config/locales/crowdin/ca.yml | 29 ++- .../costs/config/locales/crowdin/ckb-IR.yml | 29 ++- modules/costs/config/locales/crowdin/cs.yml | 29 ++- modules/costs/config/locales/crowdin/da.yml | 29 ++- modules/costs/config/locales/crowdin/de.yml | 31 +++- modules/costs/config/locales/crowdin/el.yml | 29 ++- modules/costs/config/locales/crowdin/eo.yml | 29 ++- modules/costs/config/locales/crowdin/es.yml | 29 ++- modules/costs/config/locales/crowdin/et.yml | 29 ++- modules/costs/config/locales/crowdin/eu.yml | 29 ++- modules/costs/config/locales/crowdin/fa.yml | 29 ++- modules/costs/config/locales/crowdin/fi.yml | 29 ++- modules/costs/config/locales/crowdin/fil.yml | 29 ++- modules/costs/config/locales/crowdin/fr.yml | 29 ++- modules/costs/config/locales/crowdin/he.yml | 29 ++- modules/costs/config/locales/crowdin/hi.yml | 29 ++- modules/costs/config/locales/crowdin/hr.yml | 29 ++- modules/costs/config/locales/crowdin/hu.yml | 29 ++- modules/costs/config/locales/crowdin/hy.yml | 29 ++- modules/costs/config/locales/crowdin/id.yml | 29 ++- modules/costs/config/locales/crowdin/it.yml | 29 ++- modules/costs/config/locales/crowdin/ja.yml | 31 +++- modules/costs/config/locales/crowdin/ka.yml | 29 ++- modules/costs/config/locales/crowdin/kk.yml | 29 ++- modules/costs/config/locales/crowdin/ko.yml | 29 ++- modules/costs/config/locales/crowdin/lt.yml | 29 ++- modules/costs/config/locales/crowdin/lv.yml | 29 ++- modules/costs/config/locales/crowdin/mn.yml | 29 ++- modules/costs/config/locales/crowdin/ms.yml | 29 ++- modules/costs/config/locales/crowdin/ne.yml | 29 ++- modules/costs/config/locales/crowdin/nl.yml | 29 ++- modules/costs/config/locales/crowdin/no.yml | 29 ++- modules/costs/config/locales/crowdin/pl.yml | 29 ++- .../costs/config/locales/crowdin/pt-BR.yml | 29 ++- .../costs/config/locales/crowdin/pt-PT.yml | 29 ++- modules/costs/config/locales/crowdin/ro.yml | 29 ++- modules/costs/config/locales/crowdin/ru.yml | 29 ++- modules/costs/config/locales/crowdin/rw.yml | 29 ++- modules/costs/config/locales/crowdin/si.yml | 29 ++- modules/costs/config/locales/crowdin/sk.yml | 29 ++- modules/costs/config/locales/crowdin/sl.yml | 29 ++- modules/costs/config/locales/crowdin/sr.yml | 29 ++- modules/costs/config/locales/crowdin/sv.yml | 29 ++- modules/costs/config/locales/crowdin/th.yml | 29 ++- modules/costs/config/locales/crowdin/tr.yml | 29 ++- modules/costs/config/locales/crowdin/uk.yml | 29 ++- modules/costs/config/locales/crowdin/uz.yml | 29 ++- modules/costs/config/locales/crowdin/vi.yml | 29 ++- .../costs/config/locales/crowdin/zh-CN.yml | 29 ++- .../costs/config/locales/crowdin/zh-TW.yml | 29 ++- .../grids/config/locales/crowdin/js-af.yml | 2 +- .../grids/config/locales/crowdin/js-ar.yml | 2 +- .../grids/config/locales/crowdin/js-az.yml | 2 +- .../grids/config/locales/crowdin/js-be.yml | 2 +- .../grids/config/locales/crowdin/js-bg.yml | 2 +- .../grids/config/locales/crowdin/js-ca.yml | 2 +- .../config/locales/crowdin/js-ckb-IR.yml | 2 +- .../grids/config/locales/crowdin/js-cs.yml | 2 +- .../grids/config/locales/crowdin/js-da.yml | 2 +- .../grids/config/locales/crowdin/js-de.yml | 2 +- .../grids/config/locales/crowdin/js-el.yml | 2 +- .../grids/config/locales/crowdin/js-eo.yml | 2 +- .../grids/config/locales/crowdin/js-es.yml | 2 +- .../grids/config/locales/crowdin/js-et.yml | 2 +- .../grids/config/locales/crowdin/js-eu.yml | 2 +- .../grids/config/locales/crowdin/js-fa.yml | 2 +- .../grids/config/locales/crowdin/js-fi.yml | 2 +- .../grids/config/locales/crowdin/js-fil.yml | 2 +- .../grids/config/locales/crowdin/js-fr.yml | 2 +- .../grids/config/locales/crowdin/js-he.yml | 2 +- .../grids/config/locales/crowdin/js-hi.yml | 2 +- .../grids/config/locales/crowdin/js-hr.yml | 2 +- .../grids/config/locales/crowdin/js-hu.yml | 2 +- .../grids/config/locales/crowdin/js-hy.yml | 2 +- .../grids/config/locales/crowdin/js-id.yml | 2 +- .../grids/config/locales/crowdin/js-it.yml | 2 +- .../grids/config/locales/crowdin/js-ja.yml | 2 +- .../grids/config/locales/crowdin/js-ka.yml | 2 +- .../grids/config/locales/crowdin/js-kk.yml | 2 +- .../grids/config/locales/crowdin/js-ko.yml | 2 +- .../grids/config/locales/crowdin/js-lt.yml | 2 +- .../grids/config/locales/crowdin/js-lv.yml | 2 +- .../grids/config/locales/crowdin/js-mn.yml | 2 +- .../grids/config/locales/crowdin/js-ms.yml | 2 +- .../grids/config/locales/crowdin/js-ne.yml | 2 +- .../grids/config/locales/crowdin/js-nl.yml | 2 +- .../grids/config/locales/crowdin/js-no.yml | 2 +- .../grids/config/locales/crowdin/js-pl.yml | 2 +- .../grids/config/locales/crowdin/js-pt-BR.yml | 2 +- .../grids/config/locales/crowdin/js-pt-PT.yml | 2 +- .../grids/config/locales/crowdin/js-ro.yml | 2 +- .../grids/config/locales/crowdin/js-ru.yml | 2 +- .../grids/config/locales/crowdin/js-rw.yml | 2 +- .../grids/config/locales/crowdin/js-si.yml | 2 +- .../grids/config/locales/crowdin/js-sk.yml | 2 +- .../grids/config/locales/crowdin/js-sl.yml | 2 +- .../grids/config/locales/crowdin/js-sr.yml | 2 +- .../grids/config/locales/crowdin/js-sv.yml | 2 +- .../grids/config/locales/crowdin/js-th.yml | 2 +- .../grids/config/locales/crowdin/js-tr.yml | 2 +- .../grids/config/locales/crowdin/js-uk.yml | 2 +- .../grids/config/locales/crowdin/js-uz.yml | 2 +- .../grids/config/locales/crowdin/js-vi.yml | 2 +- .../grids/config/locales/crowdin/js-zh-CN.yml | 2 +- .../grids/config/locales/crowdin/js-zh-TW.yml | 2 +- .../ldap_groups/config/locales/crowdin/af.yml | 13 +- .../ldap_groups/config/locales/crowdin/ar.yml | 13 +- .../ldap_groups/config/locales/crowdin/az.yml | 13 +- .../ldap_groups/config/locales/crowdin/be.yml | 13 +- .../ldap_groups/config/locales/crowdin/bg.yml | 13 +- .../ldap_groups/config/locales/crowdin/ca.yml | 13 +- .../config/locales/crowdin/ckb-IR.yml | 13 +- .../ldap_groups/config/locales/crowdin/cs.yml | 13 +- .../ldap_groups/config/locales/crowdin/da.yml | 13 +- .../ldap_groups/config/locales/crowdin/de.yml | 18 +- .../ldap_groups/config/locales/crowdin/el.yml | 13 +- .../ldap_groups/config/locales/crowdin/eo.yml | 13 +- .../ldap_groups/config/locales/crowdin/es.yml | 17 +- .../ldap_groups/config/locales/crowdin/et.yml | 13 +- .../ldap_groups/config/locales/crowdin/eu.yml | 13 +- .../ldap_groups/config/locales/crowdin/fa.yml | 13 +- .../ldap_groups/config/locales/crowdin/fi.yml | 13 +- .../config/locales/crowdin/fil.yml | 13 +- .../ldap_groups/config/locales/crowdin/fr.yml | 17 +- .../ldap_groups/config/locales/crowdin/he.yml | 13 +- .../ldap_groups/config/locales/crowdin/hi.yml | 13 +- .../ldap_groups/config/locales/crowdin/hr.yml | 13 +- .../ldap_groups/config/locales/crowdin/hu.yml | 13 +- .../ldap_groups/config/locales/crowdin/hy.yml | 13 +- .../ldap_groups/config/locales/crowdin/id.yml | 13 +- .../ldap_groups/config/locales/crowdin/it.yml | 18 +- .../ldap_groups/config/locales/crowdin/ja.yml | 13 +- .../ldap_groups/config/locales/crowdin/ka.yml | 13 +- .../ldap_groups/config/locales/crowdin/kk.yml | 13 +- .../ldap_groups/config/locales/crowdin/ko.yml | 15 +- .../ldap_groups/config/locales/crowdin/lt.yml | 13 +- .../ldap_groups/config/locales/crowdin/lv.yml | 13 +- .../ldap_groups/config/locales/crowdin/mn.yml | 13 +- .../ldap_groups/config/locales/crowdin/ms.yml | 13 +- .../ldap_groups/config/locales/crowdin/ne.yml | 13 +- .../ldap_groups/config/locales/crowdin/nl.yml | 13 +- .../ldap_groups/config/locales/crowdin/no.yml | 13 +- .../ldap_groups/config/locales/crowdin/pl.yml | 19 +- .../config/locales/crowdin/pt-BR.yml | 17 +- .../config/locales/crowdin/pt-PT.yml | 19 +- .../ldap_groups/config/locales/crowdin/ro.yml | 13 +- .../ldap_groups/config/locales/crowdin/ru.yml | 19 +- .../ldap_groups/config/locales/crowdin/rw.yml | 13 +- .../ldap_groups/config/locales/crowdin/si.yml | 13 +- .../ldap_groups/config/locales/crowdin/sk.yml | 13 +- .../ldap_groups/config/locales/crowdin/sl.yml | 13 +- .../ldap_groups/config/locales/crowdin/sr.yml | 13 +- .../ldap_groups/config/locales/crowdin/sv.yml | 13 +- .../ldap_groups/config/locales/crowdin/th.yml | 13 +- .../ldap_groups/config/locales/crowdin/tr.yml | 13 +- .../ldap_groups/config/locales/crowdin/uk.yml | 16 +- .../ldap_groups/config/locales/crowdin/uz.yml | 13 +- .../ldap_groups/config/locales/crowdin/vi.yml | 13 +- .../config/locales/crowdin/zh-CN.yml | 16 +- .../config/locales/crowdin/zh-TW.yml | 15 +- modules/meeting/config/locales/crowdin/af.yml | 45 +---- modules/meeting/config/locales/crowdin/ar.yml | 45 +---- modules/meeting/config/locales/crowdin/az.yml | 45 +---- modules/meeting/config/locales/crowdin/be.yml | 45 +---- modules/meeting/config/locales/crowdin/bg.yml | 45 +---- modules/meeting/config/locales/crowdin/ca.yml | 45 +---- .../meeting/config/locales/crowdin/ckb-IR.yml | 45 +---- modules/meeting/config/locales/crowdin/cs.yml | 47 +---- modules/meeting/config/locales/crowdin/da.yml | 45 +---- modules/meeting/config/locales/crowdin/de.yml | 51 +----- modules/meeting/config/locales/crowdin/el.yml | 45 +---- modules/meeting/config/locales/crowdin/eo.yml | 45 +---- modules/meeting/config/locales/crowdin/es.yml | 45 +---- modules/meeting/config/locales/crowdin/et.yml | 45 +---- modules/meeting/config/locales/crowdin/eu.yml | 45 +---- modules/meeting/config/locales/crowdin/fa.yml | 45 +---- modules/meeting/config/locales/crowdin/fi.yml | 45 +---- .../meeting/config/locales/crowdin/fil.yml | 45 +---- modules/meeting/config/locales/crowdin/fr.yml | 45 +---- modules/meeting/config/locales/crowdin/he.yml | 45 +---- modules/meeting/config/locales/crowdin/hi.yml | 45 +---- modules/meeting/config/locales/crowdin/hr.yml | 45 +---- modules/meeting/config/locales/crowdin/hu.yml | 45 +---- modules/meeting/config/locales/crowdin/hy.yml | 45 +---- modules/meeting/config/locales/crowdin/id.yml | 45 +---- modules/meeting/config/locales/crowdin/it.yml | 45 +---- modules/meeting/config/locales/crowdin/ja.yml | 55 +----- modules/meeting/config/locales/crowdin/ka.yml | 45 +---- modules/meeting/config/locales/crowdin/kk.yml | 45 +---- modules/meeting/config/locales/crowdin/ko.yml | 45 +---- modules/meeting/config/locales/crowdin/lt.yml | 45 +---- modules/meeting/config/locales/crowdin/lv.yml | 45 +---- modules/meeting/config/locales/crowdin/mn.yml | 45 +---- modules/meeting/config/locales/crowdin/ms.yml | 45 +---- modules/meeting/config/locales/crowdin/ne.yml | 45 +---- modules/meeting/config/locales/crowdin/nl.yml | 45 +---- modules/meeting/config/locales/crowdin/no.yml | 45 +---- modules/meeting/config/locales/crowdin/pl.yml | 45 +---- .../meeting/config/locales/crowdin/pt-BR.yml | 45 +---- .../meeting/config/locales/crowdin/pt-PT.yml | 45 +---- modules/meeting/config/locales/crowdin/ro.yml | 45 +---- modules/meeting/config/locales/crowdin/ru.yml | 45 +---- modules/meeting/config/locales/crowdin/rw.yml | 45 +---- modules/meeting/config/locales/crowdin/si.yml | 45 +---- modules/meeting/config/locales/crowdin/sk.yml | 45 +---- modules/meeting/config/locales/crowdin/sl.yml | 45 +---- modules/meeting/config/locales/crowdin/sr.yml | 45 +---- modules/meeting/config/locales/crowdin/sv.yml | 45 +---- modules/meeting/config/locales/crowdin/th.yml | 45 +---- modules/meeting/config/locales/crowdin/tr.yml | 43 +---- modules/meeting/config/locales/crowdin/uk.yml | 45 +---- modules/meeting/config/locales/crowdin/uz.yml | 45 +---- modules/meeting/config/locales/crowdin/vi.yml | 45 +---- .../meeting/config/locales/crowdin/zh-CN.yml | 45 +---- .../meeting/config/locales/crowdin/zh-TW.yml | 45 +---- .../reporting/config/locales/crowdin/ro.yml | 2 +- .../reporting/config/locales/crowdin/vi.yml | 2 +- .../config/locales/crowdin/zh-TW.yml | 4 +- .../config/locales/crowdin/af.yml | 147 ++++++++++----- .../config/locales/crowdin/ar.yml | 147 ++++++++++----- .../config/locales/crowdin/az.yml | 147 ++++++++++----- .../config/locales/crowdin/be.yml | 147 ++++++++++----- .../config/locales/crowdin/bg.yml | 147 ++++++++++----- .../config/locales/crowdin/ca.yml | 147 ++++++++++----- .../config/locales/crowdin/ckb-IR.yml | 147 ++++++++++----- .../config/locales/crowdin/cs.yml | 147 ++++++++++----- .../config/locales/crowdin/da.yml | 147 ++++++++++----- .../config/locales/crowdin/de.yml | 147 ++++++++++----- .../config/locales/crowdin/el.yml | 147 ++++++++++----- .../config/locales/crowdin/eo.yml | 147 ++++++++++----- .../config/locales/crowdin/es.yml | 147 ++++++++++----- .../config/locales/crowdin/et.yml | 147 ++++++++++----- .../config/locales/crowdin/eu.yml | 147 ++++++++++----- .../config/locales/crowdin/fa.yml | 147 ++++++++++----- .../config/locales/crowdin/fi.yml | 147 ++++++++++----- .../config/locales/crowdin/fil.yml | 147 ++++++++++----- .../config/locales/crowdin/fr.yml | 147 ++++++++++----- .../config/locales/crowdin/he.yml | 147 ++++++++++----- .../config/locales/crowdin/hi.yml | 147 ++++++++++----- .../config/locales/crowdin/hr.yml | 147 ++++++++++----- .../config/locales/crowdin/hu.yml | 147 ++++++++++----- .../config/locales/crowdin/hy.yml | 147 ++++++++++----- .../config/locales/crowdin/id.yml | 147 ++++++++++----- .../config/locales/crowdin/it.yml | 147 ++++++++++----- .../config/locales/crowdin/ja.yml | 147 ++++++++++----- .../config/locales/crowdin/ka.yml | 147 ++++++++++----- .../config/locales/crowdin/kk.yml | 147 ++++++++++----- .../config/locales/crowdin/ko.yml | 147 ++++++++++----- .../config/locales/crowdin/lt.yml | 147 ++++++++++----- .../config/locales/crowdin/lv.yml | 147 ++++++++++----- .../config/locales/crowdin/mn.yml | 147 ++++++++++----- .../config/locales/crowdin/ms.yml | 147 ++++++++++----- .../config/locales/crowdin/ne.yml | 147 ++++++++++----- .../config/locales/crowdin/nl.yml | 147 ++++++++++----- .../config/locales/crowdin/no.yml | 147 ++++++++++----- .../config/locales/crowdin/pl.yml | 147 ++++++++++----- .../config/locales/crowdin/pt-BR.yml | 147 ++++++++++----- .../config/locales/crowdin/pt-PT.yml | 147 ++++++++++----- .../config/locales/crowdin/ro.yml | 147 ++++++++++----- .../config/locales/crowdin/ru.yml | 147 ++++++++++----- .../config/locales/crowdin/rw.yml | 147 ++++++++++----- .../config/locales/crowdin/si.yml | 147 ++++++++++----- .../config/locales/crowdin/sk.yml | 147 ++++++++++----- .../config/locales/crowdin/sl.yml | 147 ++++++++++----- .../config/locales/crowdin/sr.yml | 147 ++++++++++----- .../config/locales/crowdin/sv.yml | 147 ++++++++++----- .../config/locales/crowdin/th.yml | 147 ++++++++++----- .../config/locales/crowdin/tr.yml | 147 ++++++++++----- .../config/locales/crowdin/uk.yml | 147 ++++++++++----- .../config/locales/crowdin/uz.yml | 147 ++++++++++----- .../config/locales/crowdin/vi.yml | 147 ++++++++++----- .../config/locales/crowdin/zh-CN.yml | 147 ++++++++++----- .../config/locales/crowdin/zh-TW.yml | 147 ++++++++++----- .../storages/config/locales/crowdin/af.yml | 5 + .../storages/config/locales/crowdin/ar.yml | 5 + .../storages/config/locales/crowdin/az.yml | 5 + .../storages/config/locales/crowdin/be.yml | 5 + .../storages/config/locales/crowdin/bg.yml | 5 + .../storages/config/locales/crowdin/ca.yml | 5 + .../config/locales/crowdin/ckb-IR.yml | 5 + .../storages/config/locales/crowdin/cs.yml | 5 + .../storages/config/locales/crowdin/da.yml | 5 + .../storages/config/locales/crowdin/de.yml | 13 +- .../storages/config/locales/crowdin/el.yml | 5 + .../storages/config/locales/crowdin/eo.yml | 5 + .../storages/config/locales/crowdin/es.yml | 5 + .../storages/config/locales/crowdin/et.yml | 5 + .../storages/config/locales/crowdin/eu.yml | 5 + .../storages/config/locales/crowdin/fa.yml | 5 + .../storages/config/locales/crowdin/fi.yml | 5 + .../storages/config/locales/crowdin/fil.yml | 5 + .../storages/config/locales/crowdin/fr.yml | 5 + .../storages/config/locales/crowdin/he.yml | 5 + .../storages/config/locales/crowdin/hi.yml | 5 + .../storages/config/locales/crowdin/hr.yml | 5 + .../storages/config/locales/crowdin/hu.yml | 5 + .../storages/config/locales/crowdin/hy.yml | 5 + .../storages/config/locales/crowdin/id.yml | 5 + .../storages/config/locales/crowdin/it.yml | 5 + .../storages/config/locales/crowdin/ja.yml | 171 +++++++++--------- .../storages/config/locales/crowdin/js-ja.yml | 18 +- .../storages/config/locales/crowdin/ka.yml | 5 + .../storages/config/locales/crowdin/kk.yml | 5 + .../storages/config/locales/crowdin/ko.yml | 5 + .../storages/config/locales/crowdin/lt.yml | 5 + .../storages/config/locales/crowdin/lv.yml | 5 + .../storages/config/locales/crowdin/mn.yml | 5 + .../storages/config/locales/crowdin/ms.yml | 5 + .../storages/config/locales/crowdin/ne.yml | 5 + .../storages/config/locales/crowdin/nl.yml | 5 + .../storages/config/locales/crowdin/no.yml | 5 + .../storages/config/locales/crowdin/pl.yml | 5 + .../storages/config/locales/crowdin/pt-BR.yml | 5 + .../storages/config/locales/crowdin/pt-PT.yml | 5 + .../storages/config/locales/crowdin/ro.yml | 5 + .../storages/config/locales/crowdin/ru.yml | 5 + .../storages/config/locales/crowdin/rw.yml | 5 + .../storages/config/locales/crowdin/si.yml | 5 + .../storages/config/locales/crowdin/sk.yml | 5 + .../storages/config/locales/crowdin/sl.yml | 5 + .../storages/config/locales/crowdin/sr.yml | 5 + .../storages/config/locales/crowdin/sv.yml | 5 + .../storages/config/locales/crowdin/th.yml | 5 + .../storages/config/locales/crowdin/tr.yml | 5 + .../storages/config/locales/crowdin/uk.yml | 5 + .../storages/config/locales/crowdin/uz.yml | 5 + .../storages/config/locales/crowdin/vi.yml | 5 + .../storages/config/locales/crowdin/zh-CN.yml | 5 + .../storages/config/locales/crowdin/zh-TW.yml | 5 + .../config/locales/crowdin/ro.yml | 2 +- .../config/locales/crowdin/ru.yml | 2 +- modules/wikis/config/locales/crowdin/af.yml | 143 +++++++++------ modules/wikis/config/locales/crowdin/ar.yml | 143 +++++++++------ modules/wikis/config/locales/crowdin/az.yml | 143 +++++++++------ modules/wikis/config/locales/crowdin/be.yml | 143 +++++++++------ modules/wikis/config/locales/crowdin/bg.yml | 143 +++++++++------ modules/wikis/config/locales/crowdin/ca.yml | 143 +++++++++------ .../wikis/config/locales/crowdin/ckb-IR.yml | 143 +++++++++------ modules/wikis/config/locales/crowdin/cs.yml | 143 +++++++++------ modules/wikis/config/locales/crowdin/da.yml | 143 +++++++++------ modules/wikis/config/locales/crowdin/de.yml | 143 +++++++++------ modules/wikis/config/locales/crowdin/el.yml | 143 +++++++++------ modules/wikis/config/locales/crowdin/eo.yml | 143 +++++++++------ modules/wikis/config/locales/crowdin/es.yml | 143 +++++++++------ modules/wikis/config/locales/crowdin/et.yml | 143 +++++++++------ modules/wikis/config/locales/crowdin/eu.yml | 143 +++++++++------ modules/wikis/config/locales/crowdin/fa.yml | 143 +++++++++------ modules/wikis/config/locales/crowdin/fi.yml | 143 +++++++++------ modules/wikis/config/locales/crowdin/fil.yml | 143 +++++++++------ modules/wikis/config/locales/crowdin/fr.yml | 143 +++++++++------ modules/wikis/config/locales/crowdin/he.yml | 143 +++++++++------ modules/wikis/config/locales/crowdin/hi.yml | 143 +++++++++------ modules/wikis/config/locales/crowdin/hr.yml | 143 +++++++++------ modules/wikis/config/locales/crowdin/hu.yml | 143 +++++++++------ modules/wikis/config/locales/crowdin/hy.yml | 143 +++++++++------ modules/wikis/config/locales/crowdin/id.yml | 143 +++++++++------ modules/wikis/config/locales/crowdin/it.yml | 143 +++++++++------ modules/wikis/config/locales/crowdin/ja.yml | 143 +++++++++------ modules/wikis/config/locales/crowdin/ka.yml | 143 +++++++++------ modules/wikis/config/locales/crowdin/kk.yml | 143 +++++++++------ modules/wikis/config/locales/crowdin/ko.yml | 143 +++++++++------ modules/wikis/config/locales/crowdin/lt.yml | 143 +++++++++------ modules/wikis/config/locales/crowdin/lv.yml | 143 +++++++++------ modules/wikis/config/locales/crowdin/mn.yml | 143 +++++++++------ modules/wikis/config/locales/crowdin/ms.yml | 143 +++++++++------ modules/wikis/config/locales/crowdin/ne.yml | 143 +++++++++------ modules/wikis/config/locales/crowdin/nl.yml | 143 +++++++++------ modules/wikis/config/locales/crowdin/no.yml | 143 +++++++++------ modules/wikis/config/locales/crowdin/pl.yml | 143 +++++++++------ .../wikis/config/locales/crowdin/pt-BR.yml | 143 +++++++++------ .../wikis/config/locales/crowdin/pt-PT.yml | 143 +++++++++------ modules/wikis/config/locales/crowdin/ro.yml | 143 +++++++++------ modules/wikis/config/locales/crowdin/ru.yml | 143 +++++++++------ modules/wikis/config/locales/crowdin/rw.yml | 143 +++++++++------ modules/wikis/config/locales/crowdin/si.yml | 143 +++++++++------ modules/wikis/config/locales/crowdin/sk.yml | 143 +++++++++------ modules/wikis/config/locales/crowdin/sl.yml | 143 +++++++++------ modules/wikis/config/locales/crowdin/sr.yml | 143 +++++++++------ modules/wikis/config/locales/crowdin/sv.yml | 143 +++++++++------ modules/wikis/config/locales/crowdin/th.yml | 143 +++++++++------ modules/wikis/config/locales/crowdin/tr.yml | 143 +++++++++------ modules/wikis/config/locales/crowdin/uk.yml | 143 +++++++++------ modules/wikis/config/locales/crowdin/uz.yml | 143 +++++++++------ modules/wikis/config/locales/crowdin/vi.yml | 143 +++++++++------ .../wikis/config/locales/crowdin/zh-CN.yml | 143 +++++++++------ .../wikis/config/locales/crowdin/zh-TW.yml | 143 +++++++++------ .../config/locales/crowdin/zh-CN.yml | 2 +- 613 files changed, 15054 insertions(+), 8023 deletions(-) diff --git a/config/locales/crowdin/af.yml b/config/locales/crowdin/af.yml index 8557a331211..cda56e021e8 100644 --- a/config/locales/crowdin/af.yml +++ b/config/locales/crowdin/af.yml @@ -2846,6 +2846,7 @@ af: button_login: Teken in button_move: Skuif button_move_and_follow: Skuif en volg + button_next: Next button_print: Print button_quote: Haal aan button_remove: Remove diff --git a/config/locales/crowdin/ar.yml b/config/locales/crowdin/ar.yml index c28e9747df2..5e6f2bcadbd 100644 --- a/config/locales/crowdin/ar.yml +++ b/config/locales/crowdin/ar.yml @@ -3008,6 +3008,7 @@ ar: button_login: تسجيل الدخول button_move: نقل button_move_and_follow: نقل ومتابعة + button_next: Next button_print: طباعة button_quote: اقتباس button_remove: إزالة diff --git a/config/locales/crowdin/az.yml b/config/locales/crowdin/az.yml index b0692eb5478..417dd50d1cb 100644 --- a/config/locales/crowdin/az.yml +++ b/config/locales/crowdin/az.yml @@ -2846,6 +2846,7 @@ az: button_login: Sign in button_move: Move button_move_and_follow: Move and follow + button_next: Next button_print: Print button_quote: Sitat button_remove: Remove diff --git a/config/locales/crowdin/be.yml b/config/locales/crowdin/be.yml index 8c990a5f2f3..b90939c5f3e 100644 --- a/config/locales/crowdin/be.yml +++ b/config/locales/crowdin/be.yml @@ -2928,6 +2928,7 @@ be: button_login: Sign in button_move: Move button_move_and_follow: Move and follow + button_next: Next button_print: Print button_quote: Quote button_remove: Remove diff --git a/config/locales/crowdin/bg.yml b/config/locales/crowdin/bg.yml index 1feb53c06b4..393771ba191 100644 --- a/config/locales/crowdin/bg.yml +++ b/config/locales/crowdin/bg.yml @@ -2844,6 +2844,7 @@ bg: button_login: Влизане button_move: Премести button_move_and_follow: Преместване и последване + button_next: Next button_print: Отпечатване button_quote: Цитат button_remove: Премахване diff --git a/config/locales/crowdin/ca.yml b/config/locales/crowdin/ca.yml index 843bb7ac093..d456882fef7 100644 --- a/config/locales/crowdin/ca.yml +++ b/config/locales/crowdin/ca.yml @@ -2843,6 +2843,7 @@ ca: button_login: Iniciar sessió button_move: Moure button_move_and_follow: Moure i continuar + button_next: Next button_print: Imprimir button_quote: Citar button_remove: Suprimir diff --git a/config/locales/crowdin/ckb-IR.yml b/config/locales/crowdin/ckb-IR.yml index d0de29dc59a..11cebc2b390 100644 --- a/config/locales/crowdin/ckb-IR.yml +++ b/config/locales/crowdin/ckb-IR.yml @@ -2846,6 +2846,7 @@ ckb-IR: button_login: Sign in button_move: Move button_move_and_follow: Move and follow + button_next: Next button_print: Print button_quote: Quote button_remove: Remove diff --git a/config/locales/crowdin/cs.yml b/config/locales/crowdin/cs.yml index 78858599318..4b04cf9af72 100644 --- a/config/locales/crowdin/cs.yml +++ b/config/locales/crowdin/cs.yml @@ -2930,6 +2930,7 @@ cs: button_login: Přihlásit se button_move: Přesunout button_move_and_follow: Přesunout a pokračovat + button_next: Next button_print: Tisk button_quote: Citovat button_remove: Odstranit diff --git a/config/locales/crowdin/da.yml b/config/locales/crowdin/da.yml index ff143f322ce..a3611dfc43a 100644 --- a/config/locales/crowdin/da.yml +++ b/config/locales/crowdin/da.yml @@ -2845,6 +2845,7 @@ da: button_login: Log ind button_move: Flyt button_move_and_follow: Flyt og følg + button_next: Next button_print: Print button_quote: Citer button_remove: Fjern diff --git a/config/locales/crowdin/de.yml b/config/locales/crowdin/de.yml index 9e098c82f4b..f8259616a61 100644 --- a/config/locales/crowdin/de.yml +++ b/config/locales/crowdin/de.yml @@ -52,25 +52,25 @@ de: confirm_button_text: Veröffentlichen admin: reserved_identifiers: - title: Reserved project identifiers - lede_html: When a project's identifier is renamed, the previous identifier is kept reserved so that existing links and integrations keep working.
Here you can release reserved identifiers so that they may be used by other projects. + title: Reservierte Projektkennungen + lede_html: Wenn eine Kennung eines Projekts umbenannt wird, bleibt die vorherige Kennung reserviert, damit bestehende Links und Integrationen weiterhin funktionieren.
Hier können reservierten Kennungen freigegeben werden, sodass sie von anderen Projekten verwendet werden können. col_identifier: Kennung col_project: Projekt - col_reserved: Reserved - not_available_in_semantic_mode: Reserved project identifiers are only available in numeric identifier mode. - filter_label: Search identifiers - btn_release: Release - released_notice: Identifier "%{identifier}" has been released. - identifier_not_found: The reserved identifier could not be found. It may have already been released or the project may have been deleted. Please refresh the page. + col_reserved: Reserviert + not_available_in_semantic_mode: Reservierte Projektkennungen sind nur im numerischen Modus verfügbar. + filter_label: Kennung suchen + btn_release: Freigeben + released_notice: Die Kennung "%{identifier}" wurde freigegeben. + identifier_not_found: Die reservierte Kennung konnte nicht gefunden werden. Möglicherweise wurde diese bereits freigegeben oder das Projekt wurde gelöscht. Bitte aktualisieren Sie die Seite. dialog: - title: Release identifier - heading: Release "%{identifier}"? - description: Releasing this identifier cannot be undone. External links and integrations using it will stop resolving, and the name becomes available for any new project to claim. - checkbox_label: I understand that this cannot be undone. - confirm_button: Release identifier - empty_heading: No reserved identifiers + title: Kennung freigeben + heading: '"%{identifier}" freigeben?' + description: Die Freigabe dieser Kennung kann nicht rückgängig gemacht werden. Externe Links und Integrationen, die diese Kennung verwenden, werden nicht mehr aufgelöst, und der Name wird für neue Projekte verfügbar, die ihn beansprucht. + checkbox_label: Ich verstehe, dass dies nicht rückgängig gemacht werden kann. + confirm_button: Kennung freigeben + empty_heading: Keine reservierten Kennungen reserved_ago: vor %{time} - empty_body: When a project's identifier changes, the previous one will appear here so you can release it once it's safe to do so. + empty_body: Wenn sich die Projektkennung ändert, wird die vorherige Kennung hier angezeigt, damit Sie diese freigeben können, sobald es sicher ist. plugins: no_results_title_text: Es sind derzeit keine Plugins installiert. no_results_content_text: Weitere Informationen finden Sie auf unserer Seite für Integrationen und Plugins. @@ -140,7 +140,7 @@ de: cannot_delete_with_imports: Jira-Hosts mit laufenden Importen können nicht gelöscht werden custom_field_creation_failed: 'Das nutzerdefinierte Feld ''%{name}'' konnte nicht erstellt werden: %{message}' semantic_identifiers_must_be_enabled: - title: Project-based semantic identifiers must be enabled. + title: Projektspezifische semantische Kennungen müssen aktiviert sein. description: Jira uses issue identifiers consisting of a project key and a sequence number (PRJ-123). OpenProject also supports it, but it needs to be enabled [here](link). blank: title: Noch keine Jira-Hosts konfiguriert @@ -180,7 +180,7 @@ de: client: connection_error: 'Verbindung zum Jira-Server fehlgeschlagen: %{message}' connection_timeout: 'Die Verbindung zum Jira-Server wurde unterbrochen: %{message}' - ssrf_blocked: 'Connection blocked: the Jira host resolves to a private IP address. If your Jira instance runs on an internal network, allow its IP via the OPENPROJECT_SSRF__PROTECTION__IP__ALLOWLIST environment variable.' + ssrf_blocked: 'Verbindung blockiert: Der Jira-Host wird zu einer privaten IP-Adresse aufgelöst. Wenn Ihre Jira-Instanz in einem internen Netzwerk läuft, erlauben Sie ihre IP über die OPENPROJECT_SSRF__PROTECTION__IP__ALLOWLIST Umgebungsvariable.' ssrf_block_doc_link: Bitte sehen Sie sich unsere [Dokumentation](docs_url) an. ssl_error: 'SSL-Fehler bei der Verbindung zum Jira-Server: %{message}' parse_error: 'Die Jira API-Antwort konnte nicht gelesen werden: %{message}' @@ -286,7 +286,7 @@ de: elements: relations: Beziehungen zwischen Tickets project_ids: Projektkennungen - issue_ids: Issue identifiers + issue_ids: Ticketkennungen sprints: Sprint-Zuweisungen workflows: Workflows auf Projektebene schemes: Schemas @@ -433,11 +433,11 @@ de: page_header: description: Wählen Sie zwischen einfachen numerischen Arbeitspaket- oder projektspezifischen Kennungen, bei denen die Projektkennung der Arbeitspaket-ID vorangestellt wird. banner: - existing_identifiers_notice: 'Existing identifiers for %{project_count} projects don''t meet requirements for project-based semantic identifiers. OpenProject can automatically update these so that they are valid as in the examples below. Click on ''Convert identifiers'' to update identifiers for all projects in this manner and enable project-based semantic identifiers. + existing_identifiers_notice: 'Vorhandene Kennungen für %{project_count} Projekte entsprechen nicht den Anforderungen für projektbasierte alphanumerische Bezeichner. OpenProject kann diese automatisch aktualisieren, so dass sie wie in den folgenden Beispielen gültig sind. Klicken Sie auf ''Kennung konvertieren'', um die Kennungen für alle Projekte auf diese Weise zu aktualisieren und projektbasierte alphanumerische Bezeichner zu aktivieren. ' box_header: - table_title: Projects with identifiers to update + table_title: Projekte mit Kennungen zum Aktualisieren label_project: Projekt label_previous_identifier: Vorherige Kennung label_autofixed_suggestion: Zukünftige Kennung @@ -455,8 +455,8 @@ de: remaining_projects: one: "... 1 weiteres Projekt" other: "... %{count} weitere Projekte" - button_autofix: Convert identifiers - button_save: Convert identifiers + button_autofix: Kennungen konvertieren + button_save: Kennungen konvertieren dialog: title: Arbeitspaket-Kennungen ändern heading: Aktivieren Sie projektspezifische Arbeitspaket-Kennungen? @@ -467,9 +467,9 @@ de: checkbox_label: Mir ist bewusst, dass dies alle Arbeitspaket-Kennungen dauerhaft ändern wird success_banner: Das Format der Arbeitspaket-Kennung wurde erfolgreich aktualisiert. in_progress: - header_semantic: Converting to project-based identifiers - header_classic: Converting to numeric identifiers - footer_message: Background conversion is in progress. You can safely leave this page. + header_semantic: Zu projektbasierten Kennungen konvertieren + header_classic: Zu numerischen Kennungen konvertieren + footer_message: Die Hintergrundkonvertierung ist im Gange. Sie können diese Seite sicher verlassen. workflows: tabs: default_transitions: Standard-Übergänge @@ -915,7 +915,7 @@ de: text: Diese Aktion löscht keine Projekte, die in der Liste enthalten sind. Sind Sie sicher, dass Sie diese Projektliste löschen möchten? settings: header_details: Allgemeine Informationen - header_identifier: Identifier + header_identifier: Kennung header_status: Status header_relations: Projektbeziehungen button_update_details: Einstellungen aktualisieren @@ -1368,12 +1368,12 @@ de: edit: form_configuration: tab: Formularkonfiguration - label_group: Section - reset_to_defaults: Reset form - add_attribute_group: Section - add_query_group: Related work packages table - delete_group: Delete section - remove_attribute: Remove from section + label_group: Abschnitt + reset_to_defaults: Formular zurücksetzen + add_attribute_group: Abschnitt + add_query_group: Zugehörige Arbeitspaket-Tabelle + delete_group: Abschnitt löschen + remove_attribute: Aus Abschnitt entfernen drag_to_activate: Felder aus diesem Bereich herausziehen, um sie zu aktivieren drag_to_reorder: Ziehen zum Neuordnen edit_query: Abfrage bearbeiten @@ -1383,12 +1383,12 @@ de: no_inactive_attributes: Keine inaktiven Attribute blankslate_title: Noch keine Gruppen blankslate_description: Fügen Sie Gruppen über die Schaltfläche oben hinzu oder ziehen Sie Attribute aus dem linken Bereich. - group_actions: Section actions - rename_group: Rename section - confirm_delete_group: Are you sure you want to delete this section? This action cannot be automatically reversed. - group_name_label: Section name + group_actions: Abschnittsoptionen + rename_group: Abschnitt umbenennen + confirm_delete_group: Sind Sie sicher, dass Sie diesen Abschnitt löschen möchten? Diese Aktion kann nicht automatisch rückgängig gemacht werden. + group_name_label: Name des Abschnitts row_actions: Weitere Aktionen - query_group_label: Related work packages table + query_group_label: Zugehörige Arbeitspaket-Tabelle empty_group_hint: Attribute hierher ziehen invalid_attribute_groups: Die abgesendeten Daten der Formularkonfiguration sind ungültig. invalid_query: Die eingebettete Abfrage ist ungültig. @@ -1717,7 +1717,7 @@ de: attachment: attachment_content: Inhalt des Anhangs attachment_file_name: Dateiname des Anhangs - charset: Character set + charset: Zeichensatz content_type: Medien-Typ downloads: Downloads file: Datei @@ -1812,7 +1812,7 @@ de: title: Titel description: Beschreibung member: - blocked: Blocked + blocked: Gesperrt roles: Rollen notification: read_ian: In-App lesen @@ -2061,7 +2061,7 @@ de: relatable: Relatable to remaining_hours: Verbleibender Aufwand remaining_time: Verbleibender Aufwand - sequence_number: Sequence number + sequence_number: Sequenznummer shared_with_users: Geteilt mit schedule_manually: Manuelle Planung spent_hours: Aufgewendete Zeit @@ -2161,7 +2161,7 @@ de: regex_invalid: konnte nicht mit dem zugehörigen regulären Ausdruck überprüft werden. regex_list_invalid: Die Zeilen %{invalid_lines} konnten nicht als regulärer Ausdruck gelesen werden. smaller_than_or_equal_to_max_length: muss kleiner als oder gleich der maximalen Länge sein. - ssrf_filtered: violates the SSRF policy of this OpenProject instance. + ssrf_filtered: verstößt gegen die SSRF-Richtlinien dieser OpenProject Instanz. system_wide_non_working_day_exists: widerspricht einem systemweiten Nicht-Arbeitstag für dieses Datum. taken: ist bereits vergeben. too_long: ist zu lang (nicht mehr als %{count} Zeichen). @@ -2840,6 +2840,7 @@ de: button_login: Anmelden button_move: Verschieben button_move_and_follow: Verschieben und Arbeitspaket anzeigen + button_next: Weiter button_print: Drucken button_quote: Zitieren button_remove: Entfernen @@ -3471,10 +3472,10 @@ de: no_results_text: Keine Ergebnisse header: project_select_component: - all_projects: All projects - favorites: Favorites - leave_project: Leave project - title: Projects + all_projects: Alle Projekte + favorites: Favoriten + leave_project: Projekt verlassen + title: Projekte toggle_switch: label_on: Ein label_off: Aus @@ -3516,8 +3517,8 @@ de: projects: Neueste sichtbare Projekte in dieser Instanz. no_visible_projects: Es gibt keine sichtbaren Projekte in dieser OpenProject-Umgebung. favorite_projects: - no_results: You have no favorite projects - no_results_subtext: Add one or multiple projects as favorite through their overview or in a project list. + no_results: Sie haben keine favorisierten Projekte + no_results_subtext: Fügen Sie ein oder mehrere Projekte als Favorit in ihrer Übersicht oder in einer Projektliste hinzu. users: Neueste registrierte Benutzer in dieser Instanz. blocks: community: OpenProject Community @@ -3528,12 +3529,12 @@ de: learn_about: Erfahren Sie mehr über die neuen Funktionen missing: Es gibt noch keine hervorgehobenen Funktionen. '17_5': - new_features_title: 'The release contains various new features and improvements, such as: + new_features_title: 'Dieses Release enthält verschiedene neue Funktionen und Verbesserungen, wie z. B: ' new_features_list: - line_0: Project-based work package identifiers for clearer references. - line_1: Jira Migrator support for Jira identifiers, due dates, and more. + line_0: Projektbasierte Arbeitspaket-Kennungen für klarere Referenzen. + line_1: Jira Migrator unterstützt Jira-Kennungen, Fälligkeitsdaten und mehr. line_2: Option Arbeitspakettypen und -status in Backlogs auszuschließen. line_3: Neu gestaltete Sprint-Ansichten. line_4: Verbesserte Verknüpfung von Arbeitspaketen zwischen dem Dokumenten-Modul und Texteditoren. @@ -4053,7 +4054,7 @@ de: label_home: Hauptseite label_subject_or_id: Titel oder ID label_calendar_subscriptions: Kalenderabonnements - label_identifier: Identifiers + label_identifier: Kennungen label_project_identifier: Projektkennung label_in: an label_in_less_than: in weniger als @@ -4086,7 +4087,7 @@ de: label_journal_diff: Beschreibungsvergleich label_language: Sprache label_languages: Sprachen - label_export_plural: Exports + label_export_plural: Exporte label_external_links: Externe Links label_locale: Sprache und Region label_jump_to_a_project: Zu einem Projekt springen... @@ -4283,7 +4284,7 @@ de: label_project_new: Neues Projekt label_project_plural: Projekte label_project_list_plural: Projektlisten - label_reserved_identifiers: Reserved project identifiers + label_reserved_identifiers: Reservierte Projektkennungen label_project_life_cycle: Projekt-Lebenszyklus label_project_attributes_plural: Projektattribute label_project_custom_field_plural: Projektattribute @@ -4551,7 +4552,7 @@ de: label_total_days_off: Gesamtzahl freier Tage macro_execution_error: Fehler beim Ausführen des Makros %{macro_name} macro_unavailable: Das Makro %{macro_name} kann nicht angezeigt werden. - macro_unknown: Unknown or unsupported macro. + macro_unknown: Unbekanntes oder nicht unterstütztes Makro. macros: placeholder: "[Placeholder] Makro %{macro_name}" errors: @@ -4835,7 +4836,7 @@ de: common: work_package_card_component: drag_handle: - label: Drag to reorder + label: Ziehen zum Neuordnen menu: label_actions: Arbeitspaket-Aktionen parent: Übergeordnetes Arbeitspaket @@ -5241,8 +5242,8 @@ de: setting_consent_required: Einwilligung erforderlich setting_consent_decline_mail: Kontaktadresse bei Rückfragen zur Einwilligung setting_cross_project_work_package_relations: Arbeitspaket-Beziehungen zwischen Projekten erlauben - setting_csv_escape_formulas: Escape formulas in CSV exports - setting_csv_escape_formulas_text: 'Escape spreadsheet formulas in CSV exports by prefixing cells that begin with characters such as =, +, -, or @ with a single quote. This mitigates CSV formula injection when exported files are opened in spreadsheet applications such as Excel. This comes at the downside of modifying the string values inside the CSV, so you may want to disable this if downstream tools require the exact, unescaped cell values. + setting_csv_escape_formulas: Formeln in CSV-Exporten maskieren + setting_csv_escape_formulas_text: 'Tabellenkalkulationsformeln in CSV-Exporten maskieren, indem Zellen, die mit Zeichen wie =, +, - oder @ beginnen, ein einfaches Anführungszeichen vorangestellt wird. Dies verhindert CSV-Formelinjektionen, wenn exportierte Dateien in Tabellenkalkulationsanwendungen wie Excel geöffnet werden. Der Nachteil ist, dass dadurch die Zeichenkettenwerte in der CSV verändert werden. Diese Option sollte daher deaktiviert werden, wenn nachgelagerte Tools die exakten, unmaskierten Zellwerte benötigen. ' setting_first_week_of_year: Die erste Woche im Jahr enthält @@ -5285,7 +5286,7 @@ de: setting_work_package_properties: Arbeitspaket-Eigenschaften setting_work_package_startdate_is_adddate: Neue Arbeitspakete haben "Heute" als Anfangsdatum setting_work_packages_projects_export_limit: Arbeitspakete / Exportlimit für Projekte - setting_work_packages_projects_export_limit_text: 'Maximum number of work packages or projects that can be included in a single export. Larger exports are truncated to this limit. + setting_work_packages_projects_export_limit_text: 'Maximale Anzahl von Arbeitspaketen oder Projekten, die in einem einzelnen Export enthalten sein können. Größere Exporte werden auf diesen Grenzwert gekürzt. ' setting_journal_aggregation_time_minutes: Aggregationszeitraum @@ -5374,9 +5375,9 @@ de: setting_welcome_title: Titel des Willkommens-Block setting_welcome_on_homescreen: Willkommens-Block auf Startseite anzeigen setting_work_packages_identifier_classic: Instanzweite numerische Sequenz (Standard) - setting_work_packages_identifier_classic_caption: 'Every work package gets a sequential number starting with 1 (for example, #1234). The numbers are unique within the instance and remain the same even if work packages are moved between projects.' + setting_work_packages_identifier_classic_caption: 'Jedes Arbeitspaket erhält eine sequentielle Nummer beginnend mit 1 (z.B. #1234). Die Nummern sind innerhalb dieser Instanz eindeutig. Sie bleiben also gleich, auch wenn Arbeitspakete zwischen Projekten verschoben werden.' setting_work_packages_identifier_semantic: Projektspezifische semantische Kennungen (Beta) - setting_work_packages_identifier_semantic_caption: Every project has a unique project identifier prefixed to a number (for example, PROJ-11). The numbering of each project starts at 1. If a work package is moved to another project, a new identifier is generated but the old one will continue to function. + setting_work_packages_identifier_semantic_caption: Jedes Projekt hat eine eindeutige Projektkennung, die einer Zahl vorangestellt wird (z. B. PROJ-11). Die Nummerierung beginnt in jedem Projekt bei 1. Wenn ein Arbeitspaket in ein anderes Projekt verschoben wird, wird eine neue Kennung generiert, die alte bleibt jedoch weiterhin gültig. setting_work_package_list_default_highlighting_mode: Standard Hervorhebung setting_work_package_list_default_highlighted_attributes: Voreinstellung Inline Hervorherbung setting_working_days: Arbeitstage @@ -5558,7 +5559,7 @@ de: section_work_week: Arbeitswoche section_holidays_and_closures: Feiertage und Schließungen work_packages: - work_package_identifier: Work package identifiers + work_package_identifier: Arbeitspaket-Kennungen not_allowed_text: Sie haben nicht die notwendigen Rechte, um diese Seite zu sehen. activities: enable_internal_comments: Interne Kommentare aktivieren @@ -5988,16 +5989,16 @@ de: ' dialog: - title: Change working days - description: 'Changing which days of the week are considered working days or non-working days can affect the start and finish days of all work packages and life cycles in all projects in this instance. + title: Arbeitstage ändern + description: 'Die Änderung der Wochentage, die als Arbeitstage oder arbeitsfreie Tage gelten, kann sich auf die Start- und Endtage aller Arbeitspakete und Projektphasen in allen Projekten auswirken. ' - removed_title: 'You will remove the following days from the non-working days list:' - warning: 'The changes might take some time to take effect. You will be notified when all relevant work packages and project life cycles have been updated. + removed_title: 'Sie werden die folgenden Tage aus der Liste der arbeitsfreien Tage entfernen:' + warning: 'Es kann einige Zeit dauern, bis die Änderungen wirksam werden. Sie werden benachrichtigt, wenn alle relevanten Arbeitspakete und Projektphasen aktualisiert worden sind. ' - heading: Change the working days? - confirm_button: Save and reschedule + heading: Arbeitstage ändern? + confirm_button: Speichern und verschieben journal_note: changed: _**Arbeitstage** geändert (%{changes})._ days: @@ -6072,7 +6073,7 @@ de: ancestor: Unbekannt - Das übergeordnete Element ist wegen fehlender Berechtigungen nicht sichtbar. definingProject: Unbekannt - Das Projekt ist wegen fehlender Berechtigungen nicht sichtbar. definingWorkspace: Unbekannt - Der Arbeitsbereich ist wegen fehlender Berechtigungen nicht sichtbar. - workPackage: Undisclosed - The work package is invisible because of lacking permissions. + workPackage: Unbekannt - Das Arbeitspaket ist wegen fehlender Berechtigungen nicht sichtbar. doorkeeper: pre_authorization: status: Vorab-Autorisierung diff --git a/config/locales/crowdin/el.yml b/config/locales/crowdin/el.yml index cf2213f4065..1c0f2246997 100644 --- a/config/locales/crowdin/el.yml +++ b/config/locales/crowdin/el.yml @@ -2845,6 +2845,7 @@ el: button_login: Σύνδεση button_move: Μετακίνηση button_move_and_follow: Μετακίνηση και ακολούθηση + button_next: Next button_print: Εκτύπωση button_quote: Παράθεση button_remove: Αφαίρεση diff --git a/config/locales/crowdin/eo.yml b/config/locales/crowdin/eo.yml index cbe73069ad6..1e46efd3a12 100644 --- a/config/locales/crowdin/eo.yml +++ b/config/locales/crowdin/eo.yml @@ -2846,6 +2846,7 @@ eo: button_login: Ensaluti button_move: Movi button_move_and_follow: Movi kaj daŭrigi + button_next: Next button_print: Printi button_quote: Citi button_remove: Forigi diff --git a/config/locales/crowdin/es.yml b/config/locales/crowdin/es.yml index 9604569f0ca..6cded04c7a2 100644 --- a/config/locales/crowdin/es.yml +++ b/config/locales/crowdin/es.yml @@ -2839,6 +2839,7 @@ es: button_login: Iniciar sesión button_move: Mover button_move_and_follow: Mover y seguir + button_next: Siguiente button_print: Imprimir button_quote: Comentario button_remove: Eliminar diff --git a/config/locales/crowdin/et.yml b/config/locales/crowdin/et.yml index c17c1c1c667..efd4cba0616 100644 --- a/config/locales/crowdin/et.yml +++ b/config/locales/crowdin/et.yml @@ -2846,6 +2846,7 @@ et: button_login: Logi sisse button_move: Tõsta button_move_and_follow: Tõsta ja järgne + button_next: Next button_print: Prindi button_quote: Tsiteeri button_remove: Eemalda diff --git a/config/locales/crowdin/eu.yml b/config/locales/crowdin/eu.yml index 983dee910ca..b846ea5b048 100644 --- a/config/locales/crowdin/eu.yml +++ b/config/locales/crowdin/eu.yml @@ -2846,6 +2846,7 @@ eu: button_login: Sign in button_move: Move button_move_and_follow: Move and follow + button_next: Next button_print: Print button_quote: Quote button_remove: Remove diff --git a/config/locales/crowdin/fa.yml b/config/locales/crowdin/fa.yml index 34e68b2a10f..1d9f750c7df 100644 --- a/config/locales/crowdin/fa.yml +++ b/config/locales/crowdin/fa.yml @@ -2846,6 +2846,7 @@ fa: button_login: ورود button_move: انتقال button_move_and_follow: کپی و دنبال کردن + button_next: Next button_print: چاپ کردن button_quote: نقل قول button_remove: Remove diff --git a/config/locales/crowdin/fi.yml b/config/locales/crowdin/fi.yml index 2c8ccb73ea5..a487d156940 100644 --- a/config/locales/crowdin/fi.yml +++ b/config/locales/crowdin/fi.yml @@ -2844,6 +2844,7 @@ fi: button_login: Kirjaudu button_move: Siirrä button_move_and_follow: Siirrä ja seuraa + button_next: Next button_print: Tulosta button_quote: Siteeraa button_remove: Poista diff --git a/config/locales/crowdin/fil.yml b/config/locales/crowdin/fil.yml index 11411632098..a38b8591747 100644 --- a/config/locales/crowdin/fil.yml +++ b/config/locales/crowdin/fil.yml @@ -2846,6 +2846,7 @@ fil: button_login: Mag-sign in button_move: Ilipat button_move_and_follow: Ilipat at sundin + button_next: Next button_print: I-print button_quote: Quote button_remove: Tanggalin diff --git a/config/locales/crowdin/fr.yml b/config/locales/crowdin/fr.yml index 293167807de..43b25093a85 100644 --- a/config/locales/crowdin/fr.yml +++ b/config/locales/crowdin/fr.yml @@ -2839,6 +2839,7 @@ fr: button_login: Connexion button_move: Déplacer button_move_and_follow: Déplacer et suivre + button_next: Suivant button_print: Imprimer button_quote: Citer button_remove: Supprimer diff --git a/config/locales/crowdin/he.yml b/config/locales/crowdin/he.yml index 7885a81edd6..1f42b02ea1f 100644 --- a/config/locales/crowdin/he.yml +++ b/config/locales/crowdin/he.yml @@ -2928,6 +2928,7 @@ he: button_login: לוג-אין button_move: העבר button_move_and_follow: הזז ועקוב + button_next: Next button_print: Print button_quote: צטט button_remove: Remove diff --git a/config/locales/crowdin/hi.yml b/config/locales/crowdin/hi.yml index 16fec7582bc..764069f6ba0 100644 --- a/config/locales/crowdin/hi.yml +++ b/config/locales/crowdin/hi.yml @@ -2846,6 +2846,7 @@ hi: button_login: साइन इन करें button_move: स्थानांतरित करें button_move_and_follow: स्थानांतरित करें व फौलो करें + button_next: Next button_print: Print button_quote: उद्धरण button_remove: Remove diff --git a/config/locales/crowdin/hr.yml b/config/locales/crowdin/hr.yml index edbe3c546c1..ff401154ed7 100644 --- a/config/locales/crowdin/hr.yml +++ b/config/locales/crowdin/hr.yml @@ -2885,6 +2885,7 @@ hr: button_login: Prijavi se button_move: Premjesti button_move_and_follow: Premjesti i slijedi + button_next: Next button_print: Ispis button_quote: Citiraj button_remove: Ukloni diff --git a/config/locales/crowdin/hu.yml b/config/locales/crowdin/hu.yml index 68bb905805b..8d90ae0c7d6 100644 --- a/config/locales/crowdin/hu.yml +++ b/config/locales/crowdin/hu.yml @@ -2900,6 +2900,7 @@ hu: button_login: Bejelentkezés button_move: Mozgatás button_move_and_follow: Mozgatés és a következő + button_next: Next button_print: Nyomtatás button_quote: Idéz button_remove: Eltávolítás diff --git a/config/locales/crowdin/hy.yml b/config/locales/crowdin/hy.yml index 82286797ff6..c1e8dc8b280 100644 --- a/config/locales/crowdin/hy.yml +++ b/config/locales/crowdin/hy.yml @@ -2846,6 +2846,7 @@ hy: button_login: Sign in button_move: Move button_move_and_follow: Move and follow + button_next: Next button_print: Print button_quote: Quote button_remove: Remove diff --git a/config/locales/crowdin/id.yml b/config/locales/crowdin/id.yml index 0bda858cae8..4c776529f83 100644 --- a/config/locales/crowdin/id.yml +++ b/config/locales/crowdin/id.yml @@ -2814,6 +2814,7 @@ id: button_login: Login button_move: Pindahkan button_move_and_follow: Pindahkan dan amati + button_next: Next button_print: Cetak button_quote: Kutipan button_remove: Remove diff --git a/config/locales/crowdin/it.yml b/config/locales/crowdin/it.yml index 3a00b71e210..1e2254a0f56 100644 --- a/config/locales/crowdin/it.yml +++ b/config/locales/crowdin/it.yml @@ -2846,6 +2846,7 @@ it: button_login: Accedi button_move: Sposta button_move_and_follow: Sposta e segui + button_next: Avanti button_print: Stampa button_quote: Cita button_remove: Rimuovi diff --git a/config/locales/crowdin/ja.yml b/config/locales/crowdin/ja.yml index b0a5bad9dbd..c9c47a89b20 100644 --- a/config/locales/crowdin/ja.yml +++ b/config/locales/crowdin/ja.yml @@ -2808,6 +2808,7 @@ ja: button_login: ログイン button_move: 移動 button_move_and_follow: 移動後表示 + button_next: Next button_print: 印刷 button_quote: 引用 button_remove: 削除 diff --git a/config/locales/crowdin/ka.yml b/config/locales/crowdin/ka.yml index f80e7425c21..126d28008ec 100644 --- a/config/locales/crowdin/ka.yml +++ b/config/locales/crowdin/ka.yml @@ -2846,6 +2846,7 @@ ka: button_login: შესვლა button_move: გადატანა button_move_and_follow: Move and follow + button_next: Next button_print: ბეჭდვა button_quote: ციტატა button_remove: წაშლა diff --git a/config/locales/crowdin/kk.yml b/config/locales/crowdin/kk.yml index 02d1b9dec41..fe1d67c3142 100644 --- a/config/locales/crowdin/kk.yml +++ b/config/locales/crowdin/kk.yml @@ -2846,6 +2846,7 @@ kk: button_login: Sign in button_move: Move button_move_and_follow: Move and follow + button_next: Next button_print: Print button_quote: Quote button_remove: Remove diff --git a/config/locales/crowdin/ko.yml b/config/locales/crowdin/ko.yml index da84903ee29..07066540ba9 100644 --- a/config/locales/crowdin/ko.yml +++ b/config/locales/crowdin/ko.yml @@ -2801,6 +2801,7 @@ ko: button_login: 로그인 button_move: 이동 button_move_and_follow: 이동하고 따라가기 + button_next: 다음 button_print: 인쇄 button_quote: 인용 button_remove: 제거 diff --git a/config/locales/crowdin/lt.yml b/config/locales/crowdin/lt.yml index 026e125ce62..9d07d113ca8 100644 --- a/config/locales/crowdin/lt.yml +++ b/config/locales/crowdin/lt.yml @@ -2927,6 +2927,7 @@ lt: button_login: Prisijungti button_move: Perkelti button_move_and_follow: Perkelti ir sekti + button_next: Next button_print: Spausdinti button_quote: Cituoti button_remove: Pašalinti diff --git a/config/locales/crowdin/lv.yml b/config/locales/crowdin/lv.yml index 5f6ef219a24..c7393ab9520 100644 --- a/config/locales/crowdin/lv.yml +++ b/config/locales/crowdin/lv.yml @@ -2887,6 +2887,7 @@ lv: button_login: Ienākt button_move: Move button_move_and_follow: Move and follow + button_next: Next button_print: Drukāt button_quote: Citēt button_remove: Noņemt diff --git a/config/locales/crowdin/mn.yml b/config/locales/crowdin/mn.yml index d6e9dc22098..48fa0bb8527 100644 --- a/config/locales/crowdin/mn.yml +++ b/config/locales/crowdin/mn.yml @@ -2846,6 +2846,7 @@ mn: button_login: Sign in button_move: Move button_move_and_follow: Move and follow + button_next: Next button_print: Print button_quote: Quote button_remove: Remove diff --git a/config/locales/crowdin/ms.yml b/config/locales/crowdin/ms.yml index add3b321d2d..097e250325c 100644 --- a/config/locales/crowdin/ms.yml +++ b/config/locales/crowdin/ms.yml @@ -2811,6 +2811,7 @@ ms: button_login: Daftar masuk button_move: Alih button_move_and_follow: Alih dan ikut + button_next: Next button_print: Cetak button_quote: Petikan button_remove: Keluarkan diff --git a/config/locales/crowdin/ne.yml b/config/locales/crowdin/ne.yml index 090bb4fd8f8..68ce0448729 100644 --- a/config/locales/crowdin/ne.yml +++ b/config/locales/crowdin/ne.yml @@ -2846,6 +2846,7 @@ ne: button_login: Sign in button_move: Move button_move_and_follow: Move and follow + button_next: Next button_print: Print button_quote: Quote button_remove: Remove diff --git a/config/locales/crowdin/nl.yml b/config/locales/crowdin/nl.yml index 59005313298..f357f1b9292 100644 --- a/config/locales/crowdin/nl.yml +++ b/config/locales/crowdin/nl.yml @@ -2842,6 +2842,7 @@ nl: button_login: Aanmelden button_move: Verplaatsen button_move_and_follow: Verplaatsen en volgen + button_next: Next button_print: Afdrukken button_quote: Citeer button_remove: Verwijder diff --git a/config/locales/crowdin/no.yml b/config/locales/crowdin/no.yml index a17e7ec393b..1ee30f293ad 100644 --- a/config/locales/crowdin/no.yml +++ b/config/locales/crowdin/no.yml @@ -2844,6 +2844,7 @@ button_login: Logg inn button_move: Flytt button_move_and_follow: Flytt og følg + button_next: Next button_print: Skriv ut button_quote: Sitèr button_remove: Fjern diff --git a/config/locales/crowdin/pl.yml b/config/locales/crowdin/pl.yml index cde8bc3e5ce..8477ea1f08b 100644 --- a/config/locales/crowdin/pl.yml +++ b/config/locales/crowdin/pl.yml @@ -2922,6 +2922,7 @@ pl: button_login: Zaloguj button_move: Przenieś button_move_and_follow: Przenieś i kontynuuj + button_next: Dalej button_print: Drukuj button_quote: Cytat button_remove: Usuń diff --git a/config/locales/crowdin/pt-BR.yml b/config/locales/crowdin/pt-BR.yml index 8dfcbae57bf..2c80fc14092 100644 --- a/config/locales/crowdin/pt-BR.yml +++ b/config/locales/crowdin/pt-BR.yml @@ -2843,6 +2843,7 @@ pt-BR: button_login: Iniciar sessão button_move: Mover button_move_and_follow: Mover e seguir + button_next: Próximo button_print: Imprimir button_quote: Citar button_remove: Remover diff --git a/config/locales/crowdin/pt-PT.yml b/config/locales/crowdin/pt-PT.yml index f21b3314d2f..09267170605 100644 --- a/config/locales/crowdin/pt-PT.yml +++ b/config/locales/crowdin/pt-PT.yml @@ -2844,6 +2844,7 @@ pt-PT: button_login: Iniciar sessão button_move: Mover button_move_and_follow: Mover e seguir + button_next: Seguinte button_print: Imprimir button_quote: Citar button_remove: Remover diff --git a/config/locales/crowdin/ro.yml b/config/locales/crowdin/ro.yml index aea59c1242f..fb23d7d2a71 100644 --- a/config/locales/crowdin/ro.yml +++ b/config/locales/crowdin/ro.yml @@ -2887,6 +2887,7 @@ ro: button_login: Autentificare button_move: Mutare button_move_and_follow: Mutare și continuare + button_next: Next button_print: Tipărește button_quote: Citare button_remove: Eliminare diff --git a/config/locales/crowdin/ru.yml b/config/locales/crowdin/ru.yml index fce7da33edd..961654b8a3c 100644 --- a/config/locales/crowdin/ru.yml +++ b/config/locales/crowdin/ru.yml @@ -2931,6 +2931,7 @@ ru: button_login: Войти button_move: Переместить button_move_and_follow: Переместить и следовать + button_next: Next button_print: Печать button_quote: Цитата button_remove: Удалить diff --git a/config/locales/crowdin/rw.yml b/config/locales/crowdin/rw.yml index c61e27cc323..8b83eeb1088 100644 --- a/config/locales/crowdin/rw.yml +++ b/config/locales/crowdin/rw.yml @@ -2846,6 +2846,7 @@ rw: button_login: Sign in button_move: Move button_move_and_follow: Move and follow + button_next: Next button_print: Print button_quote: Quote button_remove: Remove diff --git a/config/locales/crowdin/si.yml b/config/locales/crowdin/si.yml index 6244f5de315..0c9e165845f 100644 --- a/config/locales/crowdin/si.yml +++ b/config/locales/crowdin/si.yml @@ -2846,6 +2846,7 @@ si: button_login: පුරනය වන්න button_move: ගෙනයන්න button_move_and_follow: ගෙනයන්න සහ අනුගමනය කරන්න + button_next: Next button_print: මුද්රණය button_quote: උපුටා button_remove: ඉවත් කරන්න diff --git a/config/locales/crowdin/sk.yml b/config/locales/crowdin/sk.yml index ebd13edeb73..31593669c1c 100644 --- a/config/locales/crowdin/sk.yml +++ b/config/locales/crowdin/sk.yml @@ -2926,6 +2926,7 @@ sk: button_login: Prihlásiť sa button_move: Presunúť button_move_and_follow: Presunúť a nasledovať + button_next: Next button_print: Tlač button_quote: Citovať button_remove: Vymazať diff --git a/config/locales/crowdin/sl.yml b/config/locales/crowdin/sl.yml index 2fb2519680c..57d04cf726a 100644 --- a/config/locales/crowdin/sl.yml +++ b/config/locales/crowdin/sl.yml @@ -2935,6 +2935,7 @@ sl: button_login: Prijava button_move: Premakni button_move_and_follow: Premakni in sledi + button_next: Next button_print: Natisni button_quote: Citiraj button_remove: Odstrani diff --git a/config/locales/crowdin/sr.yml b/config/locales/crowdin/sr.yml index aa7316c80b6..62b2f8b1540 100644 --- a/config/locales/crowdin/sr.yml +++ b/config/locales/crowdin/sr.yml @@ -2887,6 +2887,7 @@ sr: button_login: Sign in button_move: Move button_move_and_follow: Move and follow + button_next: Next button_print: Print button_quote: Quote button_remove: Remove diff --git a/config/locales/crowdin/sv.yml b/config/locales/crowdin/sv.yml index db0ed8085c5..8d5ce2c4eea 100644 --- a/config/locales/crowdin/sv.yml +++ b/config/locales/crowdin/sv.yml @@ -2846,6 +2846,7 @@ sv: button_login: Logga in button_move: Flytta button_move_and_follow: Flytta och följ + button_next: Next button_print: Skriv ut button_quote: Citat button_remove: Ta bort diff --git a/config/locales/crowdin/th.yml b/config/locales/crowdin/th.yml index c31af51a76f..c28bd1308f9 100644 --- a/config/locales/crowdin/th.yml +++ b/config/locales/crowdin/th.yml @@ -2805,6 +2805,7 @@ th: button_login: ลงชื่อเข้าใช้ button_move: ย้าย button_move_and_follow: ย้าย และทำตาม + button_next: Next button_print: Print button_quote: อ้างถึง button_remove: Remove diff --git a/config/locales/crowdin/tr.yml b/config/locales/crowdin/tr.yml index 33f2e493867..31462578c0d 100644 --- a/config/locales/crowdin/tr.yml +++ b/config/locales/crowdin/tr.yml @@ -2851,6 +2851,7 @@ tr: button_login: Oturum aç button_move: Taşı button_move_and_follow: Taşı ve takip et + button_next: Next button_print: Yazdır button_quote: Alıntı button_remove: Kaldır diff --git a/config/locales/crowdin/uk.yml b/config/locales/crowdin/uk.yml index eff77fe5703..8aff42d5de0 100644 --- a/config/locales/crowdin/uk.yml +++ b/config/locales/crowdin/uk.yml @@ -2927,6 +2927,7 @@ uk: button_login: Увійти button_move: Перемістити button_move_and_follow: Перемістити і перейти + button_next: Далі button_print: Друкувати button_quote: Цитата button_remove: Видалити diff --git a/config/locales/crowdin/uz.yml b/config/locales/crowdin/uz.yml index 15ca0060dec..614375e0d73 100644 --- a/config/locales/crowdin/uz.yml +++ b/config/locales/crowdin/uz.yml @@ -2846,6 +2846,7 @@ uz: button_login: Sign in button_move: Move button_move_and_follow: Move and follow + button_next: Next button_print: Print button_quote: Quote button_remove: Remove diff --git a/config/locales/crowdin/vi.yml b/config/locales/crowdin/vi.yml index a2e57c2ac91..3e29fa69a75 100644 --- a/config/locales/crowdin/vi.yml +++ b/config/locales/crowdin/vi.yml @@ -2807,6 +2807,7 @@ vi: button_login: Đăng nhập button_move: Di chuyển button_move_and_follow: Di chuyển và thực hiện theo + button_next: Next button_print: In button_quote: Trích dẫn button_remove: Xoá diff --git a/config/locales/crowdin/zh-CN.yml b/config/locales/crowdin/zh-CN.yml index 8a4e2c6dfd5..47a0b272bb5 100644 --- a/config/locales/crowdin/zh-CN.yml +++ b/config/locales/crowdin/zh-CN.yml @@ -2805,6 +2805,7 @@ zh-CN: button_login: 登录 button_move: 移动 button_move_and_follow: 移动和跟踪 + button_next: 下一步 button_print: 打印 button_quote: 引用 button_remove: 移除 diff --git a/config/locales/crowdin/zh-TW.yml b/config/locales/crowdin/zh-TW.yml index f49cfe86829..18c7f27766d 100644 --- a/config/locales/crowdin/zh-TW.yml +++ b/config/locales/crowdin/zh-TW.yml @@ -2801,6 +2801,7 @@ zh-TW: button_login: 登入 button_move: 移動 button_move_and_follow: 移動並跟隨 + button_next: Next button_print: 列印 button_quote: 引言 button_remove: 刪除 diff --git a/modules/auth_saml/config/locales/crowdin/af.yml b/modules/auth_saml/config/locales/crowdin/af.yml index 36600b59a5a..8b15fb8273f 100644 --- a/modules/auth_saml/config/locales/crowdin/af.yml +++ b/modules/auth_saml/config/locales/crowdin/af.yml @@ -12,6 +12,7 @@ af: sp_entity_id: Service entity ID metadata_url: Identity provider metadata URL name_identifier_format: Name identifier format + idp_entity_id: Identity provider entity ID idp_sso_service_url: Identity provider login endpoint idp_slo_service_url: Identity provider logout endpoint idp_cert: Public certificate of identity provider @@ -44,6 +45,10 @@ af: success: Successfully updated the configuration using the identity provider metadata. invalid_url: Provided metadata URL is invalid. Provide a HTTP(s) URL. error: 'Failed to retrieve the identity provider metadata: %{error}' + federation_metadata: 'The metadata URL points to a federation aggregate (many identity providers). Use your institution''s direct metadata URL, or enter your institution''s IdP entity ID in the metadata form and try again. + + ' + metadata_too_large: The metadata file exceeds the maximum allowed size. providers: label_empty_title: No SAML providers configured yet. label_empty_description: Add a provider to see them here. @@ -110,6 +115,9 @@ af: ' metadata_url: 'Your identity provider provides a metadata URL. + ' + idp_entity_id: 'Optional: Useful when the metadata URL points to a federation aggregate with a lot of entries. Enter the entity ID of your institution''s identity provider. Leave blank for single-entity metadata URLs. + ' metadata_xml: 'Your identity provider provides a metadata XML download. diff --git a/modules/auth_saml/config/locales/crowdin/ar.yml b/modules/auth_saml/config/locales/crowdin/ar.yml index 636a624beaf..5c67dffc766 100644 --- a/modules/auth_saml/config/locales/crowdin/ar.yml +++ b/modules/auth_saml/config/locales/crowdin/ar.yml @@ -12,6 +12,7 @@ ar: sp_entity_id: Service entity ID metadata_url: Identity provider metadata URL name_identifier_format: Name identifier format + idp_entity_id: Identity provider entity ID idp_sso_service_url: Identity provider login endpoint idp_slo_service_url: Identity provider logout endpoint idp_cert: Public certificate of identity provider @@ -44,6 +45,10 @@ ar: success: Successfully updated the configuration using the identity provider metadata. invalid_url: Provided metadata URL is invalid. Provide a HTTP(s) URL. error: 'Failed to retrieve the identity provider metadata: %{error}' + federation_metadata: 'The metadata URL points to a federation aggregate (many identity providers). Use your institution''s direct metadata URL, or enter your institution''s IdP entity ID in the metadata form and try again. + + ' + metadata_too_large: The metadata file exceeds the maximum allowed size. providers: label_empty_title: No SAML providers configured yet. label_empty_description: Add a provider to see them here. @@ -110,6 +115,9 @@ ar: ' metadata_url: 'Your identity provider provides a metadata URL. + ' + idp_entity_id: 'Optional: Useful when the metadata URL points to a federation aggregate with a lot of entries. Enter the entity ID of your institution''s identity provider. Leave blank for single-entity metadata URLs. + ' metadata_xml: 'Your identity provider provides a metadata XML download. diff --git a/modules/auth_saml/config/locales/crowdin/az.yml b/modules/auth_saml/config/locales/crowdin/az.yml index 79942bfabf2..63ab3a54283 100644 --- a/modules/auth_saml/config/locales/crowdin/az.yml +++ b/modules/auth_saml/config/locales/crowdin/az.yml @@ -12,6 +12,7 @@ az: sp_entity_id: Service entity ID metadata_url: Identity provider metadata URL name_identifier_format: Name identifier format + idp_entity_id: Identity provider entity ID idp_sso_service_url: Identity provider login endpoint idp_slo_service_url: Identity provider logout endpoint idp_cert: Public certificate of identity provider @@ -44,6 +45,10 @@ az: success: Successfully updated the configuration using the identity provider metadata. invalid_url: Provided metadata URL is invalid. Provide a HTTP(s) URL. error: 'Failed to retrieve the identity provider metadata: %{error}' + federation_metadata: 'The metadata URL points to a federation aggregate (many identity providers). Use your institution''s direct metadata URL, or enter your institution''s IdP entity ID in the metadata form and try again. + + ' + metadata_too_large: The metadata file exceeds the maximum allowed size. providers: label_empty_title: No SAML providers configured yet. label_empty_description: Add a provider to see them here. @@ -110,6 +115,9 @@ az: ' metadata_url: 'Your identity provider provides a metadata URL. + ' + idp_entity_id: 'Optional: Useful when the metadata URL points to a federation aggregate with a lot of entries. Enter the entity ID of your institution''s identity provider. Leave blank for single-entity metadata URLs. + ' metadata_xml: 'Your identity provider provides a metadata XML download. diff --git a/modules/auth_saml/config/locales/crowdin/be.yml b/modules/auth_saml/config/locales/crowdin/be.yml index 812ed9874e7..1752936976c 100644 --- a/modules/auth_saml/config/locales/crowdin/be.yml +++ b/modules/auth_saml/config/locales/crowdin/be.yml @@ -12,6 +12,7 @@ be: sp_entity_id: Service entity ID metadata_url: Identity provider metadata URL name_identifier_format: Name identifier format + idp_entity_id: Identity provider entity ID idp_sso_service_url: Identity provider login endpoint idp_slo_service_url: Identity provider logout endpoint idp_cert: Public certificate of identity provider @@ -44,6 +45,10 @@ be: success: Successfully updated the configuration using the identity provider metadata. invalid_url: Provided metadata URL is invalid. Provide a HTTP(s) URL. error: 'Failed to retrieve the identity provider metadata: %{error}' + federation_metadata: 'The metadata URL points to a federation aggregate (many identity providers). Use your institution''s direct metadata URL, or enter your institution''s IdP entity ID in the metadata form and try again. + + ' + metadata_too_large: The metadata file exceeds the maximum allowed size. providers: label_empty_title: No SAML providers configured yet. label_empty_description: Add a provider to see them here. @@ -110,6 +115,9 @@ be: ' metadata_url: 'Your identity provider provides a metadata URL. + ' + idp_entity_id: 'Optional: Useful when the metadata URL points to a federation aggregate with a lot of entries. Enter the entity ID of your institution''s identity provider. Leave blank for single-entity metadata URLs. + ' metadata_xml: 'Your identity provider provides a metadata XML download. diff --git a/modules/auth_saml/config/locales/crowdin/bg.yml b/modules/auth_saml/config/locales/crowdin/bg.yml index 39d92d8ff5d..959894957ee 100644 --- a/modules/auth_saml/config/locales/crowdin/bg.yml +++ b/modules/auth_saml/config/locales/crowdin/bg.yml @@ -12,6 +12,7 @@ bg: sp_entity_id: Идентификатор на обслужващата единица metadata_url: URL на метаданните на доставчика на идентичност name_identifier_format: Формат на идентификатора на името + idp_entity_id: Identity provider entity ID idp_sso_service_url: Крайна точка за вход на доставчик на идентичности idp_slo_service_url: Крайна точка за вход на доставчик на идентичности idp_cert: Публично удостоверение на доставчика на идентификация @@ -44,6 +45,10 @@ bg: success: Успешно е актуализирана конфигурацията, като са използвани метаданните на доставчика на идентичност. invalid_url: Предоставеният URL адрес на метаданни е невалиден. Предоставете HTTP(s) URL адрес. error: 'Не се получи извличане на метаданните на доставчика на идентичност: %{error}' + federation_metadata: 'The metadata URL points to a federation aggregate (many identity providers). Use your institution''s direct metadata URL, or enter your institution''s IdP entity ID in the metadata form and try again. + + ' + metadata_too_large: The metadata file exceeds the maximum allowed size. providers: label_empty_title: Все още няма конфигурирани доставчици на SAML. label_empty_description: Добавете доставчик, за да ги видите тук. @@ -110,6 +115,9 @@ bg: ' metadata_url: 'Your identity provider provides a metadata URL. + ' + idp_entity_id: 'Optional: Useful when the metadata URL points to a federation aggregate with a lot of entries. Enter the entity ID of your institution''s identity provider. Leave blank for single-entity metadata URLs. + ' metadata_xml: 'Your identity provider provides a metadata XML download. diff --git a/modules/auth_saml/config/locales/crowdin/ca.yml b/modules/auth_saml/config/locales/crowdin/ca.yml index 4b3d295423a..fe38441b7b2 100644 --- a/modules/auth_saml/config/locales/crowdin/ca.yml +++ b/modules/auth_saml/config/locales/crowdin/ca.yml @@ -12,6 +12,7 @@ ca: sp_entity_id: ID de l'entitat de servei metadata_url: URL de metadades del proveïdor d'identitat name_identifier_format: Format de l'identificador de nom + idp_entity_id: Identity provider entity ID idp_sso_service_url: Punt d'inici de sessió del proveïdor d'identitat idp_slo_service_url: Punt final de sortida del proveïdor d'identitat idp_cert: Certificat públic del proveïdor d'identitat @@ -44,6 +45,10 @@ ca: success: S'ha actualitzat correctament la configuració utilitzant les metadades del proveïdor d'identitat. invalid_url: L'URL de les metadades proporcionades no és vàlid. Proporciona un URL HTTP(s). error: 'Ha fallat en recuperar les metadades del proveïdor d''identitat: %{error}' + federation_metadata: 'The metadata URL points to a federation aggregate (many identity providers). Use your institution''s direct metadata URL, or enter your institution''s IdP entity ID in the metadata form and try again. + + ' + metadata_too_large: The metadata file exceeds the maximum allowed size. providers: label_empty_title: Encara no s'ha configurat cap proveïdor SAML. label_empty_description: Afegiu un proveïdor per veure'ls aquí. @@ -110,6 +115,9 @@ ca: ' metadata_url: 'El vostre proveïdor d''identitat proporciona un URL de metadades. + ' + idp_entity_id: 'Optional: Useful when the metadata URL points to a federation aggregate with a lot of entries. Enter the entity ID of your institution''s identity provider. Leave blank for single-entity metadata URLs. + ' metadata_xml: 'El vostre proveïdor d''identitat proporciona una baixada XML de metadades. diff --git a/modules/auth_saml/config/locales/crowdin/ckb-IR.yml b/modules/auth_saml/config/locales/crowdin/ckb-IR.yml index bf96224fc28..bacecc1a826 100644 --- a/modules/auth_saml/config/locales/crowdin/ckb-IR.yml +++ b/modules/auth_saml/config/locales/crowdin/ckb-IR.yml @@ -12,6 +12,7 @@ ckb-IR: sp_entity_id: Service entity ID metadata_url: Identity provider metadata URL name_identifier_format: Name identifier format + idp_entity_id: Identity provider entity ID idp_sso_service_url: Identity provider login endpoint idp_slo_service_url: Identity provider logout endpoint idp_cert: Public certificate of identity provider @@ -44,6 +45,10 @@ ckb-IR: success: Successfully updated the configuration using the identity provider metadata. invalid_url: Provided metadata URL is invalid. Provide a HTTP(s) URL. error: 'Failed to retrieve the identity provider metadata: %{error}' + federation_metadata: 'The metadata URL points to a federation aggregate (many identity providers). Use your institution''s direct metadata URL, or enter your institution''s IdP entity ID in the metadata form and try again. + + ' + metadata_too_large: The metadata file exceeds the maximum allowed size. providers: label_empty_title: No SAML providers configured yet. label_empty_description: Add a provider to see them here. @@ -110,6 +115,9 @@ ckb-IR: ' metadata_url: 'Your identity provider provides a metadata URL. + ' + idp_entity_id: 'Optional: Useful when the metadata URL points to a federation aggregate with a lot of entries. Enter the entity ID of your institution''s identity provider. Leave blank for single-entity metadata URLs. + ' metadata_xml: 'Your identity provider provides a metadata XML download. diff --git a/modules/auth_saml/config/locales/crowdin/cs.yml b/modules/auth_saml/config/locales/crowdin/cs.yml index c5f59e29631..9eec598040d 100644 --- a/modules/auth_saml/config/locales/crowdin/cs.yml +++ b/modules/auth_saml/config/locales/crowdin/cs.yml @@ -12,6 +12,7 @@ cs: sp_entity_id: ID entity služby metadata_url: Identity provider metadata URL name_identifier_format: Formát identifikátoru názvu + idp_entity_id: Identity provider entity ID idp_sso_service_url: Identity provider login endpoint idp_slo_service_url: Identity provider logout endpoint idp_cert: Public certificate of identity provider @@ -44,6 +45,10 @@ cs: success: Successfully updated the configuration using the identity provider metadata. invalid_url: Provided metadata URL is invalid. Provide a HTTP(s) URL. error: 'Failed to retrieve the identity provider metadata: %{error}' + federation_metadata: 'The metadata URL points to a federation aggregate (many identity providers). Use your institution''s direct metadata URL, or enter your institution''s IdP entity ID in the metadata form and try again. + + ' + metadata_too_large: The metadata file exceeds the maximum allowed size. providers: label_empty_title: Zatím nenastaveni žádní poskytovatelé SAML. label_empty_description: Přidejte poskytovatele, abyste je viděli zde. @@ -110,6 +115,9 @@ cs: ' metadata_url: 'Your identity provider provides a metadata URL. + ' + idp_entity_id: 'Optional: Useful when the metadata URL points to a federation aggregate with a lot of entries. Enter the entity ID of your institution''s identity provider. Leave blank for single-entity metadata URLs. + ' metadata_xml: 'Your identity provider provides a metadata XML download. diff --git a/modules/auth_saml/config/locales/crowdin/da.yml b/modules/auth_saml/config/locales/crowdin/da.yml index 19999134138..bf8da19040f 100644 --- a/modules/auth_saml/config/locales/crowdin/da.yml +++ b/modules/auth_saml/config/locales/crowdin/da.yml @@ -12,6 +12,7 @@ da: sp_entity_id: Tjenesteentitets-ID metadata_url: Identitetsudbydermetadata-URL name_identifier_format: Navnidentifikatorformat + idp_entity_id: Identity provider entity ID idp_sso_service_url: Identitetsudbyder login endpoint idp_slo_service_url: IdP(Identity provider) logud endpoint idp_cert: Identitetsudbyders offentlige certifikat @@ -44,6 +45,10 @@ da: success: Opsætningen er opdateret vha. identitetsudbyderens metadata. invalid_url: Den angivne metadata-URL er ugyldig. Angiv en HTTP(S)-URL. error: 'Mislykkedes at hente identitetsudbydermetadata: %{error}' + federation_metadata: 'The metadata URL points to a federation aggregate (many identity providers). Use your institution''s direct metadata URL, or enter your institution''s IdP entity ID in the metadata form and try again. + + ' + metadata_too_large: The metadata file exceeds the maximum allowed size. providers: label_empty_title: Ingen SAML-udbydere opsat endnu. label_empty_description: Tilføj en udbyder for at se denne her. @@ -110,6 +115,9 @@ da: ' metadata_url: 'Identitetsudbyderen leverer en metadata-URL. + ' + idp_entity_id: 'Optional: Useful when the metadata URL points to a federation aggregate with a lot of entries. Enter the entity ID of your institution''s identity provider. Leave blank for single-entity metadata URLs. + ' metadata_xml: 'Identitetsudbyderen leverer en metadata-XML download. diff --git a/modules/auth_saml/config/locales/crowdin/de.yml b/modules/auth_saml/config/locales/crowdin/de.yml index 42d4b909fc9..d9ba5cb1411 100644 --- a/modules/auth_saml/config/locales/crowdin/de.yml +++ b/modules/auth_saml/config/locales/crowdin/de.yml @@ -12,6 +12,7 @@ de: sp_entity_id: Entity-ID des Services metadata_url: Metadaten-URL des Identitätsanbieters name_identifier_format: Format der Namenskennung + idp_entity_id: Identity provider entity ID idp_sso_service_url: Endpunkt für die Anmeldung beim Identitätsanbieter idp_slo_service_url: Endpunkt für die Abmeldung beim Identitätsanbieter idp_cert: Öffentliches Zertifikat des Identitätsanbieters @@ -44,6 +45,10 @@ de: success: Die Konfiguration wurde unter Verwendung der Metadaten des Identitätsanbieters erfolgreich aktualisiert. invalid_url: Die angegebene Metadaten-URL ist ungültig. Geben Sie eine HTTP(s)-URL an. error: 'Abrufen der Metadaten des Identitätsanbieters fehlgeschlagen: %{error}' + federation_metadata: 'The metadata URL points to a federation aggregate (many identity providers). Use your institution''s direct metadata URL, or enter your institution''s IdP entity ID in the metadata form and try again. + + ' + metadata_too_large: The metadata file exceeds the maximum allowed size. providers: label_empty_title: Noch keine SAML-Anbieter konfiguriert. label_empty_description: Fügen Sie einen Anbieter hinzu, um sie hier zu sehen. @@ -110,6 +115,9 @@ de: ' metadata_url: 'Ihr Identitätsanbieter stellt eine Metadaten-URL zur Verfügung. + ' + idp_entity_id: 'Optional: Useful when the metadata URL points to a federation aggregate with a lot of entries. Enter the entity ID of your institution''s identity provider. Leave blank for single-entity metadata URLs. + ' metadata_xml: 'Ihr Identitätsanbieter bietet einen XML-Download für Metadaten an. diff --git a/modules/auth_saml/config/locales/crowdin/el.yml b/modules/auth_saml/config/locales/crowdin/el.yml index 3dbd942f551..b9cefce251a 100644 --- a/modules/auth_saml/config/locales/crowdin/el.yml +++ b/modules/auth_saml/config/locales/crowdin/el.yml @@ -12,6 +12,7 @@ el: sp_entity_id: ID Οντότητας Παρόχου Υπηρεσίας (SP) metadata_url: URL Μεταδεδομένων Παρόχου Ταυτότητας (IdP) name_identifier_format: Μορφή αναγνωριστικού ονόματος + idp_entity_id: Identity provider entity ID idp_sso_service_url: Τερματικό σημείο σύνδεσης Παρόχου Ταυτότητας (IdP Login) idp_slo_service_url: Τερματικό σημείο αποσύνδεσης Παρόχου Ταυτότητας (IdP Logout) idp_cert: Δημόσιο πιστοποιητικό του Παρόχου Ταυτότητας (IdP) @@ -44,6 +45,10 @@ el: success: Η διαμόρφωση ενημερώθηκε επιτυχώς με χρήση των μεταδεδομένων του παρόχου ταυτότητας. invalid_url: Το παρεχόμενο URL μεταδεδομένων δεν είναι έγκυρο. Παρακαλούμε δώστε ένα HTTP(s) URL. error: 'Αποτυχία ανάκτησης μεταδεδομένων παρόχου ταυτότητας: %{error}' + federation_metadata: 'The metadata URL points to a federation aggregate (many identity providers). Use your institution''s direct metadata URL, or enter your institution''s IdP entity ID in the metadata form and try again. + + ' + metadata_too_large: The metadata file exceeds the maximum allowed size. providers: label_empty_title: Δεν έχουν ρυθμιστεί ακόμη πάροχοι SAML. label_empty_description: Προσθέστε έναν πάροχο για να τον δείτε εδώ. @@ -110,6 +115,9 @@ el: ' metadata_url: 'Ο πάροχος ταυτότητάς σας παρέχει ένα URL μεταδεδομένων. + ' + idp_entity_id: 'Optional: Useful when the metadata URL points to a federation aggregate with a lot of entries. Enter the entity ID of your institution''s identity provider. Leave blank for single-entity metadata URLs. + ' metadata_xml: 'Ο πάροχος ταυτότητάς σας παρέχει ένα αρχείο XML μεταδεδομένων προς λήψη. diff --git a/modules/auth_saml/config/locales/crowdin/eo.yml b/modules/auth_saml/config/locales/crowdin/eo.yml index 5f6f63e4c87..84c1f502471 100644 --- a/modules/auth_saml/config/locales/crowdin/eo.yml +++ b/modules/auth_saml/config/locales/crowdin/eo.yml @@ -12,6 +12,7 @@ eo: sp_entity_id: Service entity ID metadata_url: Identity provider metadata URL name_identifier_format: Name identifier format + idp_entity_id: Identity provider entity ID idp_sso_service_url: Identity provider login endpoint idp_slo_service_url: Identity provider logout endpoint idp_cert: Public certificate of identity provider @@ -44,6 +45,10 @@ eo: success: Successfully updated the configuration using the identity provider metadata. invalid_url: Provided metadata URL is invalid. Provide a HTTP(s) URL. error: 'Failed to retrieve the identity provider metadata: %{error}' + federation_metadata: 'The metadata URL points to a federation aggregate (many identity providers). Use your institution''s direct metadata URL, or enter your institution''s IdP entity ID in the metadata form and try again. + + ' + metadata_too_large: The metadata file exceeds the maximum allowed size. providers: label_empty_title: No SAML providers configured yet. label_empty_description: Add a provider to see them here. @@ -110,6 +115,9 @@ eo: ' metadata_url: 'Your identity provider provides a metadata URL. + ' + idp_entity_id: 'Optional: Useful when the metadata URL points to a federation aggregate with a lot of entries. Enter the entity ID of your institution''s identity provider. Leave blank for single-entity metadata URLs. + ' metadata_xml: 'Your identity provider provides a metadata XML download. diff --git a/modules/auth_saml/config/locales/crowdin/es.yml b/modules/auth_saml/config/locales/crowdin/es.yml index 715644bfbfe..ca3631abe9f 100644 --- a/modules/auth_saml/config/locales/crowdin/es.yml +++ b/modules/auth_saml/config/locales/crowdin/es.yml @@ -12,6 +12,7 @@ es: sp_entity_id: ID de la entidad de servicio metadata_url: URL de metadatos del proveedor de identidad name_identifier_format: Formato del identificador del nombre + idp_entity_id: Identity provider entity ID idp_sso_service_url: Terminal de inicio de sesión del proveedor de identidad idp_slo_service_url: Terminal de cierre de sesión del proveedor de identidad idp_cert: Certificado público del proveedor de identidad @@ -44,6 +45,10 @@ es: success: Se ha actualizado con éxito la configuración utilizando los metadatos del proveedor de identidad. invalid_url: La URL de metadatos proporcionada no es válida. Proporcione una URL HTTP(s). error: 'Error al recuperar los metadatos del proveedor de identidad: %{error}' + federation_metadata: 'The metadata URL points to a federation aggregate (many identity providers). Use your institution''s direct metadata URL, or enter your institution''s IdP entity ID in the metadata form and try again. + + ' + metadata_too_large: The metadata file exceeds the maximum allowed size. providers: label_empty_title: Aún no hay proveedores SAML configurados. label_empty_description: Añada un proveedor para verlo aquí. @@ -110,6 +115,9 @@ es: ' metadata_url: 'Su proveedor de identidad proporciona una URL de metadatos. + ' + idp_entity_id: 'Optional: Useful when the metadata URL points to a federation aggregate with a lot of entries. Enter the entity ID of your institution''s identity provider. Leave blank for single-entity metadata URLs. + ' metadata_xml: 'Su proveedor de identidad proporciona una descarga XML de metadatos. diff --git a/modules/auth_saml/config/locales/crowdin/et.yml b/modules/auth_saml/config/locales/crowdin/et.yml index 1bafcff7533..3708e5cc04d 100644 --- a/modules/auth_saml/config/locales/crowdin/et.yml +++ b/modules/auth_saml/config/locales/crowdin/et.yml @@ -12,6 +12,7 @@ et: sp_entity_id: Service entity ID metadata_url: Identity provider metadata URL name_identifier_format: Name identifier format + idp_entity_id: Identity provider entity ID idp_sso_service_url: Identity provider login endpoint idp_slo_service_url: Identity provider logout endpoint idp_cert: Public certificate of identity provider @@ -44,6 +45,10 @@ et: success: Successfully updated the configuration using the identity provider metadata. invalid_url: Provided metadata URL is invalid. Provide a HTTP(s) URL. error: 'Failed to retrieve the identity provider metadata: %{error}' + federation_metadata: 'The metadata URL points to a federation aggregate (many identity providers). Use your institution''s direct metadata URL, or enter your institution''s IdP entity ID in the metadata form and try again. + + ' + metadata_too_large: The metadata file exceeds the maximum allowed size. providers: label_empty_title: No SAML providers configured yet. label_empty_description: Add a provider to see them here. @@ -110,6 +115,9 @@ et: ' metadata_url: 'Your identity provider provides a metadata URL. + ' + idp_entity_id: 'Optional: Useful when the metadata URL points to a federation aggregate with a lot of entries. Enter the entity ID of your institution''s identity provider. Leave blank for single-entity metadata URLs. + ' metadata_xml: 'Your identity provider provides a metadata XML download. diff --git a/modules/auth_saml/config/locales/crowdin/eu.yml b/modules/auth_saml/config/locales/crowdin/eu.yml index 8daea4f87bb..841e857a43d 100644 --- a/modules/auth_saml/config/locales/crowdin/eu.yml +++ b/modules/auth_saml/config/locales/crowdin/eu.yml @@ -12,6 +12,7 @@ eu: sp_entity_id: Service entity ID metadata_url: Identity provider metadata URL name_identifier_format: Name identifier format + idp_entity_id: Identity provider entity ID idp_sso_service_url: Identity provider login endpoint idp_slo_service_url: Identity provider logout endpoint idp_cert: Public certificate of identity provider @@ -44,6 +45,10 @@ eu: success: Successfully updated the configuration using the identity provider metadata. invalid_url: Provided metadata URL is invalid. Provide a HTTP(s) URL. error: 'Failed to retrieve the identity provider metadata: %{error}' + federation_metadata: 'The metadata URL points to a federation aggregate (many identity providers). Use your institution''s direct metadata URL, or enter your institution''s IdP entity ID in the metadata form and try again. + + ' + metadata_too_large: The metadata file exceeds the maximum allowed size. providers: label_empty_title: No SAML providers configured yet. label_empty_description: Add a provider to see them here. @@ -110,6 +115,9 @@ eu: ' metadata_url: 'Your identity provider provides a metadata URL. + ' + idp_entity_id: 'Optional: Useful when the metadata URL points to a federation aggregate with a lot of entries. Enter the entity ID of your institution''s identity provider. Leave blank for single-entity metadata URLs. + ' metadata_xml: 'Your identity provider provides a metadata XML download. diff --git a/modules/auth_saml/config/locales/crowdin/fa.yml b/modules/auth_saml/config/locales/crowdin/fa.yml index 16a0ac07a16..8220336b584 100644 --- a/modules/auth_saml/config/locales/crowdin/fa.yml +++ b/modules/auth_saml/config/locales/crowdin/fa.yml @@ -12,6 +12,7 @@ fa: sp_entity_id: شناسه سرویس metadata_url: آدرس فراداده سرور احراز هویت name_identifier_format: قالب متغیر نام + idp_entity_id: Identity provider entity ID idp_sso_service_url: مسیر ورود سرور احراز هویت idp_slo_service_url: مسیر خروج سرور احراز هویت idp_cert: مدرک عمومی سرور احراز هویت @@ -44,6 +45,10 @@ fa: success: ارتقای تنظیمات بوسیله فراداده سرویس احراز هویت با موفقیت انجام شد. invalid_url: مسیر فراداده صحیح نیست. لطفا آدرس صحیح HTTP(S) ارائه دهید. error: 'فراداده ارائه دهنده هویت بازیابی نشد: %{error}' + federation_metadata: 'The metadata URL points to a federation aggregate (many identity providers). Use your institution''s direct metadata URL, or enter your institution''s IdP entity ID in the metadata form and try again. + + ' + metadata_too_large: The metadata file exceeds the maximum allowed size. providers: label_empty_title: هیچ سخت‌افزار احراز هویتی پیکربندی نشده است. label_empty_description: یک ارائه دهنده اضافه کنید تا آن را در اینجا ببینید. @@ -110,6 +115,9 @@ fa: ' metadata_url: 'ارائه دهنده هویت شما یک URL فراداده ارائه می دهد. + ' + idp_entity_id: 'Optional: Useful when the metadata URL points to a federation aggregate with a lot of entries. Enter the entity ID of your institution''s identity provider. Leave blank for single-entity metadata URLs. + ' metadata_xml: 'ارائه دهنده هویت شما یک دانلود XML فراداده ارائه می دهد. diff --git a/modules/auth_saml/config/locales/crowdin/fi.yml b/modules/auth_saml/config/locales/crowdin/fi.yml index d57e1c0ea02..943820a676e 100644 --- a/modules/auth_saml/config/locales/crowdin/fi.yml +++ b/modules/auth_saml/config/locales/crowdin/fi.yml @@ -12,6 +12,7 @@ fi: sp_entity_id: Service entity ID metadata_url: Identity provider metadata URL name_identifier_format: Name identifier format + idp_entity_id: Identity provider entity ID idp_sso_service_url: Identity provider login endpoint idp_slo_service_url: Identity provider logout endpoint idp_cert: Public certificate of identity provider @@ -44,6 +45,10 @@ fi: success: Successfully updated the configuration using the identity provider metadata. invalid_url: Provided metadata URL is invalid. Provide a HTTP(s) URL. error: 'Failed to retrieve the identity provider metadata: %{error}' + federation_metadata: 'The metadata URL points to a federation aggregate (many identity providers). Use your institution''s direct metadata URL, or enter your institution''s IdP entity ID in the metadata form and try again. + + ' + metadata_too_large: The metadata file exceeds the maximum allowed size. providers: label_empty_title: No SAML providers configured yet. label_empty_description: Add a provider to see them here. @@ -110,6 +115,9 @@ fi: ' metadata_url: 'Your identity provider provides a metadata URL. + ' + idp_entity_id: 'Optional: Useful when the metadata URL points to a federation aggregate with a lot of entries. Enter the entity ID of your institution''s identity provider. Leave blank for single-entity metadata URLs. + ' metadata_xml: 'Your identity provider provides a metadata XML download. diff --git a/modules/auth_saml/config/locales/crowdin/fil.yml b/modules/auth_saml/config/locales/crowdin/fil.yml index 4441d30067c..19fb12a99fc 100644 --- a/modules/auth_saml/config/locales/crowdin/fil.yml +++ b/modules/auth_saml/config/locales/crowdin/fil.yml @@ -12,6 +12,7 @@ fil: sp_entity_id: Service entity ID metadata_url: Identity provider metadata URL name_identifier_format: Name identifier format + idp_entity_id: Identity provider entity ID idp_sso_service_url: Identity provider login endpoint idp_slo_service_url: Identity provider logout endpoint idp_cert: Public certificate of identity provider @@ -44,6 +45,10 @@ fil: success: Successfully updated the configuration using the identity provider metadata. invalid_url: Provided metadata URL is invalid. Provide a HTTP(s) URL. error: 'Failed to retrieve the identity provider metadata: %{error}' + federation_metadata: 'The metadata URL points to a federation aggregate (many identity providers). Use your institution''s direct metadata URL, or enter your institution''s IdP entity ID in the metadata form and try again. + + ' + metadata_too_large: The metadata file exceeds the maximum allowed size. providers: label_empty_title: No SAML providers configured yet. label_empty_description: Add a provider to see them here. @@ -110,6 +115,9 @@ fil: ' metadata_url: 'Your identity provider provides a metadata URL. + ' + idp_entity_id: 'Optional: Useful when the metadata URL points to a federation aggregate with a lot of entries. Enter the entity ID of your institution''s identity provider. Leave blank for single-entity metadata URLs. + ' metadata_xml: 'Your identity provider provides a metadata XML download. diff --git a/modules/auth_saml/config/locales/crowdin/fr.yml b/modules/auth_saml/config/locales/crowdin/fr.yml index 86f2dd446df..0c0b71601ad 100644 --- a/modules/auth_saml/config/locales/crowdin/fr.yml +++ b/modules/auth_saml/config/locales/crowdin/fr.yml @@ -12,6 +12,7 @@ fr: sp_entity_id: ID de l'entité de service metadata_url: URL des métadonnées du fournisseur d'identité name_identifier_format: Format de l'identifiant du nom + idp_entity_id: Identity provider entity ID idp_sso_service_url: Point de terminaison de connexion du fournisseur d'identité idp_slo_service_url: Point de terminaison de déconnexion du fournisseur d'identité idp_cert: Certificat public du fournisseur d'identité @@ -44,6 +45,10 @@ fr: success: Mise à jour réussie de la configuration à l'aide des métadonnées du fournisseur d'identité. invalid_url: L'URL des métadonnées fournie n'est pas valide. Fournissez une URL HTTP(s). error: 'Échec de la récupération des métadonnées du fournisseur d''identité : %{error}' + federation_metadata: 'The metadata URL points to a federation aggregate (many identity providers). Use your institution''s direct metadata URL, or enter your institution''s IdP entity ID in the metadata form and try again. + + ' + metadata_too_large: The metadata file exceeds the maximum allowed size. providers: label_empty_title: Aucun fournisseur SAML n'est encore configuré. label_empty_description: Ajoutez un fournisseur pour le voir ici. @@ -110,6 +115,9 @@ fr: ' metadata_url: 'Votre fournisseur d''identité fournit une URL de métadonnées. + ' + idp_entity_id: 'Optional: Useful when the metadata URL points to a federation aggregate with a lot of entries. Enter the entity ID of your institution''s identity provider. Leave blank for single-entity metadata URLs. + ' metadata_xml: 'Votre fournisseur d''identité fournit un téléchargement de métadonnées XML. diff --git a/modules/auth_saml/config/locales/crowdin/he.yml b/modules/auth_saml/config/locales/crowdin/he.yml index 4479a920ea8..aa5a68d6068 100644 --- a/modules/auth_saml/config/locales/crowdin/he.yml +++ b/modules/auth_saml/config/locales/crowdin/he.yml @@ -12,6 +12,7 @@ he: sp_entity_id: מזהה ישות השירות metadata_url: כתובת URL של מטא-נתוני ספק הזהות name_identifier_format: Name identifier format + idp_entity_id: Identity provider entity ID idp_sso_service_url: Identity provider login endpoint idp_slo_service_url: Identity provider logout endpoint idp_cert: Public certificate of identity provider @@ -44,6 +45,10 @@ he: success: Successfully updated the configuration using the identity provider metadata. invalid_url: Provided metadata URL is invalid. Provide a HTTP(s) URL. error: 'Failed to retrieve the identity provider metadata: %{error}' + federation_metadata: 'The metadata URL points to a federation aggregate (many identity providers). Use your institution''s direct metadata URL, or enter your institution''s IdP entity ID in the metadata form and try again. + + ' + metadata_too_large: The metadata file exceeds the maximum allowed size. providers: label_empty_title: No SAML providers configured yet. label_empty_description: Add a provider to see them here. @@ -110,6 +115,9 @@ he: ' metadata_url: 'Your identity provider provides a metadata URL. + ' + idp_entity_id: 'Optional: Useful when the metadata URL points to a federation aggregate with a lot of entries. Enter the entity ID of your institution''s identity provider. Leave blank for single-entity metadata URLs. + ' metadata_xml: 'Your identity provider provides a metadata XML download. diff --git a/modules/auth_saml/config/locales/crowdin/hi.yml b/modules/auth_saml/config/locales/crowdin/hi.yml index 2bf80d82f76..85430aba3fd 100644 --- a/modules/auth_saml/config/locales/crowdin/hi.yml +++ b/modules/auth_saml/config/locales/crowdin/hi.yml @@ -12,6 +12,7 @@ hi: sp_entity_id: Service entity ID metadata_url: Identity provider metadata URL name_identifier_format: Name identifier format + idp_entity_id: Identity provider entity ID idp_sso_service_url: Identity provider login endpoint idp_slo_service_url: Identity provider logout endpoint idp_cert: Public certificate of identity provider @@ -44,6 +45,10 @@ hi: success: Successfully updated the configuration using the identity provider metadata. invalid_url: Provided metadata URL is invalid. Provide a HTTP(s) URL. error: 'Failed to retrieve the identity provider metadata: %{error}' + federation_metadata: 'The metadata URL points to a federation aggregate (many identity providers). Use your institution''s direct metadata URL, or enter your institution''s IdP entity ID in the metadata form and try again. + + ' + metadata_too_large: The metadata file exceeds the maximum allowed size. providers: label_empty_title: No SAML providers configured yet. label_empty_description: Add a provider to see them here. @@ -110,6 +115,9 @@ hi: ' metadata_url: 'Your identity provider provides a metadata URL. + ' + idp_entity_id: 'Optional: Useful when the metadata URL points to a federation aggregate with a lot of entries. Enter the entity ID of your institution''s identity provider. Leave blank for single-entity metadata URLs. + ' metadata_xml: 'Your identity provider provides a metadata XML download. diff --git a/modules/auth_saml/config/locales/crowdin/hr.yml b/modules/auth_saml/config/locales/crowdin/hr.yml index 5508eae4385..3cdefb68450 100644 --- a/modules/auth_saml/config/locales/crowdin/hr.yml +++ b/modules/auth_saml/config/locales/crowdin/hr.yml @@ -12,6 +12,7 @@ hr: sp_entity_id: Service entity ID metadata_url: Identity provider metadata URL name_identifier_format: Name identifier format + idp_entity_id: Identity provider entity ID idp_sso_service_url: Identity provider login endpoint idp_slo_service_url: Identity provider logout endpoint idp_cert: Public certificate of identity provider @@ -44,6 +45,10 @@ hr: success: Successfully updated the configuration using the identity provider metadata. invalid_url: Provided metadata URL is invalid. Provide a HTTP(s) URL. error: 'Failed to retrieve the identity provider metadata: %{error}' + federation_metadata: 'The metadata URL points to a federation aggregate (many identity providers). Use your institution''s direct metadata URL, or enter your institution''s IdP entity ID in the metadata form and try again. + + ' + metadata_too_large: The metadata file exceeds the maximum allowed size. providers: label_empty_title: No SAML providers configured yet. label_empty_description: Add a provider to see them here. @@ -110,6 +115,9 @@ hr: ' metadata_url: 'Your identity provider provides a metadata URL. + ' + idp_entity_id: 'Optional: Useful when the metadata URL points to a federation aggregate with a lot of entries. Enter the entity ID of your institution''s identity provider. Leave blank for single-entity metadata URLs. + ' metadata_xml: 'Your identity provider provides a metadata XML download. diff --git a/modules/auth_saml/config/locales/crowdin/hu.yml b/modules/auth_saml/config/locales/crowdin/hu.yml index 367844c57de..34e675905c4 100644 --- a/modules/auth_saml/config/locales/crowdin/hu.yml +++ b/modules/auth_saml/config/locales/crowdin/hu.yml @@ -12,6 +12,7 @@ hu: sp_entity_id: Service entity ID metadata_url: Identity provider metadata URL name_identifier_format: Névazonosító formátum + idp_entity_id: Identity provider entity ID idp_sso_service_url: Identity provider login endpoint idp_slo_service_url: Identity provider logout endpoint idp_cert: Public certificate of identity provider @@ -44,6 +45,10 @@ hu: success: Successfully updated the configuration using the identity provider metadata. invalid_url: Provided metadata URL is invalid. Provide a HTTP(s) URL. error: 'Failed to retrieve the identity provider metadata: %{error}' + federation_metadata: 'The metadata URL points to a federation aggregate (many identity providers). Use your institution''s direct metadata URL, or enter your institution''s IdP entity ID in the metadata form and try again. + + ' + metadata_too_large: The metadata file exceeds the maximum allowed size. providers: label_empty_title: No SAML providers configured yet. label_empty_description: Add a provider to see them here. @@ -110,6 +115,9 @@ hu: ' metadata_url: 'Your identity provider provides a metadata URL. + ' + idp_entity_id: 'Optional: Useful when the metadata URL points to a federation aggregate with a lot of entries. Enter the entity ID of your institution''s identity provider. Leave blank for single-entity metadata URLs. + ' metadata_xml: 'Your identity provider provides a metadata XML download. diff --git a/modules/auth_saml/config/locales/crowdin/hy.yml b/modules/auth_saml/config/locales/crowdin/hy.yml index bb9dfe30506..9fa120f1ce7 100644 --- a/modules/auth_saml/config/locales/crowdin/hy.yml +++ b/modules/auth_saml/config/locales/crowdin/hy.yml @@ -12,6 +12,7 @@ hy: sp_entity_id: Service entity ID metadata_url: Identity provider metadata URL name_identifier_format: Name identifier format + idp_entity_id: Identity provider entity ID idp_sso_service_url: Identity provider login endpoint idp_slo_service_url: Identity provider logout endpoint idp_cert: Public certificate of identity provider @@ -44,6 +45,10 @@ hy: success: Successfully updated the configuration using the identity provider metadata. invalid_url: Provided metadata URL is invalid. Provide a HTTP(s) URL. error: 'Failed to retrieve the identity provider metadata: %{error}' + federation_metadata: 'The metadata URL points to a federation aggregate (many identity providers). Use your institution''s direct metadata URL, or enter your institution''s IdP entity ID in the metadata form and try again. + + ' + metadata_too_large: The metadata file exceeds the maximum allowed size. providers: label_empty_title: No SAML providers configured yet. label_empty_description: Add a provider to see them here. @@ -110,6 +115,9 @@ hy: ' metadata_url: 'Your identity provider provides a metadata URL. + ' + idp_entity_id: 'Optional: Useful when the metadata URL points to a federation aggregate with a lot of entries. Enter the entity ID of your institution''s identity provider. Leave blank for single-entity metadata URLs. + ' metadata_xml: 'Your identity provider provides a metadata XML download. diff --git a/modules/auth_saml/config/locales/crowdin/id.yml b/modules/auth_saml/config/locales/crowdin/id.yml index f4c814e5923..bfd36ec9f25 100644 --- a/modules/auth_saml/config/locales/crowdin/id.yml +++ b/modules/auth_saml/config/locales/crowdin/id.yml @@ -12,6 +12,7 @@ id: sp_entity_id: ID entitas layanan metadata_url: URL metadata penyedia identitas name_identifier_format: Format pengenal nama + idp_entity_id: Identity provider entity ID idp_sso_service_url: Titik akhir masuk penyedia identitas idp_slo_service_url: Titik akhir masuk penyedia identitas idp_cert: Sertifikat publik penyedia identitas @@ -44,6 +45,10 @@ id: success: Berhasil memperbarui konfigurasi menggunakan metadata penyedia identitas. invalid_url: URL metadata yang diberikan tidak valid. Berikan URL HTTP. error: 'Gagal mengambil metadata penyedia identitas: %{error}' + federation_metadata: 'The metadata URL points to a federation aggregate (many identity providers). Use your institution''s direct metadata URL, or enter your institution''s IdP entity ID in the metadata form and try again. + + ' + metadata_too_large: The metadata file exceeds the maximum allowed size. providers: label_empty_title: Belum ada penyedia SAML yang dikonfigurasi. label_empty_description: Tambahkan penyedia untuk melihatnya di sini. @@ -110,6 +115,9 @@ id: ' metadata_url: 'Penyedia identitas Anda menyediakan URL metadata. + ' + idp_entity_id: 'Optional: Useful when the metadata URL points to a federation aggregate with a lot of entries. Enter the entity ID of your institution''s identity provider. Leave blank for single-entity metadata URLs. + ' metadata_xml: 'Penyedia identitas Anda menyediakan unduhan metadata XML. diff --git a/modules/auth_saml/config/locales/crowdin/it.yml b/modules/auth_saml/config/locales/crowdin/it.yml index 7c1dbf55cc1..7885fd8e2d2 100644 --- a/modules/auth_saml/config/locales/crowdin/it.yml +++ b/modules/auth_saml/config/locales/crowdin/it.yml @@ -12,6 +12,7 @@ it: sp_entity_id: ID dell'entità di servizio metadata_url: URL dei metadati del fornitore di identità name_identifier_format: Formato dell'identificatore del nome + idp_entity_id: Identity provider entity ID idp_sso_service_url: Endpoint di login del fornitore di identità idp_slo_service_url: Endpoint di logout del fornitore di identità idp_cert: Certificato pubblico del fornitore di identità @@ -44,6 +45,10 @@ it: success: La configurazione è stata aggiornata utilizzando i metadati del fornitore di identità. invalid_url: L'URL dei metadati forniti non è valido. Fornire un URL HTTP(s). error: 'Impossibile recuperare i metadati del fornitore di identità: %{error}' + federation_metadata: 'The metadata URL points to a federation aggregate (many identity providers). Use your institution''s direct metadata URL, or enter your institution''s IdP entity ID in the metadata form and try again. + + ' + metadata_too_large: The metadata file exceeds the maximum allowed size. providers: label_empty_title: Nessun fornitore SAML configurato. label_empty_description: Aggiungi un fornitore per vederli qui. @@ -110,6 +115,9 @@ it: ' metadata_url: 'Il tuo fornitore di identità fornisce un URL di metadati. + ' + idp_entity_id: 'Optional: Useful when the metadata URL points to a federation aggregate with a lot of entries. Enter the entity ID of your institution''s identity provider. Leave blank for single-entity metadata URLs. + ' metadata_xml: 'Il tuo fornitore di identità fornisce un download in XML dei metadati. diff --git a/modules/auth_saml/config/locales/crowdin/ja.yml b/modules/auth_saml/config/locales/crowdin/ja.yml index 247c542620b..748ab378d94 100644 --- a/modules/auth_saml/config/locales/crowdin/ja.yml +++ b/modules/auth_saml/config/locales/crowdin/ja.yml @@ -12,6 +12,7 @@ ja: sp_entity_id: サービス・エンティティID metadata_url: ID プロバイダのメタデータ URL name_identifier_format: 名前識別子の形式 + idp_entity_id: Identity provider entity ID idp_sso_service_url: アイデンティティ・プロバイダのログイン・エンドポイント idp_slo_service_url: アイデンティティプロバイダのログアウトエンドポイント idp_cert: ID プロバイダの公開証明書 @@ -44,6 +45,10 @@ ja: success: ID プロバイダのメタデータを使用した構成の更新に成功しました。 invalid_url: 提供されたメタデータの URL が無効です。HTTP(s) URLを指定してください。 error: ID プロバイダのメタデータの取得に失敗しました: %{error} + federation_metadata: 'The metadata URL points to a federation aggregate (many identity providers). Use your institution''s direct metadata URL, or enter your institution''s IdP entity ID in the metadata form and try again. + + ' + metadata_too_large: The metadata file exceeds the maximum allowed size. providers: label_empty_title: SAML プロバイダはまだ構成されていない。 label_empty_description: プロバイダーを追加して、ここでご覧ください。 @@ -110,6 +115,9 @@ ja: ' metadata_url: 'ID プロバイダはメタデータ URL を提供する。 + ' + idp_entity_id: 'Optional: Useful when the metadata URL points to a federation aggregate with a lot of entries. Enter the entity ID of your institution''s identity provider. Leave blank for single-entity metadata URLs. + ' metadata_xml: 'ID プロバイダがメタデータ XML をダウンロードする。 diff --git a/modules/auth_saml/config/locales/crowdin/ka.yml b/modules/auth_saml/config/locales/crowdin/ka.yml index 8af2aa6c716..e6d0ee9182b 100644 --- a/modules/auth_saml/config/locales/crowdin/ka.yml +++ b/modules/auth_saml/config/locales/crowdin/ka.yml @@ -12,6 +12,7 @@ ka: sp_entity_id: Service entity ID metadata_url: Identity provider metadata URL name_identifier_format: Name identifier format + idp_entity_id: Identity provider entity ID idp_sso_service_url: Identity provider login endpoint idp_slo_service_url: Identity provider logout endpoint idp_cert: Public certificate of identity provider @@ -44,6 +45,10 @@ ka: success: Successfully updated the configuration using the identity provider metadata. invalid_url: Provided metadata URL is invalid. Provide a HTTP(s) URL. error: 'Failed to retrieve the identity provider metadata: %{error}' + federation_metadata: 'The metadata URL points to a federation aggregate (many identity providers). Use your institution''s direct metadata URL, or enter your institution''s IdP entity ID in the metadata form and try again. + + ' + metadata_too_large: The metadata file exceeds the maximum allowed size. providers: label_empty_title: No SAML providers configured yet. label_empty_description: Add a provider to see them here. @@ -110,6 +115,9 @@ ka: ' metadata_url: 'Your identity provider provides a metadata URL. + ' + idp_entity_id: 'Optional: Useful when the metadata URL points to a federation aggregate with a lot of entries. Enter the entity ID of your institution''s identity provider. Leave blank for single-entity metadata URLs. + ' metadata_xml: 'Your identity provider provides a metadata XML download. diff --git a/modules/auth_saml/config/locales/crowdin/kk.yml b/modules/auth_saml/config/locales/crowdin/kk.yml index 8b556f13080..9054cfe9ece 100644 --- a/modules/auth_saml/config/locales/crowdin/kk.yml +++ b/modules/auth_saml/config/locales/crowdin/kk.yml @@ -12,6 +12,7 @@ kk: sp_entity_id: Service entity ID metadata_url: Identity provider metadata URL name_identifier_format: Name identifier format + idp_entity_id: Identity provider entity ID idp_sso_service_url: Identity provider login endpoint idp_slo_service_url: Identity provider logout endpoint idp_cert: Public certificate of identity provider @@ -44,6 +45,10 @@ kk: success: Successfully updated the configuration using the identity provider metadata. invalid_url: Provided metadata URL is invalid. Provide a HTTP(s) URL. error: 'Failed to retrieve the identity provider metadata: %{error}' + federation_metadata: 'The metadata URL points to a federation aggregate (many identity providers). Use your institution''s direct metadata URL, or enter your institution''s IdP entity ID in the metadata form and try again. + + ' + metadata_too_large: The metadata file exceeds the maximum allowed size. providers: label_empty_title: No SAML providers configured yet. label_empty_description: Add a provider to see them here. @@ -110,6 +115,9 @@ kk: ' metadata_url: 'Your identity provider provides a metadata URL. + ' + idp_entity_id: 'Optional: Useful when the metadata URL points to a federation aggregate with a lot of entries. Enter the entity ID of your institution''s identity provider. Leave blank for single-entity metadata URLs. + ' metadata_xml: 'Your identity provider provides a metadata XML download. diff --git a/modules/auth_saml/config/locales/crowdin/ko.yml b/modules/auth_saml/config/locales/crowdin/ko.yml index c2b28111b68..e26820b2c11 100644 --- a/modules/auth_saml/config/locales/crowdin/ko.yml +++ b/modules/auth_saml/config/locales/crowdin/ko.yml @@ -12,6 +12,7 @@ ko: sp_entity_id: 서비스 엔티티 ID metadata_url: ID 공급자 메타데이터 URL name_identifier_format: 이름 식별자 형식 + idp_entity_id: Identity provider entity ID idp_sso_service_url: ID 공급자 로그인 엔드포인트 idp_slo_service_url: ID 공급자 로그아웃 엔드포인트 idp_cert: ID 공급자의 공개 인증서 @@ -44,6 +45,10 @@ ko: success: ID 공급자 메타데이터를 사용하여 구성을 업데이트했습니다. invalid_url: 제공한 메타데이터 URL이 유효하지 않습니다. HTTP(s) URL을 입력하세요. error: 'ID 공급자 메타데이터를 검색하지 못했습니다: %{error}' + federation_metadata: 'The metadata URL points to a federation aggregate (many identity providers). Use your institution''s direct metadata URL, or enter your institution''s IdP entity ID in the metadata form and try again. + + ' + metadata_too_large: The metadata file exceeds the maximum allowed size. providers: label_empty_title: 아직 구성된 SAML 공급자가 없습니다. label_empty_description: 여기에서 보려면 공급자를 추가합니다. @@ -110,6 +115,9 @@ ko: ' metadata_url: 'ID 공급자가 메타데이터 URL을 제공합니다. + ' + idp_entity_id: 'Optional: Useful when the metadata URL points to a federation aggregate with a lot of entries. Enter the entity ID of your institution''s identity provider. Leave blank for single-entity metadata URLs. + ' metadata_xml: 'ID 공급자가 메타데이터 XML 다운로드를 제공합니다. diff --git a/modules/auth_saml/config/locales/crowdin/lt.yml b/modules/auth_saml/config/locales/crowdin/lt.yml index 24f060d22c3..6bd003884d3 100644 --- a/modules/auth_saml/config/locales/crowdin/lt.yml +++ b/modules/auth_saml/config/locales/crowdin/lt.yml @@ -12,6 +12,7 @@ lt: sp_entity_id: Service entity ID metadata_url: Identity provider metadata URL name_identifier_format: Name identifier format + idp_entity_id: Identity provider entity ID idp_sso_service_url: Identity provider login endpoint idp_slo_service_url: Identity provider logout endpoint idp_cert: Public certificate of identity provider @@ -44,6 +45,10 @@ lt: success: Successfully updated the configuration using the identity provider metadata. invalid_url: Provided metadata URL is invalid. Provide a HTTP(s) URL. error: 'Failed to retrieve the identity provider metadata: %{error}' + federation_metadata: 'The metadata URL points to a federation aggregate (many identity providers). Use your institution''s direct metadata URL, or enter your institution''s IdP entity ID in the metadata form and try again. + + ' + metadata_too_large: The metadata file exceeds the maximum allowed size. providers: label_empty_title: No SAML providers configured yet. label_empty_description: Add a provider to see them here. @@ -110,6 +115,9 @@ lt: ' metadata_url: 'Your identity provider provides a metadata URL. + ' + idp_entity_id: 'Optional: Useful when the metadata URL points to a federation aggregate with a lot of entries. Enter the entity ID of your institution''s identity provider. Leave blank for single-entity metadata URLs. + ' metadata_xml: 'Your identity provider provides a metadata XML download. diff --git a/modules/auth_saml/config/locales/crowdin/lv.yml b/modules/auth_saml/config/locales/crowdin/lv.yml index eae507b9461..ad99ab2f374 100644 --- a/modules/auth_saml/config/locales/crowdin/lv.yml +++ b/modules/auth_saml/config/locales/crowdin/lv.yml @@ -12,6 +12,7 @@ lv: sp_entity_id: Service entity ID metadata_url: Identity provider metadata URL name_identifier_format: Name identifier format + idp_entity_id: Identity provider entity ID idp_sso_service_url: Identity provider login endpoint idp_slo_service_url: Identity provider logout endpoint idp_cert: Public certificate of identity provider @@ -44,6 +45,10 @@ lv: success: Successfully updated the configuration using the identity provider metadata. invalid_url: Provided metadata URL is invalid. Provide a HTTP(s) URL. error: 'Failed to retrieve the identity provider metadata: %{error}' + federation_metadata: 'The metadata URL points to a federation aggregate (many identity providers). Use your institution''s direct metadata URL, or enter your institution''s IdP entity ID in the metadata form and try again. + + ' + metadata_too_large: The metadata file exceeds the maximum allowed size. providers: label_empty_title: No SAML providers configured yet. label_empty_description: Add a provider to see them here. @@ -110,6 +115,9 @@ lv: ' metadata_url: 'Your identity provider provides a metadata URL. + ' + idp_entity_id: 'Optional: Useful when the metadata URL points to a federation aggregate with a lot of entries. Enter the entity ID of your institution''s identity provider. Leave blank for single-entity metadata URLs. + ' metadata_xml: 'Your identity provider provides a metadata XML download. diff --git a/modules/auth_saml/config/locales/crowdin/mn.yml b/modules/auth_saml/config/locales/crowdin/mn.yml index 03a00b7711a..f618489ae3b 100644 --- a/modules/auth_saml/config/locales/crowdin/mn.yml +++ b/modules/auth_saml/config/locales/crowdin/mn.yml @@ -12,6 +12,7 @@ mn: sp_entity_id: Service entity ID metadata_url: Identity provider metadata URL name_identifier_format: Name identifier format + idp_entity_id: Identity provider entity ID idp_sso_service_url: Identity provider login endpoint idp_slo_service_url: Identity provider logout endpoint idp_cert: Public certificate of identity provider @@ -44,6 +45,10 @@ mn: success: Successfully updated the configuration using the identity provider metadata. invalid_url: Provided metadata URL is invalid. Provide a HTTP(s) URL. error: 'Failed to retrieve the identity provider metadata: %{error}' + federation_metadata: 'The metadata URL points to a federation aggregate (many identity providers). Use your institution''s direct metadata URL, or enter your institution''s IdP entity ID in the metadata form and try again. + + ' + metadata_too_large: The metadata file exceeds the maximum allowed size. providers: label_empty_title: No SAML providers configured yet. label_empty_description: Add a provider to see them here. @@ -110,6 +115,9 @@ mn: ' metadata_url: 'Your identity provider provides a metadata URL. + ' + idp_entity_id: 'Optional: Useful when the metadata URL points to a federation aggregate with a lot of entries. Enter the entity ID of your institution''s identity provider. Leave blank for single-entity metadata URLs. + ' metadata_xml: 'Your identity provider provides a metadata XML download. diff --git a/modules/auth_saml/config/locales/crowdin/ms.yml b/modules/auth_saml/config/locales/crowdin/ms.yml index c429036067d..9fb3cd30f9e 100644 --- a/modules/auth_saml/config/locales/crowdin/ms.yml +++ b/modules/auth_saml/config/locales/crowdin/ms.yml @@ -12,6 +12,7 @@ ms: sp_entity_id: ID entiti perkhidmatan metadata_url: URL metadata pembekal identiti name_identifier_format: Format pengecam nama + idp_entity_id: Identity provider entity ID idp_sso_service_url: Titik akhir log masuk pembekal identiti idp_slo_service_url: Titik akhir logout pembekal identiti idp_cert: Sijil awam pemberi identiti @@ -44,6 +45,10 @@ ms: success: Berjaya mengemas kini konfigurasi menggunakan metadata pembekal identiti. invalid_url: URL metadata yang diberikan adalah tidak sah. Sediakan URL HTTP. error: 'Gagal mendapatkan semula metadata pembekal identiti: %{error}' + federation_metadata: 'The metadata URL points to a federation aggregate (many identity providers). Use your institution''s direct metadata URL, or enter your institution''s IdP entity ID in the metadata form and try again. + + ' + metadata_too_large: The metadata file exceeds the maximum allowed size. providers: label_empty_title: Tiada pembekal SAML dikonfigurasikan lagi. label_empty_description: Tambah pembekal untuk melihat mereka di sini. @@ -110,6 +115,9 @@ ms: ' metadata_url: 'Pembekal identiti anda menyediakan URL metadata. + ' + idp_entity_id: 'Optional: Useful when the metadata URL points to a federation aggregate with a lot of entries. Enter the entity ID of your institution''s identity provider. Leave blank for single-entity metadata URLs. + ' metadata_xml: 'Pembekal identiti anda menyediakan muat turun XML metadata. diff --git a/modules/auth_saml/config/locales/crowdin/ne.yml b/modules/auth_saml/config/locales/crowdin/ne.yml index edd3460a6a8..1492e7a4df2 100644 --- a/modules/auth_saml/config/locales/crowdin/ne.yml +++ b/modules/auth_saml/config/locales/crowdin/ne.yml @@ -12,6 +12,7 @@ ne: sp_entity_id: Service entity ID metadata_url: Identity provider metadata URL name_identifier_format: Name identifier format + idp_entity_id: Identity provider entity ID idp_sso_service_url: Identity provider login endpoint idp_slo_service_url: Identity provider logout endpoint idp_cert: Public certificate of identity provider @@ -44,6 +45,10 @@ ne: success: Successfully updated the configuration using the identity provider metadata. invalid_url: Provided metadata URL is invalid. Provide a HTTP(s) URL. error: 'Failed to retrieve the identity provider metadata: %{error}' + federation_metadata: 'The metadata URL points to a federation aggregate (many identity providers). Use your institution''s direct metadata URL, or enter your institution''s IdP entity ID in the metadata form and try again. + + ' + metadata_too_large: The metadata file exceeds the maximum allowed size. providers: label_empty_title: No SAML providers configured yet. label_empty_description: Add a provider to see them here. @@ -110,6 +115,9 @@ ne: ' metadata_url: 'Your identity provider provides a metadata URL. + ' + idp_entity_id: 'Optional: Useful when the metadata URL points to a federation aggregate with a lot of entries. Enter the entity ID of your institution''s identity provider. Leave blank for single-entity metadata URLs. + ' metadata_xml: 'Your identity provider provides a metadata XML download. diff --git a/modules/auth_saml/config/locales/crowdin/nl.yml b/modules/auth_saml/config/locales/crowdin/nl.yml index 73552b9794f..e786601a540 100644 --- a/modules/auth_saml/config/locales/crowdin/nl.yml +++ b/modules/auth_saml/config/locales/crowdin/nl.yml @@ -12,6 +12,7 @@ nl: sp_entity_id: Service-entiteit ID metadata_url: URL metagegevens identiteitsprovider name_identifier_format: Formaat naamidentificatie + idp_entity_id: Identity provider entity ID idp_sso_service_url: Identiteit provider login eindpunt idp_slo_service_url: Identiteit provider loguit eindpunt idp_cert: Publiek certificaat van identiteitsprovider @@ -44,6 +45,10 @@ nl: success: De configuratie is succesvol bijgewerkt met de metagegevens van de identiteits- provider. invalid_url: Verstrekte metadata URL is ongeldig. Geef een HTTP(s) URL. error: 'Fout bij het ophalen van de metagegevens van de identiteitaanbieder: %{error}' + federation_metadata: 'The metadata URL points to a federation aggregate (many identity providers). Use your institution''s direct metadata URL, or enter your institution''s IdP entity ID in the metadata form and try again. + + ' + metadata_too_large: The metadata file exceeds the maximum allowed size. providers: label_empty_title: Er zijn nog geen SAML-providers geconfigureerd. label_empty_description: Voeg een provider toe om ze hier te zien. @@ -110,6 +115,9 @@ nl: ' metadata_url: 'Uw identiteitsprovider verstrekt een metadata-URL. + ' + idp_entity_id: 'Optional: Useful when the metadata URL points to a federation aggregate with a lot of entries. Enter the entity ID of your institution''s identity provider. Leave blank for single-entity metadata URLs. + ' metadata_xml: 'Your identity provider provides a metadata XML download. diff --git a/modules/auth_saml/config/locales/crowdin/no.yml b/modules/auth_saml/config/locales/crowdin/no.yml index 939dcc5b35d..5c24aeee3ed 100644 --- a/modules/auth_saml/config/locales/crowdin/no.yml +++ b/modules/auth_saml/config/locales/crowdin/no.yml @@ -12,6 +12,7 @@ sp_entity_id: Tjeneste enhet ID metadata_url: Identitetsleverandør metadata URL name_identifier_format: Navn identifikator format + idp_entity_id: Identity provider entity ID idp_sso_service_url: Identitet leverandør påloggingsendepunkt idp_slo_service_url: Identity provider logout endpoint idp_cert: Public certificate of identity provider @@ -44,6 +45,10 @@ success: Successfully updated the configuration using the identity provider metadata. invalid_url: Provided metadata URL is invalid. Provide a HTTP(s) URL. error: 'Failed to retrieve the identity provider metadata: %{error}' + federation_metadata: 'The metadata URL points to a federation aggregate (many identity providers). Use your institution''s direct metadata URL, or enter your institution''s IdP entity ID in the metadata form and try again. + + ' + metadata_too_large: The metadata file exceeds the maximum allowed size. providers: label_empty_title: No SAML providers configured yet. label_empty_description: Add a provider to see them here. @@ -110,6 +115,9 @@ ' metadata_url: 'Your identity provider provides a metadata URL. + ' + idp_entity_id: 'Optional: Useful when the metadata URL points to a federation aggregate with a lot of entries. Enter the entity ID of your institution''s identity provider. Leave blank for single-entity metadata URLs. + ' metadata_xml: 'Your identity provider provides a metadata XML download. diff --git a/modules/auth_saml/config/locales/crowdin/pl.yml b/modules/auth_saml/config/locales/crowdin/pl.yml index 1f499792eea..b5183096289 100644 --- a/modules/auth_saml/config/locales/crowdin/pl.yml +++ b/modules/auth_saml/config/locales/crowdin/pl.yml @@ -12,6 +12,7 @@ pl: sp_entity_id: Identyfikator jednostki usługowej metadata_url: Adres URL metadanych dostawcy tożsamości name_identifier_format: Format identyfikatora nazwy + idp_entity_id: Identity provider entity ID idp_sso_service_url: Punkt końcowy logowania dostawcy tożsamości idp_slo_service_url: Punkt końcowy wylogowania dostawcy tożsamości idp_cert: Publiczny certyfikat dostawcy tożsamości @@ -44,6 +45,10 @@ pl: success: Pomyślnie zaktualizowano konfigurację, używając metadanych dostawcy tożsamości. invalid_url: Podany adres URL metadanych jest nieprawidłowy. Podaj adres URL HTTP(s). error: 'Nie udało się pobrać metadanych dostawcy identyfikacji: %{error}' + federation_metadata: 'The metadata URL points to a federation aggregate (many identity providers). Use your institution''s direct metadata URL, or enter your institution''s IdP entity ID in the metadata form and try again. + + ' + metadata_too_large: The metadata file exceeds the maximum allowed size. providers: label_empty_title: Brak skonfigurowanych dostawców SAML. label_empty_description: Dodaj dostawcę, aby zobaczyć go tutaj. @@ -110,6 +115,9 @@ pl: ' metadata_url: 'Dostawca tożsamości podaje adres URL metadanych. + ' + idp_entity_id: 'Optional: Useful when the metadata URL points to a federation aggregate with a lot of entries. Enter the entity ID of your institution''s identity provider. Leave blank for single-entity metadata URLs. + ' metadata_xml: 'Twój dostawca tożsamości udostępnia metadane pobierania XML. diff --git a/modules/auth_saml/config/locales/crowdin/pt-BR.yml b/modules/auth_saml/config/locales/crowdin/pt-BR.yml index b7ca47cf570..85103a738da 100644 --- a/modules/auth_saml/config/locales/crowdin/pt-BR.yml +++ b/modules/auth_saml/config/locales/crowdin/pt-BR.yml @@ -12,6 +12,7 @@ pt-BR: sp_entity_id: ID da entidade do serviço metadata_url: URL de metadados do provedor de identidade name_identifier_format: Formato do identificador de nome + idp_entity_id: Identity provider entity ID idp_sso_service_url: Endpoint de login do provedor de identidade idp_slo_service_url: Endpoint de logout do provedor de identidade idp_cert: Certificado público de provedor de identidade @@ -44,6 +45,10 @@ pt-BR: success: Configuração atualizada com sucesso usando os metadados do provedor de identidade. invalid_url: O URL de metadados fornecido é inválido. Forneça um URL HTTP(s). error: 'Falha ao recuperar os metadados do provedor de identidade: %{error}' + federation_metadata: 'The metadata URL points to a federation aggregate (many identity providers). Use your institution''s direct metadata URL, or enter your institution''s IdP entity ID in the metadata form and try again. + + ' + metadata_too_large: The metadata file exceeds the maximum allowed size. providers: label_empty_title: Nenhum provedor SAML configurado até o momento. label_empty_description: Adicione um provedor para vê-lo aqui. @@ -110,6 +115,9 @@ pt-BR: ' metadata_url: 'Seu provedor de identidade fornece uma URL de metadados. + ' + idp_entity_id: 'Optional: Useful when the metadata URL points to a federation aggregate with a lot of entries. Enter the entity ID of your institution''s identity provider. Leave blank for single-entity metadata URLs. + ' metadata_xml: 'Seu provedor de identidade oferece a opção de baixar o XML de metadados. diff --git a/modules/auth_saml/config/locales/crowdin/pt-PT.yml b/modules/auth_saml/config/locales/crowdin/pt-PT.yml index e04624c5074..fd14fc54e0a 100644 --- a/modules/auth_saml/config/locales/crowdin/pt-PT.yml +++ b/modules/auth_saml/config/locales/crowdin/pt-PT.yml @@ -12,6 +12,7 @@ pt-PT: sp_entity_id: ID da entidade de serviço metadata_url: URL dos metadados do fornecedor de identidade name_identifier_format: Formato do identificador do nome + idp_entity_id: Identity provider entity ID idp_sso_service_url: Ponto final do início de sessão do fornecedor de identidade idp_slo_service_url: Ponto final do fim de sessão do fornecedor de identidade idp_cert: Certificado público do fornecedor de identidade @@ -44,6 +45,10 @@ pt-PT: success: Atualizou a configuração utilizando os metadados do fornecedor de identidade com êxito. invalid_url: O URL de metadados fornecido é inválido. Forneça um URL HTTP(s). error: 'Falha ao recuperar os metadados do fornecedor de identidade: %{error}' + federation_metadata: 'The metadata URL points to a federation aggregate (many identity providers). Use your institution''s direct metadata URL, or enter your institution''s IdP entity ID in the metadata form and try again. + + ' + metadata_too_large: The metadata file exceeds the maximum allowed size. providers: label_empty_title: Ainda não existem fornecedores SAML configurados. label_empty_description: Adicione um fornecedor para vê-lo aqui. @@ -110,6 +115,9 @@ pt-PT: ' metadata_url: 'O seu fornecedor de identidade fornece um URL de metadados. + ' + idp_entity_id: 'Optional: Useful when the metadata URL points to a federation aggregate with a lot of entries. Enter the entity ID of your institution''s identity provider. Leave blank for single-entity metadata URLs. + ' metadata_xml: 'O seu fornecedor de identidade fornece uma transferência XML de metadados. diff --git a/modules/auth_saml/config/locales/crowdin/ro.yml b/modules/auth_saml/config/locales/crowdin/ro.yml index 306cea9d806..a981c9452a9 100644 --- a/modules/auth_saml/config/locales/crowdin/ro.yml +++ b/modules/auth_saml/config/locales/crowdin/ro.yml @@ -12,6 +12,7 @@ ro: sp_entity_id: Service entity ID metadata_url: Identity provider metadata URL name_identifier_format: Name identifier format + idp_entity_id: Identity provider entity ID idp_sso_service_url: Identity provider login endpoint idp_slo_service_url: Identity provider logout endpoint idp_cert: Public certificate of identity provider @@ -44,6 +45,10 @@ ro: success: Successfully updated the configuration using the identity provider metadata. invalid_url: Provided metadata URL is invalid. Provide a HTTP(s) URL. error: 'Failed to retrieve the identity provider metadata: %{error}' + federation_metadata: 'The metadata URL points to a federation aggregate (many identity providers). Use your institution''s direct metadata URL, or enter your institution''s IdP entity ID in the metadata form and try again. + + ' + metadata_too_large: The metadata file exceeds the maximum allowed size. providers: label_empty_title: No SAML providers configured yet. label_empty_description: Add a provider to see them here. @@ -110,6 +115,9 @@ ro: ' metadata_url: 'Your identity provider provides a metadata URL. + ' + idp_entity_id: 'Optional: Useful when the metadata URL points to a federation aggregate with a lot of entries. Enter the entity ID of your institution''s identity provider. Leave blank for single-entity metadata URLs. + ' metadata_xml: 'Your identity provider provides a metadata XML download. diff --git a/modules/auth_saml/config/locales/crowdin/ru.yml b/modules/auth_saml/config/locales/crowdin/ru.yml index d0229b35fce..ea725efc33b 100644 --- a/modules/auth_saml/config/locales/crowdin/ru.yml +++ b/modules/auth_saml/config/locales/crowdin/ru.yml @@ -12,6 +12,7 @@ ru: sp_entity_id: Идентификатор объекта обслуживания metadata_url: URL метаданных провайдера идентификации name_identifier_format: Формат идентификатора имени + idp_entity_id: Identity provider entity ID idp_sso_service_url: Конечная точка входа провайдера идентификации idp_slo_service_url: Конечная точка выхода провайдера идентификации idp_cert: Публичный сертификат провайдера идентификации @@ -44,6 +45,10 @@ ru: success: Конфигурация успешно обновлена с использованием метаданных провайдера идентификации. invalid_url: Предоставленный URL-адрес метаданных недействителен. Укажите URL-адрес HTTP(s). error: 'Не удалось получить метаданные провайдера идентификации: %{error}' + federation_metadata: 'The metadata URL points to a federation aggregate (many identity providers). Use your institution''s direct metadata URL, or enter your institution''s IdP entity ID in the metadata form and try again. + + ' + metadata_too_large: The metadata file exceeds the maximum allowed size. providers: label_empty_title: Провайдеры SAML еще не настроены. label_empty_description: Добавьте провайдера, чтобы увидеть его здесь. @@ -110,6 +115,9 @@ ru: ' metadata_url: 'Ваш провайдер идентификации предоставляет URL-адрес метаданных. + ' + idp_entity_id: 'Optional: Useful when the metadata URL points to a federation aggregate with a lot of entries. Enter the entity ID of your institution''s identity provider. Leave blank for single-entity metadata URLs. + ' metadata_xml: 'Ваш провайдер идентификации предоставляет XML-загрузку метаданных. diff --git a/modules/auth_saml/config/locales/crowdin/rw.yml b/modules/auth_saml/config/locales/crowdin/rw.yml index d0fc8577c42..ecaf196d311 100644 --- a/modules/auth_saml/config/locales/crowdin/rw.yml +++ b/modules/auth_saml/config/locales/crowdin/rw.yml @@ -12,6 +12,7 @@ rw: sp_entity_id: Service entity ID metadata_url: Identity provider metadata URL name_identifier_format: Name identifier format + idp_entity_id: Identity provider entity ID idp_sso_service_url: Identity provider login endpoint idp_slo_service_url: Identity provider logout endpoint idp_cert: Public certificate of identity provider @@ -44,6 +45,10 @@ rw: success: Successfully updated the configuration using the identity provider metadata. invalid_url: Provided metadata URL is invalid. Provide a HTTP(s) URL. error: 'Failed to retrieve the identity provider metadata: %{error}' + federation_metadata: 'The metadata URL points to a federation aggregate (many identity providers). Use your institution''s direct metadata URL, or enter your institution''s IdP entity ID in the metadata form and try again. + + ' + metadata_too_large: The metadata file exceeds the maximum allowed size. providers: label_empty_title: No SAML providers configured yet. label_empty_description: Add a provider to see them here. @@ -110,6 +115,9 @@ rw: ' metadata_url: 'Your identity provider provides a metadata URL. + ' + idp_entity_id: 'Optional: Useful when the metadata URL points to a federation aggregate with a lot of entries. Enter the entity ID of your institution''s identity provider. Leave blank for single-entity metadata URLs. + ' metadata_xml: 'Your identity provider provides a metadata XML download. diff --git a/modules/auth_saml/config/locales/crowdin/si.yml b/modules/auth_saml/config/locales/crowdin/si.yml index 9259643391a..4574e12aff0 100644 --- a/modules/auth_saml/config/locales/crowdin/si.yml +++ b/modules/auth_saml/config/locales/crowdin/si.yml @@ -12,6 +12,7 @@ si: sp_entity_id: Service entity ID metadata_url: Identity provider metadata URL name_identifier_format: Name identifier format + idp_entity_id: Identity provider entity ID idp_sso_service_url: Identity provider login endpoint idp_slo_service_url: Identity provider logout endpoint idp_cert: Public certificate of identity provider @@ -44,6 +45,10 @@ si: success: Successfully updated the configuration using the identity provider metadata. invalid_url: Provided metadata URL is invalid. Provide a HTTP(s) URL. error: 'Failed to retrieve the identity provider metadata: %{error}' + federation_metadata: 'The metadata URL points to a federation aggregate (many identity providers). Use your institution''s direct metadata URL, or enter your institution''s IdP entity ID in the metadata form and try again. + + ' + metadata_too_large: The metadata file exceeds the maximum allowed size. providers: label_empty_title: No SAML providers configured yet. label_empty_description: Add a provider to see them here. @@ -110,6 +115,9 @@ si: ' metadata_url: 'Your identity provider provides a metadata URL. + ' + idp_entity_id: 'Optional: Useful when the metadata URL points to a federation aggregate with a lot of entries. Enter the entity ID of your institution''s identity provider. Leave blank for single-entity metadata URLs. + ' metadata_xml: 'Your identity provider provides a metadata XML download. diff --git a/modules/auth_saml/config/locales/crowdin/sk.yml b/modules/auth_saml/config/locales/crowdin/sk.yml index 4ccc15d4ec8..cbfbb2c589b 100644 --- a/modules/auth_saml/config/locales/crowdin/sk.yml +++ b/modules/auth_saml/config/locales/crowdin/sk.yml @@ -12,6 +12,7 @@ sk: sp_entity_id: Service entity ID metadata_url: Identity provider metadata URL name_identifier_format: + idp_entity_id: Identity provider entity ID idp_sso_service_url: Identity provider login endpoint idp_slo_service_url: Identity provider logout endpoint idp_cert: Public certificate of identity provider @@ -44,6 +45,10 @@ sk: success: Successfully updated the configuration using the identity provider metadata. invalid_url: Provided metadata URL is invalid. Provide a HTTP(s) URL. error: 'Failed to retrieve the identity provider metadata: %{error}' + federation_metadata: 'The metadata URL points to a federation aggregate (many identity providers). Use your institution''s direct metadata URL, or enter your institution''s IdP entity ID in the metadata form and try again. + + ' + metadata_too_large: The metadata file exceeds the maximum allowed size. providers: label_empty_title: No SAML providers configured yet. label_empty_description: Add a provider to see them here. @@ -110,6 +115,9 @@ sk: ' metadata_url: 'Your identity provider provides a metadata URL. + ' + idp_entity_id: 'Optional: Useful when the metadata URL points to a federation aggregate with a lot of entries. Enter the entity ID of your institution''s identity provider. Leave blank for single-entity metadata URLs. + ' metadata_xml: 'Your identity provider provides a metadata XML download. diff --git a/modules/auth_saml/config/locales/crowdin/sl.yml b/modules/auth_saml/config/locales/crowdin/sl.yml index ebc966a6c4c..95373bc5c08 100644 --- a/modules/auth_saml/config/locales/crowdin/sl.yml +++ b/modules/auth_saml/config/locales/crowdin/sl.yml @@ -12,6 +12,7 @@ sl: sp_entity_id: Service entity ID metadata_url: Identity provider metadata URL name_identifier_format: Name identifier format + idp_entity_id: Identity provider entity ID idp_sso_service_url: Identity provider login endpoint idp_slo_service_url: Identity provider logout endpoint idp_cert: Public certificate of identity provider @@ -44,6 +45,10 @@ sl: success: Successfully updated the configuration using the identity provider metadata. invalid_url: Provided metadata URL is invalid. Provide a HTTP(s) URL. error: 'Failed to retrieve the identity provider metadata: %{error}' + federation_metadata: 'The metadata URL points to a federation aggregate (many identity providers). Use your institution''s direct metadata URL, or enter your institution''s IdP entity ID in the metadata form and try again. + + ' + metadata_too_large: The metadata file exceeds the maximum allowed size. providers: label_empty_title: No SAML providers configured yet. label_empty_description: Add a provider to see them here. @@ -110,6 +115,9 @@ sl: ' metadata_url: 'Your identity provider provides a metadata URL. + ' + idp_entity_id: 'Optional: Useful when the metadata URL points to a federation aggregate with a lot of entries. Enter the entity ID of your institution''s identity provider. Leave blank for single-entity metadata URLs. + ' metadata_xml: 'Your identity provider provides a metadata XML download. diff --git a/modules/auth_saml/config/locales/crowdin/sr.yml b/modules/auth_saml/config/locales/crowdin/sr.yml index db13f4def80..64d5f8f982a 100644 --- a/modules/auth_saml/config/locales/crowdin/sr.yml +++ b/modules/auth_saml/config/locales/crowdin/sr.yml @@ -12,6 +12,7 @@ sr: sp_entity_id: Service entity ID metadata_url: Identity provider metadata URL name_identifier_format: Name identifier format + idp_entity_id: Identity provider entity ID idp_sso_service_url: Identity provider login endpoint idp_slo_service_url: Identity provider logout endpoint idp_cert: Public certificate of identity provider @@ -44,6 +45,10 @@ sr: success: Successfully updated the configuration using the identity provider metadata. invalid_url: Provided metadata URL is invalid. Provide a HTTP(s) URL. error: 'Failed to retrieve the identity provider metadata: %{error}' + federation_metadata: 'The metadata URL points to a federation aggregate (many identity providers). Use your institution''s direct metadata URL, or enter your institution''s IdP entity ID in the metadata form and try again. + + ' + metadata_too_large: The metadata file exceeds the maximum allowed size. providers: label_empty_title: No SAML providers configured yet. label_empty_description: Add a provider to see them here. @@ -110,6 +115,9 @@ sr: ' metadata_url: 'Your identity provider provides a metadata URL. + ' + idp_entity_id: 'Optional: Useful when the metadata URL points to a federation aggregate with a lot of entries. Enter the entity ID of your institution''s identity provider. Leave blank for single-entity metadata URLs. + ' metadata_xml: 'Your identity provider provides a metadata XML download. diff --git a/modules/auth_saml/config/locales/crowdin/sv.yml b/modules/auth_saml/config/locales/crowdin/sv.yml index 35a01d20c80..3849223553b 100644 --- a/modules/auth_saml/config/locales/crowdin/sv.yml +++ b/modules/auth_saml/config/locales/crowdin/sv.yml @@ -12,6 +12,7 @@ sv: sp_entity_id: ID för serviceenhet metadata_url: Identitetsleverantör metadata URL name_identifier_format: Format för namnidentifierare + idp_entity_id: Identity provider entity ID idp_sso_service_url: Identitetsleverantörens inloggningsändpunkt idp_slo_service_url: Utloggningsslutpunkt för identitetsleverantör idp_cert: Offentligt certifikat för identitetsleverantör @@ -44,6 +45,10 @@ sv: success: Uppdaterade konfigurationen med hjälp av identitetsleverantörens metadata. invalid_url: Tillhandahållen metadata URL är ogiltig. Ange en HTTP(s) URL. error: 'Misslyckades med att hämta metadata för identitetsleverantören: %{error}' + federation_metadata: 'The metadata URL points to a federation aggregate (many identity providers). Use your institution''s direct metadata URL, or enter your institution''s IdP entity ID in the metadata form and try again. + + ' + metadata_too_large: The metadata file exceeds the maximum allowed size. providers: label_empty_title: Inga SAML-leverantörer har konfigurerats ännu. label_empty_description: Lägg till en leverantör för att se dem här. @@ -110,6 +115,9 @@ sv: ' metadata_url: 'Din identitetsleverantör tillhandahåller en URL för metadata. + ' + idp_entity_id: 'Optional: Useful when the metadata URL points to a federation aggregate with a lot of entries. Enter the entity ID of your institution''s identity provider. Leave blank for single-entity metadata URLs. + ' metadata_xml: 'Din identitetsleverantör tillhandahåller en XML-nedladdning av metadata. diff --git a/modules/auth_saml/config/locales/crowdin/th.yml b/modules/auth_saml/config/locales/crowdin/th.yml index 1ac0e47350f..a89f84ae7ea 100644 --- a/modules/auth_saml/config/locales/crowdin/th.yml +++ b/modules/auth_saml/config/locales/crowdin/th.yml @@ -12,6 +12,7 @@ th: sp_entity_id: รหัสระบุเอนทิตีบริการ (Service Entity ID) metadata_url: URL ข้อมูลเมทาดาตาของผู้ให้บริการระบุตัวตน (IdP) name_identifier_format: รูปแบบรหัสระบุชื่อ (Name Identifier Format) + idp_entity_id: Identity provider entity ID idp_sso_service_url: จุดลงชื่อเข้าใช้ของผู้ให้บริการระบุตัวตน (IdP) idp_slo_service_url: Identity provider logout endpoint idp_cert: Public certificate of identity provider @@ -44,6 +45,10 @@ th: success: Successfully updated the configuration using the identity provider metadata. invalid_url: Provided metadata URL is invalid. Provide a HTTP(s) URL. error: 'Failed to retrieve the identity provider metadata: %{error}' + federation_metadata: 'The metadata URL points to a federation aggregate (many identity providers). Use your institution''s direct metadata URL, or enter your institution''s IdP entity ID in the metadata form and try again. + + ' + metadata_too_large: The metadata file exceeds the maximum allowed size. providers: label_empty_title: No SAML providers configured yet. label_empty_description: Add a provider to see them here. @@ -110,6 +115,9 @@ th: ' metadata_url: 'Your identity provider provides a metadata URL. + ' + idp_entity_id: 'Optional: Useful when the metadata URL points to a federation aggregate with a lot of entries. Enter the entity ID of your institution''s identity provider. Leave blank for single-entity metadata URLs. + ' metadata_xml: 'Your identity provider provides a metadata XML download. diff --git a/modules/auth_saml/config/locales/crowdin/tr.yml b/modules/auth_saml/config/locales/crowdin/tr.yml index ff8dafdebc5..0a50087de98 100644 --- a/modules/auth_saml/config/locales/crowdin/tr.yml +++ b/modules/auth_saml/config/locales/crowdin/tr.yml @@ -12,6 +12,7 @@ tr: sp_entity_id: Hizmet kuruluşu kimliği metadata_url: Kimlik sağlayıcı meta veri URL'si name_identifier_format: Ad tanımlayıcı biçimi + idp_entity_id: Identity provider entity ID idp_sso_service_url: Kimlik sağlayıcı oturum açma uç noktası idp_slo_service_url: Kimlik sağlayıcı oturum kapatma uç noktası idp_cert: Kamu kimlik belgesi sağlayıcısı. @@ -44,6 +45,10 @@ tr: success: Kimlik sağlayıcı meta verilerini kullanarak yapılandırma başarıyla güncelledi. invalid_url: Sağlanan meta veri URL'si geçersiz. Lütfen bir HTTP(s) URL'si sağlayın. error: 'Kimlik sağlayıcı meta verilerini alma işlemi başarısız oldu: %{error}' + federation_metadata: 'The metadata URL points to a federation aggregate (many identity providers). Use your institution''s direct metadata URL, or enter your institution''s IdP entity ID in the metadata form and try again. + + ' + metadata_too_large: The metadata file exceeds the maximum allowed size. providers: label_empty_title: Henüz hiçbir SAML sağlayıcısı yapılandırılmadı. label_empty_description: Onları burada görmek için bir sağlayıcı ekleyin. @@ -108,6 +113,9 @@ tr: metadata_none: '' metadata_url: 'Kimlik sağlayıcınız bir meta veri URL''si sağlar. + ' + idp_entity_id: 'Optional: Useful when the metadata URL points to a federation aggregate with a lot of entries. Enter the entity ID of your institution''s identity provider. Leave blank for single-entity metadata URLs. + ' metadata_xml: 'Kimlik sağlayıcınız bir meta veri XML indirmesi sağlar. diff --git a/modules/auth_saml/config/locales/crowdin/uk.yml b/modules/auth_saml/config/locales/crowdin/uk.yml index 2615a3d05ef..b20ef7fa663 100644 --- a/modules/auth_saml/config/locales/crowdin/uk.yml +++ b/modules/auth_saml/config/locales/crowdin/uk.yml @@ -12,6 +12,7 @@ uk: sp_entity_id: ID сервісної організації metadata_url: URL-адреса метаданих постачальника ідентифікаційних даних name_identifier_format: Формат ідентифікатора імені + idp_entity_id: Identity provider entity ID idp_sso_service_url: Кінцева точка входу постачальника ідентифікаційних даних idp_slo_service_url: Кінцева точка виходу постачальника ідентифікаційних даних idp_cert: Загальнодоступний сертифікат постачальника ідентифікаційних даних @@ -44,6 +45,10 @@ uk: success: Конфігурацію оновлено за допомогою метаданих постачальника ідентифікаційних даних. invalid_url: Надано неправильну URL-адресу метаданих. Укажіть URL-адресу HTTP(s). error: 'Не вдалось отримати метадані постачальника ідентифікаційних даних: %{error}' + federation_metadata: 'The metadata URL points to a federation aggregate (many identity providers). Use your institution''s direct metadata URL, or enter your institution''s IdP entity ID in the metadata form and try again. + + ' + metadata_too_large: The metadata file exceeds the maximum allowed size. providers: label_empty_title: Поки не налаштовано жодного постачальника послуг SAML. label_empty_description: Додайте постачальника послуг, і він з’явиться тут. @@ -110,6 +115,9 @@ uk: ' metadata_url: 'Ваш постачальник ідентифікаційних надає URL-адресу метаданих. + ' + idp_entity_id: 'Optional: Useful when the metadata URL points to a federation aggregate with a lot of entries. Enter the entity ID of your institution''s identity provider. Leave blank for single-entity metadata URLs. + ' metadata_xml: 'Ваш постачальник ідентифікаційних надає можливість завантаження XML метаданих. diff --git a/modules/auth_saml/config/locales/crowdin/uz.yml b/modules/auth_saml/config/locales/crowdin/uz.yml index 1b33f8105a4..878950b5fbb 100644 --- a/modules/auth_saml/config/locales/crowdin/uz.yml +++ b/modules/auth_saml/config/locales/crowdin/uz.yml @@ -12,6 +12,7 @@ uz: sp_entity_id: Service entity ID metadata_url: Identity provider metadata URL name_identifier_format: Name identifier format + idp_entity_id: Identity provider entity ID idp_sso_service_url: Identity provider login endpoint idp_slo_service_url: Identity provider logout endpoint idp_cert: Public certificate of identity provider @@ -44,6 +45,10 @@ uz: success: Successfully updated the configuration using the identity provider metadata. invalid_url: Provided metadata URL is invalid. Provide a HTTP(s) URL. error: 'Failed to retrieve the identity provider metadata: %{error}' + federation_metadata: 'The metadata URL points to a federation aggregate (many identity providers). Use your institution''s direct metadata URL, or enter your institution''s IdP entity ID in the metadata form and try again. + + ' + metadata_too_large: The metadata file exceeds the maximum allowed size. providers: label_empty_title: No SAML providers configured yet. label_empty_description: Add a provider to see them here. @@ -110,6 +115,9 @@ uz: ' metadata_url: 'Your identity provider provides a metadata URL. + ' + idp_entity_id: 'Optional: Useful when the metadata URL points to a federation aggregate with a lot of entries. Enter the entity ID of your institution''s identity provider. Leave blank for single-entity metadata URLs. + ' metadata_xml: 'Your identity provider provides a metadata XML download. diff --git a/modules/auth_saml/config/locales/crowdin/vi.yml b/modules/auth_saml/config/locales/crowdin/vi.yml index 021e7f459ad..6e527eb2a68 100644 --- a/modules/auth_saml/config/locales/crowdin/vi.yml +++ b/modules/auth_saml/config/locales/crowdin/vi.yml @@ -12,6 +12,7 @@ vi: sp_entity_id: ID thực thể dịch vụ metadata_url: URL siêu dữ liệu của nhà cung cấp danh tính name_identifier_format: Định dạng nhận dạng tên + idp_entity_id: Identity provider entity ID idp_sso_service_url: Điểm cuối đăng nhập của nhà cung cấp danh tính idp_slo_service_url: Điểm cuối đăng xuất của nhà cung cấp danh tính idp_cert: Giấy chứng nhận công khai của nhà cung cấp danh tính @@ -44,6 +45,10 @@ vi: success: Đã cập nhật thành công cấu hình bằng siêu dữ liệu của nhà cung cấp danh tính. invalid_url: URL siêu dữ liệu được cung cấp không hợp lệ. Cung cấp (các) URL HTTP. error: 'Không truy xuất được siêu dữ liệu của nhà cung cấp danh tính: %{error}' + federation_metadata: 'The metadata URL points to a federation aggregate (many identity providers). Use your institution''s direct metadata URL, or enter your institution''s IdP entity ID in the metadata form and try again. + + ' + metadata_too_large: The metadata file exceeds the maximum allowed size. providers: label_empty_title: Chưa có nhà cung cấp SAML nào được định cấu hình. label_empty_description: Thêm nhà cung cấp để xem chúng ở đây. @@ -110,6 +115,9 @@ vi: ' metadata_url: 'Nhà cung cấp danh tính của bạn cung cấp URL siêu dữ liệu. + ' + idp_entity_id: 'Optional: Useful when the metadata URL points to a federation aggregate with a lot of entries. Enter the entity ID of your institution''s identity provider. Leave blank for single-entity metadata URLs. + ' metadata_xml: 'Nhà cung cấp danh tính của bạn cung cấp bản tải xuống XML siêu dữ liệu. diff --git a/modules/auth_saml/config/locales/crowdin/zh-CN.yml b/modules/auth_saml/config/locales/crowdin/zh-CN.yml index dad0b72ff76..5785f55ae5e 100644 --- a/modules/auth_saml/config/locales/crowdin/zh-CN.yml +++ b/modules/auth_saml/config/locales/crowdin/zh-CN.yml @@ -12,6 +12,7 @@ zh-CN: sp_entity_id: 服务实体 ID metadata_url: 身份提供商元数据URL name_identifier_format: 名称标识符格式 + idp_entity_id: Identity provider entity ID idp_sso_service_url: 身份供应商登录端点 idp_slo_service_url: 身份供应商注销端点 idp_cert: 身份提供商公共证书 @@ -44,6 +45,10 @@ zh-CN: success: 使用身份提供商元数据成功更新配置。 invalid_url: 提供的元数据 URL 无效。请提供一个 HTTP(s) URL。 error: 检索身份提商元数据失败: %{error} + federation_metadata: 'The metadata URL points to a federation aggregate (many identity providers). Use your institution''s direct metadata URL, or enter your institution''s IdP entity ID in the metadata form and try again. + + ' + metadata_too_large: The metadata file exceeds the maximum allowed size. providers: label_empty_title: 尚未配置 SAML 提供商。 label_empty_description: 在这里添加一个提供商以查看它们。 @@ -110,6 +115,9 @@ zh-CN: ' metadata_url: '您的身份提供商提供了一个元数据 URL 。 + ' + idp_entity_id: 'Optional: Useful when the metadata URL points to a federation aggregate with a lot of entries. Enter the entity ID of your institution''s identity provider. Leave blank for single-entity metadata URLs. + ' metadata_xml: '您的身份提供商提供了一个元数据 XML 下载。 diff --git a/modules/auth_saml/config/locales/crowdin/zh-TW.yml b/modules/auth_saml/config/locales/crowdin/zh-TW.yml index 91b92e6066d..290de9580b0 100644 --- a/modules/auth_saml/config/locales/crowdin/zh-TW.yml +++ b/modules/auth_saml/config/locales/crowdin/zh-TW.yml @@ -12,6 +12,7 @@ zh-TW: sp_entity_id: 服務實體 ID metadata_url: 身分提供商後設資料 URL name_identifier_format: 名稱識別碼格式 + idp_entity_id: Identity provider entity ID idp_sso_service_url: 身分提供商登入端點 idp_slo_service_url: 身分提供商登出端點 idp_cert: 身分提供商的公開證書 @@ -44,6 +45,10 @@ zh-TW: success: 已成功使用身分提供者元資料更新配置設定。 invalid_url: 提供的元資料 URL 無效。提供 HTTP(s) URL。 error: 擷取身分提供者元資料失敗: %{error} + federation_metadata: 'The metadata URL points to a federation aggregate (many identity providers). Use your institution''s direct metadata URL, or enter your institution''s IdP entity ID in the metadata form and try again. + + ' + metadata_too_large: The metadata file exceeds the maximum allowed size. providers: label_empty_title: 尚未設定 SAML 提供商。 label_empty_description: 增加可供查詢之提供商 @@ -110,6 +115,9 @@ zh-TW: ' metadata_url: '您的身分提供者會提供一個 metadata URL。 + ' + idp_entity_id: 'Optional: Useful when the metadata URL points to a federation aggregate with a lot of entries. Enter the entity ID of your institution''s identity provider. Leave blank for single-entity metadata URLs. + ' metadata_xml: '您的身分提供者會提供一個 metadata URL。 diff --git a/modules/backlogs/config/locales/crowdin/af.yml b/modules/backlogs/config/locales/crowdin/af.yml index 07a3cc5cdac..2308cf8c401 100644 --- a/modules/backlogs/config/locales/crowdin/af.yml +++ b/modules/backlogs/config/locales/crowdin/af.yml @@ -40,6 +40,7 @@ af: in_planning: In planning active: Active completed: Completed + work_packages: Work packages work_package: backlog_bucket: Backlog Bucket backlogs_work_package_type: Agterstand tipe @@ -123,6 +124,8 @@ af: label_burndown_chart: Burndown chart label_is_done_status: Status %{status_name} beteken klaar label_sprint_board: Sprint board + move_to_bucket_dialog_component: + title: Move to backlog bucket move_to_sprint_dialog_component: title: Move to sprint label_sprint: Sprint @@ -179,6 +182,8 @@ af: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID move_menu: Move + move_to_backlog_bucket: Move to backlog bucket + move_to_inbox: Move to inbox move_to_sprint: Move to sprint work_package_is_closed: Werk pakket is klaar, wanneer burndown: @@ -190,18 +195,19 @@ af: upsell: sprint_sharing: description: Share sprints across projects to align teams and coordinate work in scaled agile setups (SAFe). + label_all_sprints: All sprints label_backlog: Backlog + label_backlogs: Agterstand + label_backlog_and_sprints: Backlog and sprints label_backlog_bucket_edit: Edit backlog bucket label_backlog_bucket_new: New backlog bucket - label_inbox: Inbox - label_backlogs: Agterstand label_burndown_chart: Burndown chart + label_inbox: Inbox label_sprint_board: Sprint board label_points_burn_down: Af label_points_burn_up: Op label_sprint_edit: Edit sprint label_sprint_new: New sprint - label_backlog_and_sprints: Backlog and sprints label_task_board: Taak bord notice_successful_start: The sprint was started. notice_successful_finish: The sprint was completed. @@ -209,6 +215,9 @@ af: notice_unsuccessful_start_with_reason: 'The sprint could not be started: %{reason}' notice_unsuccessful_finish: The sprint could not be completed. notice_unsuccessful_finish_with_reason: 'The sprint could not be completed: %{reason}' + notice_work_package_invisible_after_move: 'The work package was moved to %{backlog} but is not visible because its type or status is excluded from the backlog. + + ' permission_create_sprints: Create sprints permission_manage_sprint_items: Manage sprint items permission_select_backlog_types_and_statuses: Select backlog types and statuses diff --git a/modules/backlogs/config/locales/crowdin/ar.yml b/modules/backlogs/config/locales/crowdin/ar.yml index d591156a94a..fbb64f48f29 100644 --- a/modules/backlogs/config/locales/crowdin/ar.yml +++ b/modules/backlogs/config/locales/crowdin/ar.yml @@ -40,6 +40,7 @@ ar: in_planning: In planning active: Active completed: Completed + work_packages: Work packages work_package: backlog_bucket: Backlog Bucket backlogs_work_package_type: نوع الأعمال المتراكمة غير المنجزة @@ -131,6 +132,8 @@ ar: label_burndown_chart: Burndown chart label_is_done_status: الحالة %{status_name} تعني أنها منجزة label_sprint_board: Sprint board + move_to_bucket_dialog_component: + title: Move to backlog bucket move_to_sprint_dialog_component: title: Move to sprint label_sprint: Sprint @@ -195,6 +198,8 @@ ar: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID move_menu: Move + move_to_backlog_bucket: Move to backlog bucket + move_to_inbox: Move to inbox move_to_sprint: Move to sprint work_package_is_closed: مجموعة العمل قد تمت، عندما burndown: @@ -206,18 +211,19 @@ ar: upsell: sprint_sharing: description: Share sprints across projects to align teams and coordinate work in scaled agile setups (SAFe). + label_all_sprints: All sprints label_backlog: Backlog + label_backlogs: الأعمال المتراكمة غير المنجزة + label_backlog_and_sprints: Backlog and sprints label_backlog_bucket_edit: Edit backlog bucket label_backlog_bucket_new: New backlog bucket - label_inbox: الوارد - label_backlogs: الأعمال المتراكمة غير المنجزة label_burndown_chart: Burndown chart + label_inbox: الوارد label_sprint_board: Sprint board label_points_burn_down: الأسفل label_points_burn_up: الأعلى label_sprint_edit: Edit sprint label_sprint_new: New sprint - label_backlog_and_sprints: Backlog and sprints label_task_board: لوحة المهمة notice_successful_start: The sprint was started. notice_successful_finish: The sprint was completed. @@ -225,6 +231,9 @@ ar: notice_unsuccessful_start_with_reason: 'The sprint could not be started: %{reason}' notice_unsuccessful_finish: The sprint could not be completed. notice_unsuccessful_finish_with_reason: 'The sprint could not be completed: %{reason}' + notice_work_package_invisible_after_move: 'The work package was moved to %{backlog} but is not visible because its type or status is excluded from the backlog. + + ' permission_create_sprints: Create sprints permission_manage_sprint_items: Manage sprint items permission_select_backlog_types_and_statuses: Select backlog types and statuses diff --git a/modules/backlogs/config/locales/crowdin/az.yml b/modules/backlogs/config/locales/crowdin/az.yml index 3c5c57c3714..e5003410d5e 100644 --- a/modules/backlogs/config/locales/crowdin/az.yml +++ b/modules/backlogs/config/locales/crowdin/az.yml @@ -40,6 +40,7 @@ az: in_planning: In planning active: Active completed: Completed + work_packages: Work packages work_package: backlog_bucket: Backlog Bucket backlogs_work_package_type: '' @@ -123,6 +124,8 @@ az: label_burndown_chart: Burndown chart label_is_done_status: "%{status_name}" label_sprint_board: Sprint board + move_to_bucket_dialog_component: + title: Move to backlog bucket move_to_sprint_dialog_component: title: Move to sprint label_sprint: Sprint @@ -179,6 +182,8 @@ az: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID move_menu: Move + move_to_backlog_bucket: Move to backlog bucket + move_to_inbox: Move to inbox move_to_sprint: Move to sprint work_package_is_closed: Work package is done, when burndown: @@ -190,18 +195,19 @@ az: upsell: sprint_sharing: description: Share sprints across projects to align teams and coordinate work in scaled agile setups (SAFe). + label_all_sprints: All sprints label_backlog: Backlog + label_backlogs: Backlogs + label_backlog_and_sprints: Backlog and sprints label_backlog_bucket_edit: Edit backlog bucket label_backlog_bucket_new: New backlog bucket - label_inbox: Inbox - label_backlogs: Backlogs label_burndown_chart: Burndown chart + label_inbox: Inbox label_sprint_board: Sprint board label_points_burn_down: Down label_points_burn_up: Up label_sprint_edit: Edit sprint label_sprint_new: New sprint - label_backlog_and_sprints: Backlog and sprints label_task_board: Task board notice_successful_start: The sprint was started. notice_successful_finish: The sprint was completed. @@ -209,6 +215,9 @@ az: notice_unsuccessful_start_with_reason: 'The sprint could not be started: %{reason}' notice_unsuccessful_finish: The sprint could not be completed. notice_unsuccessful_finish_with_reason: 'The sprint could not be completed: %{reason}' + notice_work_package_invisible_after_move: 'The work package was moved to %{backlog} but is not visible because its type or status is excluded from the backlog. + + ' permission_create_sprints: Create sprints permission_manage_sprint_items: Manage sprint items permission_select_backlog_types_and_statuses: Select backlog types and statuses diff --git a/modules/backlogs/config/locales/crowdin/be.yml b/modules/backlogs/config/locales/crowdin/be.yml index 7b348f01476..64ada10067a 100644 --- a/modules/backlogs/config/locales/crowdin/be.yml +++ b/modules/backlogs/config/locales/crowdin/be.yml @@ -40,6 +40,7 @@ be: in_planning: In planning active: Active completed: Completed + work_packages: Work packages work_package: backlog_bucket: Backlog Bucket backlogs_work_package_type: Тып бэклогу @@ -127,6 +128,8 @@ be: label_burndown_chart: Burndown chart label_is_done_status: Status %{status_name} means done label_sprint_board: Sprint board + move_to_bucket_dialog_component: + title: Move to backlog bucket move_to_sprint_dialog_component: title: Move to sprint label_sprint: Sprint @@ -187,6 +190,8 @@ be: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID move_menu: Move + move_to_backlog_bucket: Move to backlog bucket + move_to_inbox: Move to inbox move_to_sprint: Move to sprint work_package_is_closed: Work package is done, when burndown: @@ -198,18 +203,19 @@ be: upsell: sprint_sharing: description: Share sprints across projects to align teams and coordinate work in scaled agile setups (SAFe). + label_all_sprints: All sprints label_backlog: Backlog + label_backlogs: Backlogs + label_backlog_and_sprints: Backlog and sprints label_backlog_bucket_edit: Edit backlog bucket label_backlog_bucket_new: New backlog bucket - label_inbox: Inbox - label_backlogs: Backlogs label_burndown_chart: Burndown chart + label_inbox: Inbox label_sprint_board: Sprint board label_points_burn_down: Down label_points_burn_up: Up label_sprint_edit: Edit sprint label_sprint_new: New sprint - label_backlog_and_sprints: Backlog and sprints label_task_board: Task board notice_successful_start: The sprint was started. notice_successful_finish: The sprint was completed. @@ -217,6 +223,9 @@ be: notice_unsuccessful_start_with_reason: 'The sprint could not be started: %{reason}' notice_unsuccessful_finish: The sprint could not be completed. notice_unsuccessful_finish_with_reason: 'The sprint could not be completed: %{reason}' + notice_work_package_invisible_after_move: 'The work package was moved to %{backlog} but is not visible because its type or status is excluded from the backlog. + + ' permission_create_sprints: Create sprints permission_manage_sprint_items: Manage sprint items permission_select_backlog_types_and_statuses: Select backlog types and statuses diff --git a/modules/backlogs/config/locales/crowdin/bg.yml b/modules/backlogs/config/locales/crowdin/bg.yml index 756b38b480f..08224955191 100644 --- a/modules/backlogs/config/locales/crowdin/bg.yml +++ b/modules/backlogs/config/locales/crowdin/bg.yml @@ -40,6 +40,7 @@ bg: in_planning: In planning active: Active completed: Completed + work_packages: Work packages work_package: backlog_bucket: Backlog Bucket backlogs_work_package_type: Backlog type @@ -123,6 +124,8 @@ bg: label_burndown_chart: Burndown chart label_is_done_status: Статус %{status_name} означава готово label_sprint_board: Sprint board + move_to_bucket_dialog_component: + title: Move to backlog bucket move_to_sprint_dialog_component: title: Move to sprint label_sprint: Sprint @@ -179,6 +182,8 @@ bg: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID move_menu: Move + move_to_backlog_bucket: Move to backlog bucket + move_to_inbox: Move to inbox move_to_sprint: Move to sprint work_package_is_closed: Работният пакет е готов, когато burndown: @@ -190,18 +195,19 @@ bg: upsell: sprint_sharing: description: Share sprints across projects to align teams and coordinate work in scaled agile setups (SAFe). + label_all_sprints: All sprints label_backlog: Backlog + label_backlogs: Backlogs + label_backlog_and_sprints: Backlog and sprints label_backlog_bucket_edit: Edit backlog bucket label_backlog_bucket_new: New backlog bucket - label_inbox: Inbox - label_backlogs: Backlogs label_burndown_chart: Burndown chart + label_inbox: Inbox label_sprint_board: Sprint board label_points_burn_down: Надолу label_points_burn_up: Нагоре label_sprint_edit: Edit sprint label_sprint_new: New sprint - label_backlog_and_sprints: Backlog and sprints label_task_board: Task board notice_successful_start: The sprint was started. notice_successful_finish: The sprint was completed. @@ -209,6 +215,9 @@ bg: notice_unsuccessful_start_with_reason: 'The sprint could not be started: %{reason}' notice_unsuccessful_finish: The sprint could not be completed. notice_unsuccessful_finish_with_reason: 'The sprint could not be completed: %{reason}' + notice_work_package_invisible_after_move: 'The work package was moved to %{backlog} but is not visible because its type or status is excluded from the backlog. + + ' permission_create_sprints: Create sprints permission_manage_sprint_items: Manage sprint items permission_select_backlog_types_and_statuses: Select backlog types and statuses diff --git a/modules/backlogs/config/locales/crowdin/ca.yml b/modules/backlogs/config/locales/crowdin/ca.yml index dafff29a187..2462fcd89db 100644 --- a/modules/backlogs/config/locales/crowdin/ca.yml +++ b/modules/backlogs/config/locales/crowdin/ca.yml @@ -40,6 +40,7 @@ ca: in_planning: In planning active: Active completed: Completed + work_packages: Work packages work_package: backlog_bucket: Backlog Bucket backlogs_work_package_type: Tipus de backlog @@ -123,6 +124,8 @@ ca: label_burndown_chart: Burndown chart label_is_done_status: L'estat %{status_name} significa fet label_sprint_board: Sprint board + move_to_bucket_dialog_component: + title: Move to backlog bucket move_to_sprint_dialog_component: title: Move to sprint label_sprint: Sprint @@ -179,6 +182,8 @@ ca: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID move_menu: Move + move_to_backlog_bucket: Move to backlog bucket + move_to_inbox: Move to inbox move_to_sprint: Move to sprint work_package_is_closed: Paquet de treball completat, quan burndown: @@ -190,18 +195,19 @@ ca: upsell: sprint_sharing: description: Share sprints across projects to align teams and coordinate work in scaled agile setups (SAFe). + label_all_sprints: All sprints label_backlog: Backlog + label_backlogs: Backlogs + label_backlog_and_sprints: Backlog and sprints label_backlog_bucket_edit: Edit backlog bucket label_backlog_bucket_new: New backlog bucket - label_inbox: Inbox - label_backlogs: Backlogs label_burndown_chart: Burndown chart + label_inbox: Inbox label_sprint_board: Sprint board label_points_burn_down: A baix label_points_burn_up: Amunt label_sprint_edit: Edit sprint label_sprint_new: New sprint - label_backlog_and_sprints: Backlog and sprints label_task_board: Tauler de tasques notice_successful_start: The sprint was started. notice_successful_finish: The sprint was completed. @@ -209,6 +215,9 @@ ca: notice_unsuccessful_start_with_reason: 'The sprint could not be started: %{reason}' notice_unsuccessful_finish: The sprint could not be completed. notice_unsuccessful_finish_with_reason: 'The sprint could not be completed: %{reason}' + notice_work_package_invisible_after_move: 'The work package was moved to %{backlog} but is not visible because its type or status is excluded from the backlog. + + ' permission_create_sprints: Create sprints permission_manage_sprint_items: Manage sprint items permission_select_backlog_types_and_statuses: Select backlog types and statuses diff --git a/modules/backlogs/config/locales/crowdin/ckb-IR.yml b/modules/backlogs/config/locales/crowdin/ckb-IR.yml index 15d0c11537b..73d445e03da 100644 --- a/modules/backlogs/config/locales/crowdin/ckb-IR.yml +++ b/modules/backlogs/config/locales/crowdin/ckb-IR.yml @@ -40,6 +40,7 @@ ckb-IR: in_planning: In planning active: Active completed: Completed + work_packages: Work packages work_package: backlog_bucket: Backlog Bucket backlogs_work_package_type: جۆری Backlog @@ -123,6 +124,8 @@ ckb-IR: label_burndown_chart: Burndown chart label_is_done_status: Status %{status_name} means done label_sprint_board: Sprint board + move_to_bucket_dialog_component: + title: Move to backlog bucket move_to_sprint_dialog_component: title: Move to sprint label_sprint: Sprint @@ -179,6 +182,8 @@ ckb-IR: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID move_menu: Move + move_to_backlog_bucket: Move to backlog bucket + move_to_inbox: Move to inbox move_to_sprint: Move to sprint work_package_is_closed: Work package is done, when burndown: @@ -190,18 +195,19 @@ ckb-IR: upsell: sprint_sharing: description: Share sprints across projects to align teams and coordinate work in scaled agile setups (SAFe). + label_all_sprints: All sprints label_backlog: Backlog + label_backlogs: Backlogs + label_backlog_and_sprints: Backlog and sprints label_backlog_bucket_edit: Edit backlog bucket label_backlog_bucket_new: New backlog bucket - label_inbox: Inbox - label_backlogs: Backlogs label_burndown_chart: Burndown chart + label_inbox: Inbox label_sprint_board: Sprint board label_points_burn_down: Down label_points_burn_up: Up label_sprint_edit: Edit sprint label_sprint_new: New sprint - label_backlog_and_sprints: Backlog and sprints label_task_board: Task board notice_successful_start: The sprint was started. notice_successful_finish: The sprint was completed. @@ -209,6 +215,9 @@ ckb-IR: notice_unsuccessful_start_with_reason: 'The sprint could not be started: %{reason}' notice_unsuccessful_finish: The sprint could not be completed. notice_unsuccessful_finish_with_reason: 'The sprint could not be completed: %{reason}' + notice_work_package_invisible_after_move: 'The work package was moved to %{backlog} but is not visible because its type or status is excluded from the backlog. + + ' permission_create_sprints: Create sprints permission_manage_sprint_items: Manage sprint items permission_select_backlog_types_and_statuses: Select backlog types and statuses diff --git a/modules/backlogs/config/locales/crowdin/cs.yml b/modules/backlogs/config/locales/crowdin/cs.yml index b0cea36b51b..2e366c410c1 100644 --- a/modules/backlogs/config/locales/crowdin/cs.yml +++ b/modules/backlogs/config/locales/crowdin/cs.yml @@ -40,6 +40,7 @@ cs: in_planning: V plánování active: Aktivní completed: Dokončen + work_packages: Pracovní balíčky work_package: backlog_bucket: Sekce backlogu backlogs_work_package_type: Typ backlogu @@ -127,6 +128,8 @@ cs: label_burndown_chart: Burndown chart label_is_done_status: Stav %{status_name} znamená hotovo label_sprint_board: Sprint board + move_to_bucket_dialog_component: + title: Move to backlog bucket move_to_sprint_dialog_component: title: Přesunout do sprintu label_sprint: Sprint @@ -187,6 +190,8 @@ cs: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID move_menu: Move + move_to_backlog_bucket: Move to backlog bucket + move_to_inbox: Move to inbox move_to_sprint: Move to sprint work_package_is_closed: Pracovní balíček je hotov, když burndown: @@ -198,18 +203,19 @@ cs: upsell: sprint_sharing: description: Share sprints across projects to align teams and coordinate work in scaled agile setups (SAFe). + label_all_sprints: All sprints label_backlog: Backlog + label_backlogs: Backlogy + label_backlog_and_sprints: Backlogy a sprinty label_backlog_bucket_edit: Edit backlog bucket label_backlog_bucket_new: New backlog bucket - label_inbox: Inbox - label_backlogs: Backlogy label_burndown_chart: Burndown chart + label_inbox: Inbox label_sprint_board: Sprint board label_points_burn_down: Dolů label_points_burn_up: Nahoru label_sprint_edit: Upravit sprint label_sprint_new: Nový sprint - label_backlog_and_sprints: Backlogy a sprinty label_task_board: Tabule úkolů notice_successful_start: Sprint byl zahájen. notice_successful_finish: Sprint byl dokončen. @@ -217,6 +223,9 @@ cs: notice_unsuccessful_start_with_reason: 'Sprint nebylo možné zahájit: %{reason}' notice_unsuccessful_finish: Sprint nebylo možné dokončit. notice_unsuccessful_finish_with_reason: 'Sprint nebylo možné dokončit: %{reason}' + notice_work_package_invisible_after_move: 'The work package was moved to %{backlog} but is not visible because its type or status is excluded from the backlog. + + ' permission_create_sprints: Vytváření sprintů permission_manage_sprint_items: Správa položek sprintu permission_select_backlog_types_and_statuses: Select backlog types and statuses diff --git a/modules/backlogs/config/locales/crowdin/da.yml b/modules/backlogs/config/locales/crowdin/da.yml index bdd46d7236e..3df78eec0d4 100644 --- a/modules/backlogs/config/locales/crowdin/da.yml +++ b/modules/backlogs/config/locales/crowdin/da.yml @@ -40,6 +40,7 @@ da: in_planning: Under planlægning active: Aktiv completed: Færdiggjort + work_packages: Work packages work_package: backlog_bucket: Backlog Bucket backlogs_work_package_type: Backlog-type @@ -123,6 +124,8 @@ da: label_burndown_chart: Burndown-diagram label_is_done_status: Status %{status_name} betyder færdig label_sprint_board: Sprinttavle + move_to_bucket_dialog_component: + title: Move to backlog bucket move_to_sprint_dialog_component: title: Flyt til sprint label_sprint: Sprint @@ -179,6 +182,8 @@ da: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID move_menu: Move + move_to_backlog_bucket: Move to backlog bucket + move_to_inbox: Move to inbox move_to_sprint: Move to sprint work_package_is_closed: Arbejdspakken er færdig, når burndown: @@ -190,18 +195,19 @@ da: upsell: sprint_sharing: description: Share sprints across projects to align teams and coordinate work in scaled agile setups (SAFe). + label_all_sprints: All sprints label_backlog: Backlog + label_backlogs: Backlogger + label_backlog_and_sprints: Backlog and sprints label_backlog_bucket_edit: Redigér backlog bucket label_backlog_bucket_new: Ny backlog bucket - label_inbox: Indbakke - label_backlogs: Backlogger label_burndown_chart: Burndown-diagram + label_inbox: Indbakke label_sprint_board: Sprinttavle label_points_burn_down: Ned label_points_burn_up: Op label_sprint_edit: Redigér sprint label_sprint_new: Ny sprint - label_backlog_and_sprints: Backlog and sprints label_task_board: Opgaveoversigt notice_successful_start: Sprinten blev sat i gang. notice_successful_finish: Sprinten blev afsluttet. @@ -209,6 +215,9 @@ da: notice_unsuccessful_start_with_reason: 'Sprinten kunne ikke startes: %{reason}' notice_unsuccessful_finish: Sprinten kunne ikke afsluttes. notice_unsuccessful_finish_with_reason: 'Sprinten kunne ikke afsluttes: %{reason}' + notice_work_package_invisible_after_move: 'The work package was moved to %{backlog} but is not visible because its type or status is excluded from the backlog. + + ' permission_create_sprints: Opret sprints permission_manage_sprint_items: Håndtér sprint-emner permission_select_backlog_types_and_statuses: Select backlog types and statuses diff --git a/modules/backlogs/config/locales/crowdin/de.yml b/modules/backlogs/config/locales/crowdin/de.yml index 33ff0294888..81341f860ef 100644 --- a/modules/backlogs/config/locales/crowdin/de.yml +++ b/modules/backlogs/config/locales/crowdin/de.yml @@ -40,6 +40,7 @@ de: in_planning: In Planung active: Aktiv completed: Abgeschlossen + work_packages: Arbeitspakete work_package: backlog_bucket: Backlog Bucket backlogs_work_package_type: Backlog Typ @@ -123,6 +124,8 @@ de: label_burndown_chart: Burndown-Diagramm label_is_done_status: Status %{status_name} bedeutet abgeschlossen label_sprint_board: Sprint-Board + move_to_bucket_dialog_component: + title: In Backlog Bucket verschieben move_to_sprint_dialog_component: title: Zum Sprint verschieben label_sprint: Sprint @@ -179,6 +182,8 @@ de: copy_url_to_clipboard: URL in die Zwischenablage kopieren copy_work_package_id: Arbeitspaket-ID kopieren move_menu: Verschieben + move_to_backlog_bucket: In Backlog Bucket verschieben + move_to_inbox: In Posteingang verschieben move_to_sprint: Zum Sprint verschieben work_package_is_closed: Arbeitspaket ist abgeschlossen, wenn burndown: @@ -190,18 +195,19 @@ de: upsell: sprint_sharing: description: Teilen Sie Sprints über Projekte hinweg, um Teams aufeinander abzustimmen und die Arbeit in skalierten agilen Setups (SAFe) zu koordinieren. + label_all_sprints: Alle Sprints label_backlog: Backlog + label_backlogs: Backlogs + label_backlog_and_sprints: Backlog und Sprints label_backlog_bucket_edit: Backlog Bucket bearbeiten label_backlog_bucket_new: Neuer Backlog Bucket - label_inbox: Posteingang - label_backlogs: Backlogs label_burndown_chart: Burndown-Diagramm + label_inbox: Posteingang label_sprint_board: Sprint-Board label_points_burn_down: Runter label_points_burn_up: Hoch label_sprint_edit: Sprint bearbeiten label_sprint_new: Neuer Sprint - label_backlog_and_sprints: Backlog und Sprints label_task_board: Taskboard notice_successful_start: Der Sprint wurde gestartet. notice_successful_finish: Der Sprint wurde abgeschlossen. @@ -209,6 +215,9 @@ de: notice_unsuccessful_start_with_reason: 'Der Sprint konnte nicht gestartet werden: %{reason}' notice_unsuccessful_finish: Der Sprint konnte nicht abgeschlossen werden. notice_unsuccessful_finish_with_reason: 'Der Sprint konnte nicht abgeschlossen werden: %{reason}' + notice_work_package_invisible_after_move: 'Das Arbeitspaket wurde auf %{backlog} verschoben, ist aber nicht sichtbar, weil sein Typ oder Status gemäß Konfiguration im Backlog ausgeblendet wird. + + ' permission_create_sprints: Sprints erstellen permission_manage_sprint_items: Sprint-Elemente verwalten permission_select_backlog_types_and_statuses: Typen und Status für Backlogs wählen @@ -243,5 +252,5 @@ de: backlogs: sharing_form_component: sharing_description: Dieses Projekt kann entweder eigene Sprints teilen, geteilte Sprints empfangen oder Sprints eigenständig bearbeiten (ohne Teilen). - sharing_fallback_description: Da es keinen Enterprise-Plan gibt, sind die Optionen für die gemeinsame Nutzung auf die eigenen Sprints des Projekts beschränkt. Die derzeit aktive Einstellung bleibt aktiv. + sharing_fallback_description: Ohne einen Enterprise-Plan sind die Optionen für die gemeinsame Nutzung auf die eigenen Sprints des Projekts beschränkt. Die derzeit aktive Einstellung bleibt bestehen. remaining_hours: verbleibender Aufwand diff --git a/modules/backlogs/config/locales/crowdin/el.yml b/modules/backlogs/config/locales/crowdin/el.yml index a3880da7f6b..2f425048690 100644 --- a/modules/backlogs/config/locales/crowdin/el.yml +++ b/modules/backlogs/config/locales/crowdin/el.yml @@ -40,6 +40,7 @@ el: in_planning: In planning active: Active completed: Completed + work_packages: Work packages work_package: backlog_bucket: Backlog Bucket backlogs_work_package_type: Τύπος backlog @@ -123,6 +124,8 @@ el: label_burndown_chart: Burndown chart label_is_done_status: Η κατάσταση %{status_name} σημαίνει ολοκληρωμένη label_sprint_board: Sprint board + move_to_bucket_dialog_component: + title: Move to backlog bucket move_to_sprint_dialog_component: title: Move to sprint label_sprint: Sprint @@ -179,6 +182,8 @@ el: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID move_menu: Move + move_to_backlog_bucket: Move to backlog bucket + move_to_inbox: Move to inbox move_to_sprint: Move to sprint work_package_is_closed: Το πακέτο εργασίας ολοκληρώνεται, όταν burndown: @@ -190,18 +195,19 @@ el: upsell: sprint_sharing: description: Share sprints across projects to align teams and coordinate work in scaled agile setups (SAFe). + label_all_sprints: All sprints label_backlog: Backlog + label_backlogs: Backlogs + label_backlog_and_sprints: Backlog and sprints label_backlog_bucket_edit: Edit backlog bucket label_backlog_bucket_new: New backlog bucket - label_inbox: Inbox - label_backlogs: Backlogs label_burndown_chart: Burndown chart + label_inbox: Inbox label_sprint_board: Sprint board label_points_burn_down: Κάτω label_points_burn_up: Πάνω label_sprint_edit: Edit sprint label_sprint_new: New sprint - label_backlog_and_sprints: Backlog and sprints label_task_board: Πίνακας εργασιών notice_successful_start: The sprint was started. notice_successful_finish: The sprint was completed. @@ -209,6 +215,9 @@ el: notice_unsuccessful_start_with_reason: 'The sprint could not be started: %{reason}' notice_unsuccessful_finish: The sprint could not be completed. notice_unsuccessful_finish_with_reason: 'The sprint could not be completed: %{reason}' + notice_work_package_invisible_after_move: 'The work package was moved to %{backlog} but is not visible because its type or status is excluded from the backlog. + + ' permission_create_sprints: Create sprints permission_manage_sprint_items: Manage sprint items permission_select_backlog_types_and_statuses: Select backlog types and statuses diff --git a/modules/backlogs/config/locales/crowdin/eo.yml b/modules/backlogs/config/locales/crowdin/eo.yml index 1d12bd1bfe0..da7b584acb9 100644 --- a/modules/backlogs/config/locales/crowdin/eo.yml +++ b/modules/backlogs/config/locales/crowdin/eo.yml @@ -40,6 +40,7 @@ eo: in_planning: In planning active: Active completed: Completed + work_packages: Work packages work_package: backlog_bucket: Backlog Bucket backlogs_work_package_type: Backlog type @@ -123,6 +124,8 @@ eo: label_burndown_chart: Burndown chart label_is_done_status: Status %{status_name} means done label_sprint_board: Sprint board + move_to_bucket_dialog_component: + title: Move to backlog bucket move_to_sprint_dialog_component: title: Move to sprint label_sprint: Sprint @@ -179,6 +182,8 @@ eo: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID move_menu: Move + move_to_backlog_bucket: Move to backlog bucket + move_to_inbox: Move to inbox move_to_sprint: Move to sprint work_package_is_closed: Work package is done, when burndown: @@ -190,18 +195,19 @@ eo: upsell: sprint_sharing: description: Share sprints across projects to align teams and coordinate work in scaled agile setups (SAFe). + label_all_sprints: All sprints label_backlog: Backlog + label_backlogs: Backlogs + label_backlog_and_sprints: Backlog and sprints label_backlog_bucket_edit: Edit backlog bucket label_backlog_bucket_new: New backlog bucket - label_inbox: Inbox - label_backlogs: Backlogs label_burndown_chart: Burndown chart + label_inbox: Inbox label_sprint_board: Sprint board label_points_burn_down: Malsupren label_points_burn_up: Supren label_sprint_edit: Edit sprint label_sprint_new: New sprint - label_backlog_and_sprints: Backlog and sprints label_task_board: Task board notice_successful_start: The sprint was started. notice_successful_finish: The sprint was completed. @@ -209,6 +215,9 @@ eo: notice_unsuccessful_start_with_reason: 'The sprint could not be started: %{reason}' notice_unsuccessful_finish: The sprint could not be completed. notice_unsuccessful_finish_with_reason: 'The sprint could not be completed: %{reason}' + notice_work_package_invisible_after_move: 'The work package was moved to %{backlog} but is not visible because its type or status is excluded from the backlog. + + ' permission_create_sprints: Create sprints permission_manage_sprint_items: Manage sprint items permission_select_backlog_types_and_statuses: Select backlog types and statuses diff --git a/modules/backlogs/config/locales/crowdin/es.yml b/modules/backlogs/config/locales/crowdin/es.yml index b7f74eb7a13..7109d72b2ff 100644 --- a/modules/backlogs/config/locales/crowdin/es.yml +++ b/modules/backlogs/config/locales/crowdin/es.yml @@ -40,6 +40,7 @@ es: in_planning: En planificación active: Activo completed: Completado + work_packages: Paquetes de trabajo work_package: backlog_bucket: Buckets de backlog backlogs_work_package_type: Tipo de Backlog @@ -123,6 +124,8 @@ es: label_burndown_chart: Diagrama Burndown label_is_done_status: El estado %{status_name} significa completado label_sprint_board: Tablero Sprint + move_to_bucket_dialog_component: + title: Mover al bucket de backlog move_to_sprint_dialog_component: title: Mover al sprint label_sprint: Sprint @@ -179,6 +182,8 @@ es: copy_url_to_clipboard: Copiar URL al portapapeles copy_work_package_id: Copiar el ID del paquete de trabajo move_menu: Mover + move_to_backlog_bucket: Mover al bucket de backlog + move_to_inbox: Mover a la bandeja de entrada move_to_sprint: Mover al sprint work_package_is_closed: El paquete de trabajo esta terminado, cuando burndown: @@ -190,18 +195,19 @@ es: upsell: sprint_sharing: description: Comparte sprints entre proyectos para coordinar a los equipos y organizar el trabajo en entornos ágiles a gran escala (SAFe). + label_all_sprints: Todos los sprints label_backlog: Backlog + label_backlogs: Backlogs + label_backlog_and_sprints: Backlog y sprints label_backlog_bucket_edit: Editar bucket de backlog label_backlog_bucket_new: Nuevo bucket de backlog - label_inbox: Bandeja de entrada - label_backlogs: Backlogs label_burndown_chart: Diagrama Burndown + label_inbox: Bandeja de entrada label_sprint_board: Tablero Sprint label_points_burn_down: Abajo label_points_burn_up: Arriba label_sprint_edit: Editar sprint label_sprint_new: Nuevo sprint - label_backlog_and_sprints: Backlog y sprints label_task_board: Tablero de tareas notice_successful_start: Se inició el sprint. notice_successful_finish: El sprint se completó. @@ -209,6 +215,9 @@ es: notice_unsuccessful_start_with_reason: 'El sprint no pudo iniciarse: %{reason}' notice_unsuccessful_finish: El sprint no pudo completarse. notice_unsuccessful_finish_with_reason: 'El sprint no pudo completarse: %{reason}' + notice_work_package_invisible_after_move: 'El paquete de trabajo se ha trasladado a %{backlog}, pero no se ve porque su tipo o estado están excluidos de la lista de tareas pendientes. + + ' permission_create_sprints: Crear sprints permission_manage_sprint_items: Gestionar elementos de sprint permission_select_backlog_types_and_statuses: Selecciona los tipos y estados del backlog diff --git a/modules/backlogs/config/locales/crowdin/et.yml b/modules/backlogs/config/locales/crowdin/et.yml index 463e5930940..a4fab3a8ede 100644 --- a/modules/backlogs/config/locales/crowdin/et.yml +++ b/modules/backlogs/config/locales/crowdin/et.yml @@ -40,6 +40,7 @@ et: in_planning: In planning active: Active completed: Completed + work_packages: Work packages work_package: backlog_bucket: Backlog Bucket backlogs_work_package_type: Backlog type @@ -123,6 +124,8 @@ et: label_burndown_chart: Burndown chart label_is_done_status: Status %{status_name} means done label_sprint_board: Sprint board + move_to_bucket_dialog_component: + title: Move to backlog bucket move_to_sprint_dialog_component: title: Move to sprint label_sprint: Sprint @@ -179,6 +182,8 @@ et: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID move_menu: Move + move_to_backlog_bucket: Move to backlog bucket + move_to_inbox: Move to inbox move_to_sprint: Move to sprint work_package_is_closed: Work package is done, when burndown: @@ -190,18 +195,19 @@ et: upsell: sprint_sharing: description: Share sprints across projects to align teams and coordinate work in scaled agile setups (SAFe). + label_all_sprints: All sprints label_backlog: Backlog + label_backlogs: Backlogs + label_backlog_and_sprints: Backlog and sprints label_backlog_bucket_edit: Edit backlog bucket label_backlog_bucket_new: New backlog bucket - label_inbox: Inbox - label_backlogs: Backlogs label_burndown_chart: Burndown chart + label_inbox: Inbox label_sprint_board: Sprint board label_points_burn_down: Alla label_points_burn_up: Üles label_sprint_edit: Edit sprint label_sprint_new: New sprint - label_backlog_and_sprints: Backlog and sprints label_task_board: Task board notice_successful_start: The sprint was started. notice_successful_finish: The sprint was completed. @@ -209,6 +215,9 @@ et: notice_unsuccessful_start_with_reason: 'The sprint could not be started: %{reason}' notice_unsuccessful_finish: The sprint could not be completed. notice_unsuccessful_finish_with_reason: 'The sprint could not be completed: %{reason}' + notice_work_package_invisible_after_move: 'The work package was moved to %{backlog} but is not visible because its type or status is excluded from the backlog. + + ' permission_create_sprints: Create sprints permission_manage_sprint_items: Manage sprint items permission_select_backlog_types_and_statuses: Select backlog types and statuses diff --git a/modules/backlogs/config/locales/crowdin/eu.yml b/modules/backlogs/config/locales/crowdin/eu.yml index 5e186d74e8a..4e081e10749 100644 --- a/modules/backlogs/config/locales/crowdin/eu.yml +++ b/modules/backlogs/config/locales/crowdin/eu.yml @@ -40,6 +40,7 @@ eu: in_planning: In planning active: Active completed: Completed + work_packages: Work packages work_package: backlog_bucket: Backlog Bucket backlogs_work_package_type: Backlog type @@ -123,6 +124,8 @@ eu: label_burndown_chart: Burndown chart label_is_done_status: Status %{status_name} means done label_sprint_board: Sprint board + move_to_bucket_dialog_component: + title: Move to backlog bucket move_to_sprint_dialog_component: title: Move to sprint label_sprint: Sprint @@ -179,6 +182,8 @@ eu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID move_menu: Move + move_to_backlog_bucket: Move to backlog bucket + move_to_inbox: Move to inbox move_to_sprint: Move to sprint work_package_is_closed: Work package is done, when burndown: @@ -190,18 +195,19 @@ eu: upsell: sprint_sharing: description: Share sprints across projects to align teams and coordinate work in scaled agile setups (SAFe). + label_all_sprints: All sprints label_backlog: Backlog + label_backlogs: Backlogs + label_backlog_and_sprints: Backlog and sprints label_backlog_bucket_edit: Edit backlog bucket label_backlog_bucket_new: New backlog bucket - label_inbox: Inbox - label_backlogs: Backlogs label_burndown_chart: Burndown chart + label_inbox: Inbox label_sprint_board: Sprint board label_points_burn_down: Behera label_points_burn_up: Gora label_sprint_edit: Edit sprint label_sprint_new: New sprint - label_backlog_and_sprints: Backlog and sprints label_task_board: Task board notice_successful_start: The sprint was started. notice_successful_finish: The sprint was completed. @@ -209,6 +215,9 @@ eu: notice_unsuccessful_start_with_reason: 'The sprint could not be started: %{reason}' notice_unsuccessful_finish: The sprint could not be completed. notice_unsuccessful_finish_with_reason: 'The sprint could not be completed: %{reason}' + notice_work_package_invisible_after_move: 'The work package was moved to %{backlog} but is not visible because its type or status is excluded from the backlog. + + ' permission_create_sprints: Create sprints permission_manage_sprint_items: Manage sprint items permission_select_backlog_types_and_statuses: Select backlog types and statuses diff --git a/modules/backlogs/config/locales/crowdin/fa.yml b/modules/backlogs/config/locales/crowdin/fa.yml index 5edee49ee7b..3b6fcf62663 100644 --- a/modules/backlogs/config/locales/crowdin/fa.yml +++ b/modules/backlogs/config/locales/crowdin/fa.yml @@ -40,6 +40,7 @@ fa: in_planning: در حال برنامه ریزی active: فعال completed: تکمیل شده + work_packages: Work packages work_package: backlog_bucket: Backlog Bucket backlogs_work_package_type: Backlog type @@ -123,6 +124,8 @@ fa: label_burndown_chart: Burndown chart label_is_done_status: Status %{status_name} means done label_sprint_board: Sprint board + move_to_bucket_dialog_component: + title: Move to backlog bucket move_to_sprint_dialog_component: title: Move to sprint label_sprint: Sprint @@ -179,6 +182,8 @@ fa: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID move_menu: Move + move_to_backlog_bucket: Move to backlog bucket + move_to_inbox: Move to inbox move_to_sprint: Move to sprint work_package_is_closed: Work package is done, when burndown: @@ -190,18 +195,19 @@ fa: upsell: sprint_sharing: description: Share sprints across projects to align teams and coordinate work in scaled agile setups (SAFe). + label_all_sprints: All sprints label_backlog: Backlog + label_backlogs: پس‌افت + label_backlog_and_sprints: Backlog and sprints label_backlog_bucket_edit: Edit backlog bucket label_backlog_bucket_new: New backlog bucket - label_inbox: Inbox - label_backlogs: پس‌افت label_burndown_chart: Burndown chart + label_inbox: Inbox label_sprint_board: Sprint board label_points_burn_down: پایین label_points_burn_up: بالا label_sprint_edit: Edit sprint label_sprint_new: New sprint - label_backlog_and_sprints: Backlog and sprints label_task_board: تابلوی وظیفه notice_successful_start: The sprint was started. notice_successful_finish: The sprint was completed. @@ -209,6 +215,9 @@ fa: notice_unsuccessful_start_with_reason: 'The sprint could not be started: %{reason}' notice_unsuccessful_finish: The sprint could not be completed. notice_unsuccessful_finish_with_reason: 'The sprint could not be completed: %{reason}' + notice_work_package_invisible_after_move: 'The work package was moved to %{backlog} but is not visible because its type or status is excluded from the backlog. + + ' permission_create_sprints: Create sprints permission_manage_sprint_items: Manage sprint items permission_select_backlog_types_and_statuses: Select backlog types and statuses diff --git a/modules/backlogs/config/locales/crowdin/fi.yml b/modules/backlogs/config/locales/crowdin/fi.yml index 4a071deebdc..0204bd8f8a9 100644 --- a/modules/backlogs/config/locales/crowdin/fi.yml +++ b/modules/backlogs/config/locales/crowdin/fi.yml @@ -40,6 +40,7 @@ fi: in_planning: In planning active: Active completed: Completed + work_packages: Work packages work_package: backlog_bucket: Backlog Bucket backlogs_work_package_type: Työjonon tyyppi @@ -123,6 +124,8 @@ fi: label_burndown_chart: Burndown chart label_is_done_status: Tila %{status_name} tarkoittaa valmista label_sprint_board: Sprint board + move_to_bucket_dialog_component: + title: Move to backlog bucket move_to_sprint_dialog_component: title: Move to sprint label_sprint: Sprint @@ -179,6 +182,8 @@ fi: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID move_menu: Move + move_to_backlog_bucket: Move to backlog bucket + move_to_inbox: Move to inbox move_to_sprint: Move to sprint work_package_is_closed: Tehtävä on valmis, kun burndown: @@ -190,18 +195,19 @@ fi: upsell: sprint_sharing: description: Share sprints across projects to align teams and coordinate work in scaled agile setups (SAFe). + label_all_sprints: All sprints label_backlog: Backlog + label_backlogs: Työjonot + label_backlog_and_sprints: Backlog and sprints label_backlog_bucket_edit: Edit backlog bucket label_backlog_bucket_new: New backlog bucket - label_inbox: Inbox - label_backlogs: Työjonot label_burndown_chart: Burndown chart + label_inbox: Inbox label_sprint_board: Sprint board label_points_burn_down: Alas label_points_burn_up: Ylös label_sprint_edit: Edit sprint label_sprint_new: New sprint - label_backlog_and_sprints: Backlog and sprints label_task_board: Tehtävätaulu notice_successful_start: The sprint was started. notice_successful_finish: The sprint was completed. @@ -209,6 +215,9 @@ fi: notice_unsuccessful_start_with_reason: 'The sprint could not be started: %{reason}' notice_unsuccessful_finish: The sprint could not be completed. notice_unsuccessful_finish_with_reason: 'The sprint could not be completed: %{reason}' + notice_work_package_invisible_after_move: 'The work package was moved to %{backlog} but is not visible because its type or status is excluded from the backlog. + + ' permission_create_sprints: Create sprints permission_manage_sprint_items: Manage sprint items permission_select_backlog_types_and_statuses: Select backlog types and statuses diff --git a/modules/backlogs/config/locales/crowdin/fil.yml b/modules/backlogs/config/locales/crowdin/fil.yml index 05f68101fd9..47cd7fdf877 100644 --- a/modules/backlogs/config/locales/crowdin/fil.yml +++ b/modules/backlogs/config/locales/crowdin/fil.yml @@ -40,6 +40,7 @@ fil: in_planning: In planning active: Active completed: Completed + work_packages: Work packages work_package: backlog_bucket: Backlog Bucket backlogs_work_package_type: Backlog type @@ -123,6 +124,8 @@ fil: label_burndown_chart: Burndown chart label_is_done_status: Status %{status_name} means done label_sprint_board: Sprint board + move_to_bucket_dialog_component: + title: Move to backlog bucket move_to_sprint_dialog_component: title: Move to sprint label_sprint: Sprint @@ -179,6 +182,8 @@ fil: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID move_menu: Move + move_to_backlog_bucket: Move to backlog bucket + move_to_inbox: Move to inbox move_to_sprint: Move to sprint work_package_is_closed: Work package is done, when burndown: @@ -190,18 +195,19 @@ fil: upsell: sprint_sharing: description: Share sprints across projects to align teams and coordinate work in scaled agile setups (SAFe). + label_all_sprints: All sprints label_backlog: Backlog + label_backlogs: Backlogs + label_backlog_and_sprints: Backlog and sprints label_backlog_bucket_edit: Edit backlog bucket label_backlog_bucket_new: New backlog bucket - label_inbox: Inbox - label_backlogs: Backlogs label_burndown_chart: Burndown chart + label_inbox: Inbox label_sprint_board: Sprint board label_points_burn_down: Down label_points_burn_up: Up label_sprint_edit: Edit sprint label_sprint_new: New sprint - label_backlog_and_sprints: Backlog and sprints label_task_board: Task board notice_successful_start: The sprint was started. notice_successful_finish: The sprint was completed. @@ -209,6 +215,9 @@ fil: notice_unsuccessful_start_with_reason: 'The sprint could not be started: %{reason}' notice_unsuccessful_finish: The sprint could not be completed. notice_unsuccessful_finish_with_reason: 'The sprint could not be completed: %{reason}' + notice_work_package_invisible_after_move: 'The work package was moved to %{backlog} but is not visible because its type or status is excluded from the backlog. + + ' permission_create_sprints: Create sprints permission_manage_sprint_items: Manage sprint items permission_select_backlog_types_and_statuses: Select backlog types and statuses diff --git a/modules/backlogs/config/locales/crowdin/fr.yml b/modules/backlogs/config/locales/crowdin/fr.yml index ec834cc5512..3e9fe75cc68 100644 --- a/modules/backlogs/config/locales/crowdin/fr.yml +++ b/modules/backlogs/config/locales/crowdin/fr.yml @@ -40,6 +40,7 @@ fr: in_planning: En cours de planification active: Actif completed: Terminé + work_packages: Lots de travaux work_package: backlog_bucket: Bucket de backlog backlogs_work_package_type: Type de backlog @@ -123,6 +124,8 @@ fr: label_burndown_chart: Graphique burndown label_is_done_status: Le statut %{status_name} signifie fait label_sprint_board: Tableau de sprint + move_to_bucket_dialog_component: + title: Déplacer vers un bucket de backlog move_to_sprint_dialog_component: title: Passer au sprint label_sprint: Sprint @@ -179,6 +182,8 @@ fr: copy_url_to_clipboard: Copier l'URL dans le presse-papier copy_work_package_id: Copier l'ID du lot de travaux move_menu: Déplacer + move_to_backlog_bucket: Déplacer vers un bucket de backlog + move_to_inbox: Déplacer vers la boîte de réception move_to_sprint: Déplacer dans le sprint work_package_is_closed: Le lot de travaux est fait lorsque burndown: @@ -190,18 +195,19 @@ fr: upsell: sprint_sharing: description: Partager les sprints entre les projets afin d'aligner les équipes et de coordonner le travail dans des configurations agiles à grande échelle (SAFe). + label_all_sprints: Tous les sprints label_backlog: Backlog + label_backlogs: Backlogs + label_backlog_and_sprints: Backlog et sprints label_backlog_bucket_edit: Modifier le bucket de backlog label_backlog_bucket_new: Nouveau bucket de backlog - label_inbox: Boîte de réception - label_backlogs: Backlogs label_burndown_chart: Graphique burndown + label_inbox: Boîte de réception label_sprint_board: Tableau de sprint label_points_burn_down: Vers le bas label_points_burn_up: Vers le haut label_sprint_edit: Modifier le sprint label_sprint_new: Nouveau sprint - label_backlog_and_sprints: Backlog et sprints label_task_board: Tableau des tâches notice_successful_start: Le sprint a commencé. notice_successful_finish: Le sprint est terminé. @@ -209,6 +215,9 @@ fr: notice_unsuccessful_start_with_reason: 'Le sprint n''a pas pu être démarré : %{reason}' notice_unsuccessful_finish: Le sprint n'a pas pu être terminé. notice_unsuccessful_finish_with_reason: 'Le sprint n''a pas pu être achevé : %{reason}' + notice_work_package_invisible_after_move: 'Le lot de travaux a été déplacé vers %{backlog} mais n''est pas visible car son type ou son statut est exclu de l''arriéré. + + ' permission_create_sprints: Créer des sprints permission_manage_sprint_items: Gérer les éléments du sprint permission_select_backlog_types_and_statuses: Sélectionner les types et les statuts du backlog diff --git a/modules/backlogs/config/locales/crowdin/he.yml b/modules/backlogs/config/locales/crowdin/he.yml index aa89d567a5c..86f3cd1d6ad 100644 --- a/modules/backlogs/config/locales/crowdin/he.yml +++ b/modules/backlogs/config/locales/crowdin/he.yml @@ -40,6 +40,7 @@ he: in_planning: In planning active: Active completed: Completed + work_packages: Work packages work_package: backlog_bucket: Backlog Bucket backlogs_work_package_type: Backlog type @@ -127,6 +128,8 @@ he: label_burndown_chart: Burndown chart label_is_done_status: Status %{status_name} means done label_sprint_board: Sprint board + move_to_bucket_dialog_component: + title: Move to backlog bucket move_to_sprint_dialog_component: title: Move to sprint label_sprint: Sprint @@ -187,6 +190,8 @@ he: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID move_menu: Move + move_to_backlog_bucket: Move to backlog bucket + move_to_inbox: Move to inbox move_to_sprint: Move to sprint work_package_is_closed: Work package is done, when burndown: @@ -198,18 +203,19 @@ he: upsell: sprint_sharing: description: Share sprints across projects to align teams and coordinate work in scaled agile setups (SAFe). + label_all_sprints: All sprints label_backlog: Backlog + label_backlogs: Backlogs + label_backlog_and_sprints: Backlog and sprints label_backlog_bucket_edit: Edit backlog bucket label_backlog_bucket_new: New backlog bucket - label_inbox: Inbox - label_backlogs: Backlogs label_burndown_chart: Burndown chart + label_inbox: Inbox label_sprint_board: Sprint board label_points_burn_down: Down label_points_burn_up: Up label_sprint_edit: Edit sprint label_sprint_new: New sprint - label_backlog_and_sprints: Backlog and sprints label_task_board: Task board notice_successful_start: The sprint was started. notice_successful_finish: The sprint was completed. @@ -217,6 +223,9 @@ he: notice_unsuccessful_start_with_reason: 'The sprint could not be started: %{reason}' notice_unsuccessful_finish: The sprint could not be completed. notice_unsuccessful_finish_with_reason: 'The sprint could not be completed: %{reason}' + notice_work_package_invisible_after_move: 'The work package was moved to %{backlog} but is not visible because its type or status is excluded from the backlog. + + ' permission_create_sprints: Create sprints permission_manage_sprint_items: Manage sprint items permission_select_backlog_types_and_statuses: Select backlog types and statuses diff --git a/modules/backlogs/config/locales/crowdin/hi.yml b/modules/backlogs/config/locales/crowdin/hi.yml index bf33a94ce62..d4b7efa0e43 100644 --- a/modules/backlogs/config/locales/crowdin/hi.yml +++ b/modules/backlogs/config/locales/crowdin/hi.yml @@ -40,6 +40,7 @@ hi: in_planning: In planning active: Active completed: Completed + work_packages: Work packages work_package: backlog_bucket: Backlog Bucket backlogs_work_package_type: बैकलॉग प्रकार @@ -123,6 +124,8 @@ hi: label_burndown_chart: Burndown chart label_is_done_status: स्थिति %{status_name} का अर्थ हो गया label_sprint_board: Sprint board + move_to_bucket_dialog_component: + title: Move to backlog bucket move_to_sprint_dialog_component: title: Move to sprint label_sprint: Sprint @@ -179,6 +182,8 @@ hi: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID move_menu: Move + move_to_backlog_bucket: Move to backlog bucket + move_to_inbox: Move to inbox move_to_sprint: Move to sprint work_package_is_closed: काम का पैकेज हो गया, जब burndown: @@ -190,18 +195,19 @@ hi: upsell: sprint_sharing: description: Share sprints across projects to align teams and coordinate work in scaled agile setups (SAFe). + label_all_sprints: All sprints label_backlog: Backlog + label_backlogs: Backlogs + label_backlog_and_sprints: Backlog and sprints label_backlog_bucket_edit: Edit backlog bucket label_backlog_bucket_new: New backlog bucket - label_inbox: Inbox - label_backlogs: Backlogs label_burndown_chart: Burndown chart + label_inbox: Inbox label_sprint_board: Sprint board label_points_burn_down: Down label_points_burn_up: Up label_sprint_edit: Edit sprint label_sprint_new: New sprint - label_backlog_and_sprints: Backlog and sprints label_task_board: Task board notice_successful_start: The sprint was started. notice_successful_finish: The sprint was completed. @@ -209,6 +215,9 @@ hi: notice_unsuccessful_start_with_reason: 'The sprint could not be started: %{reason}' notice_unsuccessful_finish: The sprint could not be completed. notice_unsuccessful_finish_with_reason: 'The sprint could not be completed: %{reason}' + notice_work_package_invisible_after_move: 'The work package was moved to %{backlog} but is not visible because its type or status is excluded from the backlog. + + ' permission_create_sprints: Create sprints permission_manage_sprint_items: Manage sprint items permission_select_backlog_types_and_statuses: Select backlog types and statuses diff --git a/modules/backlogs/config/locales/crowdin/hr.yml b/modules/backlogs/config/locales/crowdin/hr.yml index 8454829f62d..4090aa2761e 100644 --- a/modules/backlogs/config/locales/crowdin/hr.yml +++ b/modules/backlogs/config/locales/crowdin/hr.yml @@ -40,6 +40,7 @@ hr: in_planning: In planning active: Active completed: Completed + work_packages: Work packages work_package: backlog_bucket: Backlog Bucket backlogs_work_package_type: Backlog tip @@ -125,6 +126,8 @@ hr: label_burndown_chart: Burndown chart label_is_done_status: Status %{status_name} je završen label_sprint_board: Sprint board + move_to_bucket_dialog_component: + title: Move to backlog bucket move_to_sprint_dialog_component: title: Move to sprint label_sprint: Sprint @@ -183,6 +186,8 @@ hr: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID move_menu: Move + move_to_backlog_bucket: Move to backlog bucket + move_to_inbox: Move to inbox move_to_sprint: Move to sprint work_package_is_closed: Radni zadatak je urađen, kada burndown: @@ -194,18 +199,19 @@ hr: upsell: sprint_sharing: description: Share sprints across projects to align teams and coordinate work in scaled agile setups (SAFe). + label_all_sprints: All sprints label_backlog: Backlog + label_backlogs: Backlogs + label_backlog_and_sprints: Backlog and sprints label_backlog_bucket_edit: Edit backlog bucket label_backlog_bucket_new: New backlog bucket - label_inbox: Inbox - label_backlogs: Backlogs label_burndown_chart: Burndown chart + label_inbox: Inbox label_sprint_board: Sprint board label_points_burn_down: Dolje label_points_burn_up: Gore label_sprint_edit: Edit sprint label_sprint_new: New sprint - label_backlog_and_sprints: Backlog and sprints label_task_board: Upravitelj zadatcima notice_successful_start: The sprint was started. notice_successful_finish: The sprint was completed. @@ -213,6 +219,9 @@ hr: notice_unsuccessful_start_with_reason: 'The sprint could not be started: %{reason}' notice_unsuccessful_finish: The sprint could not be completed. notice_unsuccessful_finish_with_reason: 'The sprint could not be completed: %{reason}' + notice_work_package_invisible_after_move: 'The work package was moved to %{backlog} but is not visible because its type or status is excluded from the backlog. + + ' permission_create_sprints: Create sprints permission_manage_sprint_items: Manage sprint items permission_select_backlog_types_and_statuses: Select backlog types and statuses diff --git a/modules/backlogs/config/locales/crowdin/hu.yml b/modules/backlogs/config/locales/crowdin/hu.yml index 076afe2144b..d1fad4f2a87 100644 --- a/modules/backlogs/config/locales/crowdin/hu.yml +++ b/modules/backlogs/config/locales/crowdin/hu.yml @@ -40,6 +40,7 @@ hu: in_planning: In planning active: Active completed: Completed + work_packages: Work packages work_package: backlog_bucket: Backlog Bucket backlogs_work_package_type: Backlog típus @@ -123,6 +124,8 @@ hu: label_burndown_chart: Burndown chart label_is_done_status: Státusz %{status_name} kész állapotot jelöl label_sprint_board: Sprint board + move_to_bucket_dialog_component: + title: Move to backlog bucket move_to_sprint_dialog_component: title: Move to sprint label_sprint: Sprint @@ -179,6 +182,8 @@ hu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID move_menu: Move + move_to_backlog_bucket: Move to backlog bucket + move_to_inbox: Move to inbox move_to_sprint: Move to sprint work_package_is_closed: A munkacsomag készen áll, ekkor burndown: @@ -190,18 +195,19 @@ hu: upsell: sprint_sharing: description: Share sprints across projects to align teams and coordinate work in scaled agile setups (SAFe). + label_all_sprints: All sprints label_backlog: Backlog + label_backlogs: Backlogs + label_backlog_and_sprints: Backlog and sprints label_backlog_bucket_edit: Edit backlog bucket label_backlog_bucket_new: New backlog bucket - label_inbox: Inbox - label_backlogs: Backlogs label_burndown_chart: Burndown chart + label_inbox: Inbox label_sprint_board: Sprint board label_points_burn_down: Le label_points_burn_up: Fel label_sprint_edit: Edit sprint label_sprint_new: New sprint - label_backlog_and_sprints: Backlog and sprints label_task_board: Task board notice_successful_start: The sprint was started. notice_successful_finish: The sprint was completed. @@ -209,6 +215,9 @@ hu: notice_unsuccessful_start_with_reason: 'The sprint could not be started: %{reason}' notice_unsuccessful_finish: The sprint could not be completed. notice_unsuccessful_finish_with_reason: 'The sprint could not be completed: %{reason}' + notice_work_package_invisible_after_move: 'The work package was moved to %{backlog} but is not visible because its type or status is excluded from the backlog. + + ' permission_create_sprints: Create sprints permission_manage_sprint_items: Manage sprint items permission_select_backlog_types_and_statuses: Select backlog types and statuses diff --git a/modules/backlogs/config/locales/crowdin/hy.yml b/modules/backlogs/config/locales/crowdin/hy.yml index ea39d933d78..08e1ad2550d 100644 --- a/modules/backlogs/config/locales/crowdin/hy.yml +++ b/modules/backlogs/config/locales/crowdin/hy.yml @@ -40,6 +40,7 @@ hy: in_planning: In planning active: Active completed: Completed + work_packages: Work packages work_package: backlog_bucket: Backlog Bucket backlogs_work_package_type: Backlog type @@ -123,6 +124,8 @@ hy: label_burndown_chart: Burndown chart label_is_done_status: Status %{status_name} means done label_sprint_board: Sprint board + move_to_bucket_dialog_component: + title: Move to backlog bucket move_to_sprint_dialog_component: title: Move to sprint label_sprint: Sprint @@ -179,6 +182,8 @@ hy: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID move_menu: Move + move_to_backlog_bucket: Move to backlog bucket + move_to_inbox: Move to inbox move_to_sprint: Move to sprint work_package_is_closed: Work package is done, when burndown: @@ -190,18 +195,19 @@ hy: upsell: sprint_sharing: description: Share sprints across projects to align teams and coordinate work in scaled agile setups (SAFe). + label_all_sprints: All sprints label_backlog: Backlog + label_backlogs: Backlogs + label_backlog_and_sprints: Backlog and sprints label_backlog_bucket_edit: Edit backlog bucket label_backlog_bucket_new: New backlog bucket - label_inbox: Inbox - label_backlogs: Backlogs label_burndown_chart: Burndown chart + label_inbox: Inbox label_sprint_board: Sprint board label_points_burn_down: Down label_points_burn_up: Up label_sprint_edit: Edit sprint label_sprint_new: New sprint - label_backlog_and_sprints: Backlog and sprints label_task_board: Task board notice_successful_start: The sprint was started. notice_successful_finish: The sprint was completed. @@ -209,6 +215,9 @@ hy: notice_unsuccessful_start_with_reason: 'The sprint could not be started: %{reason}' notice_unsuccessful_finish: The sprint could not be completed. notice_unsuccessful_finish_with_reason: 'The sprint could not be completed: %{reason}' + notice_work_package_invisible_after_move: 'The work package was moved to %{backlog} but is not visible because its type or status is excluded from the backlog. + + ' permission_create_sprints: Create sprints permission_manage_sprint_items: Manage sprint items permission_select_backlog_types_and_statuses: Select backlog types and statuses diff --git a/modules/backlogs/config/locales/crowdin/id.yml b/modules/backlogs/config/locales/crowdin/id.yml index a3117e1cc6c..a22b652ade9 100644 --- a/modules/backlogs/config/locales/crowdin/id.yml +++ b/modules/backlogs/config/locales/crowdin/id.yml @@ -40,6 +40,7 @@ id: in_planning: In planning active: Active completed: Completed + work_packages: Work packages work_package: backlog_bucket: Backlog Bucket backlogs_work_package_type: Jenis jaminan tersimpan @@ -121,6 +122,8 @@ id: label_burndown_chart: Burndown chart label_is_done_status: Status %{status_name} berarti selesai label_sprint_board: Sprint board + move_to_bucket_dialog_component: + title: Move to backlog bucket move_to_sprint_dialog_component: title: Move to sprint label_sprint: Sprint @@ -175,6 +178,8 @@ id: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID move_menu: Move + move_to_backlog_bucket: Move to backlog bucket + move_to_inbox: Move to inbox move_to_sprint: Move to sprint work_package_is_closed: Paket kerja selesai, ketika burndown: @@ -186,18 +191,19 @@ id: upsell: sprint_sharing: description: Share sprints across projects to align teams and coordinate work in scaled agile setups (SAFe). + label_all_sprints: All sprints label_backlog: Backlog + label_backlogs: Backlogs + label_backlog_and_sprints: Backlog and sprints label_backlog_bucket_edit: Edit backlog bucket label_backlog_bucket_new: New backlog bucket - label_inbox: Inbox - label_backlogs: Backlogs label_burndown_chart: Burndown chart + label_inbox: Inbox label_sprint_board: Sprint board label_points_burn_down: Menurun label_points_burn_up: Naik label_sprint_edit: Edit sprint label_sprint_new: New sprint - label_backlog_and_sprints: Backlog and sprints label_task_board: Papan tugas notice_successful_start: The sprint was started. notice_successful_finish: The sprint was completed. @@ -205,6 +211,9 @@ id: notice_unsuccessful_start_with_reason: 'The sprint could not be started: %{reason}' notice_unsuccessful_finish: The sprint could not be completed. notice_unsuccessful_finish_with_reason: 'The sprint could not be completed: %{reason}' + notice_work_package_invisible_after_move: 'The work package was moved to %{backlog} but is not visible because its type or status is excluded from the backlog. + + ' permission_create_sprints: Create sprints permission_manage_sprint_items: Manage sprint items permission_select_backlog_types_and_statuses: Select backlog types and statuses diff --git a/modules/backlogs/config/locales/crowdin/it.yml b/modules/backlogs/config/locales/crowdin/it.yml index 2936624e457..004219a43a5 100644 --- a/modules/backlogs/config/locales/crowdin/it.yml +++ b/modules/backlogs/config/locales/crowdin/it.yml @@ -40,6 +40,7 @@ it: in_planning: In pianificazione active: Attivo completed: Completato + work_packages: Macro-attività work_package: backlog_bucket: Bucket del backlog backlogs_work_package_type: Tipo di backlog @@ -123,6 +124,8 @@ it: label_burndown_chart: Grafico Burndown label_is_done_status: Lo stato %{status_name} vuol dire completato label_sprint_board: Bacheca sprint + move_to_bucket_dialog_component: + title: Sposta nel bucket del backlog move_to_sprint_dialog_component: title: Sposta nello sprint label_sprint: Sprint @@ -179,6 +182,8 @@ it: copy_url_to_clipboard: Copia URL negli appunti copy_work_package_id: Copia ID macro-attività move_menu: Sposta + move_to_backlog_bucket: Sposta nel bucket del backlog + move_to_inbox: Sposta in posta in arrivo move_to_sprint: Sposta nello sprint work_package_is_closed: Il pacchetto di lavoro è fatto, quando burndown: @@ -190,18 +195,19 @@ it: upsell: sprint_sharing: description: Condividi gli sprint tra progetti per allineare i team e coordinare il lavoro in contesti Agile scalati (SAFe). + label_all_sprints: Tutti gli sprint label_backlog: Backlog + label_backlogs: Backlog + label_backlog_and_sprints: Backlog e sprint label_backlog_bucket_edit: Modifica il bucket del backlog label_backlog_bucket_new: Nuovo bucket del backlog - label_inbox: Posta in arrivo - label_backlogs: Backlog label_burndown_chart: Grafico Burndown + label_inbox: Posta in arrivo label_sprint_board: Bacheca sprint label_points_burn_down: Verso il basso label_points_burn_up: Verso l'alto label_sprint_edit: Modifica sprint label_sprint_new: Nuovo sprint - label_backlog_and_sprints: Backlog e sprint label_task_board: Pannello delle attività notice_successful_start: Lo sprint è stato avviato. notice_successful_finish: Lo sprint è stato completato. @@ -209,6 +215,9 @@ it: notice_unsuccessful_start_with_reason: 'Impossibile avviare lo sprint: %{reason}' notice_unsuccessful_finish: Impossibile completare lo sprint. notice_unsuccessful_finish_with_reason: 'Impossibile completare lo sprint: %{reason}' + notice_work_package_invisible_after_move: 'La macro-attività è stata spostata in %{backlog}, ma non è visibile perché il suo tipo o stato è escluso dal backlog. + + ' permission_create_sprints: Crea gli sprint permission_manage_sprint_items: Gestisci gli elementi dello sprint permission_select_backlog_types_and_statuses: Seleziona tipi e stati del backlog diff --git a/modules/backlogs/config/locales/crowdin/ja.yml b/modules/backlogs/config/locales/crowdin/ja.yml index 394e9cb7f00..494b5e47529 100644 --- a/modules/backlogs/config/locales/crowdin/ja.yml +++ b/modules/backlogs/config/locales/crowdin/ja.yml @@ -40,6 +40,7 @@ ja: in_planning: In planning active: Active completed: Completed + work_packages: Work packages work_package: backlog_bucket: Backlog Bucket backlogs_work_package_type: バックログの種類 @@ -121,6 +122,8 @@ ja: label_burndown_chart: Burndown chart label_is_done_status: ステータス%{status_name}は完了として扱う label_sprint_board: Sprint board + move_to_bucket_dialog_component: + title: Move to backlog bucket move_to_sprint_dialog_component: title: Move to sprint label_sprint: Sprint @@ -175,6 +178,8 @@ ja: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID move_menu: Move + move_to_backlog_bucket: Move to backlog bucket + move_to_inbox: Move to inbox move_to_sprint: Move to sprint work_package_is_closed: ワークパッケージが終了するには burndown: @@ -186,18 +191,19 @@ ja: upsell: sprint_sharing: description: Share sprints across projects to align teams and coordinate work in scaled agile setups (SAFe). + label_all_sprints: All sprints label_backlog: Backlog + label_backlogs: バックログ + label_backlog_and_sprints: Backlog and sprints label_backlog_bucket_edit: Edit backlog bucket label_backlog_bucket_new: New backlog bucket - label_inbox: Inbox - label_backlogs: バックログ label_burndown_chart: Burndown chart + label_inbox: Inbox label_sprint_board: Sprint board label_points_burn_down: ダウン label_points_burn_up: アップ label_sprint_edit: Edit sprint label_sprint_new: 新しいスプリント - label_backlog_and_sprints: Backlog and sprints label_task_board: かんばん notice_successful_start: The sprint was started. notice_successful_finish: The sprint was completed. @@ -205,6 +211,9 @@ ja: notice_unsuccessful_start_with_reason: 'The sprint could not be started: %{reason}' notice_unsuccessful_finish: The sprint could not be completed. notice_unsuccessful_finish_with_reason: 'The sprint could not be completed: %{reason}' + notice_work_package_invisible_after_move: 'The work package was moved to %{backlog} but is not visible because its type or status is excluded from the backlog. + + ' permission_create_sprints: Create sprints permission_manage_sprint_items: Manage sprint items permission_select_backlog_types_and_statuses: Select backlog types and statuses diff --git a/modules/backlogs/config/locales/crowdin/ka.yml b/modules/backlogs/config/locales/crowdin/ka.yml index d176e4e4e9a..6f0121764ad 100644 --- a/modules/backlogs/config/locales/crowdin/ka.yml +++ b/modules/backlogs/config/locales/crowdin/ka.yml @@ -40,6 +40,7 @@ ka: in_planning: In planning active: Active completed: Completed + work_packages: Work packages work_package: backlog_bucket: Backlog Bucket backlogs_work_package_type: ჩამორჩენის ტიპი @@ -123,6 +124,8 @@ ka: label_burndown_chart: Burndown chart label_is_done_status: Status %{status_name} means done label_sprint_board: Sprint board + move_to_bucket_dialog_component: + title: Move to backlog bucket move_to_sprint_dialog_component: title: Move to sprint label_sprint: Sprint @@ -179,6 +182,8 @@ ka: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID move_menu: Move + move_to_backlog_bucket: Move to backlog bucket + move_to_inbox: Move to inbox move_to_sprint: Move to sprint work_package_is_closed: Work package is done, when burndown: @@ -190,18 +195,19 @@ ka: upsell: sprint_sharing: description: Share sprints across projects to align teams and coordinate work in scaled agile setups (SAFe). + label_all_sprints: All sprints label_backlog: Backlog + label_backlogs: შეუსრულებელი ამოცანები + label_backlog_and_sprints: Backlog and sprints label_backlog_bucket_edit: Edit backlog bucket label_backlog_bucket_new: New backlog bucket - label_inbox: Inbox - label_backlogs: შეუსრულებელი ამოცანები label_burndown_chart: Burndown chart + label_inbox: Inbox label_sprint_board: Sprint board label_points_burn_down: ქვემოთ label_points_burn_up: ზემოთ label_sprint_edit: Edit sprint label_sprint_new: New sprint - label_backlog_and_sprints: Backlog and sprints label_task_board: ამოცანების დაფა notice_successful_start: The sprint was started. notice_successful_finish: The sprint was completed. @@ -209,6 +215,9 @@ ka: notice_unsuccessful_start_with_reason: 'The sprint could not be started: %{reason}' notice_unsuccessful_finish: The sprint could not be completed. notice_unsuccessful_finish_with_reason: 'The sprint could not be completed: %{reason}' + notice_work_package_invisible_after_move: 'The work package was moved to %{backlog} but is not visible because its type or status is excluded from the backlog. + + ' permission_create_sprints: Create sprints permission_manage_sprint_items: Manage sprint items permission_select_backlog_types_and_statuses: Select backlog types and statuses diff --git a/modules/backlogs/config/locales/crowdin/kk.yml b/modules/backlogs/config/locales/crowdin/kk.yml index 620d4541569..f0d232a3c09 100644 --- a/modules/backlogs/config/locales/crowdin/kk.yml +++ b/modules/backlogs/config/locales/crowdin/kk.yml @@ -40,6 +40,7 @@ kk: in_planning: In planning active: Active completed: Completed + work_packages: Work packages work_package: backlog_bucket: Backlog Bucket backlogs_work_package_type: Backlog type @@ -123,6 +124,8 @@ kk: label_burndown_chart: Burndown chart label_is_done_status: Status %{status_name} means done label_sprint_board: Sprint board + move_to_bucket_dialog_component: + title: Move to backlog bucket move_to_sprint_dialog_component: title: Move to sprint label_sprint: Sprint @@ -179,6 +182,8 @@ kk: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID move_menu: Move + move_to_backlog_bucket: Move to backlog bucket + move_to_inbox: Move to inbox move_to_sprint: Move to sprint work_package_is_closed: Work package is done, when burndown: @@ -190,18 +195,19 @@ kk: upsell: sprint_sharing: description: Share sprints across projects to align teams and coordinate work in scaled agile setups (SAFe). + label_all_sprints: All sprints label_backlog: Backlog + label_backlogs: Backlogs + label_backlog_and_sprints: Backlog and sprints label_backlog_bucket_edit: Edit backlog bucket label_backlog_bucket_new: New backlog bucket - label_inbox: Inbox - label_backlogs: Backlogs label_burndown_chart: Burndown chart + label_inbox: Inbox label_sprint_board: Sprint board label_points_burn_down: Down label_points_burn_up: Up label_sprint_edit: Edit sprint label_sprint_new: New sprint - label_backlog_and_sprints: Backlog and sprints label_task_board: Task board notice_successful_start: The sprint was started. notice_successful_finish: The sprint was completed. @@ -209,6 +215,9 @@ kk: notice_unsuccessful_start_with_reason: 'The sprint could not be started: %{reason}' notice_unsuccessful_finish: The sprint could not be completed. notice_unsuccessful_finish_with_reason: 'The sprint could not be completed: %{reason}' + notice_work_package_invisible_after_move: 'The work package was moved to %{backlog} but is not visible because its type or status is excluded from the backlog. + + ' permission_create_sprints: Create sprints permission_manage_sprint_items: Manage sprint items permission_select_backlog_types_and_statuses: Select backlog types and statuses diff --git a/modules/backlogs/config/locales/crowdin/ko.yml b/modules/backlogs/config/locales/crowdin/ko.yml index 71eb8e739d3..0d9c50b1856 100644 --- a/modules/backlogs/config/locales/crowdin/ko.yml +++ b/modules/backlogs/config/locales/crowdin/ko.yml @@ -40,6 +40,7 @@ ko: in_planning: 계획 중 active: 활성 completed: 완료됨 + work_packages: 작업 패키지 work_package: backlog_bucket: 백로그 버킷 backlogs_work_package_type: 백로그 유형 @@ -121,6 +122,8 @@ ko: label_burndown_chart: 번다운 차트 label_is_done_status: "%{status_name} 상태는 완료를 의미합니다." label_sprint_board: 스프린트 보드 + move_to_bucket_dialog_component: + title: 백로그 버킷으로 이동 move_to_sprint_dialog_component: title: 스프린트로 이동 label_sprint: 스프린트 @@ -175,6 +178,8 @@ ko: copy_url_to_clipboard: 클립보드에 URL 복사 copy_work_package_id: 작업 패키지 ID 복사 move_menu: 이동 + move_to_backlog_bucket: 백로그 버킷으로 이동 + move_to_inbox: 받은 편지함으로 이동 move_to_sprint: 스프린트로 이동 work_package_is_closed: 다음 경우에 작업 패키지가 완료됩니다. burndown: @@ -186,18 +191,19 @@ ko: upsell: sprint_sharing: description: 프로젝트 간에 스프린트를 공유하여 팀을 조율하고 확장된 애자일 설정(SAFe)에서 작업을 조정합니다. + label_all_sprints: 모든 스프린트 label_backlog: 백로그 + label_backlogs: 백로그 + label_backlog_and_sprints: 백로그 및 스프린트 label_backlog_bucket_edit: 백로그 버킷 편집 label_backlog_bucket_new: 새로운 백로그 버킷 - label_inbox: 받은 편지함 - label_backlogs: 백로그 label_burndown_chart: 번다운 차트 + label_inbox: 받은 편지함 label_sprint_board: 스프린트 보드 label_points_burn_down: 아래 label_points_burn_up: 위 label_sprint_edit: 스프린트 편집 label_sprint_new: 새로운 스프린트 - label_backlog_and_sprints: 백로그 및 스프린트 label_task_board: 작업 보드 notice_successful_start: 스프린트가 시작되었습니다. notice_successful_finish: 스프린트가 완료되었습니다. @@ -205,6 +211,9 @@ ko: notice_unsuccessful_start_with_reason: '스프린트를 시작할 수 없습니다: %{reason}' notice_unsuccessful_finish: 스프린트를 완료할 수 없습니다. notice_unsuccessful_finish_with_reason: '스프린트를 완료할 수 없습니다: %{reason}' + notice_work_package_invisible_after_move: '작업 패키지가 %{backlog}(으)로 이동되었지만 해당 유형이나 상태가 백로그에서 제외되었으므로 표시되지 않습니다. + + ' permission_create_sprints: 스프린트 만들기 permission_manage_sprint_items: 스프린트 항목 관리 permission_select_backlog_types_and_statuses: 백로그 유형 및 상태 선택 diff --git a/modules/backlogs/config/locales/crowdin/lt.yml b/modules/backlogs/config/locales/crowdin/lt.yml index 22d5ab326c6..bc33271a776 100644 --- a/modules/backlogs/config/locales/crowdin/lt.yml +++ b/modules/backlogs/config/locales/crowdin/lt.yml @@ -40,6 +40,7 @@ lt: in_planning: In planning active: Active completed: Completed + work_packages: Work packages work_package: backlog_bucket: Backlog Bucket backlogs_work_package_type: Darbų sąrašo tipas @@ -127,6 +128,8 @@ lt: label_burndown_chart: Burndown chart label_is_done_status: Būsena %{status_name} reiškia atlikta label_sprint_board: Sprint board + move_to_bucket_dialog_component: + title: Move to backlog bucket move_to_sprint_dialog_component: title: Move to sprint label_sprint: Sprint @@ -187,6 +190,8 @@ lt: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID move_menu: Move + move_to_backlog_bucket: Move to backlog bucket + move_to_inbox: Move to inbox move_to_sprint: Move to sprint work_package_is_closed: Darbo paketas baigtas, kai burndown: @@ -198,18 +203,19 @@ lt: upsell: sprint_sharing: description: Share sprints across projects to align teams and coordinate work in scaled agile setups (SAFe). + label_all_sprints: All sprints label_backlog: Backlog + label_backlogs: Darbų sąrašai + label_backlog_and_sprints: Backlog and sprints label_backlog_bucket_edit: Edit backlog bucket label_backlog_bucket_new: New backlog bucket - label_inbox: Inbox - label_backlogs: Darbų sąrašai label_burndown_chart: Burndown chart + label_inbox: Inbox label_sprint_board: Sprint board label_points_burn_down: Žemyn label_points_burn_up: Aukštyn label_sprint_edit: Edit sprint label_sprint_new: New sprint - label_backlog_and_sprints: Backlog and sprints label_task_board: Užduočių lenta notice_successful_start: The sprint was started. notice_successful_finish: The sprint was completed. @@ -217,6 +223,9 @@ lt: notice_unsuccessful_start_with_reason: 'The sprint could not be started: %{reason}' notice_unsuccessful_finish: The sprint could not be completed. notice_unsuccessful_finish_with_reason: 'The sprint could not be completed: %{reason}' + notice_work_package_invisible_after_move: 'The work package was moved to %{backlog} but is not visible because its type or status is excluded from the backlog. + + ' permission_create_sprints: Create sprints permission_manage_sprint_items: Manage sprint items permission_select_backlog_types_and_statuses: Select backlog types and statuses diff --git a/modules/backlogs/config/locales/crowdin/lv.yml b/modules/backlogs/config/locales/crowdin/lv.yml index 6e969f73455..e769fd13db8 100644 --- a/modules/backlogs/config/locales/crowdin/lv.yml +++ b/modules/backlogs/config/locales/crowdin/lv.yml @@ -40,6 +40,7 @@ lv: in_planning: In planning active: Active completed: Completed + work_packages: Work packages work_package: backlog_bucket: Backlog Bucket backlogs_work_package_type: Produkta darbu krātuves tips @@ -125,6 +126,8 @@ lv: label_burndown_chart: Burndown chart label_is_done_status: Statuss %{status_name} nozīmē, ka darbis ir pabeigts label_sprint_board: Sprint board + move_to_bucket_dialog_component: + title: Move to backlog bucket move_to_sprint_dialog_component: title: Move to sprint label_sprint: Sprint @@ -183,6 +186,8 @@ lv: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID move_menu: Move + move_to_backlog_bucket: Move to backlog bucket + move_to_inbox: Move to inbox move_to_sprint: Move to sprint work_package_is_closed: 'Darba pieteikums ir bageits, kad ' burndown: @@ -194,18 +199,19 @@ lv: upsell: sprint_sharing: description: Share sprints across projects to align teams and coordinate work in scaled agile setups (SAFe). + label_all_sprints: All sprints label_backlog: Backlog + label_backlogs: Darbu krātuve + label_backlog_and_sprints: Backlog and sprints label_backlog_bucket_edit: Edit backlog bucket label_backlog_bucket_new: New backlog bucket - label_inbox: Inbox - label_backlogs: Darbu krātuve label_burndown_chart: Burndown chart + label_inbox: Inbox label_sprint_board: Sprint board label_points_burn_down: Lejup label_points_burn_up: Augšup label_sprint_edit: Edit sprint label_sprint_new: New sprint - label_backlog_and_sprints: Backlog and sprints label_task_board: Pieteikumu tāfele notice_successful_start: The sprint was started. notice_successful_finish: The sprint was completed. @@ -213,6 +219,9 @@ lv: notice_unsuccessful_start_with_reason: 'The sprint could not be started: %{reason}' notice_unsuccessful_finish: The sprint could not be completed. notice_unsuccessful_finish_with_reason: 'The sprint could not be completed: %{reason}' + notice_work_package_invisible_after_move: 'The work package was moved to %{backlog} but is not visible because its type or status is excluded from the backlog. + + ' permission_create_sprints: Create sprints permission_manage_sprint_items: Manage sprint items permission_select_backlog_types_and_statuses: Select backlog types and statuses diff --git a/modules/backlogs/config/locales/crowdin/mn.yml b/modules/backlogs/config/locales/crowdin/mn.yml index 549686ea5a3..fbed0c9117c 100644 --- a/modules/backlogs/config/locales/crowdin/mn.yml +++ b/modules/backlogs/config/locales/crowdin/mn.yml @@ -40,6 +40,7 @@ mn: in_planning: In planning active: Active completed: Completed + work_packages: Work packages work_package: backlog_bucket: Backlog Bucket backlogs_work_package_type: Backlog type @@ -123,6 +124,8 @@ mn: label_burndown_chart: Burndown chart label_is_done_status: Төлөв %{status_name} дууссан гэсэн үг label_sprint_board: Sprint board + move_to_bucket_dialog_component: + title: Move to backlog bucket move_to_sprint_dialog_component: title: Move to sprint label_sprint: Sprint @@ -179,6 +182,8 @@ mn: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID move_menu: Move + move_to_backlog_bucket: Move to backlog bucket + move_to_inbox: Move to inbox move_to_sprint: Move to sprint work_package_is_closed: Work package is done, when burndown: @@ -190,18 +195,19 @@ mn: upsell: sprint_sharing: description: Share sprints across projects to align teams and coordinate work in scaled agile setups (SAFe). + label_all_sprints: All sprints label_backlog: Backlog + label_backlogs: Backlogs + label_backlog_and_sprints: Backlog and sprints label_backlog_bucket_edit: Edit backlog bucket label_backlog_bucket_new: New backlog bucket - label_inbox: Inbox - label_backlogs: Backlogs label_burndown_chart: Burndown chart + label_inbox: Inbox label_sprint_board: Sprint board label_points_burn_down: Down label_points_burn_up: Up label_sprint_edit: Edit sprint label_sprint_new: New sprint - label_backlog_and_sprints: Backlog and sprints label_task_board: Task board notice_successful_start: The sprint was started. notice_successful_finish: The sprint was completed. @@ -209,6 +215,9 @@ mn: notice_unsuccessful_start_with_reason: 'The sprint could not be started: %{reason}' notice_unsuccessful_finish: The sprint could not be completed. notice_unsuccessful_finish_with_reason: 'The sprint could not be completed: %{reason}' + notice_work_package_invisible_after_move: 'The work package was moved to %{backlog} but is not visible because its type or status is excluded from the backlog. + + ' permission_create_sprints: Create sprints permission_manage_sprint_items: Manage sprint items permission_select_backlog_types_and_statuses: Select backlog types and statuses diff --git a/modules/backlogs/config/locales/crowdin/ms.yml b/modules/backlogs/config/locales/crowdin/ms.yml index 2e032a47cce..9a3d197be53 100644 --- a/modules/backlogs/config/locales/crowdin/ms.yml +++ b/modules/backlogs/config/locales/crowdin/ms.yml @@ -40,6 +40,7 @@ ms: in_planning: In planning active: Active completed: Completed + work_packages: Work packages work_package: backlog_bucket: Backlog Bucket backlogs_work_package_type: Jenis tunggakan kerja @@ -121,6 +122,8 @@ ms: label_burndown_chart: Burndown chart label_is_done_status: Status %{status_name} bermaksud selesai label_sprint_board: Sprint board + move_to_bucket_dialog_component: + title: Move to backlog bucket move_to_sprint_dialog_component: title: Move to sprint label_sprint: Sprint @@ -175,6 +178,8 @@ ms: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID move_menu: Move + move_to_backlog_bucket: Move to backlog bucket + move_to_inbox: Move to inbox move_to_sprint: Move to sprint work_package_is_closed: Pakej kerja selesai apabila burndown: @@ -186,18 +191,19 @@ ms: upsell: sprint_sharing: description: Share sprints across projects to align teams and coordinate work in scaled agile setups (SAFe). + label_all_sprints: All sprints label_backlog: Backlog + label_backlogs: Tunggakan + label_backlog_and_sprints: Backlog and sprints label_backlog_bucket_edit: Edit backlog bucket label_backlog_bucket_new: New backlog bucket - label_inbox: Inbox - label_backlogs: Tunggakan label_burndown_chart: Burndown chart + label_inbox: Inbox label_sprint_board: Sprint board label_points_burn_down: Bawah label_points_burn_up: Atas label_sprint_edit: Edit sprint label_sprint_new: New sprint - label_backlog_and_sprints: Backlog and sprints label_task_board: Papan tugasan notice_successful_start: The sprint was started. notice_successful_finish: The sprint was completed. @@ -205,6 +211,9 @@ ms: notice_unsuccessful_start_with_reason: 'The sprint could not be started: %{reason}' notice_unsuccessful_finish: The sprint could not be completed. notice_unsuccessful_finish_with_reason: 'The sprint could not be completed: %{reason}' + notice_work_package_invisible_after_move: 'The work package was moved to %{backlog} but is not visible because its type or status is excluded from the backlog. + + ' permission_create_sprints: Create sprints permission_manage_sprint_items: Manage sprint items permission_select_backlog_types_and_statuses: Select backlog types and statuses diff --git a/modules/backlogs/config/locales/crowdin/ne.yml b/modules/backlogs/config/locales/crowdin/ne.yml index b2e835a739b..658794d265e 100644 --- a/modules/backlogs/config/locales/crowdin/ne.yml +++ b/modules/backlogs/config/locales/crowdin/ne.yml @@ -40,6 +40,7 @@ ne: in_planning: In planning active: Active completed: Completed + work_packages: Work packages work_package: backlog_bucket: Backlog Bucket backlogs_work_package_type: Backlog type @@ -123,6 +124,8 @@ ne: label_burndown_chart: Burndown chart label_is_done_status: Status %{status_name} means done label_sprint_board: Sprint board + move_to_bucket_dialog_component: + title: Move to backlog bucket move_to_sprint_dialog_component: title: Move to sprint label_sprint: Sprint @@ -179,6 +182,8 @@ ne: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID move_menu: Move + move_to_backlog_bucket: Move to backlog bucket + move_to_inbox: Move to inbox move_to_sprint: Move to sprint work_package_is_closed: Work package is done, when burndown: @@ -190,18 +195,19 @@ ne: upsell: sprint_sharing: description: Share sprints across projects to align teams and coordinate work in scaled agile setups (SAFe). + label_all_sprints: All sprints label_backlog: Backlog + label_backlogs: Backlogs + label_backlog_and_sprints: Backlog and sprints label_backlog_bucket_edit: Edit backlog bucket label_backlog_bucket_new: New backlog bucket - label_inbox: Inbox - label_backlogs: Backlogs label_burndown_chart: Burndown chart + label_inbox: Inbox label_sprint_board: Sprint board label_points_burn_down: Down label_points_burn_up: Up label_sprint_edit: Edit sprint label_sprint_new: New sprint - label_backlog_and_sprints: Backlog and sprints label_task_board: Task board notice_successful_start: The sprint was started. notice_successful_finish: The sprint was completed. @@ -209,6 +215,9 @@ ne: notice_unsuccessful_start_with_reason: 'The sprint could not be started: %{reason}' notice_unsuccessful_finish: The sprint could not be completed. notice_unsuccessful_finish_with_reason: 'The sprint could not be completed: %{reason}' + notice_work_package_invisible_after_move: 'The work package was moved to %{backlog} but is not visible because its type or status is excluded from the backlog. + + ' permission_create_sprints: Create sprints permission_manage_sprint_items: Manage sprint items permission_select_backlog_types_and_statuses: Select backlog types and statuses diff --git a/modules/backlogs/config/locales/crowdin/nl.yml b/modules/backlogs/config/locales/crowdin/nl.yml index 063cc521245..d61e239809a 100644 --- a/modules/backlogs/config/locales/crowdin/nl.yml +++ b/modules/backlogs/config/locales/crowdin/nl.yml @@ -40,6 +40,7 @@ nl: in_planning: Wordt gepland active: Gestart completed: Voltooid + work_packages: Work packages work_package: backlog_bucket: Backlog Bucket backlogs_work_package_type: Backlog type @@ -123,6 +124,8 @@ nl: label_burndown_chart: Burndown chart label_is_done_status: Status van %{status_name} betekent gedaan label_sprint_board: Sprint bord + move_to_bucket_dialog_component: + title: Move to backlog bucket move_to_sprint_dialog_component: title: Verplaats naar sprint label_sprint: Sprint @@ -179,6 +182,8 @@ nl: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID move_menu: Move + move_to_backlog_bucket: Move to backlog bucket + move_to_inbox: Move to inbox move_to_sprint: Move to sprint work_package_is_closed: Het werkpakket is klaar wanneer burndown: @@ -190,18 +195,19 @@ nl: upsell: sprint_sharing: description: Share sprints across projects to align teams and coordinate work in scaled agile setups (SAFe). + label_all_sprints: All sprints label_backlog: Backlog + label_backlogs: Backlogs + label_backlog_and_sprints: Backlog and sprints label_backlog_bucket_edit: Edit backlog bucket label_backlog_bucket_new: New backlog bucket - label_inbox: Postvak in - label_backlogs: Backlogs label_burndown_chart: Burndown chart + label_inbox: Postvak in label_sprint_board: Sprint bord label_points_burn_down: Omlaag label_points_burn_up: Omhoog label_sprint_edit: Sprint bewerken label_sprint_new: Nieuwe sprint - label_backlog_and_sprints: Backlog and sprints label_task_board: Taakbord notice_successful_start: De sprint is gestart. notice_successful_finish: De sprint is voltooid. @@ -209,6 +215,9 @@ nl: notice_unsuccessful_start_with_reason: 'The sprint could not be started: %{reason}' notice_unsuccessful_finish: The sprint could not be completed. notice_unsuccessful_finish_with_reason: 'The sprint could not be completed: %{reason}' + notice_work_package_invisible_after_move: 'The work package was moved to %{backlog} but is not visible because its type or status is excluded from the backlog. + + ' permission_create_sprints: Create sprints permission_manage_sprint_items: Manage sprint items permission_select_backlog_types_and_statuses: Select backlog types and statuses diff --git a/modules/backlogs/config/locales/crowdin/no.yml b/modules/backlogs/config/locales/crowdin/no.yml index 6be155a02f7..021d33b9be2 100644 --- a/modules/backlogs/config/locales/crowdin/no.yml +++ b/modules/backlogs/config/locales/crowdin/no.yml @@ -40,6 +40,7 @@ in_planning: In planning active: Active completed: Completed + work_packages: Work packages work_package: backlog_bucket: Backlog Bucket backlogs_work_package_type: Forsinkelser type @@ -123,6 +124,8 @@ label_burndown_chart: Burndown chart label_is_done_status: Status %{status_name} betyr fullført label_sprint_board: Sprint board + move_to_bucket_dialog_component: + title: Move to backlog bucket move_to_sprint_dialog_component: title: Move to sprint label_sprint: Sprint @@ -179,6 +182,8 @@ copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID move_menu: Move + move_to_backlog_bucket: Move to backlog bucket + move_to_inbox: Move to inbox move_to_sprint: Move to sprint work_package_is_closed: Arbeidspakke er ferdig, når burndown: @@ -190,18 +195,19 @@ upsell: sprint_sharing: description: Share sprints across projects to align teams and coordinate work in scaled agile setups (SAFe). + label_all_sprints: All sprints label_backlog: Backlog + label_backlogs: Forsinkelser + label_backlog_and_sprints: Backlog and sprints label_backlog_bucket_edit: Edit backlog bucket label_backlog_bucket_new: New backlog bucket - label_inbox: Inbox - label_backlogs: Forsinkelser label_burndown_chart: Burndown chart + label_inbox: Inbox label_sprint_board: Sprint board label_points_burn_down: Ned label_points_burn_up: Opp label_sprint_edit: Edit sprint label_sprint_new: New sprint - label_backlog_and_sprints: Backlog and sprints label_task_board: Oppgavetavle notice_successful_start: The sprint was started. notice_successful_finish: The sprint was completed. @@ -209,6 +215,9 @@ notice_unsuccessful_start_with_reason: 'The sprint could not be started: %{reason}' notice_unsuccessful_finish: The sprint could not be completed. notice_unsuccessful_finish_with_reason: 'The sprint could not be completed: %{reason}' + notice_work_package_invisible_after_move: 'The work package was moved to %{backlog} but is not visible because its type or status is excluded from the backlog. + + ' permission_create_sprints: Create sprints permission_manage_sprint_items: Manage sprint items permission_select_backlog_types_and_statuses: Select backlog types and statuses diff --git a/modules/backlogs/config/locales/crowdin/pl.yml b/modules/backlogs/config/locales/crowdin/pl.yml index da7112dc6d2..c7ade1c7199 100644 --- a/modules/backlogs/config/locales/crowdin/pl.yml +++ b/modules/backlogs/config/locales/crowdin/pl.yml @@ -40,6 +40,7 @@ pl: in_planning: W planowaniu active: Aktywne completed: Ukończone + work_packages: Pakiety robocze work_package: backlog_bucket: Kategoria backlogu backlogs_work_package_type: Typ backlogu @@ -127,6 +128,8 @@ pl: label_burndown_chart: Wykres spalania (burndown) label_is_done_status: Status %{status_name} oznacza zrobiony label_sprint_board: Tablica sprintu + move_to_bucket_dialog_component: + title: Przenieś do kategorii backlogu move_to_sprint_dialog_component: title: Przenieś do sprintu label_sprint: Sprint @@ -187,6 +190,8 @@ pl: copy_url_to_clipboard: Skopiuj adres URL do schowka copy_work_package_id: Skopiuj identyfikator pakietu roboczego move_menu: Przenieś + move_to_backlog_bucket: Przenieś do kategorii backlogu + move_to_inbox: Przenieś do skrzynki odbiorczej move_to_sprint: Przenieś do sprintu work_package_is_closed: Zestaw Zadań będzie gotowy, kiedy burndown: @@ -198,18 +203,19 @@ pl: upsell: sprint_sharing: description: Udostępnianie sprintów między projektami w celu dostosowania zespołów i koordynowania pracy w skalowanych konfiguracjach zwinnych (SAFe). + label_all_sprints: Wszystkie sprinty label_backlog: Backlog + label_backlogs: Backlogi + label_backlog_and_sprints: Backlog i sprinty label_backlog_bucket_edit: Edytuj kategorię backlogu label_backlog_bucket_new: Nowa kategoria backlogu - label_inbox: Skrzynka odbiorcza - label_backlogs: Backlogi label_burndown_chart: Wykres spalania (burndown) + label_inbox: Skrzynka odbiorcza label_sprint_board: Tablica sprintu label_points_burn_down: W dół label_points_burn_up: W górę label_sprint_edit: Edytuj sprint label_sprint_new: Nowy sprint - label_backlog_and_sprints: Backlog i sprinty label_task_board: Panel zadań notice_successful_start: Sprint został rozpoczęty. notice_successful_finish: Sprint został ukończony. @@ -217,6 +223,9 @@ pl: notice_unsuccessful_start_with_reason: 'Nie można rozpocząć sprintu: %{reason}' notice_unsuccessful_finish: Nie można ukończyć sprintu. notice_unsuccessful_finish_with_reason: 'Nie można ukończyć sprintu: %{reason}' + notice_work_package_invisible_after_move: 'Pakiet roboczy został przeniesiony do %{backlog}, ale nie jest widoczny, ponieważ jego typ lub status są wykluczone z backlogu. + + ' permission_create_sprints: Utwórz sprinty permission_manage_sprint_items: Zarządzaj elementami sprintu permission_select_backlog_types_and_statuses: Wybierz typy i statusy backlogu diff --git a/modules/backlogs/config/locales/crowdin/pt-BR.yml b/modules/backlogs/config/locales/crowdin/pt-BR.yml index a0dc4be9ab8..204b5c09216 100644 --- a/modules/backlogs/config/locales/crowdin/pt-BR.yml +++ b/modules/backlogs/config/locales/crowdin/pt-BR.yml @@ -40,6 +40,7 @@ pt-BR: in_planning: Em planejamento active: Ativa completed: Concluída + work_packages: Pacotes de trabalho work_package: backlog_bucket: Grupo de backlog backlogs_work_package_type: Tipo de backlog @@ -123,6 +124,8 @@ pt-BR: label_burndown_chart: Gráfico de burndown label_is_done_status: Situação %{status_name} significa pronto label_sprint_board: Quadro de sprints + move_to_bucket_dialog_component: + title: Mover para grupo de backlog move_to_sprint_dialog_component: title: Mover para sprint label_sprint: Sprint @@ -179,6 +182,8 @@ pt-BR: copy_url_to_clipboard: Copiar URL para a área de transferência copy_work_package_id: Copiar ID do pacotes de trabalho move_menu: Mover + move_to_backlog_bucket: Mover para grupo de backlog + move_to_inbox: Mover para caixa de entrada move_to_sprint: Mover para sprint work_package_is_closed: Pacote de trabalho está pronto, quando burndown: @@ -190,18 +195,19 @@ pt-BR: upsell: sprint_sharing: description: Compartilhe sprints entre projetos para alinhar equipes e coordenar o trabalho em configurações ágeis em escala (SAFe). + label_all_sprints: Todos os sprints label_backlog: Backlog + label_backlogs: Backlogs + label_backlog_and_sprints: Backlog e sprints label_backlog_bucket_edit: Editar grupo de backlog label_backlog_bucket_new: Novo grupo de backlog - label_inbox: Caixa de entrada - label_backlogs: Backlogs label_burndown_chart: Gráfico de burndown + label_inbox: Caixa de entrada label_sprint_board: Quadro de sprints label_points_burn_down: Abaixo label_points_burn_up: Acima label_sprint_edit: Editar sprint label_sprint_new: Nova sprint - label_backlog_and_sprints: Backlog e sprints label_task_board: Quadro de tarefas notice_successful_start: A sprint foi iniciada. notice_successful_finish: A sprint foi concluída. @@ -209,6 +215,9 @@ pt-BR: notice_unsuccessful_start_with_reason: 'Não foi possível iniciar a sprint: %{reason}' notice_unsuccessful_finish: Não foi possível concluir a sprint. notice_unsuccessful_finish_with_reason: 'Não foi possível concluir a sprint: %{reason}' + notice_work_package_invisible_after_move: 'O pacote de trabalho foi movido para %{backlog}, mas não está visível porque seu tipo ou estado está excluído do backlog. + + ' permission_create_sprints: Criar sprints permission_manage_sprint_items: Gerenciar itens da sprint permission_select_backlog_types_and_statuses: Selecionar tipos e estados do backlog diff --git a/modules/backlogs/config/locales/crowdin/pt-PT.yml b/modules/backlogs/config/locales/crowdin/pt-PT.yml index d3816ad5887..52d510f4a83 100644 --- a/modules/backlogs/config/locales/crowdin/pt-PT.yml +++ b/modules/backlogs/config/locales/crowdin/pt-PT.yml @@ -40,6 +40,7 @@ pt-PT: in_planning: Em planeamento active: Ativo completed: Concluído + work_packages: Pacotes de trabalho work_package: backlog_bucket: Grupo de backlog backlogs_work_package_type: Tipo de backlog @@ -123,6 +124,8 @@ pt-PT: label_burndown_chart: Gráfico de burndown label_is_done_status: O estado %{status_name} significa terminado label_sprint_board: Quadro de sprint + move_to_bucket_dialog_component: + title: Mover para o grupo de backlog move_to_sprint_dialog_component: title: Mover para sprint label_sprint: Sprint @@ -179,6 +182,8 @@ pt-PT: copy_url_to_clipboard: Copiar URL para a área de transferência copy_work_package_id: Copiar ID do pacote de trabalho move_menu: Mover + move_to_backlog_bucket: Mover para o grupo de backlog + move_to_inbox: Mover para a caixa de entrada move_to_sprint: Mover para sprint work_package_is_closed: Pacote de trabalho está feito quando burndown: @@ -190,18 +195,19 @@ pt-PT: upsell: sprint_sharing: description: Partilhe sprints entre projetos para alinhar as equipas e coordenar o trabalho em estruturas Agile escaláveis (SAFe). + label_all_sprints: Todos os sprints label_backlog: Backlog + label_backlogs: Backlogs + label_backlog_and_sprints: Backlog e sprints label_backlog_bucket_edit: Editar grupo de backlog label_backlog_bucket_new: Novo grupo de backlog - label_inbox: Caixa de entrada - label_backlogs: Backlogs label_burndown_chart: Gráfico de burndown + label_inbox: Caixa de entrada label_sprint_board: Quadro de sprint label_points_burn_down: Abaixo label_points_burn_up: Acima label_sprint_edit: Editar sprint label_sprint_new: Novo sprint - label_backlog_and_sprints: Backlog e sprints label_task_board: Quadro de tarefas notice_successful_start: O sprint foi iniciado. notice_successful_finish: O sprint foi concluído. @@ -209,6 +215,9 @@ pt-PT: notice_unsuccessful_start_with_reason: 'Não foi possível iniciar o sprint: %{reason}' notice_unsuccessful_finish: Não foi possível concluir o sprint. notice_unsuccessful_finish_with_reason: 'Não foi possível concluir o sprint: %{reason}' + notice_work_package_invisible_after_move: 'O pacote de trabalho foi movido para %{backlog}, mas não é visível porque o seu tipo ou estado está excluído do backlog. + + ' permission_create_sprints: Criar sprints permission_manage_sprint_items: Gerir elementos de sprint permission_select_backlog_types_and_statuses: Selecionar tipos e estados de backlog diff --git a/modules/backlogs/config/locales/crowdin/ro.yml b/modules/backlogs/config/locales/crowdin/ro.yml index 6a1f1a66c66..62dcf0d4924 100644 --- a/modules/backlogs/config/locales/crowdin/ro.yml +++ b/modules/backlogs/config/locales/crowdin/ro.yml @@ -40,9 +40,10 @@ ro: in_planning: În planificare active: Activ completed: Finalizat + work_packages: Pachete de lucru work_package: backlog_bucket: Backlog Bucket - backlogs_work_package_type: Tipul de restante + backlogs_work_package_type: Tip restanță position: Poziție sprint: Sprint story_points: Puncte @@ -125,6 +126,8 @@ ro: label_burndown_chart: Burndown chart label_is_done_status: Starea %{status_name} înseamnă terminat label_sprint_board: Sprint board + move_to_bucket_dialog_component: + title: Move to backlog bucket move_to_sprint_dialog_component: title: Move to sprint label_sprint: Sprint @@ -183,6 +186,8 @@ ro: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID move_menu: Move + move_to_backlog_bucket: Move to backlog bucket + move_to_inbox: Move to inbox move_to_sprint: Move to sprint work_package_is_closed: Pachetul de lucru este finalizat, atunci când burndown: @@ -194,18 +199,19 @@ ro: upsell: sprint_sharing: description: Share sprints across projects to align teams and coordinate work in scaled agile setups (SAFe). + label_all_sprints: All sprints label_backlog: Backlog + label_backlogs: Restanțe + label_backlog_and_sprints: Backlog and sprints label_backlog_bucket_edit: Edit backlog bucket label_backlog_bucket_new: New backlog bucket - label_inbox: Inbox - label_backlogs: Restanțe label_burndown_chart: Burndown chart + label_inbox: Inbox label_sprint_board: Sprint board label_points_burn_down: Jos label_points_burn_up: Sus label_sprint_edit: Edit sprint label_sprint_new: New sprint - label_backlog_and_sprints: Backlog and sprints label_task_board: Tablă de sarcini notice_successful_start: The sprint was started. notice_successful_finish: The sprint was completed. @@ -213,6 +219,9 @@ ro: notice_unsuccessful_start_with_reason: 'The sprint could not be started: %{reason}' notice_unsuccessful_finish: The sprint could not be completed. notice_unsuccessful_finish_with_reason: 'The sprint could not be completed: %{reason}' + notice_work_package_invisible_after_move: 'The work package was moved to %{backlog} but is not visible because its type or status is excluded from the backlog. + + ' permission_create_sprints: Create sprints permission_manage_sprint_items: Manage sprint items permission_select_backlog_types_and_statuses: Select backlog types and statuses diff --git a/modules/backlogs/config/locales/crowdin/ru.yml b/modules/backlogs/config/locales/crowdin/ru.yml index 51fa6ff732a..a2cb7650e90 100644 --- a/modules/backlogs/config/locales/crowdin/ru.yml +++ b/modules/backlogs/config/locales/crowdin/ru.yml @@ -40,6 +40,7 @@ ru: in_planning: В планировании active: Активен completed: Завершён + work_packages: Пакеты работ work_package: backlog_bucket: Раздел бэклога backlogs_work_package_type: Тип невыполненной работы @@ -127,6 +128,8 @@ ru: label_burndown_chart: Диаграмма выгорания label_is_done_status: Статус %{status_name} означает завершение, label_sprint_board: Доска для спринта + move_to_bucket_dialog_component: + title: Move to backlog bucket move_to_sprint_dialog_component: title: Переместить в спринт label_sprint: Спринт @@ -187,6 +190,8 @@ ru: copy_url_to_clipboard: Скопировать URL в буфер обмена copy_work_package_id: Скопировать ID пакета работ move_menu: Переместить + move_to_backlog_bucket: Move to backlog bucket + move_to_inbox: Move to inbox move_to_sprint: Переместить в спринт work_package_is_closed: Пакет работ завершен, когда burndown: @@ -198,18 +203,19 @@ ru: upsell: sprint_sharing: description: Share sprints across projects to align teams and coordinate work in scaled agile setups (SAFe). + label_all_sprints: All sprints label_backlog: Бэклог + label_backlogs: Бэклоги + label_backlog_and_sprints: Бэклог и спринты label_backlog_bucket_edit: Редактировать раздел бэклога label_backlog_bucket_new: Новый раздел бэклога - label_inbox: Входящие - label_backlogs: Бэклоги label_burndown_chart: Диаграмма выгорания + label_inbox: Входящие label_sprint_board: Доска для спринта label_points_burn_down: Вниз label_points_burn_up: Вверх label_sprint_edit: Редактировать спринт label_sprint_new: Новый спринт - label_backlog_and_sprints: Бэклог и спринты label_task_board: Панель задач notice_successful_start: Спринт запущен. notice_successful_finish: Спринт завершен. @@ -217,6 +223,9 @@ ru: notice_unsuccessful_start_with_reason: 'Спринт не может быть запущен: %{reason}' notice_unsuccessful_finish: Спринт не может быть завершен. notice_unsuccessful_finish_with_reason: 'Спринт не может быть завершён: %{reason}' + notice_work_package_invisible_after_move: 'The work package was moved to %{backlog} but is not visible because its type or status is excluded from the backlog. + + ' permission_create_sprints: Создание спринтов permission_manage_sprint_items: Управление пунктами спринта permission_select_backlog_types_and_statuses: Выберите типы и статусы бэклога diff --git a/modules/backlogs/config/locales/crowdin/rw.yml b/modules/backlogs/config/locales/crowdin/rw.yml index b3737115b0d..f1dbbd17217 100644 --- a/modules/backlogs/config/locales/crowdin/rw.yml +++ b/modules/backlogs/config/locales/crowdin/rw.yml @@ -40,6 +40,7 @@ rw: in_planning: In planning active: Active completed: Completed + work_packages: Work packages work_package: backlog_bucket: Backlog Bucket backlogs_work_package_type: Backlog type @@ -123,6 +124,8 @@ rw: label_burndown_chart: Burndown chart label_is_done_status: Status %{status_name} means done label_sprint_board: Sprint board + move_to_bucket_dialog_component: + title: Move to backlog bucket move_to_sprint_dialog_component: title: Move to sprint label_sprint: Sprint @@ -179,6 +182,8 @@ rw: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID move_menu: Move + move_to_backlog_bucket: Move to backlog bucket + move_to_inbox: Move to inbox move_to_sprint: Move to sprint work_package_is_closed: Work package is done, when burndown: @@ -190,18 +195,19 @@ rw: upsell: sprint_sharing: description: Share sprints across projects to align teams and coordinate work in scaled agile setups (SAFe). + label_all_sprints: All sprints label_backlog: Backlog + label_backlogs: Backlogs + label_backlog_and_sprints: Backlog and sprints label_backlog_bucket_edit: Edit backlog bucket label_backlog_bucket_new: New backlog bucket - label_inbox: Inbox - label_backlogs: Backlogs label_burndown_chart: Burndown chart + label_inbox: Inbox label_sprint_board: Sprint board label_points_burn_down: Down label_points_burn_up: Up label_sprint_edit: Edit sprint label_sprint_new: New sprint - label_backlog_and_sprints: Backlog and sprints label_task_board: Task board notice_successful_start: The sprint was started. notice_successful_finish: The sprint was completed. @@ -209,6 +215,9 @@ rw: notice_unsuccessful_start_with_reason: 'The sprint could not be started: %{reason}' notice_unsuccessful_finish: The sprint could not be completed. notice_unsuccessful_finish_with_reason: 'The sprint could not be completed: %{reason}' + notice_work_package_invisible_after_move: 'The work package was moved to %{backlog} but is not visible because its type or status is excluded from the backlog. + + ' permission_create_sprints: Create sprints permission_manage_sprint_items: Manage sprint items permission_select_backlog_types_and_statuses: Select backlog types and statuses diff --git a/modules/backlogs/config/locales/crowdin/si.yml b/modules/backlogs/config/locales/crowdin/si.yml index 98c253ca5a4..948d2798eea 100644 --- a/modules/backlogs/config/locales/crowdin/si.yml +++ b/modules/backlogs/config/locales/crowdin/si.yml @@ -40,6 +40,7 @@ si: in_planning: In planning active: Active completed: Completed + work_packages: Work packages work_package: backlog_bucket: Backlog Bucket backlogs_work_package_type: බැක්ලොග් වර්ගය @@ -123,6 +124,8 @@ si: label_burndown_chart: Burndown chart label_is_done_status: තත්ත්වය %{status_name} යන්නෙන් අදහස් කරන්නේ label_sprint_board: Sprint board + move_to_bucket_dialog_component: + title: Move to backlog bucket move_to_sprint_dialog_component: title: Move to sprint label_sprint: Sprint @@ -179,6 +182,8 @@ si: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID move_menu: Move + move_to_backlog_bucket: Move to backlog bucket + move_to_inbox: Move to inbox move_to_sprint: Move to sprint work_package_is_closed: වැඩ පැකේජය සිදු කරනු ලබන්නේ කවදාද burndown: @@ -190,18 +195,19 @@ si: upsell: sprint_sharing: description: Share sprints across projects to align teams and coordinate work in scaled agile setups (SAFe). + label_all_sprints: All sprints label_backlog: Backlog + label_backlogs: බැක්ලොග්ස් + label_backlog_and_sprints: Backlog and sprints label_backlog_bucket_edit: Edit backlog bucket label_backlog_bucket_new: New backlog bucket - label_inbox: Inbox - label_backlogs: බැක්ලොග්ස් label_burndown_chart: Burndown chart + label_inbox: Inbox label_sprint_board: Sprint board label_points_burn_down: පහළට label_points_burn_up: ඉහළට label_sprint_edit: Edit sprint label_sprint_new: New sprint - label_backlog_and_sprints: Backlog and sprints label_task_board: කාර්ය මණ්ඩලය notice_successful_start: The sprint was started. notice_successful_finish: The sprint was completed. @@ -209,6 +215,9 @@ si: notice_unsuccessful_start_with_reason: 'The sprint could not be started: %{reason}' notice_unsuccessful_finish: The sprint could not be completed. notice_unsuccessful_finish_with_reason: 'The sprint could not be completed: %{reason}' + notice_work_package_invisible_after_move: 'The work package was moved to %{backlog} but is not visible because its type or status is excluded from the backlog. + + ' permission_create_sprints: Create sprints permission_manage_sprint_items: Manage sprint items permission_select_backlog_types_and_statuses: Select backlog types and statuses diff --git a/modules/backlogs/config/locales/crowdin/sk.yml b/modules/backlogs/config/locales/crowdin/sk.yml index b5b756f0034..18d5f57e6dc 100644 --- a/modules/backlogs/config/locales/crowdin/sk.yml +++ b/modules/backlogs/config/locales/crowdin/sk.yml @@ -40,6 +40,7 @@ sk: in_planning: In planning active: Active completed: Completed + work_packages: Work packages work_package: backlog_bucket: Backlog Bucket backlogs_work_package_type: Typ oneskorenia @@ -127,6 +128,8 @@ sk: label_burndown_chart: Burndown chart label_is_done_status: Status %{status_name} znamená dokončené label_sprint_board: Sprint board + move_to_bucket_dialog_component: + title: Move to backlog bucket move_to_sprint_dialog_component: title: Move to sprint label_sprint: Sprint @@ -187,6 +190,8 @@ sk: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID move_menu: Move + move_to_backlog_bucket: Move to backlog bucket + move_to_inbox: Move to inbox move_to_sprint: Move to sprint work_package_is_closed: Pracovný balík je hotový, keď burndown: @@ -198,18 +203,19 @@ sk: upsell: sprint_sharing: description: Share sprints across projects to align teams and coordinate work in scaled agile setups (SAFe). + label_all_sprints: All sprints label_backlog: Backlog + label_backlogs: Backlogs + label_backlog_and_sprints: Backlog and sprints label_backlog_bucket_edit: Edit backlog bucket label_backlog_bucket_new: New backlog bucket - label_inbox: Inbox - label_backlogs: Backlogs label_burndown_chart: Burndown chart + label_inbox: Inbox label_sprint_board: Sprint board label_points_burn_down: Nadol label_points_burn_up: Nahor label_sprint_edit: Edit sprint label_sprint_new: New sprint - label_backlog_and_sprints: Backlog and sprints label_task_board: Task board notice_successful_start: The sprint was started. notice_successful_finish: The sprint was completed. @@ -217,6 +223,9 @@ sk: notice_unsuccessful_start_with_reason: 'The sprint could not be started: %{reason}' notice_unsuccessful_finish: The sprint could not be completed. notice_unsuccessful_finish_with_reason: 'The sprint could not be completed: %{reason}' + notice_work_package_invisible_after_move: 'The work package was moved to %{backlog} but is not visible because its type or status is excluded from the backlog. + + ' permission_create_sprints: Create sprints permission_manage_sprint_items: Manage sprint items permission_select_backlog_types_and_statuses: Select backlog types and statuses diff --git a/modules/backlogs/config/locales/crowdin/sl.yml b/modules/backlogs/config/locales/crowdin/sl.yml index 6dd8d1924c2..e5084f4ac55 100644 --- a/modules/backlogs/config/locales/crowdin/sl.yml +++ b/modules/backlogs/config/locales/crowdin/sl.yml @@ -40,6 +40,7 @@ sl: in_planning: In planning active: Active completed: Completed + work_packages: Work packages work_package: backlog_bucket: Backlog Bucket backlogs_work_package_type: Tip opravila na čakanju @@ -127,6 +128,8 @@ sl: label_burndown_chart: Burndown chart label_is_done_status: Status %{status_name} pomeni zaključeno label_sprint_board: Sprint board + move_to_bucket_dialog_component: + title: Move to backlog bucket move_to_sprint_dialog_component: title: Move to sprint label_sprint: Sprint @@ -187,6 +190,8 @@ sl: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID move_menu: Move + move_to_backlog_bucket: Move to backlog bucket + move_to_inbox: Move to inbox move_to_sprint: Move to sprint work_package_is_closed: Delovni paket je končan, ko burndown: @@ -198,18 +203,19 @@ sl: upsell: sprint_sharing: description: Share sprints across projects to align teams and coordinate work in scaled agile setups (SAFe). + label_all_sprints: All sprints label_backlog: Backlog + label_backlogs: Zaostanki + label_backlog_and_sprints: Backlog and sprints label_backlog_bucket_edit: Edit backlog bucket label_backlog_bucket_new: New backlog bucket - label_inbox: Inbox - label_backlogs: Zaostanki label_burndown_chart: Burndown chart + label_inbox: Inbox label_sprint_board: Sprint board label_points_burn_down: Navzdol label_points_burn_up: Navzgor label_sprint_edit: Edit sprint label_sprint_new: New sprint - label_backlog_and_sprints: Backlog and sprints label_task_board: Tabla opravil notice_successful_start: The sprint was started. notice_successful_finish: The sprint was completed. @@ -217,6 +223,9 @@ sl: notice_unsuccessful_start_with_reason: 'The sprint could not be started: %{reason}' notice_unsuccessful_finish: The sprint could not be completed. notice_unsuccessful_finish_with_reason: 'The sprint could not be completed: %{reason}' + notice_work_package_invisible_after_move: 'The work package was moved to %{backlog} but is not visible because its type or status is excluded from the backlog. + + ' permission_create_sprints: Create sprints permission_manage_sprint_items: Manage sprint items permission_select_backlog_types_and_statuses: Select backlog types and statuses diff --git a/modules/backlogs/config/locales/crowdin/sr.yml b/modules/backlogs/config/locales/crowdin/sr.yml index cca0d8f5120..fd5df5ceb35 100644 --- a/modules/backlogs/config/locales/crowdin/sr.yml +++ b/modules/backlogs/config/locales/crowdin/sr.yml @@ -40,6 +40,7 @@ sr: in_planning: In planning active: Active completed: Completed + work_packages: Work packages work_package: backlog_bucket: Backlog Bucket backlogs_work_package_type: Tip backlog-a @@ -125,6 +126,8 @@ sr: label_burndown_chart: Burndown chart label_is_done_status: Status %{status_name} znači završen label_sprint_board: Sprint board + move_to_bucket_dialog_component: + title: Move to backlog bucket move_to_sprint_dialog_component: title: Move to sprint label_sprint: Sprint @@ -183,6 +186,8 @@ sr: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID move_menu: Move + move_to_backlog_bucket: Move to backlog bucket + move_to_inbox: Move to inbox move_to_sprint: Move to sprint work_package_is_closed: Radni paket je završen, kada burndown: @@ -194,18 +199,19 @@ sr: upsell: sprint_sharing: description: Share sprints across projects to align teams and coordinate work in scaled agile setups (SAFe). + label_all_sprints: All sprints label_backlog: Backlog + label_backlogs: Backlogs + label_backlog_and_sprints: Backlog and sprints label_backlog_bucket_edit: Edit backlog bucket label_backlog_bucket_new: New backlog bucket - label_inbox: Inbox - label_backlogs: Backlogs label_burndown_chart: Burndown chart + label_inbox: Inbox label_sprint_board: Sprint board label_points_burn_down: Down label_points_burn_up: Up label_sprint_edit: Edit sprint label_sprint_new: New sprint - label_backlog_and_sprints: Backlog and sprints label_task_board: Task board notice_successful_start: The sprint was started. notice_successful_finish: The sprint was completed. @@ -213,6 +219,9 @@ sr: notice_unsuccessful_start_with_reason: 'The sprint could not be started: %{reason}' notice_unsuccessful_finish: The sprint could not be completed. notice_unsuccessful_finish_with_reason: 'The sprint could not be completed: %{reason}' + notice_work_package_invisible_after_move: 'The work package was moved to %{backlog} but is not visible because its type or status is excluded from the backlog. + + ' permission_create_sprints: Create sprints permission_manage_sprint_items: Manage sprint items permission_select_backlog_types_and_statuses: Select backlog types and statuses diff --git a/modules/backlogs/config/locales/crowdin/sv.yml b/modules/backlogs/config/locales/crowdin/sv.yml index b1e6f160535..d5e9f864388 100644 --- a/modules/backlogs/config/locales/crowdin/sv.yml +++ b/modules/backlogs/config/locales/crowdin/sv.yml @@ -40,6 +40,7 @@ sv: in_planning: In planning active: Active completed: Completed + work_packages: Work packages work_package: backlog_bucket: Backlog Bucket backlogs_work_package_type: Typ av backlogg @@ -123,6 +124,8 @@ sv: label_burndown_chart: Burndown chart label_is_done_status: Status %{status_name} innebär klart label_sprint_board: Sprint board + move_to_bucket_dialog_component: + title: Move to backlog bucket move_to_sprint_dialog_component: title: Move to sprint label_sprint: Sprint @@ -179,6 +182,8 @@ sv: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID move_menu: Move + move_to_backlog_bucket: Move to backlog bucket + move_to_inbox: Move to inbox move_to_sprint: Move to sprint work_package_is_closed: Arbetspaket är klart, när burndown: @@ -190,18 +195,19 @@ sv: upsell: sprint_sharing: description: Share sprints across projects to align teams and coordinate work in scaled agile setups (SAFe). + label_all_sprints: All sprints label_backlog: Backlog + label_backlogs: Backloggar + label_backlog_and_sprints: Backlog and sprints label_backlog_bucket_edit: Edit backlog bucket label_backlog_bucket_new: New backlog bucket - label_inbox: Inbox - label_backlogs: Backloggar label_burndown_chart: Burndown chart + label_inbox: Inbox label_sprint_board: Sprint board label_points_burn_down: Ner label_points_burn_up: Upp label_sprint_edit: Edit sprint label_sprint_new: New sprint - label_backlog_and_sprints: Backlog and sprints label_task_board: Aktivitetstavla notice_successful_start: The sprint was started. notice_successful_finish: The sprint was completed. @@ -209,6 +215,9 @@ sv: notice_unsuccessful_start_with_reason: 'The sprint could not be started: %{reason}' notice_unsuccessful_finish: The sprint could not be completed. notice_unsuccessful_finish_with_reason: 'The sprint could not be completed: %{reason}' + notice_work_package_invisible_after_move: 'The work package was moved to %{backlog} but is not visible because its type or status is excluded from the backlog. + + ' permission_create_sprints: Create sprints permission_manage_sprint_items: Manage sprint items permission_select_backlog_types_and_statuses: Select backlog types and statuses diff --git a/modules/backlogs/config/locales/crowdin/th.yml b/modules/backlogs/config/locales/crowdin/th.yml index ffb2caab3f9..229e2029754 100644 --- a/modules/backlogs/config/locales/crowdin/th.yml +++ b/modules/backlogs/config/locales/crowdin/th.yml @@ -40,6 +40,7 @@ th: in_planning: In planning active: Active completed: Completed + work_packages: Work packages work_package: backlog_bucket: Backlog Bucket backlogs_work_package_type: ประเภทงานค้าง @@ -121,6 +122,8 @@ th: label_burndown_chart: Burndown chart label_is_done_status: สถานะ %{status_name} หมายถึง เสร็จสิ้น label_sprint_board: Sprint board + move_to_bucket_dialog_component: + title: Move to backlog bucket move_to_sprint_dialog_component: title: Move to sprint label_sprint: Sprint @@ -175,6 +178,8 @@ th: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID move_menu: Move + move_to_backlog_bucket: Move to backlog bucket + move_to_inbox: Move to inbox move_to_sprint: Move to sprint work_package_is_closed: งานจะถือว่า เสร็จสิ้น เมื่อ burndown: @@ -186,18 +191,19 @@ th: upsell: sprint_sharing: description: Share sprints across projects to align teams and coordinate work in scaled agile setups (SAFe). + label_all_sprints: All sprints label_backlog: Backlog + label_backlogs: รายการงานคงค้าง + label_backlog_and_sprints: Backlog and sprints label_backlog_bucket_edit: Edit backlog bucket label_backlog_bucket_new: New backlog bucket - label_inbox: Inbox - label_backlogs: รายการงานคงค้าง label_burndown_chart: Burndown chart + label_inbox: Inbox label_sprint_board: Sprint board label_points_burn_down: ลง label_points_burn_up: ขึ้น label_sprint_edit: Edit sprint label_sprint_new: สปรินท์ใหม่ - label_backlog_and_sprints: Backlog and sprints label_task_board: กระดานงาน notice_successful_start: The sprint was started. notice_successful_finish: The sprint was completed. @@ -205,6 +211,9 @@ th: notice_unsuccessful_start_with_reason: 'The sprint could not be started: %{reason}' notice_unsuccessful_finish: The sprint could not be completed. notice_unsuccessful_finish_with_reason: 'The sprint could not be completed: %{reason}' + notice_work_package_invisible_after_move: 'The work package was moved to %{backlog} but is not visible because its type or status is excluded from the backlog. + + ' permission_create_sprints: สร้างสปรินท์ permission_manage_sprint_items: จัดการรายการในสปรินท์ permission_select_backlog_types_and_statuses: Select backlog types and statuses diff --git a/modules/backlogs/config/locales/crowdin/tr.yml b/modules/backlogs/config/locales/crowdin/tr.yml index c274fb509fd..aa3668a7456 100644 --- a/modules/backlogs/config/locales/crowdin/tr.yml +++ b/modules/backlogs/config/locales/crowdin/tr.yml @@ -40,6 +40,7 @@ tr: in_planning: Planlanıyor active: Aktif completed: Tamamlandı + work_packages: İş paketleri work_package: backlog_bucket: Birikmiş İş Havuzu backlogs_work_package_type: Bekleme listesi türü @@ -123,6 +124,8 @@ tr: label_burndown_chart: Burndown grafiği label_is_done_status: Durum %{status_name} tamamlandı anlamına geliyor label_sprint_board: Sprint board + move_to_bucket_dialog_component: + title: Move to backlog bucket move_to_sprint_dialog_component: title: Move to sprint label_sprint: Sprint @@ -179,6 +182,8 @@ tr: copy_url_to_clipboard: URL'yi panoya kopyala copy_work_package_id: İş paketi kimliğini kopyala move_menu: Taşı + move_to_backlog_bucket: Move to backlog bucket + move_to_inbox: Move to inbox move_to_sprint: Sprint'e taşı work_package_is_closed: İş paketi, ne zaman burndown: @@ -190,18 +195,19 @@ tr: upsell: sprint_sharing: description: Share sprints across projects to align teams and coordinate work in scaled agile setups (SAFe). + label_all_sprints: All sprints label_backlog: Backlog + label_backlogs: İş listeleri + label_backlog_and_sprints: Backlog and sprints label_backlog_bucket_edit: Edit backlog bucket label_backlog_bucket_new: New backlog bucket - label_inbox: Gelen Kutusu - label_backlogs: İş listeleri label_burndown_chart: Burndown grafiği + label_inbox: Gelen Kutusu label_sprint_board: Sprint panosu label_points_burn_down: Aşağı label_points_burn_up: Yukarı label_sprint_edit: Sprint düzenle label_sprint_new: Yeni sprint - label_backlog_and_sprints: Backlog and sprints label_task_board: Görev panosu notice_successful_start: Sprint başladı. notice_successful_finish: Sprint tamamlandı. @@ -209,6 +215,9 @@ tr: notice_unsuccessful_start_with_reason: 'Sprint başlatılamadı: %{reason}' notice_unsuccessful_finish: Sprint tamamlanamadı. notice_unsuccessful_finish_with_reason: 'Sprint tamamlanamadı: %{reason}' + notice_work_package_invisible_after_move: 'The work package was moved to %{backlog} but is not visible because its type or status is excluded from the backlog. + + ' permission_create_sprints: Sprintler oluşturma permission_manage_sprint_items: Sprint öğelerini yönetme permission_select_backlog_types_and_statuses: Select backlog types and statuses diff --git a/modules/backlogs/config/locales/crowdin/uk.yml b/modules/backlogs/config/locales/crowdin/uk.yml index e28b0e40e87..c4dfebde255 100644 --- a/modules/backlogs/config/locales/crowdin/uk.yml +++ b/modules/backlogs/config/locales/crowdin/uk.yml @@ -40,6 +40,7 @@ uk: in_planning: На етапі планування active: Активний completed: Завершений + work_packages: Пакети робіт work_package: backlog_bucket: Сегмент беклогу backlogs_work_package_type: Тип Backlog-у @@ -127,6 +128,8 @@ uk: label_burndown_chart: Діаграма згорання завдань label_is_done_status: Стан %{status_name} означає виконано label_sprint_board: Дошка спринту + move_to_bucket_dialog_component: + title: Перемістити в сегмент беклогу move_to_sprint_dialog_component: title: Перемістити в спринт label_sprint: Спринт @@ -187,6 +190,8 @@ uk: copy_url_to_clipboard: Скопіювати URL-адресу в буфер обміну copy_work_package_id: Скопіювати ідентифікатор пакета робіт move_menu: Перемістити + move_to_backlog_bucket: Перемістити в сегмент беклогу + move_to_inbox: Перемiстити у вхідні move_to_sprint: Перемістити в спринт work_package_is_closed: Робочий пакет виконується, коли burndown: @@ -198,18 +203,19 @@ uk: upsell: sprint_sharing: description: Надавайте доступ до спринтів кільком проєктам, щоб узгоджувати й координувати роботу команд у конфігураціях Масштабованої гнучкої розробки (SAFe). + label_all_sprints: Усі спринти label_backlog: Backlog + label_backlogs: Backlogs + label_backlog_and_sprints: Беклог і спринти label_backlog_bucket_edit: Змінити сегмент беклогу label_backlog_bucket_new: Новий сегмент беклогу - label_inbox: Вхідні - label_backlogs: Backlogs label_burndown_chart: Діаграма згорання завдань + label_inbox: Вхідні label_sprint_board: Дошка спринту label_points_burn_down: Вниз label_points_burn_up: Вгору label_sprint_edit: Редагувати спринт label_sprint_new: Новий спринт - label_backlog_and_sprints: Беклог і спринти label_task_board: Дошка завдань notice_successful_start: Спринт розпочато. notice_successful_finish: Спринт завершено. @@ -217,6 +223,9 @@ uk: notice_unsuccessful_start_with_reason: 'Спринт не вдалося розпочати: %{reason}' notice_unsuccessful_finish: Спринт не вдалося завершити. notice_unsuccessful_finish_with_reason: 'Спринт не вдалося завершити: %{reason}' + notice_work_package_invisible_after_move: 'Пакет робіт було переміщено в беклог (%{backlog}), але він там не відображається, оскільки його тип або статус виключено з беклогу. + + ' permission_create_sprints: Створення спринтів permission_manage_sprint_items: Керування елементами спринтів permission_select_backlog_types_and_statuses: Вибір типів і статусів беклогу diff --git a/modules/backlogs/config/locales/crowdin/uz.yml b/modules/backlogs/config/locales/crowdin/uz.yml index 3b1a8c00cc6..381df5a18ab 100644 --- a/modules/backlogs/config/locales/crowdin/uz.yml +++ b/modules/backlogs/config/locales/crowdin/uz.yml @@ -40,6 +40,7 @@ uz: in_planning: In planning active: Active completed: Completed + work_packages: Work packages work_package: backlog_bucket: Backlog Bucket backlogs_work_package_type: Backlog type @@ -123,6 +124,8 @@ uz: label_burndown_chart: Burndown chart label_is_done_status: Status %{status_name} means done label_sprint_board: Sprint board + move_to_bucket_dialog_component: + title: Move to backlog bucket move_to_sprint_dialog_component: title: Move to sprint label_sprint: Sprint @@ -179,6 +182,8 @@ uz: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID move_menu: Move + move_to_backlog_bucket: Move to backlog bucket + move_to_inbox: Move to inbox move_to_sprint: Move to sprint work_package_is_closed: Work package is done, when burndown: @@ -190,18 +195,19 @@ uz: upsell: sprint_sharing: description: Share sprints across projects to align teams and coordinate work in scaled agile setups (SAFe). + label_all_sprints: All sprints label_backlog: Backlog + label_backlogs: Backlogs + label_backlog_and_sprints: Backlog and sprints label_backlog_bucket_edit: Edit backlog bucket label_backlog_bucket_new: New backlog bucket - label_inbox: Inbox - label_backlogs: Backlogs label_burndown_chart: Burndown chart + label_inbox: Inbox label_sprint_board: Sprint board label_points_burn_down: Down label_points_burn_up: Up label_sprint_edit: Edit sprint label_sprint_new: New sprint - label_backlog_and_sprints: Backlog and sprints label_task_board: Task board notice_successful_start: The sprint was started. notice_successful_finish: The sprint was completed. @@ -209,6 +215,9 @@ uz: notice_unsuccessful_start_with_reason: 'The sprint could not be started: %{reason}' notice_unsuccessful_finish: The sprint could not be completed. notice_unsuccessful_finish_with_reason: 'The sprint could not be completed: %{reason}' + notice_work_package_invisible_after_move: 'The work package was moved to %{backlog} but is not visible because its type or status is excluded from the backlog. + + ' permission_create_sprints: Create sprints permission_manage_sprint_items: Manage sprint items permission_select_backlog_types_and_statuses: Select backlog types and statuses diff --git a/modules/backlogs/config/locales/crowdin/vi.yml b/modules/backlogs/config/locales/crowdin/vi.yml index ccf9a15b4d1..437e0c8ad81 100644 --- a/modules/backlogs/config/locales/crowdin/vi.yml +++ b/modules/backlogs/config/locales/crowdin/vi.yml @@ -40,6 +40,7 @@ vi: in_planning: Đang lập kế hoạch active: Đang hoạt động completed: Đã hoàn thành + work_packages: Work packages work_package: backlog_bucket: Nhóm Backlog (Bucket) backlogs_work_package_type: Loại Backlog @@ -123,6 +124,8 @@ vi: label_burndown_chart: Biểu đồ Burndown label_is_done_status: Trạng thái %{status_name} nghĩa là đã xong label_sprint_board: Bảng Sprint + move_to_bucket_dialog_component: + title: Move to backlog bucket move_to_sprint_dialog_component: title: Di chuyển sang Sprint label_sprint: Sprint @@ -177,6 +180,8 @@ vi: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy gói công việc (work package) ID move_menu: Move + move_to_backlog_bucket: Move to backlog bucket + move_to_inbox: Move to inbox move_to_sprint: Di chuyển sang Sprint work_package_is_closed: Gói công việc được thực hiện, khi burndown: @@ -188,18 +193,19 @@ vi: upsell: sprint_sharing: description: Share sprints across projects to align teams and coordinate work in scaled agile setups (SAFe). + label_all_sprints: All sprints label_backlog: Backlog + label_backlogs: Backlog + label_backlog_and_sprints: Backlog and sprints label_backlog_bucket_edit: Chỉnh sửa nhóm Backlog label_backlog_bucket_new: New backlog bucket - label_inbox: Hộp thư đến - label_backlogs: Backlog label_burndown_chart: Biểu đồ Burndown + label_inbox: Hộp thư đến label_sprint_board: Bảng Sprint label_points_burn_down: Xuống label_points_burn_up: lên label_sprint_edit: Edit sprint label_sprint_new: New sprint - label_backlog_and_sprints: Backlog and sprints label_task_board: Bảng nhiệm vụ notice_successful_start: The sprint was started. notice_successful_finish: The sprint was completed. @@ -207,6 +213,9 @@ vi: notice_unsuccessful_start_with_reason: 'The sprint could not be started: %{reason}' notice_unsuccessful_finish: The sprint could not be completed. notice_unsuccessful_finish_with_reason: 'The sprint could not be completed: %{reason}' + notice_work_package_invisible_after_move: 'The work package was moved to %{backlog} but is not visible because its type or status is excluded from the backlog. + + ' permission_create_sprints: Create sprints permission_manage_sprint_items: Manage sprint items permission_select_backlog_types_and_statuses: Select backlog types and statuses diff --git a/modules/backlogs/config/locales/crowdin/zh-CN.yml b/modules/backlogs/config/locales/crowdin/zh-CN.yml index bc42d163570..65c4cd2d656 100644 --- a/modules/backlogs/config/locales/crowdin/zh-CN.yml +++ b/modules/backlogs/config/locales/crowdin/zh-CN.yml @@ -40,6 +40,7 @@ zh-CN: in_planning: 计划中 active: 激活 completed: 已完成 + work_packages: 工作包 work_package: backlog_bucket: 积压工作存储桶 backlogs_work_package_type: 待办清单类型 @@ -121,6 +122,8 @@ zh-CN: label_burndown_chart: 燃尽图 label_is_done_status: 状态 %{status_name} 表示已完成 label_sprint_board: 冲刺面板 + move_to_bucket_dialog_component: + title: 移至积压工作存储桶 move_to_sprint_dialog_component: title: 移至冲刺 label_sprint: 冲刺 @@ -175,6 +178,8 @@ zh-CN: copy_url_to_clipboard: 将 URL 复制到剪贴板 copy_work_package_id: 复制工作包 ID move_menu: 移动 + move_to_backlog_bucket: 移至积压工作存储桶 + move_to_inbox: 移至收件箱 move_to_sprint: 移至冲刺 work_package_is_closed: 工作包已完成,当 burndown: @@ -186,18 +191,19 @@ zh-CN: upsell: sprint_sharing: description: 跨项目共享冲刺,以便在规模化敏捷设置 (SAFe) 中调整团队和协调工作。 + label_all_sprints: 所有冲刺 label_backlog: 积压工作 + label_backlogs: 待办清单 + label_backlog_and_sprints: 积压工作和冲刺 label_backlog_bucket_edit: 编辑积压工作存储桶 label_backlog_bucket_new: 新建积压工作存储桶 - label_inbox: 收件箱 - label_backlogs: 待办清单 label_burndown_chart: 燃尽图 + label_inbox: 收件箱 label_sprint_board: 冲刺面板 label_points_burn_down: 减少 label_points_burn_up: 增加 label_sprint_edit: 编辑冲刺 label_sprint_new: 新冲刺 - label_backlog_and_sprints: 积压工作和冲刺 label_task_board: 任务板 notice_successful_start: 该冲刺已开始。 notice_successful_finish: 该冲刺已完成。 @@ -205,6 +211,9 @@ zh-CN: notice_unsuccessful_start_with_reason: 无法开始该冲刺:%{reason} notice_unsuccessful_finish: 无法完成该冲刺。 notice_unsuccessful_finish_with_reason: 无法完成该冲刺:%{reason} + notice_work_package_invisible_after_move: '工作包已移至 %{backlog} ,但不可见,因为其类型或状态已从积压工作中排除。 + + ' permission_create_sprints: 创建冲刺 permission_manage_sprint_items: 管理冲刺条目 permission_select_backlog_types_and_statuses: 选择积压工作类型和状态 diff --git a/modules/backlogs/config/locales/crowdin/zh-TW.yml b/modules/backlogs/config/locales/crowdin/zh-TW.yml index 97b6cf28ec8..191907deb5c 100644 --- a/modules/backlogs/config/locales/crowdin/zh-TW.yml +++ b/modules/backlogs/config/locales/crowdin/zh-TW.yml @@ -22,7 +22,7 @@ --- zh-TW: plugin_openproject_backlogs: - name: OpenProject待辦事項 + name: OpenProject代辦事項 description: 此模組新增了讓敏捷團隊能夠在 Scrum 專案中使用 OpenProject 的功能。 activerecord: attributes: @@ -40,6 +40,7 @@ zh-TW: in_planning: In planning active: Active completed: Completed + work_packages: Work packages work_package: backlog_bucket: Backlog Bucket backlogs_work_package_type: 待辦事項類型 @@ -121,6 +122,8 @@ zh-TW: label_burndown_chart: 未完成圖 label_is_done_status: 狀態 %{status_name} 表示完成 label_sprint_board: 衝刺目標 + move_to_bucket_dialog_component: + title: Move to backlog bucket move_to_sprint_dialog_component: title: 移動到衝刺 label_sprint: 衝刺 @@ -175,6 +178,8 @@ zh-TW: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID move_menu: Move + move_to_backlog_bucket: Move to backlog bucket + move_to_inbox: Move to inbox move_to_sprint: Move to sprint work_package_is_closed: 視為工作套件已完成 burndown: @@ -186,18 +191,19 @@ zh-TW: upsell: sprint_sharing: description: Share sprints across projects to align teams and coordinate work in scaled agile setups (SAFe). + label_all_sprints: All sprints label_backlog: Backlog + label_backlogs: 待辦事項 + label_backlog_and_sprints: Backlog and sprints label_backlog_bucket_edit: Edit backlog bucket label_backlog_bucket_new: New backlog bucket - label_inbox: Inbox - label_backlogs: 待辦事項 label_burndown_chart: Burndown chart + label_inbox: Inbox label_sprint_board: Sprint board label_points_burn_down: 減少 label_points_burn_up: 增加 label_sprint_edit: Edit sprint label_sprint_new: New sprint - label_backlog_and_sprints: Backlog and sprints label_task_board: 任務看板 notice_successful_start: The sprint was started. notice_successful_finish: The sprint was completed. @@ -205,6 +211,9 @@ zh-TW: notice_unsuccessful_start_with_reason: 'The sprint could not be started: %{reason}' notice_unsuccessful_finish: The sprint could not be completed. notice_unsuccessful_finish_with_reason: 'The sprint could not be completed: %{reason}' + notice_work_package_invisible_after_move: 'The work package was moved to %{backlog} but is not visible because its type or status is excluded from the backlog. + + ' permission_create_sprints: Create sprints permission_manage_sprint_items: Manage sprint items permission_select_backlog_types_and_statuses: Select backlog types and statuses diff --git a/modules/bim/config/locales/crowdin/af.yml b/modules/bim/config/locales/crowdin/af.yml index 0fc50cdaf74..054c05fdedc 100644 --- a/modules/bim/config/locales/crowdin/af.yml +++ b/modules/bim/config/locales/crowdin/af.yml @@ -73,6 +73,10 @@ af: project_module_bim: BSF permission_view_linked_issues: Kyk na BSF-kwessies permission_manage_bcf: Voer en bestuur BSF-kwessies + permission_manage_bcf_explanation: | + Allows managing BCF issues, including bulk import and updates. + BCF import maps file metadata to project resources and can create or update work packages + and comments using author and timestamp values from the imported file, effectively acting on behalf of users. permission_delete_bcf: Vee BSF-kwessies uit oauth: scopes: diff --git a/modules/bim/config/locales/crowdin/ar.yml b/modules/bim/config/locales/crowdin/ar.yml index f10ee38e0d0..fd6a8a3465f 100644 --- a/modules/bim/config/locales/crowdin/ar.yml +++ b/modules/bim/config/locales/crowdin/ar.yml @@ -73,6 +73,10 @@ ar: project_module_bim: BCF permission_view_linked_issues: لا توجد مشاكل BCF permission_manage_bcf: استيراد وإدارة مشكلات BCF + permission_manage_bcf_explanation: | + Allows managing BCF issues, including bulk import and updates. + BCF import maps file metadata to project resources and can create or update work packages + and comments using author and timestamp values from the imported file, effectively acting on behalf of users. permission_delete_bcf: Delete BCF issues oauth: scopes: diff --git a/modules/bim/config/locales/crowdin/az.yml b/modules/bim/config/locales/crowdin/az.yml index a6df86baaf8..8494215981a 100644 --- a/modules/bim/config/locales/crowdin/az.yml +++ b/modules/bim/config/locales/crowdin/az.yml @@ -73,6 +73,10 @@ az: project_module_bim: BCF permission_view_linked_issues: View BCF issues permission_manage_bcf: Import and manage BCF issues + permission_manage_bcf_explanation: | + Allows managing BCF issues, including bulk import and updates. + BCF import maps file metadata to project resources and can create or update work packages + and comments using author and timestamp values from the imported file, effectively acting on behalf of users. permission_delete_bcf: Delete BCF issues oauth: scopes: diff --git a/modules/bim/config/locales/crowdin/be.yml b/modules/bim/config/locales/crowdin/be.yml index 802f7befbea..85a59643714 100644 --- a/modules/bim/config/locales/crowdin/be.yml +++ b/modules/bim/config/locales/crowdin/be.yml @@ -73,6 +73,10 @@ be: project_module_bim: BCF permission_view_linked_issues: View BCF issues permission_manage_bcf: Import and manage BCF issues + permission_manage_bcf_explanation: | + Allows managing BCF issues, including bulk import and updates. + BCF import maps file metadata to project resources and can create or update work packages + and comments using author and timestamp values from the imported file, effectively acting on behalf of users. permission_delete_bcf: Delete BCF issues oauth: scopes: diff --git a/modules/bim/config/locales/crowdin/bg.yml b/modules/bim/config/locales/crowdin/bg.yml index e23b3cf76ab..20a8615c2b9 100644 --- a/modules/bim/config/locales/crowdin/bg.yml +++ b/modules/bim/config/locales/crowdin/bg.yml @@ -73,6 +73,10 @@ bg: project_module_bim: BCF permission_view_linked_issues: View BCF issues permission_manage_bcf: Import and manage BCF issues + permission_manage_bcf_explanation: | + Allows managing BCF issues, including bulk import and updates. + BCF import maps file metadata to project resources and can create or update work packages + and comments using author and timestamp values from the imported file, effectively acting on behalf of users. permission_delete_bcf: Delete BCF issues oauth: scopes: diff --git a/modules/bim/config/locales/crowdin/ca.yml b/modules/bim/config/locales/crowdin/ca.yml index 6e75a6fcf00..352f7c0cba5 100644 --- a/modules/bim/config/locales/crowdin/ca.yml +++ b/modules/bim/config/locales/crowdin/ca.yml @@ -75,6 +75,10 @@ ca: project_module_bim: BCF permission_view_linked_issues: Visualitza els elements de BCF permission_manage_bcf: Importa i administra els elements de BCF + permission_manage_bcf_explanation: | + Allows managing BCF issues, including bulk import and updates. + BCF import maps file metadata to project resources and can create or update work packages + and comments using author and timestamp values from the imported file, effectively acting on behalf of users. permission_delete_bcf: Elimina els elements de BCF oauth: scopes: diff --git a/modules/bim/config/locales/crowdin/ckb-IR.yml b/modules/bim/config/locales/crowdin/ckb-IR.yml index 5397de73cef..68fcdeede1f 100644 --- a/modules/bim/config/locales/crowdin/ckb-IR.yml +++ b/modules/bim/config/locales/crowdin/ckb-IR.yml @@ -73,6 +73,10 @@ ckb-IR: project_module_bim: BCF permission_view_linked_issues: View BCF issues permission_manage_bcf: Import and manage BCF issues + permission_manage_bcf_explanation: | + Allows managing BCF issues, including bulk import and updates. + BCF import maps file metadata to project resources and can create or update work packages + and comments using author and timestamp values from the imported file, effectively acting on behalf of users. permission_delete_bcf: Delete BCF issues oauth: scopes: diff --git a/modules/bim/config/locales/crowdin/cs.yml b/modules/bim/config/locales/crowdin/cs.yml index a84a8d45491..f973c5932b0 100644 --- a/modules/bim/config/locales/crowdin/cs.yml +++ b/modules/bim/config/locales/crowdin/cs.yml @@ -73,6 +73,10 @@ cs: project_module_bim: BCF permission_view_linked_issues: Zobrazit problémy s BCF permission_manage_bcf: Importovat a spravovat problémy s BCF. + permission_manage_bcf_explanation: | + Allows managing BCF issues, including bulk import and updates. + BCF import maps file metadata to project resources and can create or update work packages + and comments using author and timestamp values from the imported file, effectively acting on behalf of users. permission_delete_bcf: Odstranit problémy BCF oauth: scopes: diff --git a/modules/bim/config/locales/crowdin/da.yml b/modules/bim/config/locales/crowdin/da.yml index bcd841adab7..938e48e4f1d 100644 --- a/modules/bim/config/locales/crowdin/da.yml +++ b/modules/bim/config/locales/crowdin/da.yml @@ -73,6 +73,10 @@ da: project_module_bim: BCF permission_view_linked_issues: Vis BCF-problemer permission_manage_bcf: Import og administrer BCF-problemer + permission_manage_bcf_explanation: | + Allows managing BCF issues, including bulk import and updates. + BCF import maps file metadata to project resources and can create or update work packages + and comments using author and timestamp values from the imported file, effectively acting on behalf of users. permission_delete_bcf: Slet BCF sager oauth: scopes: diff --git a/modules/bim/config/locales/crowdin/de.yml b/modules/bim/config/locales/crowdin/de.yml index 07f079b97a8..eb2bc48a9a5 100644 --- a/modules/bim/config/locales/crowdin/de.yml +++ b/modules/bim/config/locales/crowdin/de.yml @@ -73,6 +73,10 @@ de: project_module_bim: BCF permission_view_linked_issues: BCF-Fälle anzeigen permission_manage_bcf: BCF-Fälle importieren und verwalten + permission_manage_bcf_explanation: | + Ermöglicht die Verwaltung von BCF-Projekten, einschließlich Massenimport und Aktualisierungen. + Der BCF-Import ordnet die Datei-Metadaten den Projektressourcen zu und kann Arbeitspakete + und Kommentare unter Verwendung von Autoren- und Zeitstempelwerten aus der importierten Datei erstellen oder aktualisieren, wobei er effektiv im Namen der Benutzer handelt. permission_delete_bcf: BCF-Fälle löschen oauth: scopes: diff --git a/modules/bim/config/locales/crowdin/el.yml b/modules/bim/config/locales/crowdin/el.yml index 56df2640678..ef72c17c4aa 100644 --- a/modules/bim/config/locales/crowdin/el.yml +++ b/modules/bim/config/locales/crowdin/el.yml @@ -73,6 +73,10 @@ el: project_module_bim: BCF permission_view_linked_issues: Προβολή ζητημάτων BCF permission_manage_bcf: Εισαγωγή και διαχείριση ζητημάτων BCF + permission_manage_bcf_explanation: | + Allows managing BCF issues, including bulk import and updates. + BCF import maps file metadata to project resources and can create or update work packages + and comments using author and timestamp values from the imported file, effectively acting on behalf of users. permission_delete_bcf: Διαγραφή ζητημάτων BCF oauth: scopes: diff --git a/modules/bim/config/locales/crowdin/eo.yml b/modules/bim/config/locales/crowdin/eo.yml index 3a09b5b7433..901df5cebec 100644 --- a/modules/bim/config/locales/crowdin/eo.yml +++ b/modules/bim/config/locales/crowdin/eo.yml @@ -73,6 +73,10 @@ eo: project_module_bim: BCF permission_view_linked_issues: View BCF issues permission_manage_bcf: Import and manage BCF issues + permission_manage_bcf_explanation: | + Allows managing BCF issues, including bulk import and updates. + BCF import maps file metadata to project resources and can create or update work packages + and comments using author and timestamp values from the imported file, effectively acting on behalf of users. permission_delete_bcf: Delete BCF issues oauth: scopes: diff --git a/modules/bim/config/locales/crowdin/es.yml b/modules/bim/config/locales/crowdin/es.yml index 5639dbe3b59..d45098608bd 100644 --- a/modules/bim/config/locales/crowdin/es.yml +++ b/modules/bim/config/locales/crowdin/es.yml @@ -73,6 +73,10 @@ es: project_module_bim: BCF permission_view_linked_issues: Ver incidencias de BCF permission_manage_bcf: Importar y administrar incidencias de BCF + permission_manage_bcf_explanation: | + Permite gestionar incidencias de BCF, incluyendo la importación y actualización en masa. + La importación de BCF asigna los metadatos del archivo a los recursos del proyecto y puede crear o actualizar paquetes de trabajo + y comentarios utilizando los valores de autor y marca de tiempo del archivo importado, actuando así en nombre de los usuarios. permission_delete_bcf: Eliminar incidencias BCF oauth: scopes: diff --git a/modules/bim/config/locales/crowdin/et.yml b/modules/bim/config/locales/crowdin/et.yml index 2275bdd5333..d209339d276 100644 --- a/modules/bim/config/locales/crowdin/et.yml +++ b/modules/bim/config/locales/crowdin/et.yml @@ -73,6 +73,10 @@ et: project_module_bim: BCF permission_view_linked_issues: View BCF issues permission_manage_bcf: Import and manage BCF issues + permission_manage_bcf_explanation: | + Allows managing BCF issues, including bulk import and updates. + BCF import maps file metadata to project resources and can create or update work packages + and comments using author and timestamp values from the imported file, effectively acting on behalf of users. permission_delete_bcf: Delete BCF issues oauth: scopes: diff --git a/modules/bim/config/locales/crowdin/eu.yml b/modules/bim/config/locales/crowdin/eu.yml index 1e2abbf5c38..54a14009eb5 100644 --- a/modules/bim/config/locales/crowdin/eu.yml +++ b/modules/bim/config/locales/crowdin/eu.yml @@ -73,6 +73,10 @@ eu: project_module_bim: BCF permission_view_linked_issues: View BCF issues permission_manage_bcf: Import and manage BCF issues + permission_manage_bcf_explanation: | + Allows managing BCF issues, including bulk import and updates. + BCF import maps file metadata to project resources and can create or update work packages + and comments using author and timestamp values from the imported file, effectively acting on behalf of users. permission_delete_bcf: Delete BCF issues oauth: scopes: diff --git a/modules/bim/config/locales/crowdin/fa.yml b/modules/bim/config/locales/crowdin/fa.yml index e97efd95769..202a84af96a 100644 --- a/modules/bim/config/locales/crowdin/fa.yml +++ b/modules/bim/config/locales/crowdin/fa.yml @@ -75,6 +75,10 @@ fa: project_module_bim: BCF permission_view_linked_issues: مشاهده مشکلات BCF permission_manage_bcf: وارد کردن و مدیریت مشکلات BCF + permission_manage_bcf_explanation: | + Allows managing BCF issues, including bulk import and updates. + BCF import maps file metadata to project resources and can create or update work packages + and comments using author and timestamp values from the imported file, effectively acting on behalf of users. permission_delete_bcf: مشکلات حذف BCF oauth: scopes: diff --git a/modules/bim/config/locales/crowdin/fi.yml b/modules/bim/config/locales/crowdin/fi.yml index 2c86540e566..378b43de426 100644 --- a/modules/bim/config/locales/crowdin/fi.yml +++ b/modules/bim/config/locales/crowdin/fi.yml @@ -73,6 +73,10 @@ fi: project_module_bim: BCF permission_view_linked_issues: View BCF issues permission_manage_bcf: Import and manage BCF issues + permission_manage_bcf_explanation: | + Allows managing BCF issues, including bulk import and updates. + BCF import maps file metadata to project resources and can create or update work packages + and comments using author and timestamp values from the imported file, effectively acting on behalf of users. permission_delete_bcf: Delete BCF issues oauth: scopes: diff --git a/modules/bim/config/locales/crowdin/fil.yml b/modules/bim/config/locales/crowdin/fil.yml index a53b2f17543..509c73a2942 100644 --- a/modules/bim/config/locales/crowdin/fil.yml +++ b/modules/bim/config/locales/crowdin/fil.yml @@ -73,6 +73,10 @@ fil: project_module_bim: BCF permission_view_linked_issues: View BCF issues permission_manage_bcf: Import and manage BCF issues + permission_manage_bcf_explanation: | + Allows managing BCF issues, including bulk import and updates. + BCF import maps file metadata to project resources and can create or update work packages + and comments using author and timestamp values from the imported file, effectively acting on behalf of users. permission_delete_bcf: Delete BCF issues oauth: scopes: diff --git a/modules/bim/config/locales/crowdin/fr.yml b/modules/bim/config/locales/crowdin/fr.yml index 529f2ca740e..e124a77304f 100644 --- a/modules/bim/config/locales/crowdin/fr.yml +++ b/modules/bim/config/locales/crowdin/fr.yml @@ -61,7 +61,7 @@ fr: perform_description: Voulez-vous importer ou mettre à jour les problèmes repris ci-dessus ? replace_with_system_user: Les remplacer par l'utilisateur "Système" import_as_system_user: Les importer comme utilisateur "Système". - what_to_do: Que voulez-vous faire ? + what_to_do: Que voulez-vous faire? work_package_has_newer_changes: Obsolète ! Ce sujet n'a pas été mis à jour, car les derniers changements sur le serveur étaient plus récents que la "ModifiedDate" du sujet importé. Toutefois, les commentaires sur le sujet ont été importés. bcf_file_not_found: Impossible de localiser le fichier BCF. Veuillez recommencer le processus de téléversement. export: @@ -73,6 +73,10 @@ fr: project_module_bim: BCF permission_view_linked_issues: Voir les problèmes BCF permission_manage_bcf: Importer et gérer les problèmes BCF + permission_manage_bcf_explanation: | + Permet de gérer les questions BCF, y compris l'importation en masse et les mises à jour. + L'importation BCF associe les métadonnées des fichiers aux ressources du projet et peut créer ou mettre à jour les work packages + et les commentaires en utilisant les valeurs d'auteur et d'horodatage du fichier importé, agissant ainsi pour le compte des utilisateurs. permission_delete_bcf: Supprimer les problèmes BCF oauth: scopes: diff --git a/modules/bim/config/locales/crowdin/he.yml b/modules/bim/config/locales/crowdin/he.yml index 18907a5ce45..bd07bfd8b76 100644 --- a/modules/bim/config/locales/crowdin/he.yml +++ b/modules/bim/config/locales/crowdin/he.yml @@ -73,6 +73,10 @@ he: project_module_bim: BCF permission_view_linked_issues: View BCF issues permission_manage_bcf: Import and manage BCF issues + permission_manage_bcf_explanation: | + Allows managing BCF issues, including bulk import and updates. + BCF import maps file metadata to project resources and can create or update work packages + and comments using author and timestamp values from the imported file, effectively acting on behalf of users. permission_delete_bcf: Delete BCF issues oauth: scopes: diff --git a/modules/bim/config/locales/crowdin/hi.yml b/modules/bim/config/locales/crowdin/hi.yml index 25fb9e9affc..89fa0b3a314 100644 --- a/modules/bim/config/locales/crowdin/hi.yml +++ b/modules/bim/config/locales/crowdin/hi.yml @@ -73,6 +73,10 @@ hi: project_module_bim: BCF permission_view_linked_issues: View BCF issues permission_manage_bcf: Import and manage BCF issues + permission_manage_bcf_explanation: | + Allows managing BCF issues, including bulk import and updates. + BCF import maps file metadata to project resources and can create or update work packages + and comments using author and timestamp values from the imported file, effectively acting on behalf of users. permission_delete_bcf: Delete BCF issues oauth: scopes: diff --git a/modules/bim/config/locales/crowdin/hr.yml b/modules/bim/config/locales/crowdin/hr.yml index 34b92389d2c..e8e889c054b 100644 --- a/modules/bim/config/locales/crowdin/hr.yml +++ b/modules/bim/config/locales/crowdin/hr.yml @@ -73,6 +73,10 @@ hr: project_module_bim: BCF permission_view_linked_issues: View BCF issues permission_manage_bcf: Import and manage BCF issues + permission_manage_bcf_explanation: | + Allows managing BCF issues, including bulk import and updates. + BCF import maps file metadata to project resources and can create or update work packages + and comments using author and timestamp values from the imported file, effectively acting on behalf of users. permission_delete_bcf: Delete BCF issues oauth: scopes: diff --git a/modules/bim/config/locales/crowdin/hu.yml b/modules/bim/config/locales/crowdin/hu.yml index 64823f305cc..b956b8f6351 100644 --- a/modules/bim/config/locales/crowdin/hu.yml +++ b/modules/bim/config/locales/crowdin/hu.yml @@ -73,6 +73,10 @@ hu: project_module_bim: BCF permission_view_linked_issues: Nézd BCF eredmény permission_manage_bcf: Import és manage BCF eredmények + permission_manage_bcf_explanation: | + Allows managing BCF issues, including bulk import and updates. + BCF import maps file metadata to project resources and can create or update work packages + and comments using author and timestamp values from the imported file, effectively acting on behalf of users. permission_delete_bcf: Törölje a BCF -problémákat oauth: scopes: diff --git a/modules/bim/config/locales/crowdin/hy.yml b/modules/bim/config/locales/crowdin/hy.yml index e6731684abf..0570cc0ae9f 100644 --- a/modules/bim/config/locales/crowdin/hy.yml +++ b/modules/bim/config/locales/crowdin/hy.yml @@ -73,6 +73,10 @@ hy: project_module_bim: BCF permission_view_linked_issues: View BCF issues permission_manage_bcf: Import and manage BCF issues + permission_manage_bcf_explanation: | + Allows managing BCF issues, including bulk import and updates. + BCF import maps file metadata to project resources and can create or update work packages + and comments using author and timestamp values from the imported file, effectively acting on behalf of users. permission_delete_bcf: Delete BCF issues oauth: scopes: diff --git a/modules/bim/config/locales/crowdin/id.yml b/modules/bim/config/locales/crowdin/id.yml index ecfe9df1b34..b4f9944ad28 100644 --- a/modules/bim/config/locales/crowdin/id.yml +++ b/modules/bim/config/locales/crowdin/id.yml @@ -73,6 +73,10 @@ id: project_module_bim: BCF permission_view_linked_issues: Lihat masalah BCF permission_manage_bcf: Import dan atur masalah BCF + permission_manage_bcf_explanation: | + Allows managing BCF issues, including bulk import and updates. + BCF import maps file metadata to project resources and can create or update work packages + and comments using author and timestamp values from the imported file, effectively acting on behalf of users. permission_delete_bcf: Hapus masalah BCF oauth: scopes: diff --git a/modules/bim/config/locales/crowdin/it.yml b/modules/bim/config/locales/crowdin/it.yml index b4e6a5c2f96..9916a4a44d8 100644 --- a/modules/bim/config/locales/crowdin/it.yml +++ b/modules/bim/config/locales/crowdin/it.yml @@ -73,6 +73,9 @@ it: project_module_bim: BCF permission_view_linked_issues: Mostra problemi BCF permission_manage_bcf: Importa e gestisci problemi BCF + permission_manage_bcf_explanation: | + Consente di gestire le problematiche BCF, inclusa l'importazione e l'aggiornamento massivi. + L'importazione BCF associa i metadati dei file alle risorse del progetto e può creare o aggiornare macro-attività e commenti utilizzando gli autori e le marche temporali presenti nel file importato, operando di fatto per conto degli utenti. permission_delete_bcf: Elimina i problemi BCF oauth: scopes: diff --git a/modules/bim/config/locales/crowdin/ja.yml b/modules/bim/config/locales/crowdin/ja.yml index e9d9debc7cc..c90e8f7f292 100644 --- a/modules/bim/config/locales/crowdin/ja.yml +++ b/modules/bim/config/locales/crowdin/ja.yml @@ -73,6 +73,10 @@ ja: project_module_bim: BCF permission_view_linked_issues: BCF チケットを表示 permission_manage_bcf: BCF チケットのインポートと管理 + permission_manage_bcf_explanation: | + Allows managing BCF issues, including bulk import and updates. + BCF import maps file metadata to project resources and can create or update work packages + and comments using author and timestamp values from the imported file, effectively acting on behalf of users. permission_delete_bcf: BCFチケットの削除 oauth: scopes: diff --git a/modules/bim/config/locales/crowdin/ka.yml b/modules/bim/config/locales/crowdin/ka.yml index c361c0b9cd8..21251abdec7 100644 --- a/modules/bim/config/locales/crowdin/ka.yml +++ b/modules/bim/config/locales/crowdin/ka.yml @@ -73,6 +73,10 @@ ka: project_module_bim: BCF permission_view_linked_issues: View BCF issues permission_manage_bcf: Import and manage BCF issues + permission_manage_bcf_explanation: | + Allows managing BCF issues, including bulk import and updates. + BCF import maps file metadata to project resources and can create or update work packages + and comments using author and timestamp values from the imported file, effectively acting on behalf of users. permission_delete_bcf: Delete BCF issues oauth: scopes: diff --git a/modules/bim/config/locales/crowdin/kk.yml b/modules/bim/config/locales/crowdin/kk.yml index 1eaea2c2212..ece0f4d8892 100644 --- a/modules/bim/config/locales/crowdin/kk.yml +++ b/modules/bim/config/locales/crowdin/kk.yml @@ -73,6 +73,10 @@ kk: project_module_bim: BCF permission_view_linked_issues: View BCF issues permission_manage_bcf: Import and manage BCF issues + permission_manage_bcf_explanation: | + Allows managing BCF issues, including bulk import and updates. + BCF import maps file metadata to project resources and can create or update work packages + and comments using author and timestamp values from the imported file, effectively acting on behalf of users. permission_delete_bcf: Delete BCF issues oauth: scopes: diff --git a/modules/bim/config/locales/crowdin/ko.yml b/modules/bim/config/locales/crowdin/ko.yml index ba2c181e93f..d076c1dd3b2 100644 --- a/modules/bim/config/locales/crowdin/ko.yml +++ b/modules/bim/config/locales/crowdin/ko.yml @@ -73,6 +73,10 @@ ko: project_module_bim: BCF permission_view_linked_issues: BCF 이슈 보기 permission_manage_bcf: BCF 이슈 가져오기 및 관리 + permission_manage_bcf_explanation: | + 대량 가져오기 및 업데이트를 포함한 BCF 이슈를 관리할 수 있습니다. + BCF 가져오기는 파일 메타데이터를 프로젝트 리소스에 매핑하고, 가져온 파일의 + 작성자 및 타임스탬프 값을 사용하여 작업 패키지 및 코멘트를 생성하거나 업데이트하므로, 사용자를 대신하여 효과적으로 작업을 수행할 수 있습니다. permission_delete_bcf: BCF 이슈 삭제 oauth: scopes: diff --git a/modules/bim/config/locales/crowdin/lt.yml b/modules/bim/config/locales/crowdin/lt.yml index 8dc34d7a3fd..7307d8778d6 100644 --- a/modules/bim/config/locales/crowdin/lt.yml +++ b/modules/bim/config/locales/crowdin/lt.yml @@ -73,6 +73,10 @@ lt: project_module_bim: BCF permission_view_linked_issues: Peržiūrėti BCF trūkumus permission_manage_bcf: Įkelti ir valdyti BCF trūkumus + permission_manage_bcf_explanation: | + Allows managing BCF issues, including bulk import and updates. + BCF import maps file metadata to project resources and can create or update work packages + and comments using author and timestamp values from the imported file, effectively acting on behalf of users. permission_delete_bcf: Pašalinti BCF trūkumus oauth: scopes: diff --git a/modules/bim/config/locales/crowdin/lv.yml b/modules/bim/config/locales/crowdin/lv.yml index c7d59cb8909..bc52e4def9d 100644 --- a/modules/bim/config/locales/crowdin/lv.yml +++ b/modules/bim/config/locales/crowdin/lv.yml @@ -73,6 +73,10 @@ lv: project_module_bim: BCF permission_view_linked_issues: View BCF issues permission_manage_bcf: Import and manage BCF issues + permission_manage_bcf_explanation: | + Allows managing BCF issues, including bulk import and updates. + BCF import maps file metadata to project resources and can create or update work packages + and comments using author and timestamp values from the imported file, effectively acting on behalf of users. permission_delete_bcf: Delete BCF issues oauth: scopes: diff --git a/modules/bim/config/locales/crowdin/mn.yml b/modules/bim/config/locales/crowdin/mn.yml index 23895727c7b..e6893e26205 100644 --- a/modules/bim/config/locales/crowdin/mn.yml +++ b/modules/bim/config/locales/crowdin/mn.yml @@ -73,6 +73,10 @@ mn: project_module_bim: BCF permission_view_linked_issues: View BCF issues permission_manage_bcf: Import and manage BCF issues + permission_manage_bcf_explanation: | + Allows managing BCF issues, including bulk import and updates. + BCF import maps file metadata to project resources and can create or update work packages + and comments using author and timestamp values from the imported file, effectively acting on behalf of users. permission_delete_bcf: Delete BCF issues oauth: scopes: diff --git a/modules/bim/config/locales/crowdin/ms.yml b/modules/bim/config/locales/crowdin/ms.yml index bc9608963f5..ac7eec435ed 100644 --- a/modules/bim/config/locales/crowdin/ms.yml +++ b/modules/bim/config/locales/crowdin/ms.yml @@ -73,6 +73,10 @@ ms: project_module_bim: BCF permission_view_linked_issues: Lihat isu BCF permission_manage_bcf: Import dan urus isu BCF + permission_manage_bcf_explanation: | + Allows managing BCF issues, including bulk import and updates. + BCF import maps file metadata to project resources and can create or update work packages + and comments using author and timestamp values from the imported file, effectively acting on behalf of users. permission_delete_bcf: Padamkan isu BCF oauth: scopes: diff --git a/modules/bim/config/locales/crowdin/ne.yml b/modules/bim/config/locales/crowdin/ne.yml index 67283d0fefa..2dc8f92f5ea 100644 --- a/modules/bim/config/locales/crowdin/ne.yml +++ b/modules/bim/config/locales/crowdin/ne.yml @@ -73,6 +73,10 @@ ne: project_module_bim: BCF permission_view_linked_issues: View BCF issues permission_manage_bcf: Import and manage BCF issues + permission_manage_bcf_explanation: | + Allows managing BCF issues, including bulk import and updates. + BCF import maps file metadata to project resources and can create or update work packages + and comments using author and timestamp values from the imported file, effectively acting on behalf of users. permission_delete_bcf: Delete BCF issues oauth: scopes: diff --git a/modules/bim/config/locales/crowdin/nl.yml b/modules/bim/config/locales/crowdin/nl.yml index a2fef567893..f802123fb24 100644 --- a/modules/bim/config/locales/crowdin/nl.yml +++ b/modules/bim/config/locales/crowdin/nl.yml @@ -73,6 +73,10 @@ nl: project_module_bim: BCF permission_view_linked_issues: Bekijk alle BCF-kwesties permission_manage_bcf: BCF-problemen importeren en beheren + permission_manage_bcf_explanation: | + Allows managing BCF issues, including bulk import and updates. + BCF import maps file metadata to project resources and can create or update work packages + and comments using author and timestamp values from the imported file, effectively acting on behalf of users. permission_delete_bcf: BCF problemen verwijderen oauth: scopes: diff --git a/modules/bim/config/locales/crowdin/no.yml b/modules/bim/config/locales/crowdin/no.yml index ea11e478df8..2ba4d500238 100644 --- a/modules/bim/config/locales/crowdin/no.yml +++ b/modules/bim/config/locales/crowdin/no.yml @@ -73,6 +73,10 @@ project_module_bim: BCF permission_view_linked_issues: Vis BCF-utfordringer permission_manage_bcf: Importer og behandle BCF-utfordringer + permission_manage_bcf_explanation: | + Allows managing BCF issues, including bulk import and updates. + BCF import maps file metadata to project resources and can create or update work packages + and comments using author and timestamp values from the imported file, effectively acting on behalf of users. permission_delete_bcf: Slett BCF-utfordringer oauth: scopes: diff --git a/modules/bim/config/locales/crowdin/pl.yml b/modules/bim/config/locales/crowdin/pl.yml index d0e1eb98c71..a0db3e81014 100644 --- a/modules/bim/config/locales/crowdin/pl.yml +++ b/modules/bim/config/locales/crowdin/pl.yml @@ -73,6 +73,9 @@ pl: project_module_bim: BCF permission_view_linked_issues: Wyświetlanie problemów BCF permission_manage_bcf: Importowanie problemów BCF i zarządzanie nimi + permission_manage_bcf_explanation: | + Umożliwia zarządzanie problemami BCF, takimi jak zbiorczy import i aktualizacje. + Import BCF mapuje metadane pliku na zasoby projektu i może tworzyć lub aktualizować pakiety robocze oraz komentarze przy użyciu wartości autora i aygnatury czasowej z importowanego pliku, skutecznie działając w imieniu użytkowników. permission_delete_bcf: Usuń problemy BCF oauth: scopes: diff --git a/modules/bim/config/locales/crowdin/pt-BR.yml b/modules/bim/config/locales/crowdin/pt-BR.yml index 7de1523490e..386215f6188 100644 --- a/modules/bim/config/locales/crowdin/pt-BR.yml +++ b/modules/bim/config/locales/crowdin/pt-BR.yml @@ -73,6 +73,9 @@ pt-BR: project_module_bim: BCF permission_view_linked_issues: Visualizar problemas do BCF permission_manage_bcf: Importar e gerenciar problemas do BCF + permission_manage_bcf_explanation: 'Permite gerenciar issues BCF, incluindo importação e atualização em massa. A importação BCF mapeia metadados do arquivo para recursos do projeto e pode criar ou atualizar pacotes de trabalho e comentários usando valores de autor e carimbo de data/hora do arquivo importado, atuando efetivamente em nome dos usuários. + + ' permission_delete_bcf: Excluir problemas de BCF oauth: scopes: diff --git a/modules/bim/config/locales/crowdin/pt-PT.yml b/modules/bim/config/locales/crowdin/pt-PT.yml index 9d7907cd33c..5f534a8fafb 100644 --- a/modules/bim/config/locales/crowdin/pt-PT.yml +++ b/modules/bim/config/locales/crowdin/pt-PT.yml @@ -73,6 +73,9 @@ pt-PT: project_module_bim: BCF permission_view_linked_issues: Ver problemas do BCF permission_manage_bcf: Importar e gerir problemas do BCF + permission_manage_bcf_explanation: 'A importação BCF mapeia os metadados do ficheiro para os recursos do projeto e pode criar ou atualizar pacotes de trabalho e comentários com valores de autor, bem como data e hora do ficheiro importado, agindo efetivamente em nome dos utilizadores. + + ' permission_delete_bcf: Eliminar problemas de BCF oauth: scopes: diff --git a/modules/bim/config/locales/crowdin/ro.yml b/modules/bim/config/locales/crowdin/ro.yml index 7694a7c7285..09e9b9ab91b 100644 --- a/modules/bim/config/locales/crowdin/ro.yml +++ b/modules/bim/config/locales/crowdin/ro.yml @@ -73,6 +73,10 @@ ro: project_module_bim: BCF permission_view_linked_issues: Vezi problemele BCF permission_manage_bcf: Importați și gestionați problemele BCF + permission_manage_bcf_explanation: | + Allows managing BCF issues, including bulk import and updates. + BCF import maps file metadata to project resources and can create or update work packages + and comments using author and timestamp values from the imported file, effectively acting on behalf of users. permission_delete_bcf: Ștergerea problemelor BCF oauth: scopes: diff --git a/modules/bim/config/locales/crowdin/ru.yml b/modules/bim/config/locales/crowdin/ru.yml index b3c9d4067c3..fa5d53c409e 100644 --- a/modules/bim/config/locales/crowdin/ru.yml +++ b/modules/bim/config/locales/crowdin/ru.yml @@ -73,6 +73,10 @@ ru: project_module_bim: BCF permission_view_linked_issues: Просмотр проблем BCF permission_manage_bcf: Импорт и управление проблемами BCF + permission_manage_bcf_explanation: | + Allows managing BCF issues, including bulk import and updates. + BCF import maps file metadata to project resources and can create or update work packages + and comments using author and timestamp values from the imported file, effectively acting on behalf of users. permission_delete_bcf: Удалить задачи BCF oauth: scopes: diff --git a/modules/bim/config/locales/crowdin/rw.yml b/modules/bim/config/locales/crowdin/rw.yml index cd477949a93..a57e8fbb753 100644 --- a/modules/bim/config/locales/crowdin/rw.yml +++ b/modules/bim/config/locales/crowdin/rw.yml @@ -73,6 +73,10 @@ rw: project_module_bim: BCF permission_view_linked_issues: View BCF issues permission_manage_bcf: Import and manage BCF issues + permission_manage_bcf_explanation: | + Allows managing BCF issues, including bulk import and updates. + BCF import maps file metadata to project resources and can create or update work packages + and comments using author and timestamp values from the imported file, effectively acting on behalf of users. permission_delete_bcf: Delete BCF issues oauth: scopes: diff --git a/modules/bim/config/locales/crowdin/si.yml b/modules/bim/config/locales/crowdin/si.yml index 59f52c5b801..fba2bdbf5ef 100644 --- a/modules/bim/config/locales/crowdin/si.yml +++ b/modules/bim/config/locales/crowdin/si.yml @@ -73,6 +73,10 @@ si: project_module_bim: BCF permission_view_linked_issues: BCF ගැටළු බලන්න permission_manage_bcf: BCF ගැටළු ආනයනය කිරීම සහ කළමනාකරණය කිරීම + permission_manage_bcf_explanation: | + Allows managing BCF issues, including bulk import and updates. + BCF import maps file metadata to project resources and can create or update work packages + and comments using author and timestamp values from the imported file, effectively acting on behalf of users. permission_delete_bcf: Delete BCF issues oauth: scopes: diff --git a/modules/bim/config/locales/crowdin/sk.yml b/modules/bim/config/locales/crowdin/sk.yml index b8c72f249cc..f7e84888b8a 100644 --- a/modules/bim/config/locales/crowdin/sk.yml +++ b/modules/bim/config/locales/crowdin/sk.yml @@ -73,6 +73,10 @@ sk: project_module_bim: BCF permission_view_linked_issues: View BCF issues permission_manage_bcf: Import and manage BCF issues + permission_manage_bcf_explanation: | + Allows managing BCF issues, including bulk import and updates. + BCF import maps file metadata to project resources and can create or update work packages + and comments using author and timestamp values from the imported file, effectively acting on behalf of users. permission_delete_bcf: Delete BCF issues oauth: scopes: diff --git a/modules/bim/config/locales/crowdin/sl.yml b/modules/bim/config/locales/crowdin/sl.yml index c933644590b..91ca6c69cc7 100644 --- a/modules/bim/config/locales/crowdin/sl.yml +++ b/modules/bim/config/locales/crowdin/sl.yml @@ -75,6 +75,10 @@ sl: project_module_bim: BCF permission_view_linked_issues: Prikaži BCF težave permission_manage_bcf: Uvozite in upravljajte BCF težave + permission_manage_bcf_explanation: | + Allows managing BCF issues, including bulk import and updates. + BCF import maps file metadata to project resources and can create or update work packages + and comments using author and timestamp values from the imported file, effectively acting on behalf of users. permission_delete_bcf: Izbriši BCF probleme oauth: scopes: diff --git a/modules/bim/config/locales/crowdin/sr.yml b/modules/bim/config/locales/crowdin/sr.yml index ceff5bdac91..2086e42a3dd 100644 --- a/modules/bim/config/locales/crowdin/sr.yml +++ b/modules/bim/config/locales/crowdin/sr.yml @@ -73,6 +73,10 @@ sr: project_module_bim: BCF permission_view_linked_issues: View BCF issues permission_manage_bcf: Import and manage BCF issues + permission_manage_bcf_explanation: | + Allows managing BCF issues, including bulk import and updates. + BCF import maps file metadata to project resources and can create or update work packages + and comments using author and timestamp values from the imported file, effectively acting on behalf of users. permission_delete_bcf: Delete BCF issues oauth: scopes: diff --git a/modules/bim/config/locales/crowdin/sv.yml b/modules/bim/config/locales/crowdin/sv.yml index 9ef7a2bca89..5879d268125 100644 --- a/modules/bim/config/locales/crowdin/sv.yml +++ b/modules/bim/config/locales/crowdin/sv.yml @@ -73,6 +73,10 @@ sv: project_module_bim: BCF permission_view_linked_issues: Visa BCF-problem permission_manage_bcf: Importera och hantera BCF-problem + permission_manage_bcf_explanation: | + Allows managing BCF issues, including bulk import and updates. + BCF import maps file metadata to project resources and can create or update work packages + and comments using author and timestamp values from the imported file, effectively acting on behalf of users. permission_delete_bcf: Ta bort BCF-ärenden oauth: scopes: diff --git a/modules/bim/config/locales/crowdin/th.yml b/modules/bim/config/locales/crowdin/th.yml index a239ff66ab5..929f4f9b5c2 100644 --- a/modules/bim/config/locales/crowdin/th.yml +++ b/modules/bim/config/locales/crowdin/th.yml @@ -73,6 +73,10 @@ th: project_module_bim: BCF permission_view_linked_issues: View BCF issues permission_manage_bcf: Import and manage BCF issues + permission_manage_bcf_explanation: | + Allows managing BCF issues, including bulk import and updates. + BCF import maps file metadata to project resources and can create or update work packages + and comments using author and timestamp values from the imported file, effectively acting on behalf of users. permission_delete_bcf: Delete BCF issues oauth: scopes: diff --git a/modules/bim/config/locales/crowdin/tr.yml b/modules/bim/config/locales/crowdin/tr.yml index 52a33f80a66..94d82d9667c 100644 --- a/modules/bim/config/locales/crowdin/tr.yml +++ b/modules/bim/config/locales/crowdin/tr.yml @@ -73,6 +73,10 @@ tr: project_module_bim: BCF permission_view_linked_issues: BCF sorunlarını görüntüleyin permission_manage_bcf: BCF sorunlarını içe aktarın ve yönetin + permission_manage_bcf_explanation: | + Allows managing BCF issues, including bulk import and updates. + BCF import maps file metadata to project resources and can create or update work packages + and comments using author and timestamp values from the imported file, effectively acting on behalf of users. permission_delete_bcf: BCF sorunlarını sil oauth: scopes: diff --git a/modules/bim/config/locales/crowdin/uk.yml b/modules/bim/config/locales/crowdin/uk.yml index 49db3b87efd..9f8bd0b1b2b 100644 --- a/modules/bim/config/locales/crowdin/uk.yml +++ b/modules/bim/config/locales/crowdin/uk.yml @@ -73,6 +73,9 @@ uk: project_module_bim: BCF permission_view_linked_issues: Проглянути BCF помилки permission_manage_bcf: Імпорт помилок BCF і керування ними + permission_manage_bcf_explanation: | + Дозволяє керувати помилками BCF, зокрема виконувати масовий імпорт і оновлення. + BCF імпортує метадані файлів карт у ресурси проєктів і може створювати й оновлювати пакети робіт, а також коментарі, використовуючи значення автора й мітки часу з імпортованого файлу, фактично діючи від імені користувачів. permission_delete_bcf: Видалити помилки BCF oauth: scopes: diff --git a/modules/bim/config/locales/crowdin/uz.yml b/modules/bim/config/locales/crowdin/uz.yml index 44b60bf9cac..63d6cec5f8f 100644 --- a/modules/bim/config/locales/crowdin/uz.yml +++ b/modules/bim/config/locales/crowdin/uz.yml @@ -73,6 +73,10 @@ uz: project_module_bim: BCF permission_view_linked_issues: View BCF issues permission_manage_bcf: Import and manage BCF issues + permission_manage_bcf_explanation: | + Allows managing BCF issues, including bulk import and updates. + BCF import maps file metadata to project resources and can create or update work packages + and comments using author and timestamp values from the imported file, effectively acting on behalf of users. permission_delete_bcf: Delete BCF issues oauth: scopes: diff --git a/modules/bim/config/locales/crowdin/vi.yml b/modules/bim/config/locales/crowdin/vi.yml index 10220d25039..5c0e2df65a4 100644 --- a/modules/bim/config/locales/crowdin/vi.yml +++ b/modules/bim/config/locales/crowdin/vi.yml @@ -73,6 +73,10 @@ vi: project_module_bim: BCF permission_view_linked_issues: Xem các vấn đề trong BCF permission_manage_bcf: Nhập và quản lý các vấn đề trong BCF + permission_manage_bcf_explanation: | + Allows managing BCF issues, including bulk import and updates. + BCF import maps file metadata to project resources and can create or update work packages + and comments using author and timestamp values from the imported file, effectively acting on behalf of users. permission_delete_bcf: Xóa các vấn đề về BCF oauth: scopes: diff --git a/modules/bim/config/locales/crowdin/zh-CN.yml b/modules/bim/config/locales/crowdin/zh-CN.yml index 4cd638096ad..87090171e18 100644 --- a/modules/bim/config/locales/crowdin/zh-CN.yml +++ b/modules/bim/config/locales/crowdin/zh-CN.yml @@ -73,6 +73,10 @@ zh-CN: project_module_bim: BCF permission_view_linked_issues: 查看 BCF 问题 permission_manage_bcf: 导入和管理 BCF 问题 + permission_manage_bcf_explanation: | + 允许管理 BCF 问题,包括批量导入和更新。 + BCF 导入可以将文件元数据映射到项目资源,并使用导入文件中的作者和时间戳值创建或更新工作包 + 和注释,从而有效地代表用户执行操作。 permission_delete_bcf: 删除 BCF 问题 oauth: scopes: diff --git a/modules/bim/config/locales/crowdin/zh-TW.yml b/modules/bim/config/locales/crowdin/zh-TW.yml index 8933ff1988e..8d86092933c 100644 --- a/modules/bim/config/locales/crowdin/zh-TW.yml +++ b/modules/bim/config/locales/crowdin/zh-TW.yml @@ -73,6 +73,10 @@ zh-TW: project_module_bim: BCF permission_view_linked_issues: 查看 BCF 問題 permission_manage_bcf: 匯入及管理 BCF 問題集 + permission_manage_bcf_explanation: | + Allows managing BCF issues, including bulk import and updates. + BCF import maps file metadata to project resources and can create or update work packages + and comments using author and timestamp values from the imported file, effectively acting on behalf of users. permission_delete_bcf: 刪除 BCF 問題集 oauth: scopes: diff --git a/modules/budgets/config/locales/crowdin/cs.yml b/modules/budgets/config/locales/crowdin/cs.yml index e240588db21..12dc81fd057 100644 --- a/modules/budgets/config/locales/crowdin/cs.yml +++ b/modules/budgets/config/locales/crowdin/cs.yml @@ -28,7 +28,7 @@ cs: budget: author: Autor available: Dostupné - budget: Plánované + budget: Rozpočet budget_ratio: Stráveno (poměr) description: Popis spent: Strávený čas diff --git a/modules/costs/config/locales/crowdin/af.yml b/modules/costs/config/locales/crowdin/af.yml index 159f7f2c4ca..11de06a5644 100644 --- a/modules/costs/config/locales/crowdin/af.yml +++ b/modules/costs/config/locales/crowdin/af.yml @@ -39,6 +39,8 @@ af: unit: Unit name unit_plural: Pluralized unit name default: Cost type by default + for_all_projects: For all projects + rates: Rates work_package: costs_by_type: Spent units labor_costs: Labor costs @@ -88,6 +90,10 @@ af: work_package: is_not_a_valid_target_for_cost_entries: 'Work package #%{id} is not a valid target for reassigning the cost entries.' nullify_is_not_valid_for_cost_entries: Cost entries can not be assigned to a project. + cost_types_project: + attributes: + project_ids: + blank: Please select a project. attributes: comment: Opmerking cost_type: Cost type @@ -129,7 +135,6 @@ af: label_current_default_rate: Current default rate label_date_on: 'on' label_deleted_cost_types: Deleted cost types - label_locked_cost_types: Locked cost types label_display_cost_entries: Display unit costs label_display_time_entries: Display reported hours label_display_types: Display types @@ -229,6 +234,28 @@ af: errors: validation: start_time_different_date: Date part of startTime (%{start_time}) must be the same as the spentOn (%{spent_on}) date. + label_available_cost_types_projects: Available cost types projects + cost_types: + errors: + no_cost_types_available: No cost types are available in this project. Please contact an administrator. + admin: + columns: + active_projects: Active projects + cost_type_projects: + for_all_projects_blank_slate: + heading: This cost type is enabled in all projects + description: Uncheck "For all projects" on the details tab to limit this cost type to specific projects. + no_projects: + heading: No projects assigned + description: Add projects so this cost type can be used in them. + rates: + title: Rate history + settings: + time_and_costs: Time & Costs + cost_types: + heading: Cost types + none_active: No cost types are currently active in this project. + for_all_projects_hint: This cost type is enabled in all projects. costs: widgets: actual_costs: diff --git a/modules/costs/config/locales/crowdin/ar.yml b/modules/costs/config/locales/crowdin/ar.yml index 8152faa6cc4..801ce430acd 100644 --- a/modules/costs/config/locales/crowdin/ar.yml +++ b/modules/costs/config/locales/crowdin/ar.yml @@ -39,6 +39,8 @@ ar: unit: اسم الوحدة unit_plural: اسم الوحدة متعددة الأقطاب default: Cost type by default + for_all_projects: For all projects + rates: Rates work_package: costs_by_type: الوحدات المستهلكة labor_costs: تكاليف العمل @@ -104,6 +106,10 @@ ar: work_package: is_not_a_valid_target_for_cost_entries: 'مجموعة العمل #%{id} ليست هدفًا صالحًا لإعادة تعيين إدخالات التكلفة.' nullify_is_not_valid_for_cost_entries: لا يمكن تعيين إدخالات التكلفة للمشروع. + cost_types_project: + attributes: + project_ids: + blank: Please select a project. attributes: comment: التعليق cost_type: أنواع التكلفة @@ -145,7 +151,6 @@ ar: label_current_default_rate: المعدل الافتراضي الحالي label_date_on: على label_deleted_cost_types: أنواع التكلفة المحذوفة - label_locked_cost_types: أنواع التكلفة المغلقة label_display_cost_entries: عرض تكاليف الوحدة label_display_time_entries: عرض الساعات المبلّغ عنها label_display_types: أنواع العرض @@ -245,6 +250,28 @@ ar: errors: validation: start_time_different_date: Date part of startTime (%{start_time}) must be the same as the spentOn (%{spent_on}) date. + label_available_cost_types_projects: Available cost types projects + cost_types: + errors: + no_cost_types_available: No cost types are available in this project. Please contact an administrator. + admin: + columns: + active_projects: Active projects + cost_type_projects: + for_all_projects_blank_slate: + heading: This cost type is enabled in all projects + description: Uncheck "For all projects" on the details tab to limit this cost type to specific projects. + no_projects: + heading: No projects assigned + description: Add projects so this cost type can be used in them. + rates: + title: Rate history + settings: + time_and_costs: Time & Costs + cost_types: + heading: Cost types + none_active: No cost types are currently active in this project. + for_all_projects_hint: This cost type is enabled in all projects. costs: widgets: actual_costs: diff --git a/modules/costs/config/locales/crowdin/az.yml b/modules/costs/config/locales/crowdin/az.yml index 77f4e48e2b2..6f116649a56 100644 --- a/modules/costs/config/locales/crowdin/az.yml +++ b/modules/costs/config/locales/crowdin/az.yml @@ -39,6 +39,8 @@ az: unit: Unit name unit_plural: Pluralized unit name default: Cost type by default + for_all_projects: For all projects + rates: Rates work_package: costs_by_type: Spent units labor_costs: Labor costs @@ -88,6 +90,10 @@ az: work_package: is_not_a_valid_target_for_cost_entries: 'Work package #%{id} is not a valid target for reassigning the cost entries.' nullify_is_not_valid_for_cost_entries: Cost entries can not be assigned to a project. + cost_types_project: + attributes: + project_ids: + blank: Please select a project. attributes: comment: Comment cost_type: Cost type @@ -129,7 +135,6 @@ az: label_current_default_rate: Current default rate label_date_on: 'on' label_deleted_cost_types: Deleted cost types - label_locked_cost_types: Locked cost types label_display_cost_entries: Display unit costs label_display_time_entries: Display reported hours label_display_types: Display types @@ -229,6 +234,28 @@ az: errors: validation: start_time_different_date: Date part of startTime (%{start_time}) must be the same as the spentOn (%{spent_on}) date. + label_available_cost_types_projects: Available cost types projects + cost_types: + errors: + no_cost_types_available: No cost types are available in this project. Please contact an administrator. + admin: + columns: + active_projects: Active projects + cost_type_projects: + for_all_projects_blank_slate: + heading: This cost type is enabled in all projects + description: Uncheck "For all projects" on the details tab to limit this cost type to specific projects. + no_projects: + heading: No projects assigned + description: Add projects so this cost type can be used in them. + rates: + title: Rate history + settings: + time_and_costs: Time & Costs + cost_types: + heading: Cost types + none_active: No cost types are currently active in this project. + for_all_projects_hint: This cost type is enabled in all projects. costs: widgets: actual_costs: diff --git a/modules/costs/config/locales/crowdin/be.yml b/modules/costs/config/locales/crowdin/be.yml index ccac68b77c0..06d7d248314 100644 --- a/modules/costs/config/locales/crowdin/be.yml +++ b/modules/costs/config/locales/crowdin/be.yml @@ -39,6 +39,8 @@ be: unit: Unit name unit_plural: Pluralized unit name default: Cost type by default + for_all_projects: For all projects + rates: Rates work_package: costs_by_type: Spent units labor_costs: Labor costs @@ -96,6 +98,10 @@ be: work_package: is_not_a_valid_target_for_cost_entries: 'Work package #%{id} is not a valid target for reassigning the cost entries.' nullify_is_not_valid_for_cost_entries: Cost entries can not be assigned to a project. + cost_types_project: + attributes: + project_ids: + blank: Please select a project. attributes: comment: Comment cost_type: Cost type @@ -137,7 +143,6 @@ be: label_current_default_rate: Current default rate label_date_on: 'on' label_deleted_cost_types: Deleted cost types - label_locked_cost_types: Locked cost types label_display_cost_entries: Display unit costs label_display_time_entries: Display reported hours label_display_types: Display types @@ -237,6 +242,28 @@ be: errors: validation: start_time_different_date: Date part of startTime (%{start_time}) must be the same as the spentOn (%{spent_on}) date. + label_available_cost_types_projects: Available cost types projects + cost_types: + errors: + no_cost_types_available: No cost types are available in this project. Please contact an administrator. + admin: + columns: + active_projects: Active projects + cost_type_projects: + for_all_projects_blank_slate: + heading: This cost type is enabled in all projects + description: Uncheck "For all projects" on the details tab to limit this cost type to specific projects. + no_projects: + heading: No projects assigned + description: Add projects so this cost type can be used in them. + rates: + title: Rate history + settings: + time_and_costs: Time & Costs + cost_types: + heading: Cost types + none_active: No cost types are currently active in this project. + for_all_projects_hint: This cost type is enabled in all projects. costs: widgets: actual_costs: diff --git a/modules/costs/config/locales/crowdin/bg.yml b/modules/costs/config/locales/crowdin/bg.yml index f880f0cb767..a5684df8f03 100644 --- a/modules/costs/config/locales/crowdin/bg.yml +++ b/modules/costs/config/locales/crowdin/bg.yml @@ -39,6 +39,8 @@ bg: unit: Име на единица unit_plural: Плурализирано име на единица default: Cost type by default + for_all_projects: For all projects + rates: Rates work_package: costs_by_type: Изразходвани единици labor_costs: Разходи за труд @@ -88,6 +90,10 @@ bg: work_package: is_not_a_valid_target_for_cost_entries: 'Работния пакет #%{id} не е валидна цел за преназначение на разходите.' nullify_is_not_valid_for_cost_entries: Вписванията за разходи не могат да бъдат зададени на проект. + cost_types_project: + attributes: + project_ids: + blank: Please select a project. attributes: comment: Коментар cost_type: Тип разход @@ -129,7 +135,6 @@ bg: label_current_default_rate: Текуща ставка по подразбиране label_date_on: на label_deleted_cost_types: Изтрити видове разходи - label_locked_cost_types: Заключени видове разходи label_display_cost_entries: Показване на единични разходи label_display_time_entries: Показване на отчетените часове label_display_types: Видове изобразяване @@ -229,6 +234,28 @@ bg: errors: validation: start_time_different_date: Date part of startTime (%{start_time}) must be the same as the spentOn (%{spent_on}) date. + label_available_cost_types_projects: Available cost types projects + cost_types: + errors: + no_cost_types_available: No cost types are available in this project. Please contact an administrator. + admin: + columns: + active_projects: Active projects + cost_type_projects: + for_all_projects_blank_slate: + heading: This cost type is enabled in all projects + description: Uncheck "For all projects" on the details tab to limit this cost type to specific projects. + no_projects: + heading: No projects assigned + description: Add projects so this cost type can be used in them. + rates: + title: Rate history + settings: + time_and_costs: Time & Costs + cost_types: + heading: Cost types + none_active: No cost types are currently active in this project. + for_all_projects_hint: This cost type is enabled in all projects. costs: widgets: actual_costs: diff --git a/modules/costs/config/locales/crowdin/ca.yml b/modules/costs/config/locales/crowdin/ca.yml index ede688358b6..ee3dcd34a5f 100644 --- a/modules/costs/config/locales/crowdin/ca.yml +++ b/modules/costs/config/locales/crowdin/ca.yml @@ -39,6 +39,8 @@ ca: unit: Nom d'unitat unit_plural: Noms d'unitat pluralitzats default: Cost type by default + for_all_projects: For all projects + rates: Rates work_package: costs_by_type: Unitats gastades labor_costs: Costs de treball @@ -88,6 +90,10 @@ ca: work_package: is_not_a_valid_target_for_cost_entries: 'El paquet de treball #%{id} no és un objectiu vàlid per reassignar les entrades de costs.' nullify_is_not_valid_for_cost_entries: Les entrades de cost no poden ser assignades a un projecte. + cost_types_project: + attributes: + project_ids: + blank: Please select a project. attributes: comment: Comentari cost_type: Estil de cost @@ -129,7 +135,6 @@ ca: label_current_default_rate: Tarifa actual per defecte label_date_on: en label_deleted_cost_types: Estils de cost eliminats - label_locked_cost_types: Estil de costs fixats label_display_cost_entries: Mostra les unitats de cost label_display_time_entries: Mostra les hores reportades label_display_types: Mostra estils @@ -229,6 +234,28 @@ ca: errors: validation: start_time_different_date: Date part of startTime (%{start_time}) must be the same as the spentOn (%{spent_on}) date. + label_available_cost_types_projects: Available cost types projects + cost_types: + errors: + no_cost_types_available: No cost types are available in this project. Please contact an administrator. + admin: + columns: + active_projects: Active projects + cost_type_projects: + for_all_projects_blank_slate: + heading: This cost type is enabled in all projects + description: Uncheck "For all projects" on the details tab to limit this cost type to specific projects. + no_projects: + heading: No projects assigned + description: Add projects so this cost type can be used in them. + rates: + title: Rate history + settings: + time_and_costs: Time & Costs + cost_types: + heading: Cost types + none_active: No cost types are currently active in this project. + for_all_projects_hint: This cost type is enabled in all projects. costs: widgets: actual_costs: diff --git a/modules/costs/config/locales/crowdin/ckb-IR.yml b/modules/costs/config/locales/crowdin/ckb-IR.yml index 50c927bb41b..e4c0e90bccb 100644 --- a/modules/costs/config/locales/crowdin/ckb-IR.yml +++ b/modules/costs/config/locales/crowdin/ckb-IR.yml @@ -39,6 +39,8 @@ ckb-IR: unit: Unit name unit_plural: Pluralized unit name default: Cost type by default + for_all_projects: For all projects + rates: Rates work_package: costs_by_type: Spent units labor_costs: Labor costs @@ -88,6 +90,10 @@ ckb-IR: work_package: is_not_a_valid_target_for_cost_entries: 'Work package #%{id} is not a valid target for reassigning the cost entries.' nullify_is_not_valid_for_cost_entries: Cost entries can not be assigned to a project. + cost_types_project: + attributes: + project_ids: + blank: Please select a project. attributes: comment: Comment cost_type: Cost type @@ -129,7 +135,6 @@ ckb-IR: label_current_default_rate: Current default rate label_date_on: 'on' label_deleted_cost_types: Deleted cost types - label_locked_cost_types: Locked cost types label_display_cost_entries: Display unit costs label_display_time_entries: Display reported hours label_display_types: Display types @@ -229,6 +234,28 @@ ckb-IR: errors: validation: start_time_different_date: Date part of startTime (%{start_time}) must be the same as the spentOn (%{spent_on}) date. + label_available_cost_types_projects: Available cost types projects + cost_types: + errors: + no_cost_types_available: No cost types are available in this project. Please contact an administrator. + admin: + columns: + active_projects: Active projects + cost_type_projects: + for_all_projects_blank_slate: + heading: This cost type is enabled in all projects + description: Uncheck "For all projects" on the details tab to limit this cost type to specific projects. + no_projects: + heading: No projects assigned + description: Add projects so this cost type can be used in them. + rates: + title: Rate history + settings: + time_and_costs: Time & Costs + cost_types: + heading: Cost types + none_active: No cost types are currently active in this project. + for_all_projects_hint: This cost type is enabled in all projects. costs: widgets: actual_costs: diff --git a/modules/costs/config/locales/crowdin/cs.yml b/modules/costs/config/locales/crowdin/cs.yml index 070d88c577a..31452571fc9 100644 --- a/modules/costs/config/locales/crowdin/cs.yml +++ b/modules/costs/config/locales/crowdin/cs.yml @@ -39,6 +39,8 @@ cs: unit: Název jednotky unit_plural: Název Pluralizované jednotky default: Typ nákladů ve výchozím nastavení + for_all_projects: Pro všechny projekty + rates: Rates work_package: costs_by_type: Strávené jednotky labor_costs: Náklady práce @@ -96,6 +98,10 @@ cs: work_package: is_not_a_valid_target_for_cost_entries: 'Pracovní balíček #%{id} není platný cíl pro přeřazení nákladových položek.' nullify_is_not_valid_for_cost_entries: K projektu nelze přiřadit položky nákladů. + cost_types_project: + attributes: + project_ids: + blank: Prosím vyberte projekt. attributes: comment: Komentář cost_type: Typ nákladu @@ -137,7 +143,6 @@ cs: label_current_default_rate: Aktuální výchozí sazba label_date_on: '' label_deleted_cost_types: Odstraněné typy nákladů - label_locked_cost_types: Uzamčené typy nákladů label_display_cost_entries: Zobrazit jednotkové náklady label_display_time_entries: Zobrazit nahlášené hodiny label_display_types: Typy zobrazení @@ -237,6 +242,28 @@ cs: errors: validation: start_time_different_date: Date part of startTime (%{start_time}) must be the same as the spentOn (%{spent_on}) date. + label_available_cost_types_projects: Available cost types projects + cost_types: + errors: + no_cost_types_available: No cost types are available in this project. Please contact an administrator. + admin: + columns: + active_projects: Active projects + cost_type_projects: + for_all_projects_blank_slate: + heading: This cost type is enabled in all projects + description: Uncheck "For all projects" on the details tab to limit this cost type to specific projects. + no_projects: + heading: No projects assigned + description: Add projects so this cost type can be used in them. + rates: + title: Rate history + settings: + time_and_costs: Time & Costs + cost_types: + heading: Cost types + none_active: No cost types are currently active in this project. + for_all_projects_hint: This cost type is enabled in all projects. costs: widgets: actual_costs: diff --git a/modules/costs/config/locales/crowdin/da.yml b/modules/costs/config/locales/crowdin/da.yml index 3bc23067131..240eb7dcdde 100644 --- a/modules/costs/config/locales/crowdin/da.yml +++ b/modules/costs/config/locales/crowdin/da.yml @@ -39,6 +39,8 @@ da: unit: Enhedsnavn unit_plural: Pluralistisk enhedsnavn default: Omkostningstype som standard + for_all_projects: For all projects + rates: Rates work_package: costs_by_type: Forbrugte enheder labor_costs: Lønomkostninger @@ -88,6 +90,10 @@ da: work_package: is_not_a_valid_target_for_cost_entries: 'Arbejdspakke #%{id} er ikke et gyldigt mål til omfordeling af omkostningsangivelser.' nullify_is_not_valid_for_cost_entries: Omkostningsangivelser kan ikke tildeles et projekt. + cost_types_project: + attributes: + project_ids: + blank: Please select a project. attributes: comment: Kommentér cost_type: Omkostningstype @@ -129,7 +135,6 @@ da: label_current_default_rate: Nuværende standardsats label_date_on: d. label_deleted_cost_types: Slettede omkostningstyper - label_locked_cost_types: Låste omkostningstyper label_display_cost_entries: Vis enhedsomkostninger label_display_time_entries: Vis indberettede timer label_display_types: Vis typer @@ -229,6 +234,28 @@ da: errors: validation: start_time_different_date: Datodelen af startTime (%{start_time}) skal være den samme som datoen for spentOn (%{spent_on}). + label_available_cost_types_projects: Available cost types projects + cost_types: + errors: + no_cost_types_available: No cost types are available in this project. Please contact an administrator. + admin: + columns: + active_projects: Active projects + cost_type_projects: + for_all_projects_blank_slate: + heading: This cost type is enabled in all projects + description: Uncheck "For all projects" on the details tab to limit this cost type to specific projects. + no_projects: + heading: No projects assigned + description: Add projects so this cost type can be used in them. + rates: + title: Rate history + settings: + time_and_costs: Time & Costs + cost_types: + heading: Cost types + none_active: No cost types are currently active in this project. + for_all_projects_hint: This cost type is enabled in all projects. costs: widgets: actual_costs: diff --git a/modules/costs/config/locales/crowdin/de.yml b/modules/costs/config/locales/crowdin/de.yml index 4b7c160a5f7..434a059e86c 100644 --- a/modules/costs/config/locales/crowdin/de.yml +++ b/modules/costs/config/locales/crowdin/de.yml @@ -39,6 +39,8 @@ de: unit: Einheit unit_plural: Einheit plural default: Standardkostentyp + for_all_projects: Für alle Projekte + rates: Preise work_package: costs_by_type: Gebuchte Einheiten labor_costs: Personaleinzelkosten @@ -88,6 +90,10 @@ de: work_package: is_not_a_valid_target_for_cost_entries: 'Arbeitspaket #%{id} ist kein gültiges Ziel für die Zuordnug der Stückkosteneinträge.' nullify_is_not_valid_for_cost_entries: Stückkosten können keinem Projekt zugeordnet werden. + cost_types_project: + attributes: + project_ids: + blank: Bitte wählen Sie ein Projekt aus. attributes: comment: Kommentar cost_type: Kostentyp @@ -129,7 +135,6 @@ de: label_current_default_rate: Aktueller Standardsatz label_date_on: am label_deleted_cost_types: Gelöschte Kostentypen - label_locked_cost_types: Gesperrte Kostentypen label_display_cost_entries: Stückkosten anzeigen label_display_time_entries: Personaleinzelkosten anzeigen label_display_types: Angezeigte Eintragsarten @@ -210,7 +215,7 @@ de: setting_costs_currency_format_prefix: Vor der Zahl (z.B. EUR 100) setting_costs_currency_format_suffix: Nach der Zahl (z.B. 100 EUR) setting_enforce_tracking_start_and_end_times: Start- und Endzeiten erforderlich - setting_enforce_without_allow: Start- und Endzeiten können nicht verpflichtend erfasst werden, ohne die Erfassung zu erlauben + setting_enforce_without_allow: Start und Endzeiten können nur erforderlich sein, wenn ihre Angabe erlaubt ist setting_allow_tracking_start_and_end_times_caption: Erlaubt es bei der Zeitbuchung die genaue Start- und Endzeiten der Buchung zu erfassen. setting_enforce_tracking_start_and_end_times_caption: Erfordert, dass bei Zeitbuchungen genaue Start- und Endzeiten erfasst werden. text_assign_time_and_cost_entries_to_project: Gebuchte Aufwände dem Projekt zuweisen @@ -229,6 +234,28 @@ de: errors: validation: start_time_different_date: Der Datumsteil der Startzeit (%{start_time}) muss mit dem Datum (%{spent_on}) übereinstimmen. + label_available_cost_types_projects: Verfügbare Kostenarten in Projekten + cost_types: + errors: + no_cost_types_available: In diesem Projekt sind keine Kostenarten verfügbar. Bitte kontaktieren Sie einen Administrator. + admin: + columns: + active_projects: Aktive Projekte + cost_type_projects: + for_all_projects_blank_slate: + heading: Diese Kostenart ist in allen Projekten aktiviert + description: Deaktivieren Sie auf der Registerkarte "Details" die Option "Für alle Projekte", um diese Kostenart auf bestimmte Projekte zu beschränken. + no_projects: + heading: Keine zugewiesenen Projekte + description: Fügen Sie Projekte hinzu, damit diese Kostenart in ihnen verwendet werden kann. + rates: + title: Stückpreise-Historie + settings: + time_and_costs: Zeit und Kosten + cost_types: + heading: Kostentypen + none_active: In diesem Projekt sind derzeit keine Kostenarten aktiv. + for_all_projects_hint: Diese Kostenart ist in allen Projekten aktiviert. costs: widgets: actual_costs: diff --git a/modules/costs/config/locales/crowdin/el.yml b/modules/costs/config/locales/crowdin/el.yml index bee2cd37266..38875a9c480 100644 --- a/modules/costs/config/locales/crowdin/el.yml +++ b/modules/costs/config/locales/crowdin/el.yml @@ -39,6 +39,8 @@ el: unit: Όνομα μονάδας unit_plural: Πληθυντικός ονόματος μονάδας default: Προεπιλεγμένος τύπος κόστους + for_all_projects: For all projects + rates: Rates work_package: costs_by_type: Δαπανημένες μονάδες labor_costs: Κόστος εργασίας @@ -88,6 +90,10 @@ el: work_package: is_not_a_valid_target_for_cost_entries: 'Το πακέτο εργασίας #%{id} δεν είναι έγκυρος στόχος για ανάθεση των καταχωρήσεων κόστους.' nullify_is_not_valid_for_cost_entries: Οι καταχωρίσεις κόστους δεν μπορούν να ανατεθούν σε ένα έργο. + cost_types_project: + attributes: + project_ids: + blank: Please select a project. attributes: comment: Σχόλιο cost_type: Τύπος κόστους @@ -129,7 +135,6 @@ el: label_current_default_rate: Τρέχουσα προεπιλεγμένη αμοιβή label_date_on: σε label_deleted_cost_types: Διαγραμμένοι τύποι κόστους - label_locked_cost_types: Κλειδωμένοι τύποι κόστους label_display_cost_entries: Εμφάνιση μονάδων κόστους label_display_time_entries: Εμφάνιση αναφερόμενων ωρών label_display_types: Εμφάνιση τύπων @@ -229,6 +234,28 @@ el: errors: validation: start_time_different_date: Date part of startTime (%{start_time}) must be the same as the spentOn (%{spent_on}) date. + label_available_cost_types_projects: Available cost types projects + cost_types: + errors: + no_cost_types_available: No cost types are available in this project. Please contact an administrator. + admin: + columns: + active_projects: Active projects + cost_type_projects: + for_all_projects_blank_slate: + heading: This cost type is enabled in all projects + description: Uncheck "For all projects" on the details tab to limit this cost type to specific projects. + no_projects: + heading: No projects assigned + description: Add projects so this cost type can be used in them. + rates: + title: Rate history + settings: + time_and_costs: Time & Costs + cost_types: + heading: Cost types + none_active: No cost types are currently active in this project. + for_all_projects_hint: This cost type is enabled in all projects. costs: widgets: actual_costs: diff --git a/modules/costs/config/locales/crowdin/eo.yml b/modules/costs/config/locales/crowdin/eo.yml index e656e688481..96045bef2b0 100644 --- a/modules/costs/config/locales/crowdin/eo.yml +++ b/modules/costs/config/locales/crowdin/eo.yml @@ -39,6 +39,8 @@ eo: unit: Unit name unit_plural: Pluralized unit name default: Cost type by default + for_all_projects: For all projects + rates: Rates work_package: costs_by_type: Spent units labor_costs: Labor costs @@ -88,6 +90,10 @@ eo: work_package: is_not_a_valid_target_for_cost_entries: 'Work package #%{id} is not a valid target for reassigning the cost entries.' nullify_is_not_valid_for_cost_entries: Cost entries can not be assigned to a project. + cost_types_project: + attributes: + project_ids: + blank: Please select a project. attributes: comment: Komento cost_type: Cost type @@ -129,7 +135,6 @@ eo: label_current_default_rate: Current default rate label_date_on: je label_deleted_cost_types: Deleted cost types - label_locked_cost_types: Locked cost types label_display_cost_entries: Display unit costs label_display_time_entries: Display reported hours label_display_types: Display types @@ -229,6 +234,28 @@ eo: errors: validation: start_time_different_date: Date part of startTime (%{start_time}) must be the same as the spentOn (%{spent_on}) date. + label_available_cost_types_projects: Available cost types projects + cost_types: + errors: + no_cost_types_available: No cost types are available in this project. Please contact an administrator. + admin: + columns: + active_projects: Active projects + cost_type_projects: + for_all_projects_blank_slate: + heading: This cost type is enabled in all projects + description: Uncheck "For all projects" on the details tab to limit this cost type to specific projects. + no_projects: + heading: No projects assigned + description: Add projects so this cost type can be used in them. + rates: + title: Rate history + settings: + time_and_costs: Time & Costs + cost_types: + heading: Cost types + none_active: No cost types are currently active in this project. + for_all_projects_hint: This cost type is enabled in all projects. costs: widgets: actual_costs: diff --git a/modules/costs/config/locales/crowdin/es.yml b/modules/costs/config/locales/crowdin/es.yml index e829deb08de..9ef26686cbf 100644 --- a/modules/costs/config/locales/crowdin/es.yml +++ b/modules/costs/config/locales/crowdin/es.yml @@ -39,6 +39,8 @@ es: unit: Nombre de la unidad unit_plural: Nombre de la unidad pluralizado default: Tipo de coste por defecto + for_all_projects: Para todos los proyectos + rates: Tasas work_package: costs_by_type: Unidades usadas labor_costs: Costos de mano de obra @@ -88,6 +90,10 @@ es: work_package: is_not_a_valid_target_for_cost_entries: 'Paquete de trabajo #%{id} no es un objetivo válido para reasignar las entradas de costo.' nullify_is_not_valid_for_cost_entries: Las entradas de costo no pueden ser asignadas a un proyecto. + cost_types_project: + attributes: + project_ids: + blank: Selecciona un proyecto. attributes: comment: Comentario cost_type: Tipo de costo @@ -129,7 +135,6 @@ es: label_current_default_rate: tasa de morosidad actual label_date_on: en label_deleted_cost_types: Eliminar tipos de costo - label_locked_cost_types: Tipos de costo bloqueados label_display_cost_entries: Mostrar los costos unitarios label_display_time_entries: Mostrar horas reportadas label_display_types: Mostrar tipos @@ -229,6 +234,28 @@ es: errors: validation: start_time_different_date: La parte de fecha de startTime (%{start_time}) debe ser la misma que la fecha de spentOn (%{spent_on}). + label_available_cost_types_projects: Proyectos con tipos de coste disponibles + cost_types: + errors: + no_cost_types_available: En este proyecto no hay tipos de coste disponibles. Ponte en contacto con un administrador. + admin: + columns: + active_projects: Proyectos activos + cost_type_projects: + for_all_projects_blank_slate: + heading: Este tipo de coste está habilitado en todos los proyectos + description: Desmarca la casilla «Para todos los proyectos» en la pestaña de detalles para limitar este tipo de coste a proyectos específicos. + no_projects: + heading: No hay proyectos asignados + description: Añade proyectos para que se pueda utilizar este tipo de coste en ellos. + rates: + title: Historial de tasas + settings: + time_and_costs: Tiempo y costos + cost_types: + heading: Tipos de costos + none_active: Actualmente no hay tipos de coste activos en este proyecto. + for_all_projects_hint: Este tipo de coste está habilitado en todos los proyectos. costs: widgets: actual_costs: diff --git a/modules/costs/config/locales/crowdin/et.yml b/modules/costs/config/locales/crowdin/et.yml index 28fb611c52a..db5a3bd1891 100644 --- a/modules/costs/config/locales/crowdin/et.yml +++ b/modules/costs/config/locales/crowdin/et.yml @@ -39,6 +39,8 @@ et: unit: Ühiku nimi unit_plural: Pluralized unit name default: Cost type by default + for_all_projects: For all projects + rates: Rates work_package: costs_by_type: Kasutatud ühikuid labor_costs: Töökulud @@ -88,6 +90,10 @@ et: work_package: is_not_a_valid_target_for_cost_entries: 'Work package #%{id} is not a valid target for reassigning the cost entries.' nullify_is_not_valid_for_cost_entries: Cost entries can not be assigned to a project. + cost_types_project: + attributes: + project_ids: + blank: Please select a project. attributes: comment: Kommentaar cost_type: Kulu liik @@ -129,7 +135,6 @@ et: label_current_default_rate: Praegune valuutakurss label_date_on: 'on' label_deleted_cost_types: Kustutatud kululiigid - label_locked_cost_types: Lukustatud kulude tüübid label_display_cost_entries: Näita ühiku kulusid label_display_time_entries: Näita tunde label_display_types: Näita liike @@ -229,6 +234,28 @@ et: errors: validation: start_time_different_date: Date part of startTime (%{start_time}) must be the same as the spentOn (%{spent_on}) date. + label_available_cost_types_projects: Available cost types projects + cost_types: + errors: + no_cost_types_available: No cost types are available in this project. Please contact an administrator. + admin: + columns: + active_projects: Active projects + cost_type_projects: + for_all_projects_blank_slate: + heading: This cost type is enabled in all projects + description: Uncheck "For all projects" on the details tab to limit this cost type to specific projects. + no_projects: + heading: No projects assigned + description: Add projects so this cost type can be used in them. + rates: + title: Rate history + settings: + time_and_costs: Time & Costs + cost_types: + heading: Cost types + none_active: No cost types are currently active in this project. + for_all_projects_hint: This cost type is enabled in all projects. costs: widgets: actual_costs: diff --git a/modules/costs/config/locales/crowdin/eu.yml b/modules/costs/config/locales/crowdin/eu.yml index e39dae1ca0b..387bc4b55e2 100644 --- a/modules/costs/config/locales/crowdin/eu.yml +++ b/modules/costs/config/locales/crowdin/eu.yml @@ -39,6 +39,8 @@ eu: unit: Unit name unit_plural: Pluralized unit name default: Cost type by default + for_all_projects: For all projects + rates: Rates work_package: costs_by_type: Spent units labor_costs: Labor costs @@ -88,6 +90,10 @@ eu: work_package: is_not_a_valid_target_for_cost_entries: 'Work package #%{id} is not a valid target for reassigning the cost entries.' nullify_is_not_valid_for_cost_entries: Cost entries can not be assigned to a project. + cost_types_project: + attributes: + project_ids: + blank: Please select a project. attributes: comment: Comment cost_type: Cost type @@ -129,7 +135,6 @@ eu: label_current_default_rate: Current default rate label_date_on: 'on' label_deleted_cost_types: Deleted cost types - label_locked_cost_types: Locked cost types label_display_cost_entries: Display unit costs label_display_time_entries: Display reported hours label_display_types: Display types @@ -229,6 +234,28 @@ eu: errors: validation: start_time_different_date: Date part of startTime (%{start_time}) must be the same as the spentOn (%{spent_on}) date. + label_available_cost_types_projects: Available cost types projects + cost_types: + errors: + no_cost_types_available: No cost types are available in this project. Please contact an administrator. + admin: + columns: + active_projects: Active projects + cost_type_projects: + for_all_projects_blank_slate: + heading: This cost type is enabled in all projects + description: Uncheck "For all projects" on the details tab to limit this cost type to specific projects. + no_projects: + heading: No projects assigned + description: Add projects so this cost type can be used in them. + rates: + title: Rate history + settings: + time_and_costs: Time & Costs + cost_types: + heading: Cost types + none_active: No cost types are currently active in this project. + for_all_projects_hint: This cost type is enabled in all projects. costs: widgets: actual_costs: diff --git a/modules/costs/config/locales/crowdin/fa.yml b/modules/costs/config/locales/crowdin/fa.yml index a8295726cc0..a2f1b62e97d 100644 --- a/modules/costs/config/locales/crowdin/fa.yml +++ b/modules/costs/config/locales/crowdin/fa.yml @@ -39,6 +39,8 @@ fa: unit: نام واحد unit_plural: نام واحد پولی default: نوع ارزش به صورت پیش فرض + for_all_projects: For all projects + rates: Rates work_package: costs_by_type: واحد هزینه‌کرد labor_costs: هزینه های نیروی کار @@ -88,6 +90,10 @@ fa: work_package: is_not_a_valid_target_for_cost_entries: پکیج‌کاری شماره %{id} به عنوان مقصد معتبری برای تخصیص موارد هزینه نمی‌باشد. nullify_is_not_valid_for_cost_entries: ورودی‌های هزینه نمی‌توانند به یک پروژه اختصاص یابند. + cost_types_project: + attributes: + project_ids: + blank: Please select a project. attributes: comment: نظر cost_type: نوع هزینه @@ -129,7 +135,6 @@ fa: label_current_default_rate: ضریب پرداخت پیشفرض فعلی label_date_on: برخط label_deleted_cost_types: انواع هزینه حذف‌شده - label_locked_cost_types: انواع هزینه قفل‌شده label_display_cost_entries: نمایش هزینه‌های واحد label_display_time_entries: نمایش ساعات گزارش‌شده label_display_types: انواع نمایش @@ -229,6 +234,28 @@ fa: errors: validation: start_time_different_date: Date part of startTime (%{start_time}) must be the same as the spentOn (%{spent_on}) date. + label_available_cost_types_projects: Available cost types projects + cost_types: + errors: + no_cost_types_available: No cost types are available in this project. Please contact an administrator. + admin: + columns: + active_projects: Active projects + cost_type_projects: + for_all_projects_blank_slate: + heading: This cost type is enabled in all projects + description: Uncheck "For all projects" on the details tab to limit this cost type to specific projects. + no_projects: + heading: No projects assigned + description: Add projects so this cost type can be used in them. + rates: + title: Rate history + settings: + time_and_costs: Time & Costs + cost_types: + heading: Cost types + none_active: No cost types are currently active in this project. + for_all_projects_hint: This cost type is enabled in all projects. costs: widgets: actual_costs: diff --git a/modules/costs/config/locales/crowdin/fi.yml b/modules/costs/config/locales/crowdin/fi.yml index a2f1bb40c60..56c115a166a 100644 --- a/modules/costs/config/locales/crowdin/fi.yml +++ b/modules/costs/config/locales/crowdin/fi.yml @@ -39,6 +39,8 @@ fi: unit: Yksikön nimi unit_plural: Yksikön nimi monikossa default: Cost type by default + for_all_projects: For all projects + rates: Rates work_package: costs_by_type: Käytetyt yksiköt labor_costs: Työvoimakustannukset @@ -88,6 +90,10 @@ fi: work_package: is_not_a_valid_target_for_cost_entries: 'Tehtävä #%{id} ei ole kelvollinen kohde kustannuskirjauksille.' nullify_is_not_valid_for_cost_entries: Kustannuksia ei voi kohdistaa projektiin. + cost_types_project: + attributes: + project_ids: + blank: Please select a project. attributes: comment: Kommentti cost_type: Kustannustyyppi @@ -129,7 +135,6 @@ fi: label_current_default_rate: Nykyinen vakiotuntihinta label_date_on: päälle label_deleted_cost_types: Poistetut kustannuslajit - label_locked_cost_types: Lukitut kustannuslajit label_display_cost_entries: Näytä yksikkökustannukset label_display_time_entries: Näytä tuntikirjaukset label_display_types: Näytä tyypit @@ -229,6 +234,28 @@ fi: errors: validation: start_time_different_date: Date part of startTime (%{start_time}) must be the same as the spentOn (%{spent_on}) date. + label_available_cost_types_projects: Available cost types projects + cost_types: + errors: + no_cost_types_available: No cost types are available in this project. Please contact an administrator. + admin: + columns: + active_projects: Active projects + cost_type_projects: + for_all_projects_blank_slate: + heading: This cost type is enabled in all projects + description: Uncheck "For all projects" on the details tab to limit this cost type to specific projects. + no_projects: + heading: No projects assigned + description: Add projects so this cost type can be used in them. + rates: + title: Rate history + settings: + time_and_costs: Time & Costs + cost_types: + heading: Cost types + none_active: No cost types are currently active in this project. + for_all_projects_hint: This cost type is enabled in all projects. costs: widgets: actual_costs: diff --git a/modules/costs/config/locales/crowdin/fil.yml b/modules/costs/config/locales/crowdin/fil.yml index 8ec5f1e5d14..b73ebbe5f3e 100644 --- a/modules/costs/config/locales/crowdin/fil.yml +++ b/modules/costs/config/locales/crowdin/fil.yml @@ -39,6 +39,8 @@ fil: unit: Pangalan ng yunit unit_plural: Pinaraming pangalan ng yunit default: Cost type by default + for_all_projects: For all projects + rates: Rates work_package: costs_by_type: Ginugol na yunit labor_costs: Gastos sa Paggawa @@ -88,6 +90,10 @@ fil: work_package: is_not_a_valid_target_for_cost_entries: 'Work package #%{id} is not a valid target for reassigning the cost entries.' nullify_is_not_valid_for_cost_entries: Cost entries can not be assigned to a project. + cost_types_project: + attributes: + project_ids: + blank: Please select a project. attributes: comment: Komento cost_type: Uri ng Gastos @@ -129,7 +135,6 @@ fil: label_current_default_rate: Current default rate label_date_on: sa label_deleted_cost_types: Deleted cost types - label_locked_cost_types: Locked cost types label_display_cost_entries: Display unit costs label_display_time_entries: Display reported hours label_display_types: Display types @@ -229,6 +234,28 @@ fil: errors: validation: start_time_different_date: Date part of startTime (%{start_time}) must be the same as the spentOn (%{spent_on}) date. + label_available_cost_types_projects: Available cost types projects + cost_types: + errors: + no_cost_types_available: No cost types are available in this project. Please contact an administrator. + admin: + columns: + active_projects: Active projects + cost_type_projects: + for_all_projects_blank_slate: + heading: This cost type is enabled in all projects + description: Uncheck "For all projects" on the details tab to limit this cost type to specific projects. + no_projects: + heading: No projects assigned + description: Add projects so this cost type can be used in them. + rates: + title: Rate history + settings: + time_and_costs: Time & Costs + cost_types: + heading: Cost types + none_active: No cost types are currently active in this project. + for_all_projects_hint: This cost type is enabled in all projects. costs: widgets: actual_costs: diff --git a/modules/costs/config/locales/crowdin/fr.yml b/modules/costs/config/locales/crowdin/fr.yml index 28eb7b3a681..df471a6fe26 100644 --- a/modules/costs/config/locales/crowdin/fr.yml +++ b/modules/costs/config/locales/crowdin/fr.yml @@ -39,6 +39,8 @@ fr: unit: Nom de l'unité unit_plural: Nom pluriel de l'unité default: Type de coût par défaut + for_all_projects: Pour tous les projets + rates: Tarifs work_package: costs_by_type: Unités consommées labor_costs: Coûts de main d'œuvre @@ -88,6 +90,10 @@ fr: work_package: is_not_a_valid_target_for_cost_entries: 'Le lot de travaux #%{id} n''est pas une cible valide pour réaffecter les entrées de coût.' nullify_is_not_valid_for_cost_entries: Des entrées de coût ne peuvent pas être assignées à un projet. + cost_types_project: + attributes: + project_ids: + blank: Veuillez sélectionner un projet. attributes: comment: Commentaire cost_type: Types de coût @@ -129,7 +135,6 @@ fr: label_current_default_rate: Taux par défaut actuel label_date_on: le label_deleted_cost_types: Types de coût effacés - label_locked_cost_types: Types de coût bloqués label_display_cost_entries: Afficher les coûts unitaires label_display_time_entries: Afficher les heures consignées label_display_types: Afficher les types @@ -229,6 +234,28 @@ fr: errors: validation: start_time_different_date: La partie date de startTime (%{start_time}) doit être identique à la date de spentOn (%{spent_on}). + label_available_cost_types_projects: Projets de types de coûts disponibles + cost_types: + errors: + no_cost_types_available: Aucun type de coût n'est disponible dans ce projet. Veuillez contacter un administrateur. + admin: + columns: + active_projects: Projets actifs + cost_type_projects: + for_all_projects_blank_slate: + heading: Ce type de coût est activé dans tous les projets + description: Décochez la case "Pour tous les projets" dans l'onglet "Détails" pour limiter ce type de coût à des projets spécifiques. + no_projects: + heading: Aucun projet assigné + description: Ajoutez des projets pour que ce type de coût puisse y être utilisé. + rates: + title: Historique des tarifs + settings: + time_and_costs: Temps et coûts + cost_types: + heading: Types de coûts + none_active: Aucun type de coût n'est actuellement actif dans ce projet. + for_all_projects_hint: Ce type de coût est activé dans tous les projets. costs: widgets: actual_costs: diff --git a/modules/costs/config/locales/crowdin/he.yml b/modules/costs/config/locales/crowdin/he.yml index 0f3943c21de..3405fb6634c 100644 --- a/modules/costs/config/locales/crowdin/he.yml +++ b/modules/costs/config/locales/crowdin/he.yml @@ -39,6 +39,8 @@ he: unit: Unit name unit_plural: Pluralized unit name default: Cost type by default + for_all_projects: For all projects + rates: Rates work_package: costs_by_type: Spent units labor_costs: Labor costs @@ -96,6 +98,10 @@ he: work_package: is_not_a_valid_target_for_cost_entries: 'Work package #%{id} is not a valid target for reassigning the cost entries.' nullify_is_not_valid_for_cost_entries: Cost entries can not be assigned to a project. + cost_types_project: + attributes: + project_ids: + blank: Please select a project. attributes: comment: תגובה cost_type: Cost type @@ -137,7 +143,6 @@ he: label_current_default_rate: Current default rate label_date_on: פועל label_deleted_cost_types: Deleted cost types - label_locked_cost_types: Locked cost types label_display_cost_entries: Display unit costs label_display_time_entries: Display reported hours label_display_types: Display types @@ -237,6 +242,28 @@ he: errors: validation: start_time_different_date: Date part of startTime (%{start_time}) must be the same as the spentOn (%{spent_on}) date. + label_available_cost_types_projects: Available cost types projects + cost_types: + errors: + no_cost_types_available: No cost types are available in this project. Please contact an administrator. + admin: + columns: + active_projects: Active projects + cost_type_projects: + for_all_projects_blank_slate: + heading: This cost type is enabled in all projects + description: Uncheck "For all projects" on the details tab to limit this cost type to specific projects. + no_projects: + heading: No projects assigned + description: Add projects so this cost type can be used in them. + rates: + title: Rate history + settings: + time_and_costs: Time & Costs + cost_types: + heading: Cost types + none_active: No cost types are currently active in this project. + for_all_projects_hint: This cost type is enabled in all projects. costs: widgets: actual_costs: diff --git a/modules/costs/config/locales/crowdin/hi.yml b/modules/costs/config/locales/crowdin/hi.yml index 77678ee4ef6..86ee7c38b9d 100644 --- a/modules/costs/config/locales/crowdin/hi.yml +++ b/modules/costs/config/locales/crowdin/hi.yml @@ -39,6 +39,8 @@ hi: unit: Unit name unit_plural: Pluralized unit name default: Cost type by default + for_all_projects: For all projects + rates: Rates work_package: costs_by_type: Spent units labor_costs: Labor costs @@ -88,6 +90,10 @@ hi: work_package: is_not_a_valid_target_for_cost_entries: 'Work package #%{id} is not a valid target for reassigning the cost entries.' nullify_is_not_valid_for_cost_entries: Cost entries can not be assigned to a project. + cost_types_project: + attributes: + project_ids: + blank: Please select a project. attributes: comment: टिप्पणी cost_type: Cost type @@ -129,7 +135,6 @@ hi: label_current_default_rate: Current default rate label_date_on: पर label_deleted_cost_types: Deleted cost types - label_locked_cost_types: Locked cost types label_display_cost_entries: Display unit costs label_display_time_entries: Display reported hours label_display_types: Display types @@ -229,6 +234,28 @@ hi: errors: validation: start_time_different_date: Date part of startTime (%{start_time}) must be the same as the spentOn (%{spent_on}) date. + label_available_cost_types_projects: Available cost types projects + cost_types: + errors: + no_cost_types_available: No cost types are available in this project. Please contact an administrator. + admin: + columns: + active_projects: Active projects + cost_type_projects: + for_all_projects_blank_slate: + heading: This cost type is enabled in all projects + description: Uncheck "For all projects" on the details tab to limit this cost type to specific projects. + no_projects: + heading: No projects assigned + description: Add projects so this cost type can be used in them. + rates: + title: Rate history + settings: + time_and_costs: Time & Costs + cost_types: + heading: Cost types + none_active: No cost types are currently active in this project. + for_all_projects_hint: This cost type is enabled in all projects. costs: widgets: actual_costs: diff --git a/modules/costs/config/locales/crowdin/hr.yml b/modules/costs/config/locales/crowdin/hr.yml index d053f44fa6c..93b1a81e1bf 100644 --- a/modules/costs/config/locales/crowdin/hr.yml +++ b/modules/costs/config/locales/crowdin/hr.yml @@ -39,6 +39,8 @@ hr: unit: Naziv jedinice unit_plural: Višestruki nazivi jedinica default: Cost type by default + for_all_projects: For all projects + rates: Rates work_package: costs_by_type: Potrošene jedinice labor_costs: Troškovi rada @@ -92,6 +94,10 @@ hr: work_package: is_not_a_valid_target_for_cost_entries: 'Radni paket #%{id} nije ispravano odredište za ponovljeno dodjeljivanje ulaznih troškova.' nullify_is_not_valid_for_cost_entries: Ulazni troškovi ne mogu biti dodani projektu. + cost_types_project: + attributes: + project_ids: + blank: Please select a project. attributes: comment: Komentar cost_type: Vrsta troška @@ -133,7 +139,6 @@ hr: label_current_default_rate: Trenutno zadana stopa label_date_on: na label_deleted_cost_types: Izbrisane tipovi troškova - label_locked_cost_types: Locked cost types label_display_cost_entries: Prikaži jedinice troškova label_display_time_entries: Prikaži prijavljene sate label_display_types: Prikazati tipove @@ -233,6 +238,28 @@ hr: errors: validation: start_time_different_date: Date part of startTime (%{start_time}) must be the same as the spentOn (%{spent_on}) date. + label_available_cost_types_projects: Available cost types projects + cost_types: + errors: + no_cost_types_available: No cost types are available in this project. Please contact an administrator. + admin: + columns: + active_projects: Active projects + cost_type_projects: + for_all_projects_blank_slate: + heading: This cost type is enabled in all projects + description: Uncheck "For all projects" on the details tab to limit this cost type to specific projects. + no_projects: + heading: No projects assigned + description: Add projects so this cost type can be used in them. + rates: + title: Rate history + settings: + time_and_costs: Time & Costs + cost_types: + heading: Cost types + none_active: No cost types are currently active in this project. + for_all_projects_hint: This cost type is enabled in all projects. costs: widgets: actual_costs: diff --git a/modules/costs/config/locales/crowdin/hu.yml b/modules/costs/config/locales/crowdin/hu.yml index ef93a3b780f..f3a1ccda213 100644 --- a/modules/costs/config/locales/crowdin/hu.yml +++ b/modules/costs/config/locales/crowdin/hu.yml @@ -39,6 +39,8 @@ hu: unit: Egység neve unit_plural: Többes számú egység neve default: Költségtípus alapértelmezés szerint + for_all_projects: For all projects + rates: Rates work_package: costs_by_type: Elköltött egység labor_costs: Munkaerő költségek @@ -88,6 +90,10 @@ hu: work_package: is_not_a_valid_target_for_cost_entries: 'Munkacsomag #%{id} nem érvényes cél a költség újrahozzárendeléséhez.' nullify_is_not_valid_for_cost_entries: Költségek nem hozzárendelhetőek a projekthez. + cost_types_project: + attributes: + project_ids: + blank: Please select a project. attributes: comment: Komment cost_type: Költségtípus @@ -129,7 +135,6 @@ hu: label_current_default_rate: Jelenlegi alapértelmezett díj label_date_on: mikor label_deleted_cost_types: Törölt költségnemek - label_locked_cost_types: Zárolt költségnemek label_display_cost_entries: Fajlagos költségek megjelenítése label_display_time_entries: Jelentett órák megjelenítése label_display_types: Nemek megjelenítése @@ -229,6 +234,28 @@ hu: errors: validation: start_time_different_date: A startTime (%{start_time}) dátumrészének meg kell egyeznie a spentOn (%{spent_on}) dátummal. + label_available_cost_types_projects: Available cost types projects + cost_types: + errors: + no_cost_types_available: No cost types are available in this project. Please contact an administrator. + admin: + columns: + active_projects: Active projects + cost_type_projects: + for_all_projects_blank_slate: + heading: This cost type is enabled in all projects + description: Uncheck "For all projects" on the details tab to limit this cost type to specific projects. + no_projects: + heading: No projects assigned + description: Add projects so this cost type can be used in them. + rates: + title: Rate history + settings: + time_and_costs: Time & Costs + cost_types: + heading: Cost types + none_active: No cost types are currently active in this project. + for_all_projects_hint: This cost type is enabled in all projects. costs: widgets: actual_costs: diff --git a/modules/costs/config/locales/crowdin/hy.yml b/modules/costs/config/locales/crowdin/hy.yml index a2abfc42edb..874d9663e28 100644 --- a/modules/costs/config/locales/crowdin/hy.yml +++ b/modules/costs/config/locales/crowdin/hy.yml @@ -39,6 +39,8 @@ hy: unit: Unit name unit_plural: Pluralized unit name default: Cost type by default + for_all_projects: For all projects + rates: Rates work_package: costs_by_type: Spent units labor_costs: Labor costs @@ -88,6 +90,10 @@ hy: work_package: is_not_a_valid_target_for_cost_entries: 'Work package #%{id} is not a valid target for reassigning the cost entries.' nullify_is_not_valid_for_cost_entries: Cost entries can not be assigned to a project. + cost_types_project: + attributes: + project_ids: + blank: Please select a project. attributes: comment: Comment cost_type: Cost type @@ -129,7 +135,6 @@ hy: label_current_default_rate: Current default rate label_date_on: 'on' label_deleted_cost_types: Deleted cost types - label_locked_cost_types: Locked cost types label_display_cost_entries: Display unit costs label_display_time_entries: Display reported hours label_display_types: Display types @@ -229,6 +234,28 @@ hy: errors: validation: start_time_different_date: Date part of startTime (%{start_time}) must be the same as the spentOn (%{spent_on}) date. + label_available_cost_types_projects: Available cost types projects + cost_types: + errors: + no_cost_types_available: No cost types are available in this project. Please contact an administrator. + admin: + columns: + active_projects: Active projects + cost_type_projects: + for_all_projects_blank_slate: + heading: This cost type is enabled in all projects + description: Uncheck "For all projects" on the details tab to limit this cost type to specific projects. + no_projects: + heading: No projects assigned + description: Add projects so this cost type can be used in them. + rates: + title: Rate history + settings: + time_and_costs: Time & Costs + cost_types: + heading: Cost types + none_active: No cost types are currently active in this project. + for_all_projects_hint: This cost type is enabled in all projects. costs: widgets: actual_costs: diff --git a/modules/costs/config/locales/crowdin/id.yml b/modules/costs/config/locales/crowdin/id.yml index da2f0af4c7a..45d1323ea9c 100644 --- a/modules/costs/config/locales/crowdin/id.yml +++ b/modules/costs/config/locales/crowdin/id.yml @@ -39,6 +39,8 @@ id: unit: Nama unit unit_plural: Nama plural unit default: Jenis biaya secara default + for_all_projects: For all projects + rates: Rates work_package: costs_by_type: Unit terpakai labor_costs: Biaya tenaga @@ -84,6 +86,10 @@ id: work_package: is_not_a_valid_target_for_cost_entries: 'Reassign biaya tidak dapat dilakukan pada Work package #%{id}.' nullify_is_not_valid_for_cost_entries: Masukan biaya tidak dapat di-assign ke proyek. + cost_types_project: + attributes: + project_ids: + blank: Please select a project. attributes: comment: Komentar cost_type: Jenis biaya @@ -125,7 +131,6 @@ id: label_current_default_rate: Rate saat ini label_date_on: pada label_deleted_cost_types: Jenis biaya terhapus - label_locked_cost_types: Locked cost types label_display_cost_entries: Tampilkan biaya unit label_display_time_entries: Tampilkan jumlah jam label_display_types: Tampilkan tipe @@ -225,6 +230,28 @@ id: errors: validation: start_time_different_date: Bagian tanggal dari startTime (%{start_time}) harus sama dengan tanggal spentOn (%{spent_on}). + label_available_cost_types_projects: Available cost types projects + cost_types: + errors: + no_cost_types_available: No cost types are available in this project. Please contact an administrator. + admin: + columns: + active_projects: Active projects + cost_type_projects: + for_all_projects_blank_slate: + heading: This cost type is enabled in all projects + description: Uncheck "For all projects" on the details tab to limit this cost type to specific projects. + no_projects: + heading: No projects assigned + description: Add projects so this cost type can be used in them. + rates: + title: Rate history + settings: + time_and_costs: Time & Costs + cost_types: + heading: Cost types + none_active: No cost types are currently active in this project. + for_all_projects_hint: This cost type is enabled in all projects. costs: widgets: actual_costs: diff --git a/modules/costs/config/locales/crowdin/it.yml b/modules/costs/config/locales/crowdin/it.yml index 675214133e5..9dbca7ee73e 100644 --- a/modules/costs/config/locales/crowdin/it.yml +++ b/modules/costs/config/locales/crowdin/it.yml @@ -39,6 +39,8 @@ it: unit: Nome dell'unità unit_plural: Nome unità pluralizzato default: Tipo di costo predefinito + for_all_projects: Per tutti progetti + rates: Tariffe work_package: costs_by_type: Unità spese labor_costs: Costi della manodopera @@ -88,6 +90,10 @@ it: work_package: is_not_a_valid_target_for_cost_entries: 'La macro-attività (work package) #%{id} non è una destinazione valida per riassegnare le entrate del costo.' nullify_is_not_valid_for_cost_entries: Voci di costo non possono essere assegnate a un progetto. + cost_types_project: + attributes: + project_ids: + blank: Seleziona un progetto. attributes: comment: Commento cost_type: Tipo di costo @@ -129,7 +135,6 @@ it: label_current_default_rate: Tariffa predefinita corrente label_date_on: il label_deleted_cost_types: Tipi di costo eliminati - label_locked_cost_types: Tipi di costo bloccati label_display_cost_entries: Mostra i costi unitari label_display_time_entries: Mostra le ore segnalate label_display_types: Mostra i tipi @@ -229,6 +234,28 @@ it: errors: validation: start_time_different_date: La parte data di startTime (%{start_time}) deve essere uguale alla data di spentOn (%{spent_on}). + label_available_cost_types_projects: Progetti con tipi di costo disponibili + cost_types: + errors: + no_cost_types_available: Non sono disponibili tipi di costo in questo progetto. Contatta un amministratore. + admin: + columns: + active_projects: Progetti attivi + cost_type_projects: + for_all_projects_blank_slate: + heading: Questo tipo di costo è abilitato in tutti i progetti + description: Deseleziona "Per tutti i progetti" nella scheda Dettagli per limitare questo tipo di costo a progetti specifici. + no_projects: + heading: Nessun progetto assegnato + description: Aggiungi progetti per consentire l'utilizzo di questo tipo di costo. + rates: + title: Cronologia tariffe + settings: + time_and_costs: Tempi e costi + cost_types: + heading: Tipo di costo + none_active: Nessun tipo di costo è attualmente attivo in questo progetto. + for_all_projects_hint: Questo tipo di costo è abilitato in tutti i progetti. costs: widgets: actual_costs: diff --git a/modules/costs/config/locales/crowdin/ja.yml b/modules/costs/config/locales/crowdin/ja.yml index f1a7bca669d..88441d7ca24 100644 --- a/modules/costs/config/locales/crowdin/ja.yml +++ b/modules/costs/config/locales/crowdin/ja.yml @@ -39,6 +39,8 @@ ja: unit: 単位名 unit_plural: 単位名 default: デフォルトのコストタイプ + for_all_projects: For all projects + rates: Rates work_package: costs_by_type: 消費した予算 labor_costs: 作業員コスト @@ -84,6 +86,10 @@ ja: work_package: is_not_a_valid_target_for_cost_entries: コストを再割り当てるには、ワークパッケージ#%{id}は対象外である。 nullify_is_not_valid_for_cost_entries: コストエントリをプロジェクトに割り当てることはできません。 + cost_types_project: + attributes: + project_ids: + blank: Please select a project. attributes: comment: コメント cost_type: コスト種類 @@ -125,7 +131,6 @@ ja: label_current_default_rate: 現在のデフォルトレート label_date_on: オン label_deleted_cost_types: 削除されたコストタイプ - label_locked_cost_types: ロックされたコストタイプ label_display_cost_entries: ユニットのコストを表示 label_display_time_entries: 報告された時間を表示する label_display_types: 表示タイプ @@ -208,7 +213,7 @@ ja: setting_enforce_tracking_start_and_end_times: 開始/終了時間を必須とする setting_enforce_without_allow: 開始時間と終了時間を要求することは許可されていないとできません setting_allow_tracking_start_and_end_times_caption: 時間を記録する際に、開始時間と終了時間を入力できるようにする。 - setting_enforce_tracking_start_and_end_times_caption: 時間を記録する際、開始時間と終了時間の入力を必須にします。 + setting_enforce_tracking_start_and_end_times_caption: 時間を記録する際、開始時間と終了時間の入力が必須となる。 text_assign_time_and_cost_entries_to_project: 報告された時間とコストをプロジェクトに割り当てる text_destroy_cost_entries_question: 削除しようとしているワークパッケージが%{cost_entries} 件報告されました。どうしますか? text_destroy_time_and_cost_entries: 報告された時間とコストを削除する @@ -225,6 +230,28 @@ ja: errors: validation: start_time_different_date: 開始日(%{start_time})は消費日(%{spent_on})と同じである必要があります。 + label_available_cost_types_projects: Available cost types projects + cost_types: + errors: + no_cost_types_available: No cost types are available in this project. Please contact an administrator. + admin: + columns: + active_projects: Active projects + cost_type_projects: + for_all_projects_blank_slate: + heading: This cost type is enabled in all projects + description: Uncheck "For all projects" on the details tab to limit this cost type to specific projects. + no_projects: + heading: No projects assigned + description: Add projects so this cost type can be used in them. + rates: + title: Rate history + settings: + time_and_costs: Time & Costs + cost_types: + heading: Cost types + none_active: No cost types are currently active in this project. + for_all_projects_hint: This cost type is enabled in all projects. costs: widgets: actual_costs: diff --git a/modules/costs/config/locales/crowdin/ka.yml b/modules/costs/config/locales/crowdin/ka.yml index b3daa474a14..41246571f09 100644 --- a/modules/costs/config/locales/crowdin/ka.yml +++ b/modules/costs/config/locales/crowdin/ka.yml @@ -39,6 +39,8 @@ ka: unit: ერთეულის სახელი unit_plural: ერთეულის სახელი მრავლობითში default: Cost type by default + for_all_projects: For all projects + rates: Rates work_package: costs_by_type: დახარჯული ერთეული labor_costs: მუშაობის ფასი @@ -88,6 +90,10 @@ ka: work_package: is_not_a_valid_target_for_cost_entries: 'Work package #%{id} is not a valid target for reassigning the cost entries.' nullify_is_not_valid_for_cost_entries: ღირებულების ჩანაწერებს პროექტს ვერ მიანიჭებთ. + cost_types_project: + attributes: + project_ids: + blank: Please select a project. attributes: comment: კომენტარი cost_type: ხარჯის ტიპი @@ -129,7 +135,6 @@ ka: label_current_default_rate: Current default rate label_date_on: დრო label_deleted_cost_types: Deleted cost types - label_locked_cost_types: Locked cost types label_display_cost_entries: Display unit costs label_display_time_entries: Display reported hours label_display_types: ტიპების ჩვენება @@ -229,6 +234,28 @@ ka: errors: validation: start_time_different_date: Date part of startTime (%{start_time}) must be the same as the spentOn (%{spent_on}) date. + label_available_cost_types_projects: Available cost types projects + cost_types: + errors: + no_cost_types_available: No cost types are available in this project. Please contact an administrator. + admin: + columns: + active_projects: Active projects + cost_type_projects: + for_all_projects_blank_slate: + heading: This cost type is enabled in all projects + description: Uncheck "For all projects" on the details tab to limit this cost type to specific projects. + no_projects: + heading: No projects assigned + description: Add projects so this cost type can be used in them. + rates: + title: Rate history + settings: + time_and_costs: Time & Costs + cost_types: + heading: Cost types + none_active: No cost types are currently active in this project. + for_all_projects_hint: This cost type is enabled in all projects. costs: widgets: actual_costs: diff --git a/modules/costs/config/locales/crowdin/kk.yml b/modules/costs/config/locales/crowdin/kk.yml index e27f646e442..99a17e8e403 100644 --- a/modules/costs/config/locales/crowdin/kk.yml +++ b/modules/costs/config/locales/crowdin/kk.yml @@ -39,6 +39,8 @@ kk: unit: Unit name unit_plural: Pluralized unit name default: Cost type by default + for_all_projects: For all projects + rates: Rates work_package: costs_by_type: Spent units labor_costs: Labor costs @@ -88,6 +90,10 @@ kk: work_package: is_not_a_valid_target_for_cost_entries: 'Work package #%{id} is not a valid target for reassigning the cost entries.' nullify_is_not_valid_for_cost_entries: Cost entries can not be assigned to a project. + cost_types_project: + attributes: + project_ids: + blank: Please select a project. attributes: comment: Comment cost_type: Cost type @@ -129,7 +135,6 @@ kk: label_current_default_rate: Current default rate label_date_on: 'on' label_deleted_cost_types: Deleted cost types - label_locked_cost_types: Locked cost types label_display_cost_entries: Display unit costs label_display_time_entries: Display reported hours label_display_types: Display types @@ -229,6 +234,28 @@ kk: errors: validation: start_time_different_date: Date part of startTime (%{start_time}) must be the same as the spentOn (%{spent_on}) date. + label_available_cost_types_projects: Available cost types projects + cost_types: + errors: + no_cost_types_available: No cost types are available in this project. Please contact an administrator. + admin: + columns: + active_projects: Active projects + cost_type_projects: + for_all_projects_blank_slate: + heading: This cost type is enabled in all projects + description: Uncheck "For all projects" on the details tab to limit this cost type to specific projects. + no_projects: + heading: No projects assigned + description: Add projects so this cost type can be used in them. + rates: + title: Rate history + settings: + time_and_costs: Time & Costs + cost_types: + heading: Cost types + none_active: No cost types are currently active in this project. + for_all_projects_hint: This cost type is enabled in all projects. costs: widgets: actual_costs: diff --git a/modules/costs/config/locales/crowdin/ko.yml b/modules/costs/config/locales/crowdin/ko.yml index 4bac7e19726..d701c3bc77c 100644 --- a/modules/costs/config/locales/crowdin/ko.yml +++ b/modules/costs/config/locales/crowdin/ko.yml @@ -39,6 +39,8 @@ ko: unit: 단위 이름 unit_plural: 복수형 단위 이름 default: 기본 비용 유형 + for_all_projects: 모든 프로젝트용 + rates: 요금 work_package: costs_by_type: 소비 단위 labor_costs: 노동 비용 @@ -84,6 +86,10 @@ ko: work_package: is_not_a_valid_target_for_cost_entries: '작업 패키지 #%{id}은(는) 비용 항목 재할당에 올바른 대상이 아닙니다.' nullify_is_not_valid_for_cost_entries: 비용 항목은 프로젝트에 할당할 수 없습니다. + cost_types_project: + attributes: + project_ids: + blank: 프로젝트를 선택하세요. attributes: comment: 코멘트 cost_type: 비용 유형 @@ -125,7 +131,6 @@ ko: label_current_default_rate: 현재 기본 요금 label_date_on: "-" label_deleted_cost_types: 삭제된 비용 유형 - label_locked_cost_types: 잠긴 비용 유형 label_display_cost_entries: 단위 비용 표시 label_display_time_entries: 보고된 시간 표시 label_display_types: 유형 표시 @@ -225,6 +230,28 @@ ko: errors: validation: start_time_different_date: startTime(%{start_time})의 날짜 부분은 spentOn(%{spent_on}) 날짜와 동일해야 합니다. + label_available_cost_types_projects: 사용 가능한 비용 유형 프로젝트 + cost_types: + errors: + no_cost_types_available: 이 프로젝트에는 비용 유형이 없습니다. 관리자에게 문의하세요. + admin: + columns: + active_projects: 활성 프로젝트 + cost_type_projects: + for_all_projects_blank_slate: + heading: 이 비용 유형은 모든 프로젝트에서 활성화되었습니다 + description: 이 비용 유형을 특정 프로젝트로 제한하려면 세부 정보 탭에서 "모든 프로젝트용"을 선택 취소합니다. + no_projects: + heading: 할당된 프로젝트 없음 + description: 이 비용 유형을 프로젝트에 사용할 수 있도록 프로젝트를 추가합니다. + rates: + title: 요금 기록 + settings: + time_and_costs: 시간 & 비용 + cost_types: + heading: 비용 유형 + none_active: 이 프로젝트에는 현재 활성화된 비용 유형이 없습니다. + for_all_projects_hint: 이 비용 유형은 모든 프로젝트에서 활성화되었습니다. costs: widgets: actual_costs: diff --git a/modules/costs/config/locales/crowdin/lt.yml b/modules/costs/config/locales/crowdin/lt.yml index 8bc1d8f16ff..433e5710f40 100644 --- a/modules/costs/config/locales/crowdin/lt.yml +++ b/modules/costs/config/locales/crowdin/lt.yml @@ -39,6 +39,8 @@ lt: unit: Vieneto pavadinimas unit_plural: Daugiaskaitinis vienetų pavadinimas default: Cost type by default + for_all_projects: For all projects + rates: Rates work_package: costs_by_type: Panaudota vienetų labor_costs: Darbų kaštai @@ -96,6 +98,10 @@ lt: work_package: is_not_a_valid_target_for_cost_entries: 'Darbų paketas #%{id} nėra tinkamas kaštų perskirstymo pasirinkimas.' nullify_is_not_valid_for_cost_entries: Kaštų įrašai negali būti priskirti šiam projektui. + cost_types_project: + attributes: + project_ids: + blank: Please select a project. attributes: comment: Komentaras cost_type: Kaštų tipas @@ -137,7 +143,6 @@ lt: label_current_default_rate: Esamas numatytasis koeficientas label_date_on: įjungta label_deleted_cost_types: Panaikinti kaštų tipai - label_locked_cost_types: Užrakinti kaštų tipai label_display_cost_entries: Rodyti vieneto kaštus label_display_time_entries: Rodyti atsiskaitytas valandas label_display_types: Rodyti tipus @@ -237,6 +242,28 @@ lt: errors: validation: start_time_different_date: Date part of startTime (%{start_time}) must be the same as the spentOn (%{spent_on}) date. + label_available_cost_types_projects: Available cost types projects + cost_types: + errors: + no_cost_types_available: No cost types are available in this project. Please contact an administrator. + admin: + columns: + active_projects: Active projects + cost_type_projects: + for_all_projects_blank_slate: + heading: This cost type is enabled in all projects + description: Uncheck "For all projects" on the details tab to limit this cost type to specific projects. + no_projects: + heading: No projects assigned + description: Add projects so this cost type can be used in them. + rates: + title: Rate history + settings: + time_and_costs: Time & Costs + cost_types: + heading: Cost types + none_active: No cost types are currently active in this project. + for_all_projects_hint: This cost type is enabled in all projects. costs: widgets: actual_costs: diff --git a/modules/costs/config/locales/crowdin/lv.yml b/modules/costs/config/locales/crowdin/lv.yml index 37eed68d5c8..9e7c4413423 100644 --- a/modules/costs/config/locales/crowdin/lv.yml +++ b/modules/costs/config/locales/crowdin/lv.yml @@ -39,6 +39,8 @@ lv: unit: Vienības nosaukums unit_plural: Pluralized unit name default: Cost type by default + for_all_projects: For all projects + rates: Rates work_package: costs_by_type: Izlietotās vienības labor_costs: Darba izmaksas @@ -92,6 +94,10 @@ lv: work_package: is_not_a_valid_target_for_cost_entries: 'Work package #%{id} is not a valid target for reassigning the cost entries.' nullify_is_not_valid_for_cost_entries: '' + cost_types_project: + attributes: + project_ids: + blank: Please select a project. attributes: comment: Komentârs cost_type: Izmaksu veids @@ -133,7 +139,6 @@ lv: label_current_default_rate: Current default rate label_date_on: " " label_deleted_cost_types: Deleted cost types - label_locked_cost_types: Locked cost types label_display_cost_entries: Display unit costs label_display_time_entries: Display reported hours label_display_types: Display types @@ -233,6 +238,28 @@ lv: errors: validation: start_time_different_date: Date part of startTime (%{start_time}) must be the same as the spentOn (%{spent_on}) date. + label_available_cost_types_projects: Available cost types projects + cost_types: + errors: + no_cost_types_available: No cost types are available in this project. Please contact an administrator. + admin: + columns: + active_projects: Active projects + cost_type_projects: + for_all_projects_blank_slate: + heading: This cost type is enabled in all projects + description: Uncheck "For all projects" on the details tab to limit this cost type to specific projects. + no_projects: + heading: No projects assigned + description: Add projects so this cost type can be used in them. + rates: + title: Rate history + settings: + time_and_costs: Time & Costs + cost_types: + heading: Cost types + none_active: No cost types are currently active in this project. + for_all_projects_hint: This cost type is enabled in all projects. costs: widgets: actual_costs: diff --git a/modules/costs/config/locales/crowdin/mn.yml b/modules/costs/config/locales/crowdin/mn.yml index aba6026ef42..43fe6a6c5ff 100644 --- a/modules/costs/config/locales/crowdin/mn.yml +++ b/modules/costs/config/locales/crowdin/mn.yml @@ -39,6 +39,8 @@ mn: unit: Unit name unit_plural: Pluralized unit name default: Cost type by default + for_all_projects: For all projects + rates: Rates work_package: costs_by_type: Spent units labor_costs: Labor costs @@ -88,6 +90,10 @@ mn: work_package: is_not_a_valid_target_for_cost_entries: 'Work package #%{id} is not a valid target for reassigning the cost entries.' nullify_is_not_valid_for_cost_entries: Cost entries can not be assigned to a project. + cost_types_project: + attributes: + project_ids: + blank: Please select a project. attributes: comment: Comment cost_type: Cost type @@ -129,7 +135,6 @@ mn: label_current_default_rate: Current default rate label_date_on: 'on' label_deleted_cost_types: Deleted cost types - label_locked_cost_types: Locked cost types label_display_cost_entries: Display unit costs label_display_time_entries: Display reported hours label_display_types: Display types @@ -229,6 +234,28 @@ mn: errors: validation: start_time_different_date: Date part of startTime (%{start_time}) must be the same as the spentOn (%{spent_on}) date. + label_available_cost_types_projects: Available cost types projects + cost_types: + errors: + no_cost_types_available: No cost types are available in this project. Please contact an administrator. + admin: + columns: + active_projects: Active projects + cost_type_projects: + for_all_projects_blank_slate: + heading: This cost type is enabled in all projects + description: Uncheck "For all projects" on the details tab to limit this cost type to specific projects. + no_projects: + heading: No projects assigned + description: Add projects so this cost type can be used in them. + rates: + title: Rate history + settings: + time_and_costs: Time & Costs + cost_types: + heading: Cost types + none_active: No cost types are currently active in this project. + for_all_projects_hint: This cost type is enabled in all projects. costs: widgets: actual_costs: diff --git a/modules/costs/config/locales/crowdin/ms.yml b/modules/costs/config/locales/crowdin/ms.yml index a5d4dae00d7..61fb2ad55e1 100644 --- a/modules/costs/config/locales/crowdin/ms.yml +++ b/modules/costs/config/locales/crowdin/ms.yml @@ -39,6 +39,8 @@ ms: unit: Nama unit unit_plural: Nama majmuk unit default: Jenis kos secara lalai + for_all_projects: For all projects + rates: Rates work_package: costs_by_type: Unit yang telah dibelanjakan labor_costs: Kos buruh @@ -84,6 +86,10 @@ ms: work_package: is_not_a_valid_target_for_cost_entries: 'Pakej kerja #%{id} bukan sasaran yang sah untuk penukaran kos entri.' nullify_is_not_valid_for_cost_entries: Kos entri tidak dapat ditugaskan ke sebuah projek. + cost_types_project: + attributes: + project_ids: + blank: Please select a project. attributes: comment: Komen cost_type: Jenis kos @@ -125,7 +131,6 @@ ms: label_current_default_rate: Kadar default semasa label_date_on: pada label_deleted_cost_types: Jenis kos yang dipadam - label_locked_cost_types: Jenis kos terkunci label_display_cost_entries: Papar kos unit label_display_time_entries: Paparkan jam yang dilaporkan label_display_types: Jenis paparan @@ -225,6 +230,28 @@ ms: errors: validation: start_time_different_date: Date part of startTime (%{start_time}) must be the same as the spentOn (%{spent_on}) date. + label_available_cost_types_projects: Available cost types projects + cost_types: + errors: + no_cost_types_available: No cost types are available in this project. Please contact an administrator. + admin: + columns: + active_projects: Active projects + cost_type_projects: + for_all_projects_blank_slate: + heading: This cost type is enabled in all projects + description: Uncheck "For all projects" on the details tab to limit this cost type to specific projects. + no_projects: + heading: No projects assigned + description: Add projects so this cost type can be used in them. + rates: + title: Rate history + settings: + time_and_costs: Time & Costs + cost_types: + heading: Cost types + none_active: No cost types are currently active in this project. + for_all_projects_hint: This cost type is enabled in all projects. costs: widgets: actual_costs: diff --git a/modules/costs/config/locales/crowdin/ne.yml b/modules/costs/config/locales/crowdin/ne.yml index 7d0a6a0969d..0cda3de863b 100644 --- a/modules/costs/config/locales/crowdin/ne.yml +++ b/modules/costs/config/locales/crowdin/ne.yml @@ -39,6 +39,8 @@ ne: unit: Unit name unit_plural: Pluralized unit name default: Cost type by default + for_all_projects: For all projects + rates: Rates work_package: costs_by_type: Spent units labor_costs: Labor costs @@ -88,6 +90,10 @@ ne: work_package: is_not_a_valid_target_for_cost_entries: 'Work package #%{id} is not a valid target for reassigning the cost entries.' nullify_is_not_valid_for_cost_entries: Cost entries can not be assigned to a project. + cost_types_project: + attributes: + project_ids: + blank: Please select a project. attributes: comment: Comment cost_type: Cost type @@ -129,7 +135,6 @@ ne: label_current_default_rate: Current default rate label_date_on: 'on' label_deleted_cost_types: Deleted cost types - label_locked_cost_types: Locked cost types label_display_cost_entries: Display unit costs label_display_time_entries: Display reported hours label_display_types: Display types @@ -229,6 +234,28 @@ ne: errors: validation: start_time_different_date: Date part of startTime (%{start_time}) must be the same as the spentOn (%{spent_on}) date. + label_available_cost_types_projects: Available cost types projects + cost_types: + errors: + no_cost_types_available: No cost types are available in this project. Please contact an administrator. + admin: + columns: + active_projects: Active projects + cost_type_projects: + for_all_projects_blank_slate: + heading: This cost type is enabled in all projects + description: Uncheck "For all projects" on the details tab to limit this cost type to specific projects. + no_projects: + heading: No projects assigned + description: Add projects so this cost type can be used in them. + rates: + title: Rate history + settings: + time_and_costs: Time & Costs + cost_types: + heading: Cost types + none_active: No cost types are currently active in this project. + for_all_projects_hint: This cost type is enabled in all projects. costs: widgets: actual_costs: diff --git a/modules/costs/config/locales/crowdin/nl.yml b/modules/costs/config/locales/crowdin/nl.yml index 32aecf5b829..e4b1d51e691 100644 --- a/modules/costs/config/locales/crowdin/nl.yml +++ b/modules/costs/config/locales/crowdin/nl.yml @@ -39,6 +39,8 @@ nl: unit: Naam eenheid unit_plural: Vermeerderde eenheid naam default: Kostensoort als standaard + for_all_projects: For all projects + rates: Rates work_package: costs_by_type: Eenheden uitgegeven labor_costs: Arbeidskosten @@ -88,6 +90,10 @@ nl: work_package: is_not_a_valid_target_for_cost_entries: 'Werkpakket #%{id} is geen geldig doel voor het opnieuw toewijzen van de kostenposten.' nullify_is_not_valid_for_cost_entries: Kostenposten kunnen niet worden toegewezen aan een project. + cost_types_project: + attributes: + project_ids: + blank: Please select a project. attributes: comment: Reactie cost_type: Soort kosten @@ -129,7 +135,6 @@ nl: label_current_default_rate: Huidige standaard tarief label_date_on: op label_deleted_cost_types: Verwijderde kostentypen - label_locked_cost_types: Vergrendelde kostensoorten label_display_cost_entries: Kosten per eenheid weergeven label_display_time_entries: Gerapporteerde uren weergeven label_display_types: Soorten weergeven @@ -229,6 +234,28 @@ nl: errors: validation: start_time_different_date: Het datumgedeelte van start tijd (%{start_time}) moet hetzelfde zijn als de uitgegeven op (%{spent_on}) datum. + label_available_cost_types_projects: Available cost types projects + cost_types: + errors: + no_cost_types_available: No cost types are available in this project. Please contact an administrator. + admin: + columns: + active_projects: Active projects + cost_type_projects: + for_all_projects_blank_slate: + heading: This cost type is enabled in all projects + description: Uncheck "For all projects" on the details tab to limit this cost type to specific projects. + no_projects: + heading: No projects assigned + description: Add projects so this cost type can be used in them. + rates: + title: Rate history + settings: + time_and_costs: Time & Costs + cost_types: + heading: Cost types + none_active: No cost types are currently active in this project. + for_all_projects_hint: This cost type is enabled in all projects. costs: widgets: actual_costs: diff --git a/modules/costs/config/locales/crowdin/no.yml b/modules/costs/config/locales/crowdin/no.yml index f7a401b44c0..e8d4cf07150 100644 --- a/modules/costs/config/locales/crowdin/no.yml +++ b/modules/costs/config/locales/crowdin/no.yml @@ -39,6 +39,8 @@ unit: Enhetsnavn unit_plural: Flertallsnavn på enhet default: Cost type by default + for_all_projects: For all projects + rates: Rates work_package: costs_by_type: Brukte enheter labor_costs: Arbeidskostnad @@ -88,6 +90,10 @@ work_package: is_not_a_valid_target_for_cost_entries: 'Arbeidspakke #%{id} er ikke et gyldig mål for nytildeling av kostnadsoppføringer.' nullify_is_not_valid_for_cost_entries: Kostnadsoppføringer kan ikke tilordnes et prosjekt. + cost_types_project: + attributes: + project_ids: + blank: Please select a project. attributes: comment: Kommentar cost_type: Kostnadstype @@ -129,7 +135,6 @@ label_current_default_rate: Nåværende standardsats label_date_on: på label_deleted_cost_types: Slettede kostnadstyper - label_locked_cost_types: Låste kostnadstyper label_display_cost_entries: Vis enhetskostnader label_display_time_entries: Vis rapporterte timer label_display_types: Visningstyper @@ -229,6 +234,28 @@ errors: validation: start_time_different_date: Date part of startTime (%{start_time}) must be the same as the spentOn (%{spent_on}) date. + label_available_cost_types_projects: Available cost types projects + cost_types: + errors: + no_cost_types_available: No cost types are available in this project. Please contact an administrator. + admin: + columns: + active_projects: Active projects + cost_type_projects: + for_all_projects_blank_slate: + heading: This cost type is enabled in all projects + description: Uncheck "For all projects" on the details tab to limit this cost type to specific projects. + no_projects: + heading: No projects assigned + description: Add projects so this cost type can be used in them. + rates: + title: Rate history + settings: + time_and_costs: Time & Costs + cost_types: + heading: Cost types + none_active: No cost types are currently active in this project. + for_all_projects_hint: This cost type is enabled in all projects. costs: widgets: actual_costs: diff --git a/modules/costs/config/locales/crowdin/pl.yml b/modules/costs/config/locales/crowdin/pl.yml index 86e178d2b08..b0fec311f77 100644 --- a/modules/costs/config/locales/crowdin/pl.yml +++ b/modules/costs/config/locales/crowdin/pl.yml @@ -39,6 +39,8 @@ pl: unit: Nazwa jednostki unit_plural: Liczba mnoga jednostki default: Domyślny typ kosztu + for_all_projects: Dla wszystkich projektów + rates: Stawki work_package: costs_by_type: Zużyte jednostki labor_costs: Koszty pracy @@ -96,6 +98,10 @@ pl: work_package: is_not_a_valid_target_for_cost_entries: 'Zestaw zadań #%{id} nie jest poprawnym celem do ponownego rozpisania kosztów.' nullify_is_not_valid_for_cost_entries: Pozycje kosztów nie mogą być przypisane do projektu. + cost_types_project: + attributes: + project_ids: + blank: Wybierz projekt. attributes: comment: Typ kosztu cost_type: Jednostki @@ -137,7 +143,6 @@ pl: label_current_default_rate: Aktualne stawki domyślne label_date_on: na label_deleted_cost_types: Usunięte typy kosztów - label_locked_cost_types: Zablokowane typy kosztów label_display_cost_entries: Pokaż koszty jednostkowe label_display_time_entries: Wyświetl zgłoszone godziny label_display_types: Wyświetl typy @@ -237,6 +242,28 @@ pl: errors: validation: start_time_different_date: Część daty startTime (%{start_time}) musi być taka sama jak data spentOn (%{spent_on}). + label_available_cost_types_projects: Dostępne projekty typów kosztów + cost_types: + errors: + no_cost_types_available: W tym projekcie nie są dostępne żadne typy kosztów. Skontaktuj się z administratorem. + admin: + columns: + active_projects: Aktywne projekty + cost_type_projects: + for_all_projects_blank_slate: + heading: Ten typ kosztów jest włączony we wszystkich projektach + description: Wyczyść opcję „Dla wszystkich projektów” na karcie szczegółów, aby ograniczyć ten typ kosztów do określonych projektów. + no_projects: + heading: Nie przydzielono żadnych projektów + description: Dodaj projekty, aby ten typ kosztu mógł być w nich używany. + rates: + title: Historia stawek + settings: + time_and_costs: Czas i koszty + cost_types: + heading: Typy kosztów + none_active: Żadne typy kosztów nie są obecnie aktywne w tym projekcie. + for_all_projects_hint: Ten typ kosztów jest włączony we wszystkich projektach. costs: widgets: actual_costs: diff --git a/modules/costs/config/locales/crowdin/pt-BR.yml b/modules/costs/config/locales/crowdin/pt-BR.yml index c639cfbd1fb..5571e96b62d 100644 --- a/modules/costs/config/locales/crowdin/pt-BR.yml +++ b/modules/costs/config/locales/crowdin/pt-BR.yml @@ -39,6 +39,8 @@ pt-BR: unit: Nome da unidade unit_plural: Plural do nome da unidade default: Tipo de custo por padrão + for_all_projects: Para todos os projetos + rates: Taxas work_package: costs_by_type: Unidades gastas labor_costs: Custos de trabalho @@ -88,6 +90,10 @@ pt-BR: work_package: is_not_a_valid_target_for_cost_entries: 'Pacote de trabalho #%{id} não é válido para reatribuir as entradas de custo.' nullify_is_not_valid_for_cost_entries: Custos dos insumos não podem ser atribuídos a um projeto. + cost_types_project: + attributes: + project_ids: + blank: Selecione um projeto. attributes: comment: Comentário cost_type: Tipo de custo @@ -129,7 +135,6 @@ pt-BR: label_current_default_rate: Atual taxa padrão label_date_on: em label_deleted_cost_types: Tipos de custos excluídos - label_locked_cost_types: Tipos de custos bloqueados label_display_cost_entries: Exibir os custos unitários label_display_time_entries: Exibir horas informadas label_display_types: Exibir tipos @@ -229,6 +234,28 @@ pt-BR: errors: validation: start_time_different_date: A data de início (%{start_time}) deve ser a mesma da data de registro (%{spent_on}). + label_available_cost_types_projects: Tipos de custo disponíveis nos projetos + cost_types: + errors: + no_cost_types_available: Nenhum tipo de custo está disponível neste projeto. Entre em contato com um administrador. + admin: + columns: + active_projects: Projetos ativos + cost_type_projects: + for_all_projects_blank_slate: + heading: Este tipo de custo está habilitado em todos os projetos + description: Desmarque “Para todos os projetos” na aba de detalhes para limitar este tipo de custo a projetos específicos. + no_projects: + heading: Nenhum projeto atribuído + description: Adicione projetos para que este tipo de custo possa ser utilizado neles. + rates: + title: Taxa histórica + settings: + time_and_costs: Tempo e custos + cost_types: + heading: Tipos de custo + none_active: Nenhum tipo de custo está ativo neste projeto. + for_all_projects_hint: Este tipo de custo está habilitado em todos os projetos. costs: widgets: actual_costs: diff --git a/modules/costs/config/locales/crowdin/pt-PT.yml b/modules/costs/config/locales/crowdin/pt-PT.yml index ff27d367bd4..65d2ffdd757 100644 --- a/modules/costs/config/locales/crowdin/pt-PT.yml +++ b/modules/costs/config/locales/crowdin/pt-PT.yml @@ -39,6 +39,8 @@ pt-PT: unit: Nome da Unidade unit_plural: Nome da unidade no plural default: Tipo de custo por padrão + for_all_projects: Para todos os projetos + rates: Tarifas work_package: costs_by_type: Unidades gastas labor_costs: Custos de trabalho @@ -88,6 +90,10 @@ pt-PT: work_package: is_not_a_valid_target_for_cost_entries: 'Pacote de trabalho #%{id} não é um destino válido para reatribuir os registos de custo.' nullify_is_not_valid_for_cost_entries: Entradas de custo não podem ser atribuídas a um projeto. + cost_types_project: + attributes: + project_ids: + blank: Selecione um projeto. attributes: comment: Comentário cost_type: Tipo de custo @@ -129,7 +135,6 @@ pt-PT: label_current_default_rate: Taxa atual por defeito label_date_on: em label_deleted_cost_types: Tipos de custos apagados - label_locked_cost_types: Tipos de custos bloqueados label_display_cost_entries: Mostrar custos unitários label_display_time_entries: Mostrar horas reportadas label_display_types: Mostrar tipos @@ -229,6 +234,28 @@ pt-PT: errors: validation: start_time_different_date: A parte da data de startTime (%{start_time}) tem de ser a mesma que a data de spentOn (%{spent_on}). + label_available_cost_types_projects: Tipos de custos disponíveis para projetos + cost_types: + errors: + no_cost_types_available: Não existem tipos de custos disponíveis neste projeto. Contacte um administrador. + admin: + columns: + active_projects: Projetos ativos + cost_type_projects: + for_all_projects_blank_slate: + heading: Este tipo de custo é ativado em todos os projetos + description: Desmarcar a opção "Para todos os projetos" no separador de detalhes para limitar este tipo de custo a projetos específicos. + no_projects: + heading: Não há projetos atribuídos + description: Adicionar projetos para que este tipo de custo possa ser utilizado nos mesmos. + rates: + title: Histórico de tarifas + settings: + time_and_costs: '' + cost_types: + heading: Tipos de custos + none_active: Nenhum tipo de custo está ativo neste projeto. + for_all_projects_hint: Este tipo de custo está ativado em todos os projetos. costs: widgets: actual_costs: diff --git a/modules/costs/config/locales/crowdin/ro.yml b/modules/costs/config/locales/crowdin/ro.yml index 1dd6c31b450..4b12ca4c144 100644 --- a/modules/costs/config/locales/crowdin/ro.yml +++ b/modules/costs/config/locales/crowdin/ro.yml @@ -39,6 +39,8 @@ ro: unit: Denumirea unității unit_plural: Numele unității pluralizate default: Tip cost implicit + for_all_projects: For all projects + rates: Rates work_package: costs_by_type: Unități consumate labor_costs: Costurile cu forța de muncă @@ -92,6 +94,10 @@ ro: work_package: is_not_a_valid_target_for_cost_entries: 'Pachetul de lucru #%{id} nu este o ţintă validă pentru reasocierea timpilor de lucru.' nullify_is_not_valid_for_cost_entries: Înregistrările de costuri nu pot fi atribuite unui proiect. + cost_types_project: + attributes: + project_ids: + blank: Please select a project. attributes: comment: Comentariu cost_type: Tip cost @@ -133,7 +139,6 @@ ro: label_current_default_rate: Tarif implicit actual label_date_on: pe label_deleted_cost_types: Tipuri de costuri șterse - label_locked_cost_types: Tipuri de costuri blocate label_display_cost_entries: Afișarea costurilor unitare label_display_time_entries: Afișarea orelor raportate label_display_types: Tipuri de afișare @@ -233,6 +238,28 @@ ro: errors: validation: start_time_different_date: Partea de dată din startTime (%{start_time}) trebuie să fie aceeași cu data spentOn (%{spent_on}). + label_available_cost_types_projects: Available cost types projects + cost_types: + errors: + no_cost_types_available: No cost types are available in this project. Please contact an administrator. + admin: + columns: + active_projects: Active projects + cost_type_projects: + for_all_projects_blank_slate: + heading: This cost type is enabled in all projects + description: Uncheck "For all projects" on the details tab to limit this cost type to specific projects. + no_projects: + heading: No projects assigned + description: Add projects so this cost type can be used in them. + rates: + title: Rate history + settings: + time_and_costs: Time & Costs + cost_types: + heading: Cost types + none_active: No cost types are currently active in this project. + for_all_projects_hint: This cost type is enabled in all projects. costs: widgets: actual_costs: diff --git a/modules/costs/config/locales/crowdin/ru.yml b/modules/costs/config/locales/crowdin/ru.yml index fcc391759dc..7047f042f74 100644 --- a/modules/costs/config/locales/crowdin/ru.yml +++ b/modules/costs/config/locales/crowdin/ru.yml @@ -39,6 +39,8 @@ ru: unit: Наименование количественного показателя unit_plural: Множественное наименование количественного показателя default: Тип затрат по умолчанию + for_all_projects: Для всех проектов + rates: Ставки work_package: costs_by_type: Затраченное количество labor_costs: Трудовые расходы @@ -96,6 +98,10 @@ ru: work_package: is_not_a_valid_target_for_cost_entries: 'Пакет работ #%{id} не является допустимым объектом для назначения стимостей.' nullify_is_not_valid_for_cost_entries: Записи о стоимостях не могут быть присвоены проекту. + cost_types_project: + attributes: + project_ids: + blank: Пожалуйста, выберите проект. attributes: comment: Комментарий cost_type: Тип затрат @@ -137,7 +143,6 @@ ru: label_current_default_rate: Текущий тариф по умолчанию label_date_on: на label_deleted_cost_types: Типы удаленных расходов - label_locked_cost_types: Заблокированные типы стоимостей label_display_cost_entries: Отображать расходы на единицу label_display_time_entries: Отображать часы по отчету label_display_types: Отображение типов @@ -237,6 +242,28 @@ ru: errors: validation: start_time_different_date: Дата startTime (%{start_time}) должна быть такой же, как дата spentOn (%{spent_on}). + label_available_cost_types_projects: Available cost types projects + cost_types: + errors: + no_cost_types_available: No cost types are available in this project. Please contact an administrator. + admin: + columns: + active_projects: Активные проекты + cost_type_projects: + for_all_projects_blank_slate: + heading: Этот тип затрат включен во всех проектах + description: Снимите флажок "Для всех проектов" на вкладке "Детали", чтобы ограничить этот тип затрат конкретными проектами. + no_projects: + heading: Проекты не назначены + description: Добавьте проекты, чтобы в них можно было использовать этот тип расходов. + rates: + title: История ставок + settings: + time_and_costs: Время и затраты + cost_types: + heading: Типы затрат + none_active: No cost types are currently active in this project. + for_all_projects_hint: This cost type is enabled in all projects. costs: widgets: actual_costs: diff --git a/modules/costs/config/locales/crowdin/rw.yml b/modules/costs/config/locales/crowdin/rw.yml index 056252f5a86..e10fd32166b 100644 --- a/modules/costs/config/locales/crowdin/rw.yml +++ b/modules/costs/config/locales/crowdin/rw.yml @@ -39,6 +39,8 @@ rw: unit: Unit name unit_plural: Pluralized unit name default: Cost type by default + for_all_projects: For all projects + rates: Rates work_package: costs_by_type: Spent units labor_costs: Labor costs @@ -88,6 +90,10 @@ rw: work_package: is_not_a_valid_target_for_cost_entries: 'Work package #%{id} is not a valid target for reassigning the cost entries.' nullify_is_not_valid_for_cost_entries: Cost entries can not be assigned to a project. + cost_types_project: + attributes: + project_ids: + blank: Please select a project. attributes: comment: Comment cost_type: Cost type @@ -129,7 +135,6 @@ rw: label_current_default_rate: Current default rate label_date_on: 'on' label_deleted_cost_types: Deleted cost types - label_locked_cost_types: Locked cost types label_display_cost_entries: Display unit costs label_display_time_entries: Display reported hours label_display_types: Display types @@ -229,6 +234,28 @@ rw: errors: validation: start_time_different_date: Date part of startTime (%{start_time}) must be the same as the spentOn (%{spent_on}) date. + label_available_cost_types_projects: Available cost types projects + cost_types: + errors: + no_cost_types_available: No cost types are available in this project. Please contact an administrator. + admin: + columns: + active_projects: Active projects + cost_type_projects: + for_all_projects_blank_slate: + heading: This cost type is enabled in all projects + description: Uncheck "For all projects" on the details tab to limit this cost type to specific projects. + no_projects: + heading: No projects assigned + description: Add projects so this cost type can be used in them. + rates: + title: Rate history + settings: + time_and_costs: Time & Costs + cost_types: + heading: Cost types + none_active: No cost types are currently active in this project. + for_all_projects_hint: This cost type is enabled in all projects. costs: widgets: actual_costs: diff --git a/modules/costs/config/locales/crowdin/si.yml b/modules/costs/config/locales/crowdin/si.yml index 46e79d25b29..0c66721286c 100644 --- a/modules/costs/config/locales/crowdin/si.yml +++ b/modules/costs/config/locales/crowdin/si.yml @@ -39,6 +39,8 @@ si: unit: Unit name unit_plural: Pluralized unit name default: Cost type by default + for_all_projects: For all projects + rates: Rates work_package: costs_by_type: Spent units labor_costs: Labor costs @@ -88,6 +90,10 @@ si: work_package: is_not_a_valid_target_for_cost_entries: 'Work package #%{id} is not a valid target for reassigning the cost entries.' nullify_is_not_valid_for_cost_entries: Cost entries can not be assigned to a project. + cost_types_project: + attributes: + project_ids: + blank: Please select a project. attributes: comment: අදහස් දක්වන්න cost_type: Cost type @@ -129,7 +135,6 @@ si: label_current_default_rate: Current default rate label_date_on: මත label_deleted_cost_types: Deleted cost types - label_locked_cost_types: Locked cost types label_display_cost_entries: Display unit costs label_display_time_entries: Display reported hours label_display_types: Display types @@ -229,6 +234,28 @@ si: errors: validation: start_time_different_date: Date part of startTime (%{start_time}) must be the same as the spentOn (%{spent_on}) date. + label_available_cost_types_projects: Available cost types projects + cost_types: + errors: + no_cost_types_available: No cost types are available in this project. Please contact an administrator. + admin: + columns: + active_projects: Active projects + cost_type_projects: + for_all_projects_blank_slate: + heading: This cost type is enabled in all projects + description: Uncheck "For all projects" on the details tab to limit this cost type to specific projects. + no_projects: + heading: No projects assigned + description: Add projects so this cost type can be used in them. + rates: + title: Rate history + settings: + time_and_costs: Time & Costs + cost_types: + heading: Cost types + none_active: No cost types are currently active in this project. + for_all_projects_hint: This cost type is enabled in all projects. costs: widgets: actual_costs: diff --git a/modules/costs/config/locales/crowdin/sk.yml b/modules/costs/config/locales/crowdin/sk.yml index 3a755d41f0d..84a58a8707c 100644 --- a/modules/costs/config/locales/crowdin/sk.yml +++ b/modules/costs/config/locales/crowdin/sk.yml @@ -39,6 +39,8 @@ sk: unit: Názov jednotky unit_plural: Názov jednotky v množnom čísle default: Cost type by default + for_all_projects: For all projects + rates: Rates work_package: costs_by_type: Použité jednotky labor_costs: Mzdové náklady @@ -96,6 +98,10 @@ sk: work_package: is_not_a_valid_target_for_cost_entries: 'Pracovný balíček #%{id} nie je platný cieľ pre pridelenie položky nákladov.' nullify_is_not_valid_for_cost_entries: Nákladové položky nie je možné priradiť k projektu. + cost_types_project: + attributes: + project_ids: + blank: Please select a project. attributes: comment: Komentár cost_type: Typ nákladu @@ -137,7 +143,6 @@ sk: label_current_default_rate: Aktuálna štandardná sadzba label_date_on: dňa label_deleted_cost_types: Odstránené typy nákladov - label_locked_cost_types: Blokované typy nákladov label_display_cost_entries: Zobrazenie jednotkových nákladov label_display_time_entries: Zobrazenie odhlásených hodín label_display_types: Zobrazené typy vstupov @@ -237,6 +242,28 @@ sk: errors: validation: start_time_different_date: Date part of startTime (%{start_time}) must be the same as the spentOn (%{spent_on}) date. + label_available_cost_types_projects: Available cost types projects + cost_types: + errors: + no_cost_types_available: No cost types are available in this project. Please contact an administrator. + admin: + columns: + active_projects: Active projects + cost_type_projects: + for_all_projects_blank_slate: + heading: This cost type is enabled in all projects + description: Uncheck "For all projects" on the details tab to limit this cost type to specific projects. + no_projects: + heading: No projects assigned + description: Add projects so this cost type can be used in them. + rates: + title: Rate history + settings: + time_and_costs: Time & Costs + cost_types: + heading: Cost types + none_active: No cost types are currently active in this project. + for_all_projects_hint: This cost type is enabled in all projects. costs: widgets: actual_costs: diff --git a/modules/costs/config/locales/crowdin/sl.yml b/modules/costs/config/locales/crowdin/sl.yml index 36404b23498..3ef2618e469 100644 --- a/modules/costs/config/locales/crowdin/sl.yml +++ b/modules/costs/config/locales/crowdin/sl.yml @@ -39,6 +39,8 @@ sl: unit: Ime enote unit_plural: Pluralizirano ime enote default: Cost type by default + for_all_projects: For all projects + rates: Rates work_package: costs_by_type: Porabljene enote labor_costs: Stroški dela @@ -96,6 +98,10 @@ sl: work_package: is_not_a_valid_target_for_cost_entries: 'Delovni paket #%{id} ni veljaven cilj za prerazporeditev vnosov stroškov.' nullify_is_not_valid_for_cost_entries: Vnosa stroškov ni mogoče dodeliti projektu. + cost_types_project: + attributes: + project_ids: + blank: Please select a project. attributes: comment: Komentar cost_type: Vrsta stroška @@ -139,7 +145,6 @@ sl: ' label_date_on: vključeno label_deleted_cost_types: Izbrisane vrste stroškov - label_locked_cost_types: Zaklenjene vrste stroškov label_display_cost_entries: Prikaži strošek enote label_display_time_entries: Prikaz prijavljenih ur label_display_types: Prikazi vrste @@ -239,6 +244,28 @@ sl: errors: validation: start_time_different_date: Date part of startTime (%{start_time}) must be the same as the spentOn (%{spent_on}) date. + label_available_cost_types_projects: Available cost types projects + cost_types: + errors: + no_cost_types_available: No cost types are available in this project. Please contact an administrator. + admin: + columns: + active_projects: Active projects + cost_type_projects: + for_all_projects_blank_slate: + heading: This cost type is enabled in all projects + description: Uncheck "For all projects" on the details tab to limit this cost type to specific projects. + no_projects: + heading: No projects assigned + description: Add projects so this cost type can be used in them. + rates: + title: Rate history + settings: + time_and_costs: Time & Costs + cost_types: + heading: Cost types + none_active: No cost types are currently active in this project. + for_all_projects_hint: This cost type is enabled in all projects. costs: widgets: actual_costs: diff --git a/modules/costs/config/locales/crowdin/sr.yml b/modules/costs/config/locales/crowdin/sr.yml index 2fb6cae5dd6..ae57092305f 100644 --- a/modules/costs/config/locales/crowdin/sr.yml +++ b/modules/costs/config/locales/crowdin/sr.yml @@ -39,6 +39,8 @@ sr: unit: Unit name unit_plural: Pluralized unit name default: Cost type by default + for_all_projects: For all projects + rates: Rates work_package: costs_by_type: Spent units labor_costs: Labor costs @@ -92,6 +94,10 @@ sr: work_package: is_not_a_valid_target_for_cost_entries: 'Work package #%{id} is not a valid target for reassigning the cost entries.' nullify_is_not_valid_for_cost_entries: Cost entries can not be assigned to a project. + cost_types_project: + attributes: + project_ids: + blank: Please select a project. attributes: comment: Comment cost_type: Cost type @@ -133,7 +139,6 @@ sr: label_current_default_rate: Current default rate label_date_on: 'on' label_deleted_cost_types: Deleted cost types - label_locked_cost_types: Locked cost types label_display_cost_entries: Display unit costs label_display_time_entries: Display reported hours label_display_types: Display types @@ -233,6 +238,28 @@ sr: errors: validation: start_time_different_date: Date part of startTime (%{start_time}) must be the same as the spentOn (%{spent_on}) date. + label_available_cost_types_projects: Available cost types projects + cost_types: + errors: + no_cost_types_available: No cost types are available in this project. Please contact an administrator. + admin: + columns: + active_projects: Active projects + cost_type_projects: + for_all_projects_blank_slate: + heading: This cost type is enabled in all projects + description: Uncheck "For all projects" on the details tab to limit this cost type to specific projects. + no_projects: + heading: No projects assigned + description: Add projects so this cost type can be used in them. + rates: + title: Rate history + settings: + time_and_costs: Time & Costs + cost_types: + heading: Cost types + none_active: No cost types are currently active in this project. + for_all_projects_hint: This cost type is enabled in all projects. costs: widgets: actual_costs: diff --git a/modules/costs/config/locales/crowdin/sv.yml b/modules/costs/config/locales/crowdin/sv.yml index 2ba936ff85a..42bb719427f 100644 --- a/modules/costs/config/locales/crowdin/sv.yml +++ b/modules/costs/config/locales/crowdin/sv.yml @@ -39,6 +39,8 @@ sv: unit: Enhetsnamn unit_plural: Enhetsnamn plural default: Kostnadstyp som standard + for_all_projects: For all projects + rates: Rates work_package: costs_by_type: Bokade enheter labor_costs: Personalkostnader @@ -88,6 +90,10 @@ sv: work_package: is_not_a_valid_target_for_cost_entries: 'Arbetspaket #%{id} är inte ett giltigt mål för omfördelning av kostnadsposterna.' nullify_is_not_valid_for_cost_entries: Kostnadsposterna kan inte tilldelas till ett projekt. + cost_types_project: + attributes: + project_ids: + blank: Please select a project. attributes: comment: Kommentar cost_type: Kostnadstyp @@ -129,7 +135,6 @@ sv: label_current_default_rate: Nuvarande standardtimpris label_date_on: den label_deleted_cost_types: Borttagna kostnadstyper - label_locked_cost_types: Låsta kostnadstyper label_display_cost_entries: Visa enhetskostnader label_display_time_entries: Visa rapporterade timmar label_display_types: Visa typer @@ -229,6 +234,28 @@ sv: errors: validation: start_time_different_date: Datum del av startTime (%{start_time}) måste vara samma som datumet för spentOn (%{spent_on}). + label_available_cost_types_projects: Available cost types projects + cost_types: + errors: + no_cost_types_available: No cost types are available in this project. Please contact an administrator. + admin: + columns: + active_projects: Active projects + cost_type_projects: + for_all_projects_blank_slate: + heading: This cost type is enabled in all projects + description: Uncheck "For all projects" on the details tab to limit this cost type to specific projects. + no_projects: + heading: No projects assigned + description: Add projects so this cost type can be used in them. + rates: + title: Rate history + settings: + time_and_costs: Time & Costs + cost_types: + heading: Cost types + none_active: No cost types are currently active in this project. + for_all_projects_hint: This cost type is enabled in all projects. costs: widgets: actual_costs: diff --git a/modules/costs/config/locales/crowdin/th.yml b/modules/costs/config/locales/crowdin/th.yml index 564a65290c6..42406912f0e 100644 --- a/modules/costs/config/locales/crowdin/th.yml +++ b/modules/costs/config/locales/crowdin/th.yml @@ -39,6 +39,8 @@ th: unit: Unit name unit_plural: ชื่อหน่วย default: Cost type by default + for_all_projects: For all projects + rates: Rates work_package: costs_by_type: Spent units labor_costs: Labor costs @@ -84,6 +86,10 @@ th: work_package: is_not_a_valid_target_for_cost_entries: 'Work package #%{id} is not a valid target for reassigning the cost entries.' nullify_is_not_valid_for_cost_entries: Cost entries can not be assigned to a project. + cost_types_project: + attributes: + project_ids: + blank: Please select a project. attributes: comment: ความคิดเห็น cost_type: Cost type @@ -125,7 +131,6 @@ th: label_current_default_rate: อัตราเริ่มต้นปัจจุบัน label_date_on: เมื่อ label_deleted_cost_types: ประเภทต้นทุนที่ถูกลบ - label_locked_cost_types: ประเภทต้นทุนที่ถูกล็อก label_display_cost_entries: แสดงต้นทุนหน่วย label_display_time_entries: แสดงชั่วโมงที่รายงาน label_display_types: แสดงประเภท @@ -225,6 +230,28 @@ th: errors: validation: start_time_different_date: นที่ในส่วนเวลาเริ่มต้น (%{start_time}) ต้องเป็นวันเดียวกันกับวันที่บันทึกเวลา (%{spent_on}) + label_available_cost_types_projects: Available cost types projects + cost_types: + errors: + no_cost_types_available: No cost types are available in this project. Please contact an administrator. + admin: + columns: + active_projects: Active projects + cost_type_projects: + for_all_projects_blank_slate: + heading: This cost type is enabled in all projects + description: Uncheck "For all projects" on the details tab to limit this cost type to specific projects. + no_projects: + heading: No projects assigned + description: Add projects so this cost type can be used in them. + rates: + title: Rate history + settings: + time_and_costs: Time & Costs + cost_types: + heading: Cost types + none_active: No cost types are currently active in this project. + for_all_projects_hint: This cost type is enabled in all projects. costs: widgets: actual_costs: diff --git a/modules/costs/config/locales/crowdin/tr.yml b/modules/costs/config/locales/crowdin/tr.yml index 1fdcd6080f6..78fc153cf13 100644 --- a/modules/costs/config/locales/crowdin/tr.yml +++ b/modules/costs/config/locales/crowdin/tr.yml @@ -39,6 +39,8 @@ tr: unit: Birim adı unit_plural: Birimin çoğul adı default: Varsayılan maliyet türü + for_all_projects: For all projects + rates: Rates work_package: costs_by_type: Harcanan birimler labor_costs: İş gücü maliyetleri @@ -88,6 +90,10 @@ tr: work_package: is_not_a_valid_target_for_cost_entries: 'İş numarası # {id}, maliyet girişlerini yeniden atamak için geçerli bir hedef değil.%{id}.' nullify_is_not_valid_for_cost_entries: Maliyet girdileri bir projeye atanamaz. + cost_types_project: + attributes: + project_ids: + blank: Please select a project. attributes: comment: Yorum cost_type: Maliyet türü @@ -129,7 +135,6 @@ tr: label_current_default_rate: Güncel varsayılan oran label_date_on: tarihinde label_deleted_cost_types: Silinmiş maliyet türleri - label_locked_cost_types: Kilitli maliyet türleri label_display_cost_entries: Birim maliyetlerini göster label_display_time_entries: Raporlanan saatleri göster label_display_types: Ekran türleri @@ -229,6 +234,28 @@ tr: errors: validation: start_time_different_date: StartTime (%{start_time}) öğesinin tarih kısmı, spentOn (%{spent_on}) tarihi ile aynı olmalıdır. + label_available_cost_types_projects: Available cost types projects + cost_types: + errors: + no_cost_types_available: No cost types are available in this project. Please contact an administrator. + admin: + columns: + active_projects: Active projects + cost_type_projects: + for_all_projects_blank_slate: + heading: This cost type is enabled in all projects + description: Uncheck "For all projects" on the details tab to limit this cost type to specific projects. + no_projects: + heading: No projects assigned + description: Add projects so this cost type can be used in them. + rates: + title: Rate history + settings: + time_and_costs: Time & Costs + cost_types: + heading: Cost types + none_active: No cost types are currently active in this project. + for_all_projects_hint: This cost type is enabled in all projects. costs: widgets: actual_costs: diff --git a/modules/costs/config/locales/crowdin/uk.yml b/modules/costs/config/locales/crowdin/uk.yml index 00913a8409a..c6d557a7c9e 100644 --- a/modules/costs/config/locales/crowdin/uk.yml +++ b/modules/costs/config/locales/crowdin/uk.yml @@ -39,6 +39,8 @@ uk: unit: Назва одиниці unit_plural: Назва плуралізованої одиниці default: Тип витрат за замовчуванням + for_all_projects: Для всіх проєктів + rates: Ставки work_package: costs_by_type: Витрачені частини labor_costs: Витрати на оплату праці @@ -96,6 +98,10 @@ uk: work_package: is_not_a_valid_target_for_cost_entries: 'Робочий пакет #%{id} не є дійсною ціллю для перепризначення записів витрат.' nullify_is_not_valid_for_cost_entries: Записи витрат не можуть бути призначені проекту. + cost_types_project: + attributes: + project_ids: + blank: Виберіть проєкт. attributes: comment: Коментар cost_type: Тип вартості @@ -137,7 +143,6 @@ uk: label_current_default_rate: Поточна ставка за промовчанням label_date_on: на label_deleted_cost_types: Видалені типи витрат - label_locked_cost_types: Заблоковані типи витрат label_display_cost_entries: Відображення одиничних витрат label_display_time_entries: Відображати зареєстровані години label_display_types: Типи відображення @@ -237,6 +242,28 @@ uk: errors: validation: start_time_different_date: Частина дати в значенні startTime (%{start_time}) має збігатися зі значенням дати spentOn (%{spent_on}). + label_available_cost_types_projects: Доступні проєкти з типами витрат + cost_types: + errors: + no_cost_types_available: У цьому проєкті немає типів витрат. Зверніться до адміністратора. + admin: + columns: + active_projects: Активні проєкти + cost_type_projects: + for_all_projects_blank_slate: + heading: Цей тип витрат увімкнено у всіх проєктах + description: Зніміть прапорець «Для всіх проєктів» на вкладці з деталями, щоб цей тип витрат був доступний лише конкретним проєктам. + no_projects: + heading: Немає призначених проєктів + description: Додайте проєкти, щоб у них можна було використовувати цей тип витрат. + rates: + title: Історія ставок + settings: + time_and_costs: Час і витрати + cost_types: + heading: Типи витрат + none_active: Зараз у цьому проєкті немає активних типів витрат. + for_all_projects_hint: Цей тип витрат увімкнено у всіх проєктах. costs: widgets: actual_costs: diff --git a/modules/costs/config/locales/crowdin/uz.yml b/modules/costs/config/locales/crowdin/uz.yml index 03e319590bf..3c528c8ff6a 100644 --- a/modules/costs/config/locales/crowdin/uz.yml +++ b/modules/costs/config/locales/crowdin/uz.yml @@ -39,6 +39,8 @@ uz: unit: Unit name unit_plural: Pluralized unit name default: Cost type by default + for_all_projects: For all projects + rates: Rates work_package: costs_by_type: Spent units labor_costs: Labor costs @@ -88,6 +90,10 @@ uz: work_package: is_not_a_valid_target_for_cost_entries: 'Work package #%{id} is not a valid target for reassigning the cost entries.' nullify_is_not_valid_for_cost_entries: Cost entries can not be assigned to a project. + cost_types_project: + attributes: + project_ids: + blank: Please select a project. attributes: comment: Comment cost_type: Cost type @@ -129,7 +135,6 @@ uz: label_current_default_rate: Current default rate label_date_on: 'on' label_deleted_cost_types: Deleted cost types - label_locked_cost_types: Locked cost types label_display_cost_entries: Display unit costs label_display_time_entries: Display reported hours label_display_types: Display types @@ -229,6 +234,28 @@ uz: errors: validation: start_time_different_date: Date part of startTime (%{start_time}) must be the same as the spentOn (%{spent_on}) date. + label_available_cost_types_projects: Available cost types projects + cost_types: + errors: + no_cost_types_available: No cost types are available in this project. Please contact an administrator. + admin: + columns: + active_projects: Active projects + cost_type_projects: + for_all_projects_blank_slate: + heading: This cost type is enabled in all projects + description: Uncheck "For all projects" on the details tab to limit this cost type to specific projects. + no_projects: + heading: No projects assigned + description: Add projects so this cost type can be used in them. + rates: + title: Rate history + settings: + time_and_costs: Time & Costs + cost_types: + heading: Cost types + none_active: No cost types are currently active in this project. + for_all_projects_hint: This cost type is enabled in all projects. costs: widgets: actual_costs: diff --git a/modules/costs/config/locales/crowdin/vi.yml b/modules/costs/config/locales/crowdin/vi.yml index ba43a18bb2f..5be4bfa05f9 100644 --- a/modules/costs/config/locales/crowdin/vi.yml +++ b/modules/costs/config/locales/crowdin/vi.yml @@ -39,6 +39,8 @@ vi: unit: Tên đơn vị unit_plural: Tên đơn vị đa năng default: Loại chi phí theo mặc định + for_all_projects: For all projects + rates: Rates work_package: costs_by_type: Đơn vị đã chi labor_costs: Chi phí nhân công @@ -84,6 +86,10 @@ vi: work_package: is_not_a_valid_target_for_cost_entries: 'Gói công việc #%{id} không phải là mục tiêu hợp lệ để chỉ định lại các mục chi phí.' nullify_is_not_valid_for_cost_entries: Các mục chi phí không thể được phân bổ cho một dự án. + cost_types_project: + attributes: + project_ids: + blank: Please select a project. attributes: comment: bình luận cost_type: Loại chi phí @@ -125,7 +131,6 @@ vi: label_current_default_rate: Tỷ lệ mặc định hiện tại label_date_on: trên label_deleted_cost_types: Các loại chi phí đã xóa - label_locked_cost_types: Các loại chi phí bị khóa label_display_cost_entries: Chi phí đơn vị hiển thị label_display_time_entries: Hiển thị số giờ được báo cáo label_display_types: Các loại màn hình @@ -225,6 +230,28 @@ vi: errors: validation: start_time_different_date: Phần ngày của thời gian bắt đầu (%{start_time}) phải giống với ngày chi tiêu (%{spent_on}). + label_available_cost_types_projects: Available cost types projects + cost_types: + errors: + no_cost_types_available: No cost types are available in this project. Please contact an administrator. + admin: + columns: + active_projects: Active projects + cost_type_projects: + for_all_projects_blank_slate: + heading: This cost type is enabled in all projects + description: Uncheck "For all projects" on the details tab to limit this cost type to specific projects. + no_projects: + heading: No projects assigned + description: Add projects so this cost type can be used in them. + rates: + title: Rate history + settings: + time_and_costs: Time & Costs + cost_types: + heading: Cost types + none_active: No cost types are currently active in this project. + for_all_projects_hint: This cost type is enabled in all projects. costs: widgets: actual_costs: diff --git a/modules/costs/config/locales/crowdin/zh-CN.yml b/modules/costs/config/locales/crowdin/zh-CN.yml index cd9c000ef1b..df43d82f979 100644 --- a/modules/costs/config/locales/crowdin/zh-CN.yml +++ b/modules/costs/config/locales/crowdin/zh-CN.yml @@ -39,6 +39,8 @@ zh-CN: unit: 单位名称 unit_plural: 单位名称(复数) default: 默认成本类型 + for_all_projects: 适用于所有项目 + rates: 费率 work_package: costs_by_type: 支出单位 labor_costs: 人工成本 @@ -84,6 +86,10 @@ zh-CN: work_package: is_not_a_valid_target_for_cost_entries: '工作包 #%{id} 不是重新分配成本条目的有效目标。' nullify_is_not_valid_for_cost_entries: 无法将成本条目分配到项目。 + cost_types_project: + attributes: + project_ids: + blank: 请选择项目。 attributes: comment: 注释 cost_type: 成本类型 @@ -125,7 +131,6 @@ zh-CN: label_current_default_rate: 当前基本费率 label_date_on: 日期 label_deleted_cost_types: 已删除的成本类型 - label_locked_cost_types: 锁定成本类型 label_display_cost_entries: 显示单位成本 label_display_time_entries: 显示已上报工时 label_display_types: 显示类型 @@ -225,6 +230,28 @@ zh-CN: errors: validation: start_time_different_date: 开始时间 (%{start_time}) 的日期部分必须与 支出日期(%{spent_on})相同。 + label_available_cost_types_projects: 可用的成本类型项目 + cost_types: + errors: + no_cost_types_available: 此项目中没有可用的成本类型。请联系管理员。 + admin: + columns: + active_projects: 有效项目 + cost_type_projects: + for_all_projects_blank_slate: + heading: 此成本类型已在所有项目中启用 + description: 取消选中“详细信息”选项卡上的“适用于所有项目”,将此成本类型限制为特定项目。 + no_projects: + heading: 未分配项目 + description: 添加项目,以便在其中使用此成本类型。 + rates: + title: 费率历史记录 + settings: + time_and_costs: 时间和成本 + cost_types: + heading: 成本类型 + none_active: 此项目中目前没有有效成本类型。 + for_all_projects_hint: 此成本类型已在所有项目中启用。 costs: widgets: actual_costs: diff --git a/modules/costs/config/locales/crowdin/zh-TW.yml b/modules/costs/config/locales/crowdin/zh-TW.yml index 4e0b6c9d111..b608438310d 100644 --- a/modules/costs/config/locales/crowdin/zh-TW.yml +++ b/modules/costs/config/locales/crowdin/zh-TW.yml @@ -39,6 +39,8 @@ zh-TW: unit: 單位名稱 unit_plural: 單位名稱(複數) default: 預設成本類型 + for_all_projects: For all projects + rates: Rates work_package: costs_by_type: 支出單位 labor_costs: 工資 @@ -84,6 +86,10 @@ zh-TW: work_package: is_not_a_valid_target_for_cost_entries: '工作套件 #%{id} 無法作為有效的支出重新分配目標。' nullify_is_not_valid_for_cost_entries: 支出項目無法分配至專案 + cost_types_project: + attributes: + project_ids: + blank: Please select a project. attributes: comment: 留言 cost_type: 費用類別 @@ -125,7 +131,6 @@ zh-TW: label_current_default_rate: 目前基本費率 label_date_on: 開啟 label_deleted_cost_types: 已刪除的成本類型 - label_locked_cost_types: 鎖定成本類型 label_display_cost_entries: 顯示單位成本 label_display_time_entries: 顯示已回報的工作時數 label_display_types: 顯示類型 @@ -225,6 +230,28 @@ zh-TW: errors: validation: start_time_different_date: startTime (%{start_time}) 的日期部分必須與 spentOn (%{spent_on}) 的日期相同。 + label_available_cost_types_projects: Available cost types projects + cost_types: + errors: + no_cost_types_available: No cost types are available in this project. Please contact an administrator. + admin: + columns: + active_projects: Active projects + cost_type_projects: + for_all_projects_blank_slate: + heading: This cost type is enabled in all projects + description: Uncheck "For all projects" on the details tab to limit this cost type to specific projects. + no_projects: + heading: No projects assigned + description: Add projects so this cost type can be used in them. + rates: + title: Rate history + settings: + time_and_costs: Time & Costs + cost_types: + heading: Cost types + none_active: No cost types are currently active in this project. + for_all_projects_hint: This cost type is enabled in all projects. costs: widgets: actual_costs: diff --git a/modules/grids/config/locales/crowdin/js-af.yml b/modules/grids/config/locales/crowdin/js-af.yml index 903d45f29b5..41cd8ed9a30 100644 --- a/modules/grids/config/locales/crowdin/js-af.yml +++ b/modules/grids/config/locales/crowdin/js-af.yml @@ -33,7 +33,7 @@ af: title: Subitems project_favorites: title: Favorite projects - no_results: You currently have no favorite projects. Click on the star icon in the project dashboard to add one to your favorites. + no_results: You currently have no favorite projects. Add one or multiple projects as favorite through their overview or in a project list. time_entries_current_user: title: My spent time displayed_days: 'Days displayed in the widget:' diff --git a/modules/grids/config/locales/crowdin/js-ar.yml b/modules/grids/config/locales/crowdin/js-ar.yml index e3d510dafb5..44381c65926 100644 --- a/modules/grids/config/locales/crowdin/js-ar.yml +++ b/modules/grids/config/locales/crowdin/js-ar.yml @@ -33,7 +33,7 @@ ar: title: Subitems project_favorites: title: Favorite projects - no_results: You currently have no favorite projects. Click on the star icon in the project dashboard to add one to your favorites. + no_results: You currently have no favorite projects. Add one or multiple projects as favorite through their overview or in a project list. time_entries_current_user: title: My spent time displayed_days: 'Days displayed in the widget:' diff --git a/modules/grids/config/locales/crowdin/js-az.yml b/modules/grids/config/locales/crowdin/js-az.yml index 2a9c19ee517..57196840ea3 100644 --- a/modules/grids/config/locales/crowdin/js-az.yml +++ b/modules/grids/config/locales/crowdin/js-az.yml @@ -33,7 +33,7 @@ az: title: Subitems project_favorites: title: Favorite projects - no_results: You currently have no favorite projects. Click on the star icon in the project dashboard to add one to your favorites. + no_results: You currently have no favorite projects. Add one or multiple projects as favorite through their overview or in a project list. time_entries_current_user: title: My spent time displayed_days: 'Days displayed in the widget:' diff --git a/modules/grids/config/locales/crowdin/js-be.yml b/modules/grids/config/locales/crowdin/js-be.yml index ea9313d39be..dce7853099e 100644 --- a/modules/grids/config/locales/crowdin/js-be.yml +++ b/modules/grids/config/locales/crowdin/js-be.yml @@ -33,7 +33,7 @@ be: title: Subitems project_favorites: title: Favorite projects - no_results: You currently have no favorite projects. Click on the star icon in the project dashboard to add one to your favorites. + no_results: You currently have no favorite projects. Add one or multiple projects as favorite through their overview or in a project list. time_entries_current_user: title: My spent time displayed_days: 'Days displayed in the widget:' diff --git a/modules/grids/config/locales/crowdin/js-bg.yml b/modules/grids/config/locales/crowdin/js-bg.yml index c156bace885..0a6e9a2a507 100644 --- a/modules/grids/config/locales/crowdin/js-bg.yml +++ b/modules/grids/config/locales/crowdin/js-bg.yml @@ -33,7 +33,7 @@ bg: title: Subitems project_favorites: title: Любими проекти - no_results: You currently have no favorite projects. Click on the star icon in the project dashboard to add one to your favorites. + no_results: You currently have no favorite projects. Add one or multiple projects as favorite through their overview or in a project list. time_entries_current_user: title: Мое употребено време displayed_days: 'Дни, показани в приспособлението:' diff --git a/modules/grids/config/locales/crowdin/js-ca.yml b/modules/grids/config/locales/crowdin/js-ca.yml index 306c5ea3e3d..af572061e4e 100644 --- a/modules/grids/config/locales/crowdin/js-ca.yml +++ b/modules/grids/config/locales/crowdin/js-ca.yml @@ -33,7 +33,7 @@ ca: title: Subitems project_favorites: title: Projectes preferits - no_results: You currently have no favorite projects. Click on the star icon in the project dashboard to add one to your favorites. + no_results: You currently have no favorite projects. Add one or multiple projects as favorite through their overview or in a project list. time_entries_current_user: title: El meu temps invertit displayed_days: Dies mostrats en el widget diff --git a/modules/grids/config/locales/crowdin/js-ckb-IR.yml b/modules/grids/config/locales/crowdin/js-ckb-IR.yml index d419612bc15..50a9cfaa595 100644 --- a/modules/grids/config/locales/crowdin/js-ckb-IR.yml +++ b/modules/grids/config/locales/crowdin/js-ckb-IR.yml @@ -33,7 +33,7 @@ ckb-IR: title: Subitems project_favorites: title: Favorite projects - no_results: You currently have no favorite projects. Click on the star icon in the project dashboard to add one to your favorites. + no_results: You currently have no favorite projects. Add one or multiple projects as favorite through their overview or in a project list. time_entries_current_user: title: My spent time displayed_days: 'Days displayed in the widget:' diff --git a/modules/grids/config/locales/crowdin/js-cs.yml b/modules/grids/config/locales/crowdin/js-cs.yml index a786ef0cc19..3cd614744b1 100644 --- a/modules/grids/config/locales/crowdin/js-cs.yml +++ b/modules/grids/config/locales/crowdin/js-cs.yml @@ -33,7 +33,7 @@ cs: title: Dílčí položky project_favorites: title: Oblíbené projekty - no_results: Momentálně nemáte žádné oblíbené projekty. Klikněte na ikonu hvězdičky v nástěnce projektu pro přidání jednoho do oblíbených. + no_results: You currently have no favorite projects. Add one or multiple projects as favorite through their overview or in a project list. time_entries_current_user: title: Můj strávený čas displayed_days: 'Dny zobrazené ve widgetu:' diff --git a/modules/grids/config/locales/crowdin/js-da.yml b/modules/grids/config/locales/crowdin/js-da.yml index 35a589e92a1..9750bbbff36 100644 --- a/modules/grids/config/locales/crowdin/js-da.yml +++ b/modules/grids/config/locales/crowdin/js-da.yml @@ -33,7 +33,7 @@ da: title: Subitems project_favorites: title: Favorite projects - no_results: You currently have no favorite projects. Click on the star icon in the project dashboard to add one to your favorites. + no_results: You currently have no favorite projects. Add one or multiple projects as favorite through their overview or in a project list. time_entries_current_user: title: My spent time displayed_days: 'Days displayed in the widget:' diff --git a/modules/grids/config/locales/crowdin/js-de.yml b/modules/grids/config/locales/crowdin/js-de.yml index 6e541d6e9bd..866bbbcfbc2 100644 --- a/modules/grids/config/locales/crowdin/js-de.yml +++ b/modules/grids/config/locales/crowdin/js-de.yml @@ -33,7 +33,7 @@ de: title: Unterelemente project_favorites: title: Favorisierte Projekte - no_results: Sie haben derzeit keine favorisierten Projekte. Klicken Sie auf den Stern auf der Projektübersicht, um ein Projekt zu Ihren Favoriten hinzuzufügen. + no_results: Sie haben derzeit keine favorisierten Projekte. Fügen Sie ein oder mehrere Projekte in der Übersicht oder in einer Projektliste als Favoriten hinzu. time_entries_current_user: title: Meine gebuchte Zeit displayed_days: 'Dargestellte Tage im Widget:' diff --git a/modules/grids/config/locales/crowdin/js-el.yml b/modules/grids/config/locales/crowdin/js-el.yml index a4a66c2f2b9..0b27e719d97 100644 --- a/modules/grids/config/locales/crowdin/js-el.yml +++ b/modules/grids/config/locales/crowdin/js-el.yml @@ -33,7 +33,7 @@ el: title: Subitems project_favorites: title: Favorite projects - no_results: You currently have no favorite projects. Click on the star icon in the project dashboard to add one to your favorites. + no_results: You currently have no favorite projects. Add one or multiple projects as favorite through their overview or in a project list. time_entries_current_user: title: Ο δικός μου χρόνος που δαπανήθηκε displayed_days: 'Ημέρες που εμφανίζονται στο widget:' diff --git a/modules/grids/config/locales/crowdin/js-eo.yml b/modules/grids/config/locales/crowdin/js-eo.yml index 61ba39c58d7..d88e833bd7e 100644 --- a/modules/grids/config/locales/crowdin/js-eo.yml +++ b/modules/grids/config/locales/crowdin/js-eo.yml @@ -33,7 +33,7 @@ eo: title: Subitems project_favorites: title: Favorite projects - no_results: You currently have no favorite projects. Click on the star icon in the project dashboard to add one to your favorites. + no_results: You currently have no favorite projects. Add one or multiple projects as favorite through their overview or in a project list. time_entries_current_user: title: My spent time displayed_days: 'Tagoj montritaj en la kromprogrameto:' diff --git a/modules/grids/config/locales/crowdin/js-es.yml b/modules/grids/config/locales/crowdin/js-es.yml index a5bf7863716..b861ab3fb4c 100644 --- a/modules/grids/config/locales/crowdin/js-es.yml +++ b/modules/grids/config/locales/crowdin/js-es.yml @@ -33,7 +33,7 @@ es: title: Subelementos project_favorites: title: Proyectos favoritos - no_results: Actualmente no tiene ningún proyecto favorito. Haga clic en el icono de estrella en el panel de control del proyecto para añadirlo a sus favoritos. + no_results: Actualmente no tienes proyectos favoritos. Añada uno o varios proyectos como favoritos a través del resumen del proyecto o en una lista de proyectos. time_entries_current_user: title: Mi tiempo invertido displayed_days: 'Días mostrados en el widget:' diff --git a/modules/grids/config/locales/crowdin/js-et.yml b/modules/grids/config/locales/crowdin/js-et.yml index e1a294e141e..f5b9f5ff6ed 100644 --- a/modules/grids/config/locales/crowdin/js-et.yml +++ b/modules/grids/config/locales/crowdin/js-et.yml @@ -33,7 +33,7 @@ et: title: Subitems project_favorites: title: Lemmikprojektid - no_results: You currently have no favorite projects. Click on the star icon in the project dashboard to add one to your favorites. + no_results: You currently have no favorite projects. Add one or multiple projects as favorite through their overview or in a project list. time_entries_current_user: title: My spent time displayed_days: 'Days displayed in the widget:' diff --git a/modules/grids/config/locales/crowdin/js-eu.yml b/modules/grids/config/locales/crowdin/js-eu.yml index 11c8df6a95a..6b298dabd41 100644 --- a/modules/grids/config/locales/crowdin/js-eu.yml +++ b/modules/grids/config/locales/crowdin/js-eu.yml @@ -33,7 +33,7 @@ eu: title: Subitems project_favorites: title: Favorite projects - no_results: You currently have no favorite projects. Click on the star icon in the project dashboard to add one to your favorites. + no_results: You currently have no favorite projects. Add one or multiple projects as favorite through their overview or in a project list. time_entries_current_user: title: My spent time displayed_days: 'Days displayed in the widget:' diff --git a/modules/grids/config/locales/crowdin/js-fa.yml b/modules/grids/config/locales/crowdin/js-fa.yml index e76df36cc80..5b4714b4310 100644 --- a/modules/grids/config/locales/crowdin/js-fa.yml +++ b/modules/grids/config/locales/crowdin/js-fa.yml @@ -33,7 +33,7 @@ fa: title: Subitems project_favorites: title: Favorite projects - no_results: You currently have no favorite projects. Click on the star icon in the project dashboard to add one to your favorites. + no_results: You currently have no favorite projects. Add one or multiple projects as favorite through their overview or in a project list. time_entries_current_user: title: My spent time displayed_days: 'Days displayed in the widget:' diff --git a/modules/grids/config/locales/crowdin/js-fi.yml b/modules/grids/config/locales/crowdin/js-fi.yml index 362ec3bc644..d0978b00c14 100644 --- a/modules/grids/config/locales/crowdin/js-fi.yml +++ b/modules/grids/config/locales/crowdin/js-fi.yml @@ -33,7 +33,7 @@ fi: title: Subitems project_favorites: title: Favorite projects - no_results: You currently have no favorite projects. Click on the star icon in the project dashboard to add one to your favorites. + no_results: You currently have no favorite projects. Add one or multiple projects as favorite through their overview or in a project list. time_entries_current_user: title: Käyttämäni aika displayed_days: 'Days displayed in the widget:' diff --git a/modules/grids/config/locales/crowdin/js-fil.yml b/modules/grids/config/locales/crowdin/js-fil.yml index d9dac169650..bd37a18c889 100644 --- a/modules/grids/config/locales/crowdin/js-fil.yml +++ b/modules/grids/config/locales/crowdin/js-fil.yml @@ -33,7 +33,7 @@ fil: title: Subitems project_favorites: title: Favorite projects - no_results: You currently have no favorite projects. Click on the star icon in the project dashboard to add one to your favorites. + no_results: You currently have no favorite projects. Add one or multiple projects as favorite through their overview or in a project list. time_entries_current_user: title: My spent time displayed_days: 'Days displayed in the widget:' diff --git a/modules/grids/config/locales/crowdin/js-fr.yml b/modules/grids/config/locales/crowdin/js-fr.yml index 628f1334a80..42fa6756fc7 100644 --- a/modules/grids/config/locales/crowdin/js-fr.yml +++ b/modules/grids/config/locales/crowdin/js-fr.yml @@ -33,7 +33,7 @@ fr: title: Sous-éléments project_favorites: title: Projets favoris - no_results: Vous n'avez actuellement aucun projet favori. Cliquez sur l'icône en forme d'étoile dans le tableau de bord du projet pour en ajouter un à vos favoris. + no_results: Vous n'avez actuellement aucun projet favori. Ajoutez un ou plusieurs projets comme favoris dans leur aperçu ou dans une liste de projets. time_entries_current_user: title: Mon temps passé displayed_days: 'Jours affichés dans le widget :' diff --git a/modules/grids/config/locales/crowdin/js-he.yml b/modules/grids/config/locales/crowdin/js-he.yml index 7e9fd84e4a0..ccb5be94f52 100644 --- a/modules/grids/config/locales/crowdin/js-he.yml +++ b/modules/grids/config/locales/crowdin/js-he.yml @@ -33,7 +33,7 @@ he: title: Subitems project_favorites: title: Favorite projects - no_results: You currently have no favorite projects. Click on the star icon in the project dashboard to add one to your favorites. + no_results: You currently have no favorite projects. Add one or multiple projects as favorite through their overview or in a project list. time_entries_current_user: title: הזמן שהשקעתי displayed_days: 'מספר ימים בתוסף:' diff --git a/modules/grids/config/locales/crowdin/js-hi.yml b/modules/grids/config/locales/crowdin/js-hi.yml index 19f8f40771a..d12197c7f61 100644 --- a/modules/grids/config/locales/crowdin/js-hi.yml +++ b/modules/grids/config/locales/crowdin/js-hi.yml @@ -33,7 +33,7 @@ hi: title: Subitems project_favorites: title: Favorite projects - no_results: You currently have no favorite projects. Click on the star icon in the project dashboard to add one to your favorites. + no_results: You currently have no favorite projects. Add one or multiple projects as favorite through their overview or in a project list. time_entries_current_user: title: My spent time displayed_days: 'Days displayed in the widget:' diff --git a/modules/grids/config/locales/crowdin/js-hr.yml b/modules/grids/config/locales/crowdin/js-hr.yml index d3b9916c72c..6cc2444970d 100644 --- a/modules/grids/config/locales/crowdin/js-hr.yml +++ b/modules/grids/config/locales/crowdin/js-hr.yml @@ -33,7 +33,7 @@ hr: title: Subitems project_favorites: title: Favorite projects - no_results: You currently have no favorite projects. Click on the star icon in the project dashboard to add one to your favorites. + no_results: You currently have no favorite projects. Add one or multiple projects as favorite through their overview or in a project list. time_entries_current_user: title: My spent time displayed_days: 'Days displayed in the widget:' diff --git a/modules/grids/config/locales/crowdin/js-hu.yml b/modules/grids/config/locales/crowdin/js-hu.yml index 6fe2ed6ca54..cba131ba301 100644 --- a/modules/grids/config/locales/crowdin/js-hu.yml +++ b/modules/grids/config/locales/crowdin/js-hu.yml @@ -33,7 +33,7 @@ hu: title: Subitems project_favorites: title: Kedvenc projektek - no_results: Jelenleg nincsenek kedvenc projektjei. Kattintson a csillag ikonra a projekt műszerfalon, hogy felvegyen egyet a kedvencei közé. + no_results: You currently have no favorite projects. Add one or multiple projects as favorite through their overview or in a project list. time_entries_current_user: title: Eltöltött idő rögzítése displayed_days: Napok megjelenítése a főoldalon. diff --git a/modules/grids/config/locales/crowdin/js-hy.yml b/modules/grids/config/locales/crowdin/js-hy.yml index f7bd0277a1e..9d693470725 100644 --- a/modules/grids/config/locales/crowdin/js-hy.yml +++ b/modules/grids/config/locales/crowdin/js-hy.yml @@ -33,7 +33,7 @@ hy: title: Subitems project_favorites: title: Favorite projects - no_results: You currently have no favorite projects. Click on the star icon in the project dashboard to add one to your favorites. + no_results: You currently have no favorite projects. Add one or multiple projects as favorite through their overview or in a project list. time_entries_current_user: title: My spent time displayed_days: 'Days displayed in the widget:' diff --git a/modules/grids/config/locales/crowdin/js-id.yml b/modules/grids/config/locales/crowdin/js-id.yml index 5a1eae4e8ff..f2521968fb7 100644 --- a/modules/grids/config/locales/crowdin/js-id.yml +++ b/modules/grids/config/locales/crowdin/js-id.yml @@ -33,7 +33,7 @@ id: title: Subitem project_favorites: title: Proyek favorit - no_results: Saat ini, Anda tidak memiliki proyek favorit. Klik ikon bintang di dasbor proyek untuk menambahkan proyek ke daftar favorit Anda. + no_results: You currently have no favorite projects. Add one or multiple projects as favorite through their overview or in a project list. time_entries_current_user: title: Waktu yang saya habiskan displayed_days: 'Hari yang ditampilkan di widget:' diff --git a/modules/grids/config/locales/crowdin/js-it.yml b/modules/grids/config/locales/crowdin/js-it.yml index 23b8337c212..005cb78794f 100644 --- a/modules/grids/config/locales/crowdin/js-it.yml +++ b/modules/grids/config/locales/crowdin/js-it.yml @@ -33,7 +33,7 @@ it: title: Sottoelementi project_favorites: title: Progetti preferiti - no_results: Al momento non hai progetti preferiti. Clicca sull'icona della stella nella dashboard del progetto per aggiungerne uno ai tuoi preferiti. + no_results: Al momento non hai progetti preferiti. Aggiungi uno o più progetti ai preferiti dalla relativa panoramica o da un elenco di progetti. time_entries_current_user: title: Il mio tempo trascorso displayed_days: 'Giorni visualizzati nel widget:' diff --git a/modules/grids/config/locales/crowdin/js-ja.yml b/modules/grids/config/locales/crowdin/js-ja.yml index 31b399d0dbb..695286e4873 100644 --- a/modules/grids/config/locales/crowdin/js-ja.yml +++ b/modules/grids/config/locales/crowdin/js-ja.yml @@ -33,7 +33,7 @@ ja: title: Subitems project_favorites: title: お気に入りプロジェクト - no_results: 現在、お気に入りのプロジェクトはありません。プロジェクトダッシュボードの星アイコンをクリックして、お気に入りに追加してください。 + no_results: You currently have no favorite projects. Add one or multiple projects as favorite through their overview or in a project list. time_entries_current_user: title: 自分の作業時間 displayed_days: 'ウィジェットに表示される日数:' diff --git a/modules/grids/config/locales/crowdin/js-ka.yml b/modules/grids/config/locales/crowdin/js-ka.yml index 1fc07b1ae5b..3dc723d6887 100644 --- a/modules/grids/config/locales/crowdin/js-ka.yml +++ b/modules/grids/config/locales/crowdin/js-ka.yml @@ -33,7 +33,7 @@ ka: title: Subitems project_favorites: title: Favorite projects - no_results: You currently have no favorite projects. Click on the star icon in the project dashboard to add one to your favorites. + no_results: You currently have no favorite projects. Add one or multiple projects as favorite through their overview or in a project list. time_entries_current_user: title: ჩემი დახარჯული დრო displayed_days: 'Days displayed in the widget:' diff --git a/modules/grids/config/locales/crowdin/js-kk.yml b/modules/grids/config/locales/crowdin/js-kk.yml index bce4506911e..068c39e82ed 100644 --- a/modules/grids/config/locales/crowdin/js-kk.yml +++ b/modules/grids/config/locales/crowdin/js-kk.yml @@ -33,7 +33,7 @@ kk: title: Subitems project_favorites: title: Favorite projects - no_results: You currently have no favorite projects. Click on the star icon in the project dashboard to add one to your favorites. + no_results: You currently have no favorite projects. Add one or multiple projects as favorite through their overview or in a project list. time_entries_current_user: title: My spent time displayed_days: 'Days displayed in the widget:' diff --git a/modules/grids/config/locales/crowdin/js-ko.yml b/modules/grids/config/locales/crowdin/js-ko.yml index fedf9290792..d2c22e14215 100644 --- a/modules/grids/config/locales/crowdin/js-ko.yml +++ b/modules/grids/config/locales/crowdin/js-ko.yml @@ -33,7 +33,7 @@ ko: title: 하위 항목 project_favorites: title: 즐겨 찾는 프로젝트 - no_results: 즐겨 찾는 프로젝트가 현재 없습니다. 프로젝트 대시보드에서 별 아이콘을 클릭하여 즐겨찾기에 추가하세요. + no_results: 즐겨 찾는 프로젝트가 현재 없습니다. 개요 또는 프로젝트 목록에서 하나 이상의 프로젝트를 즐겨찾기로 추가하세요. time_entries_current_user: title: 내 소요 시간 displayed_days: '위젯에 표시되는 일수:' diff --git a/modules/grids/config/locales/crowdin/js-lt.yml b/modules/grids/config/locales/crowdin/js-lt.yml index d5146fbc504..52f80bd475c 100644 --- a/modules/grids/config/locales/crowdin/js-lt.yml +++ b/modules/grids/config/locales/crowdin/js-lt.yml @@ -33,7 +33,7 @@ lt: title: Subitems project_favorites: title: Mėgstami projektai - no_results: Jūs šiuo metu neturite mėgiamų projektų. Spauskite žvaigždutės piktogramą projekto skydelyje, kad pridėtumėte prie jūsų mėgstamų. + no_results: You currently have no favorite projects. Add one or multiple projects as favorite through their overview or in a project list. time_entries_current_user: title: Mano sugaištas laikas displayed_days: 'Valdiklyje rodomos dienos:' diff --git a/modules/grids/config/locales/crowdin/js-lv.yml b/modules/grids/config/locales/crowdin/js-lv.yml index d49693a4bd7..3e08d63b80e 100644 --- a/modules/grids/config/locales/crowdin/js-lv.yml +++ b/modules/grids/config/locales/crowdin/js-lv.yml @@ -33,7 +33,7 @@ lv: title: Subitems project_favorites: title: Favorite projects - no_results: You currently have no favorite projects. Click on the star icon in the project dashboard to add one to your favorites. + no_results: You currently have no favorite projects. Add one or multiple projects as favorite through their overview or in a project list. time_entries_current_user: title: My spent time displayed_days: 'Days displayed in the widget:' diff --git a/modules/grids/config/locales/crowdin/js-mn.yml b/modules/grids/config/locales/crowdin/js-mn.yml index b44a1f2edc5..7fcf469affe 100644 --- a/modules/grids/config/locales/crowdin/js-mn.yml +++ b/modules/grids/config/locales/crowdin/js-mn.yml @@ -33,7 +33,7 @@ mn: title: Subitems project_favorites: title: Favorite projects - no_results: You currently have no favorite projects. Click on the star icon in the project dashboard to add one to your favorites. + no_results: You currently have no favorite projects. Add one or multiple projects as favorite through their overview or in a project list. time_entries_current_user: title: My spent time displayed_days: 'Days displayed in the widget:' diff --git a/modules/grids/config/locales/crowdin/js-ms.yml b/modules/grids/config/locales/crowdin/js-ms.yml index 0afef82b9bb..04d22783996 100644 --- a/modules/grids/config/locales/crowdin/js-ms.yml +++ b/modules/grids/config/locales/crowdin/js-ms.yml @@ -33,7 +33,7 @@ ms: title: Subitems project_favorites: title: Projek kegemaran - no_results: Kini anda tiada projek kegemaran. Tekan ikon bintang di papan pemuka projek untuk tambahkan ke kegemaran anda. + no_results: You currently have no favorite projects. Add one or multiple projects as favorite through their overview or in a project list. time_entries_current_user: title: Masa yang saya gunakan displayed_days: 'Hari yang dipaparkan dalam widget:' diff --git a/modules/grids/config/locales/crowdin/js-ne.yml b/modules/grids/config/locales/crowdin/js-ne.yml index afee7d8717d..b882423d1ba 100644 --- a/modules/grids/config/locales/crowdin/js-ne.yml +++ b/modules/grids/config/locales/crowdin/js-ne.yml @@ -33,7 +33,7 @@ ne: title: Subitems project_favorites: title: Favorite projects - no_results: You currently have no favorite projects. Click on the star icon in the project dashboard to add one to your favorites. + no_results: You currently have no favorite projects. Add one or multiple projects as favorite through their overview or in a project list. time_entries_current_user: title: मेरो बितेको समय displayed_days: 'Days displayed in the widget:' diff --git a/modules/grids/config/locales/crowdin/js-nl.yml b/modules/grids/config/locales/crowdin/js-nl.yml index 451984f791b..cffdfc1d466 100644 --- a/modules/grids/config/locales/crowdin/js-nl.yml +++ b/modules/grids/config/locales/crowdin/js-nl.yml @@ -33,7 +33,7 @@ nl: title: Subitems project_favorites: title: Favoriete projecten - no_results: U hebt momenteel geen favoriete projecten. Klik op het sterpictogram in het projectdashboard om er een aan uw favorieten toe te voegen. + no_results: You currently have no favorite projects. Add one or multiple projects as favorite through their overview or in a project list. time_entries_current_user: title: Mijn bestede tijd displayed_days: 'Dagen weergegeven in de widget:' diff --git a/modules/grids/config/locales/crowdin/js-no.yml b/modules/grids/config/locales/crowdin/js-no.yml index bc88c3aebde..6a21f877a57 100644 --- a/modules/grids/config/locales/crowdin/js-no.yml +++ b/modules/grids/config/locales/crowdin/js-no.yml @@ -33,7 +33,7 @@ title: Subitems project_favorites: title: Favorittprosjekter - no_results: Du har ingen prosjektfavoritter. Klikk på stjerneikonet i prosjektdashbordet for å legge til en i favorittene dine. + no_results: You currently have no favorite projects. Add one or multiple projects as favorite through their overview or in a project list. time_entries_current_user: title: Min tidsbruk displayed_days: 'Dager vist i widgetet:' diff --git a/modules/grids/config/locales/crowdin/js-pl.yml b/modules/grids/config/locales/crowdin/js-pl.yml index 99daad242b8..8a4798097d5 100644 --- a/modules/grids/config/locales/crowdin/js-pl.yml +++ b/modules/grids/config/locales/crowdin/js-pl.yml @@ -33,7 +33,7 @@ pl: title: Podpozycje project_favorites: title: Ulubione projekty - no_results: Obecnie nie masz żadnych ulubionych projektów. Kliknij ikonę gwiazdki na pulpicie nawigacyjnym projektu, aby dodać go do ulubionych. + no_results: Obecnie nie masz żadnych ulubionych projektów. Dodaj co najmniej jeden projekt jako ulubiony w ich przeglądzie lub na liście projektów. time_entries_current_user: title: Mój spędzony czas displayed_days: 'Dni wyświetlane w widżecie:' diff --git a/modules/grids/config/locales/crowdin/js-pt-BR.yml b/modules/grids/config/locales/crowdin/js-pt-BR.yml index cb575b04a7b..a986ad0ca2d 100644 --- a/modules/grids/config/locales/crowdin/js-pt-BR.yml +++ b/modules/grids/config/locales/crowdin/js-pt-BR.yml @@ -33,7 +33,7 @@ pt-BR: title: Subitens project_favorites: title: Projetos favoritos - no_results: No momento, você não possui projetos favoritos. Clique no ícone de estrela no painel do projeto para adicionar um aos seus favoritos. + no_results: Você ainda não tem projetos favoritos. Adicione um ou mais projetos como favoritos através da visão geral ou em uma lista de projetos. time_entries_current_user: title: Meu tempo gasto displayed_days: 'Dias exibidos no widget:' diff --git a/modules/grids/config/locales/crowdin/js-pt-PT.yml b/modules/grids/config/locales/crowdin/js-pt-PT.yml index 22b5218286f..66ffbcb2cf2 100644 --- a/modules/grids/config/locales/crowdin/js-pt-PT.yml +++ b/modules/grids/config/locales/crowdin/js-pt-PT.yml @@ -33,7 +33,7 @@ pt-PT: title: Sub-elementos project_favorites: title: Projetos favoritos - no_results: Atualmente, não tem projetos favoritos. Clique no ícone da estrela no painel do projeto para adicionar um projeto aos seus favoritos. + no_results: Não tem nenhum projeto favorito. Adicione um ou vários projetos aos favoritos a partir da respetiva página de síntese ou numa lista de projetos. time_entries_current_user: title: O meu tempo gasto displayed_days: 'Dias exibidos no widget:' diff --git a/modules/grids/config/locales/crowdin/js-ro.yml b/modules/grids/config/locales/crowdin/js-ro.yml index 580dbe78a95..b53c720eb5c 100644 --- a/modules/grids/config/locales/crowdin/js-ro.yml +++ b/modules/grids/config/locales/crowdin/js-ro.yml @@ -33,7 +33,7 @@ ro: title: Subelemente project_favorites: title: Proiecte favorite - no_results: Nu ai niciun proiect favorit. Clic pe pictograma cu steluță din tabloul de bord al proiectului pentru a adăuga unul la favorite. + no_results: You currently have no favorite projects. Add one or multiple projects as favorite through their overview or in a project list. time_entries_current_user: title: Timpul meu consumat displayed_days: Zile afișate în lista de activități a proiectului diff --git a/modules/grids/config/locales/crowdin/js-ru.yml b/modules/grids/config/locales/crowdin/js-ru.yml index 864fdd9fc80..cd5b9b1f2b2 100644 --- a/modules/grids/config/locales/crowdin/js-ru.yml +++ b/modules/grids/config/locales/crowdin/js-ru.yml @@ -33,7 +33,7 @@ ru: title: Подпроекты project_favorites: title: Избранные проекты - no_results: В настоящее время у вас нет избранных проектов. Нажмите на значок звезды в панели управления проекта, чтобы добавить его в избранное. + no_results: You currently have no favorite projects. Add one or multiple projects as favorite through their overview or in a project list. time_entries_current_user: title: Затраченное мной время displayed_days: 'Дни, отображаемые в виджете:' diff --git a/modules/grids/config/locales/crowdin/js-rw.yml b/modules/grids/config/locales/crowdin/js-rw.yml index a1ea5c34083..72a7a06d09e 100644 --- a/modules/grids/config/locales/crowdin/js-rw.yml +++ b/modules/grids/config/locales/crowdin/js-rw.yml @@ -33,7 +33,7 @@ rw: title: Subitems project_favorites: title: Favorite projects - no_results: You currently have no favorite projects. Click on the star icon in the project dashboard to add one to your favorites. + no_results: You currently have no favorite projects. Add one or multiple projects as favorite through their overview or in a project list. time_entries_current_user: title: My spent time displayed_days: 'Days displayed in the widget:' diff --git a/modules/grids/config/locales/crowdin/js-si.yml b/modules/grids/config/locales/crowdin/js-si.yml index 7b0b6c38d6f..33a65f86c40 100644 --- a/modules/grids/config/locales/crowdin/js-si.yml +++ b/modules/grids/config/locales/crowdin/js-si.yml @@ -33,7 +33,7 @@ si: title: Subitems project_favorites: title: Favorite projects - no_results: You currently have no favorite projects. Click on the star icon in the project dashboard to add one to your favorites. + no_results: You currently have no favorite projects. Add one or multiple projects as favorite through their overview or in a project list. time_entries_current_user: title: My spent time displayed_days: 'Days displayed in the widget:' diff --git a/modules/grids/config/locales/crowdin/js-sk.yml b/modules/grids/config/locales/crowdin/js-sk.yml index 0ffd94dcb41..59df51bf4fe 100644 --- a/modules/grids/config/locales/crowdin/js-sk.yml +++ b/modules/grids/config/locales/crowdin/js-sk.yml @@ -33,7 +33,7 @@ sk: title: Subitems project_favorites: title: Favorite projects - no_results: You currently have no favorite projects. Click on the star icon in the project dashboard to add one to your favorites. + no_results: You currently have no favorite projects. Add one or multiple projects as favorite through their overview or in a project list. time_entries_current_user: title: My spent time displayed_days: 'Dni zobrazenia v miniaplikácii:' diff --git a/modules/grids/config/locales/crowdin/js-sl.yml b/modules/grids/config/locales/crowdin/js-sl.yml index c38ebc216a2..34d5a38450e 100644 --- a/modules/grids/config/locales/crowdin/js-sl.yml +++ b/modules/grids/config/locales/crowdin/js-sl.yml @@ -33,7 +33,7 @@ sl: title: Subitems project_favorites: title: Favorite projects - no_results: You currently have no favorite projects. Click on the star icon in the project dashboard to add one to your favorites. + no_results: You currently have no favorite projects. Add one or multiple projects as favorite through their overview or in a project list. time_entries_current_user: title: Moj porabljen čas displayed_days: 'Dnevi prikazani v gradniku:' diff --git a/modules/grids/config/locales/crowdin/js-sr.yml b/modules/grids/config/locales/crowdin/js-sr.yml index e16672ed1c8..77f084d2fb4 100644 --- a/modules/grids/config/locales/crowdin/js-sr.yml +++ b/modules/grids/config/locales/crowdin/js-sr.yml @@ -33,7 +33,7 @@ sr: title: Subitems project_favorites: title: Favorite projects - no_results: You currently have no favorite projects. Click on the star icon in the project dashboard to add one to your favorites. + no_results: You currently have no favorite projects. Add one or multiple projects as favorite through their overview or in a project list. time_entries_current_user: title: My spent time displayed_days: 'Days displayed in the widget:' diff --git a/modules/grids/config/locales/crowdin/js-sv.yml b/modules/grids/config/locales/crowdin/js-sv.yml index 2e28e45f77b..c2c1a7c8438 100644 --- a/modules/grids/config/locales/crowdin/js-sv.yml +++ b/modules/grids/config/locales/crowdin/js-sv.yml @@ -33,7 +33,7 @@ sv: title: Underpunkter project_favorites: title: Favoritprojekt - no_results: Du har för närvarande inga favoritprojekt. Klicka på stjärnikonen i projektets instrumentpanel för att lägga till en till dina favoriter. + no_results: You currently have no favorite projects. Add one or multiple projects as favorite through their overview or in a project list. time_entries_current_user: title: Min tillbringade tid displayed_days: 'Dagar som visas i widgeten:' diff --git a/modules/grids/config/locales/crowdin/js-th.yml b/modules/grids/config/locales/crowdin/js-th.yml index ef0e3e9ecce..9c03beb44ab 100644 --- a/modules/grids/config/locales/crowdin/js-th.yml +++ b/modules/grids/config/locales/crowdin/js-th.yml @@ -33,7 +33,7 @@ th: title: Subitems project_favorites: title: Favorite projects - no_results: You currently have no favorite projects. Click on the star icon in the project dashboard to add one to your favorites. + no_results: You currently have no favorite projects. Add one or multiple projects as favorite through their overview or in a project list. time_entries_current_user: title: My spent time displayed_days: 'Days displayed in the widget:' diff --git a/modules/grids/config/locales/crowdin/js-tr.yml b/modules/grids/config/locales/crowdin/js-tr.yml index 0588bad3269..29c65ebc3da 100644 --- a/modules/grids/config/locales/crowdin/js-tr.yml +++ b/modules/grids/config/locales/crowdin/js-tr.yml @@ -33,7 +33,7 @@ tr: title: Alt öğeler project_favorites: title: Favori projeler - no_results: Şu anda favori projeniz yok. Favorilerinize bir proje eklemek için proje gösterge panelindeki yıldız simgesine tıklayın. + no_results: You currently have no favorite projects. Add one or multiple projects as favorite through their overview or in a project list. time_entries_current_user: title: Geçirdiğim zaman displayed_days: 'Widget''te görüntülenen günler:' diff --git a/modules/grids/config/locales/crowdin/js-uk.yml b/modules/grids/config/locales/crowdin/js-uk.yml index de0cb53d111..db792b19de0 100644 --- a/modules/grids/config/locales/crowdin/js-uk.yml +++ b/modules/grids/config/locales/crowdin/js-uk.yml @@ -33,7 +33,7 @@ uk: title: Піделементи project_favorites: title: Обрані проєкти - no_results: Зараз у вас немає обраних проєктів. Натисніть значок зірочки на панелі керування проєктом, щоб додати його в обране. + no_results: 'Зараз у вас немає вибраних проєктів. Додайте один або кілька проєктів у вибране: це можна зробити на сторінці огляду або в списку проєктів.' time_entries_current_user: title: Мій витрачений час displayed_days: 'Днів, доступних у віджеті:' diff --git a/modules/grids/config/locales/crowdin/js-uz.yml b/modules/grids/config/locales/crowdin/js-uz.yml index e97255f840d..07bba3e4fe3 100644 --- a/modules/grids/config/locales/crowdin/js-uz.yml +++ b/modules/grids/config/locales/crowdin/js-uz.yml @@ -33,7 +33,7 @@ uz: title: Subitems project_favorites: title: Favorite projects - no_results: You currently have no favorite projects. Click on the star icon in the project dashboard to add one to your favorites. + no_results: You currently have no favorite projects. Add one or multiple projects as favorite through their overview or in a project list. time_entries_current_user: title: My spent time displayed_days: 'Days displayed in the widget:' diff --git a/modules/grids/config/locales/crowdin/js-vi.yml b/modules/grids/config/locales/crowdin/js-vi.yml index dea82f2b7a7..62b76e348dd 100644 --- a/modules/grids/config/locales/crowdin/js-vi.yml +++ b/modules/grids/config/locales/crowdin/js-vi.yml @@ -33,7 +33,7 @@ vi: title: mục phụ project_favorites: title: dự án yêu thích - no_results: Hiện tại bạn chưa có dự án yêu thích nào. Nhấp vào biểu tượng ngôi sao trong bảng điều khiển dự án để thêm một biểu tượng vào mục yêu thích của bạn. + no_results: You currently have no favorite projects. Add one or multiple projects as favorite through their overview or in a project list. time_entries_current_user: title: Thời gian hiện tại (My spent time) displayed_days: 'Ngày hiển thị trong widget:' diff --git a/modules/grids/config/locales/crowdin/js-zh-CN.yml b/modules/grids/config/locales/crowdin/js-zh-CN.yml index 20569d1f052..1e15522c8a6 100644 --- a/modules/grids/config/locales/crowdin/js-zh-CN.yml +++ b/modules/grids/config/locales/crowdin/js-zh-CN.yml @@ -33,7 +33,7 @@ zh-CN: title: 子项目 project_favorites: title: 收藏的项目 - no_results: 您目前没有收藏项目,单击项目仪表板中的星形图标将项目添加到收藏夹。 + no_results: 您目前没有收藏的项目。通过项目概览或项目列表添加一个或多个项目作为收藏项目。 time_entries_current_user: title: 我花费的时间 displayed_days: 微件中显示的天数: diff --git a/modules/grids/config/locales/crowdin/js-zh-TW.yml b/modules/grids/config/locales/crowdin/js-zh-TW.yml index bdde2ffc238..d781d68bec5 100644 --- a/modules/grids/config/locales/crowdin/js-zh-TW.yml +++ b/modules/grids/config/locales/crowdin/js-zh-TW.yml @@ -33,7 +33,7 @@ zh-TW: title: 子項目 project_favorites: title: 收藏的專案 - no_results: 您目前沒有收藏的專案。點擊項目儀表板中的星形圖示將其新增到您的收藏夾中。 + no_results: You currently have no favorite projects. Add one or multiple projects as favorite through their overview or in a project list. time_entries_current_user: title: 我的工時 displayed_days: 小工具顯示天數 diff --git a/modules/ldap_groups/config/locales/crowdin/af.yml b/modules/ldap_groups/config/locales/crowdin/af.yml index 8897e6a1ca2..692eed56c39 100644 --- a/modules/ldap_groups/config/locales/crowdin/af.yml +++ b/modules/ldap_groups/config/locales/crowdin/af.yml @@ -22,6 +22,7 @@ af: group_name_attribute: Group name attribute sync_users: Sync users base_dn: Search base DN + member_lookup_attribute: Group member attribute models: ldap_groups/synchronized_group: Synchronized LDAP group ldap_groups/synchronized_filter: LDAP Group synchronization filter @@ -32,7 +33,7 @@ af: ldap_groups: label_menu_item: LDAP group synchronization label_group_key: LDAP group filter key - label_synchronize: Synchronize + label_synchronize: Discover LDAP groups settings: name_attribute: LDAP groups name attribute name_attribute_text: The LDAP attribute used for naming the OpenProject group when created by a filter @@ -55,6 +56,9 @@ af: filter_string_text: Enter the RFC4515 LDAP filter that returns groups in your LDAP to synchronize with OpenProject. base_dn_text: 'Enter the search base DN to use for this filter. It needs to be below the base DN of the selected LDAP connection. Leave this option empty to reuse the base DN of the connection + ' + member_lookup_attribute_text: 'Leave empty to use the default reverse lookup: OpenProject searches for users whose memberOf attribute matches the group DN. This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). Set this to the attribute name on group entries that lists member DNs to use forward lookup instead. Examples: "uniqueMember" (groupOfUniqueNames), "member" (groupOfNames). Use this for LDAP servers that do not maintain the memberOf attribute on user entries. + ' synchronized_groups: add_new: Add synchronized LDAP group @@ -65,7 +69,12 @@ af: info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | This module allows you to set up a synchronization between LDAP and OpenProject groups. - It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. +
+ By default, OpenProject uses reverse lookup: it searches for users whose memberOf attribute matches the group DN. + This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). +
+ If your LDAP server does not maintain memberOf on user entries (e.g. it uses groupOfUniqueNames with uniqueMember), + you can configure forward lookup by setting the Group member attribute on the synchronization filter.
Groups are synchronized hourly through a cron job. [Please see our documentation on this topic](docs_url). diff --git a/modules/ldap_groups/config/locales/crowdin/ar.yml b/modules/ldap_groups/config/locales/crowdin/ar.yml index 456a95584cd..cc6011948bb 100644 --- a/modules/ldap_groups/config/locales/crowdin/ar.yml +++ b/modules/ldap_groups/config/locales/crowdin/ar.yml @@ -22,6 +22,7 @@ ar: group_name_attribute: Group name attribute sync_users: مزامنة المستخدمين base_dn: Search base DN + member_lookup_attribute: Group member attribute models: ldap_groups/synchronized_group: Synchronized LDAP group ldap_groups/synchronized_filter: LDAP Group synchronization filter @@ -32,7 +33,7 @@ ar: ldap_groups: label_menu_item: LDAP group synchronization label_group_key: LDAP group filter key - label_synchronize: Synchronize + label_synchronize: Discover LDAP groups settings: name_attribute: LDAP groups name attribute name_attribute_text: The LDAP attribute used for naming the OpenProject group when created by a filter @@ -55,6 +56,9 @@ ar: filter_string_text: Enter the RFC4515 LDAP filter that returns groups in your LDAP to synchronize with OpenProject. base_dn_text: 'Enter the search base DN to use for this filter. It needs to be below the base DN of the selected LDAP connection. Leave this option empty to reuse the base DN of the connection + ' + member_lookup_attribute_text: 'Leave empty to use the default reverse lookup: OpenProject searches for users whose memberOf attribute matches the group DN. This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). Set this to the attribute name on group entries that lists member DNs to use forward lookup instead. Examples: "uniqueMember" (groupOfUniqueNames), "member" (groupOfNames). Use this for LDAP servers that do not maintain the memberOf attribute on user entries. + ' synchronized_groups: add_new: Add synchronized LDAP group @@ -65,7 +69,12 @@ ar: info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | This module allows you to set up a synchronization between LDAP and OpenProject groups. - It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. +
+ By default, OpenProject uses reverse lookup: it searches for users whose memberOf attribute matches the group DN. + This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). +
+ If your LDAP server does not maintain memberOf on user entries (e.g. it uses groupOfUniqueNames with uniqueMember), + you can configure forward lookup by setting the Group member attribute on the synchronization filter.
Groups are synchronized hourly through a cron job. [Please see our documentation on this topic](docs_url). diff --git a/modules/ldap_groups/config/locales/crowdin/az.yml b/modules/ldap_groups/config/locales/crowdin/az.yml index 60893de1e39..fe72131a216 100644 --- a/modules/ldap_groups/config/locales/crowdin/az.yml +++ b/modules/ldap_groups/config/locales/crowdin/az.yml @@ -22,6 +22,7 @@ az: group_name_attribute: Group name attribute sync_users: Sync users base_dn: Search base DN + member_lookup_attribute: Group member attribute models: ldap_groups/synchronized_group: Synchronized LDAP group ldap_groups/synchronized_filter: LDAP Group synchronization filter @@ -32,7 +33,7 @@ az: ldap_groups: label_menu_item: LDAP group synchronization label_group_key: LDAP group filter key - label_synchronize: Synchronize + label_synchronize: Discover LDAP groups settings: name_attribute: LDAP groups name attribute name_attribute_text: The LDAP attribute used for naming the OpenProject group when created by a filter @@ -55,6 +56,9 @@ az: filter_string_text: Enter the RFC4515 LDAP filter that returns groups in your LDAP to synchronize with OpenProject. base_dn_text: 'Enter the search base DN to use for this filter. It needs to be below the base DN of the selected LDAP connection. Leave this option empty to reuse the base DN of the connection + ' + member_lookup_attribute_text: 'Leave empty to use the default reverse lookup: OpenProject searches for users whose memberOf attribute matches the group DN. This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). Set this to the attribute name on group entries that lists member DNs to use forward lookup instead. Examples: "uniqueMember" (groupOfUniqueNames), "member" (groupOfNames). Use this for LDAP servers that do not maintain the memberOf attribute on user entries. + ' synchronized_groups: add_new: Add synchronized LDAP group @@ -65,7 +69,12 @@ az: info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | This module allows you to set up a synchronization between LDAP and OpenProject groups. - It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. +
+ By default, OpenProject uses reverse lookup: it searches for users whose memberOf attribute matches the group DN. + This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). +
+ If your LDAP server does not maintain memberOf on user entries (e.g. it uses groupOfUniqueNames with uniqueMember), + you can configure forward lookup by setting the Group member attribute on the synchronization filter.
Groups are synchronized hourly through a cron job. [Please see our documentation on this topic](docs_url). diff --git a/modules/ldap_groups/config/locales/crowdin/be.yml b/modules/ldap_groups/config/locales/crowdin/be.yml index 227e36ae3b6..7f1a9dd9aad 100644 --- a/modules/ldap_groups/config/locales/crowdin/be.yml +++ b/modules/ldap_groups/config/locales/crowdin/be.yml @@ -22,6 +22,7 @@ be: group_name_attribute: Group name attribute sync_users: Sync users base_dn: Search base DN + member_lookup_attribute: Group member attribute models: ldap_groups/synchronized_group: Synchronized LDAP group ldap_groups/synchronized_filter: LDAP Group synchronization filter @@ -32,7 +33,7 @@ be: ldap_groups: label_menu_item: LDAP group synchronization label_group_key: LDAP group filter key - label_synchronize: Synchronize + label_synchronize: Discover LDAP groups settings: name_attribute: LDAP groups name attribute name_attribute_text: The LDAP attribute used for naming the OpenProject group when created by a filter @@ -55,6 +56,9 @@ be: filter_string_text: Enter the RFC4515 LDAP filter that returns groups in your LDAP to synchronize with OpenProject. base_dn_text: 'Enter the search base DN to use for this filter. It needs to be below the base DN of the selected LDAP connection. Leave this option empty to reuse the base DN of the connection + ' + member_lookup_attribute_text: 'Leave empty to use the default reverse lookup: OpenProject searches for users whose memberOf attribute matches the group DN. This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). Set this to the attribute name on group entries that lists member DNs to use forward lookup instead. Examples: "uniqueMember" (groupOfUniqueNames), "member" (groupOfNames). Use this for LDAP servers that do not maintain the memberOf attribute on user entries. + ' synchronized_groups: add_new: Add synchronized LDAP group @@ -65,7 +69,12 @@ be: info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | This module allows you to set up a synchronization between LDAP and OpenProject groups. - It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. +
+ By default, OpenProject uses reverse lookup: it searches for users whose memberOf attribute matches the group DN. + This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). +
+ If your LDAP server does not maintain memberOf on user entries (e.g. it uses groupOfUniqueNames with uniqueMember), + you can configure forward lookup by setting the Group member attribute on the synchronization filter.
Groups are synchronized hourly through a cron job. [Please see our documentation on this topic](docs_url). diff --git a/modules/ldap_groups/config/locales/crowdin/bg.yml b/modules/ldap_groups/config/locales/crowdin/bg.yml index 06052fb24eb..adfdb5cb3a0 100644 --- a/modules/ldap_groups/config/locales/crowdin/bg.yml +++ b/modules/ldap_groups/config/locales/crowdin/bg.yml @@ -22,6 +22,7 @@ bg: group_name_attribute: Атрибут за гуповото име sync_users: Синхронизиране на потребителите base_dn: База за търсене DN + member_lookup_attribute: Group member attribute models: ldap_groups/synchronized_group: Синхронизирана LDAP група ldap_groups/synchronized_filter: Филтър за синхронизиране на LDAP групи @@ -32,7 +33,7 @@ bg: ldap_groups: label_menu_item: Синхронизиране на LDAP групи label_group_key: Ключ за филтриране на LDAP група - label_synchronize: Синхронизирайте + label_synchronize: Discover LDAP groups settings: name_attribute: Атрибут за LDAP имена на групи name_attribute_text: Атрибут за LDAP, използван за именуване на OpenProject група, когато е създаден чрез филтър @@ -55,6 +56,9 @@ bg: filter_string_text: Въведете филтъра RFC4515 LDAP, който връща групи в LDAP, за да се синхронизира с OpenProject. base_dn_text: 'Въведете базовия DN за търсене, който да използвате за този филтър. То трябва да е под базовия DN на избраната LDAP връзка. Оставете тази опция празна, за да използвате отново базовия DN на връзката + ' + member_lookup_attribute_text: 'Leave empty to use the default reverse lookup: OpenProject searches for users whose memberOf attribute matches the group DN. This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). Set this to the attribute name on group entries that lists member DNs to use forward lookup instead. Examples: "uniqueMember" (groupOfUniqueNames), "member" (groupOfNames). Use this for LDAP servers that do not maintain the memberOf attribute on user entries. + ' synchronized_groups: add_new: Добавяне на синхронизирана LDAP група @@ -65,7 +69,12 @@ bg: info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | This module allows you to set up a synchronization between LDAP and OpenProject groups. - It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. +
+ By default, OpenProject uses reverse lookup: it searches for users whose memberOf attribute matches the group DN. + This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). +
+ If your LDAP server does not maintain memberOf on user entries (e.g. it uses groupOfUniqueNames with uniqueMember), + you can configure forward lookup by setting the Group member attribute on the synchronization filter.
Groups are synchronized hourly through a cron job. [Please see our documentation on this topic](docs_url). diff --git a/modules/ldap_groups/config/locales/crowdin/ca.yml b/modules/ldap_groups/config/locales/crowdin/ca.yml index 91cf2ab4f06..dfefe615476 100644 --- a/modules/ldap_groups/config/locales/crowdin/ca.yml +++ b/modules/ldap_groups/config/locales/crowdin/ca.yml @@ -22,6 +22,7 @@ ca: group_name_attribute: Atribut de nom de grup sync_users: Usuaris sincronitzats base_dn: Base de cerca DN + member_lookup_attribute: Group member attribute models: ldap_groups/synchronized_group: Grup LDAP sincronitzat ldap_groups/synchronized_filter: Filtre de sincronització de grup LDAP @@ -34,7 +35,7 @@ ca: ldap_groups: label_menu_item: Sincronització de grup LDAP label_group_key: Filtre clau de grup LDAP - label_synchronize: Sincronitzar + label_synchronize: Discover LDAP groups settings: name_attribute: Atribut de nom de grup LDAP name_attribute_text: L'atribut LDAP utilitzat per nomenar el grup d'OpenProject quan s'ha creat a través d'un filtre @@ -57,6 +58,9 @@ ca: filter_string_text: Afegeix el filtre LDAP RFC4515 que retorna els grups en el teu LDAP per sincronitzar amb OpenProject. base_dn_text: 'Afegeix la base de cerca DN per utilitzar aquest filtre. Ha d''estar dins de la base DN de la connexió LDAP seleccionada. Deixa aquest camp buit per reutilitzar la base DN de la connexió. + ' + member_lookup_attribute_text: 'Leave empty to use the default reverse lookup: OpenProject searches for users whose memberOf attribute matches the group DN. This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). Set this to the attribute name on group entries that lists member DNs to use forward lookup instead. Examples: "uniqueMember" (groupOfUniqueNames), "member" (groupOfNames). Use this for LDAP servers that do not maintain the memberOf attribute on user entries. + ' synchronized_groups: add_new: Afegeix grup de sincronització LDAP @@ -67,7 +71,12 @@ ca: info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | This module allows you to set up a synchronization between LDAP and OpenProject groups. - It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. +
+ By default, OpenProject uses reverse lookup: it searches for users whose memberOf attribute matches the group DN. + This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). +
+ If your LDAP server does not maintain memberOf on user entries (e.g. it uses groupOfUniqueNames with uniqueMember), + you can configure forward lookup by setting the Group member attribute on the synchronization filter.
Groups are synchronized hourly through a cron job. [Please see our documentation on this topic](docs_url). diff --git a/modules/ldap_groups/config/locales/crowdin/ckb-IR.yml b/modules/ldap_groups/config/locales/crowdin/ckb-IR.yml index 81a98d355f4..9e3dedc1200 100644 --- a/modules/ldap_groups/config/locales/crowdin/ckb-IR.yml +++ b/modules/ldap_groups/config/locales/crowdin/ckb-IR.yml @@ -22,6 +22,7 @@ ckb-IR: group_name_attribute: Group name attribute sync_users: Sync users base_dn: Search base DN + member_lookup_attribute: Group member attribute models: ldap_groups/synchronized_group: Synchronized LDAP group ldap_groups/synchronized_filter: LDAP Group synchronization filter @@ -32,7 +33,7 @@ ckb-IR: ldap_groups: label_menu_item: LDAP group synchronization label_group_key: LDAP group filter key - label_synchronize: Synchronize + label_synchronize: Discover LDAP groups settings: name_attribute: LDAP groups name attribute name_attribute_text: The LDAP attribute used for naming the OpenProject group when created by a filter @@ -55,6 +56,9 @@ ckb-IR: filter_string_text: Enter the RFC4515 LDAP filter that returns groups in your LDAP to synchronize with OpenProject. base_dn_text: 'Enter the search base DN to use for this filter. It needs to be below the base DN of the selected LDAP connection. Leave this option empty to reuse the base DN of the connection + ' + member_lookup_attribute_text: 'Leave empty to use the default reverse lookup: OpenProject searches for users whose memberOf attribute matches the group DN. This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). Set this to the attribute name on group entries that lists member DNs to use forward lookup instead. Examples: "uniqueMember" (groupOfUniqueNames), "member" (groupOfNames). Use this for LDAP servers that do not maintain the memberOf attribute on user entries. + ' synchronized_groups: add_new: Add synchronized LDAP group @@ -65,7 +69,12 @@ ckb-IR: info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | This module allows you to set up a synchronization between LDAP and OpenProject groups. - It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. +
+ By default, OpenProject uses reverse lookup: it searches for users whose memberOf attribute matches the group DN. + This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). +
+ If your LDAP server does not maintain memberOf on user entries (e.g. it uses groupOfUniqueNames with uniqueMember), + you can configure forward lookup by setting the Group member attribute on the synchronization filter.
Groups are synchronized hourly through a cron job. [Please see our documentation on this topic](docs_url). diff --git a/modules/ldap_groups/config/locales/crowdin/cs.yml b/modules/ldap_groups/config/locales/crowdin/cs.yml index fe898da4074..f647d870ad7 100644 --- a/modules/ldap_groups/config/locales/crowdin/cs.yml +++ b/modules/ldap_groups/config/locales/crowdin/cs.yml @@ -22,6 +22,7 @@ cs: group_name_attribute: Atribut názvu skupiny sync_users: Synchronizovat uživatele base_dn: Vyhledat základní DN + member_lookup_attribute: Group member attribute models: ldap_groups/synchronized_group: Synchronizovaná LDAP skupina ldap_groups/synchronized_filter: LDAP skupina synchronizační filtr @@ -32,7 +33,7 @@ cs: ldap_groups: label_menu_item: Synchronizace skupiny LDAP label_group_key: LDAP skupinový klíč filtru - label_synchronize: Synchronizovat + label_synchronize: Discover LDAP groups settings: name_attribute: Atribut názvu LDAP skupin name_attribute_text: LDAP atribut používaný pro pojmenování skupiny OpenProject při vytváření filtrem @@ -55,6 +56,9 @@ cs: filter_string_text: Zadejte RFC4515 LDAP, který vrátí skupiny v LDAP pro synchronizaci s OpenProject. base_dn_text: 'Pro tento filtr zadejte základní DN. Musí být nižší než základní DN vybraného LDAP. Ponechte tuto možnost prázdnou pro opětovné použití základní DN připojení + ' + member_lookup_attribute_text: 'Leave empty to use the default reverse lookup: OpenProject searches for users whose memberOf attribute matches the group DN. This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). Set this to the attribute name on group entries that lists member DNs to use forward lookup instead. Examples: "uniqueMember" (groupOfUniqueNames), "member" (groupOfNames). Use this for LDAP servers that do not maintain the memberOf attribute on user entries. + ' synchronized_groups: add_new: Přidat synchronizovanou LDAP skupinu @@ -65,7 +69,12 @@ cs: info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | This module allows you to set up a synchronization between LDAP and OpenProject groups. - It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. +
+ By default, OpenProject uses reverse lookup: it searches for users whose memberOf attribute matches the group DN. + This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). +
+ If your LDAP server does not maintain memberOf on user entries (e.g. it uses groupOfUniqueNames with uniqueMember), + you can configure forward lookup by setting the Group member attribute on the synchronization filter.
Groups are synchronized hourly through a cron job. [Please see our documentation on this topic](docs_url). diff --git a/modules/ldap_groups/config/locales/crowdin/da.yml b/modules/ldap_groups/config/locales/crowdin/da.yml index 642a3149bd9..9f91a74a3b9 100644 --- a/modules/ldap_groups/config/locales/crowdin/da.yml +++ b/modules/ldap_groups/config/locales/crowdin/da.yml @@ -22,6 +22,7 @@ da: group_name_attribute: Group name attribute sync_users: Synkroniser brugere base_dn: Søg i base DN + member_lookup_attribute: Group member attribute models: ldap_groups/synchronized_group: Synchronized LDAP group ldap_groups/synchronized_filter: LDAP Group synchronization filter @@ -32,7 +33,7 @@ da: ldap_groups: label_menu_item: LDAP group synchronization label_group_key: LDAP group filter key - label_synchronize: Synchronize + label_synchronize: Discover LDAP groups settings: name_attribute: LDAP groups name attribute name_attribute_text: The LDAP attribute used for naming the OpenProject group when created by a filter @@ -55,6 +56,9 @@ da: filter_string_text: Enter the RFC4515 LDAP filter that returns groups in your LDAP to synchronize with OpenProject. base_dn_text: 'Indtast søgefasen DN for at bruge dette filter. Det skal være under basen DN for den valgte LDAP- forbindelse. Lad denne mulighed være tom for at genbruge basen DN for forbindelsen + ' + member_lookup_attribute_text: 'Leave empty to use the default reverse lookup: OpenProject searches for users whose memberOf attribute matches the group DN. This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). Set this to the attribute name on group entries that lists member DNs to use forward lookup instead. Examples: "uniqueMember" (groupOfUniqueNames), "member" (groupOfNames). Use this for LDAP servers that do not maintain the memberOf attribute on user entries. + ' synchronized_groups: add_new: Add synchronized LDAP group @@ -65,7 +69,12 @@ da: info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | This module allows you to set up a synchronization between LDAP and OpenProject groups. - It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. +
+ By default, OpenProject uses reverse lookup: it searches for users whose memberOf attribute matches the group DN. + This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). +
+ If your LDAP server does not maintain memberOf on user entries (e.g. it uses groupOfUniqueNames with uniqueMember), + you can configure forward lookup by setting the Group member attribute on the synchronization filter.
Groups are synchronized hourly through a cron job. [Please see our documentation on this topic](docs_url). diff --git a/modules/ldap_groups/config/locales/crowdin/de.yml b/modules/ldap_groups/config/locales/crowdin/de.yml index d8fba7a6e71..2059a09aa07 100644 --- a/modules/ldap_groups/config/locales/crowdin/de.yml +++ b/modules/ldap_groups/config/locales/crowdin/de.yml @@ -22,6 +22,7 @@ de: group_name_attribute: Attribut für Gruppenname sync_users: Benutzer synchronisieren base_dn: Suchbasis DN + member_lookup_attribute: Attribut für Gruppenmitglieder models: ldap_groups/synchronized_group: Synchronisierte LDAP-Gruppe ldap_groups/synchronized_filter: Synchronisationsfilter für LDAP-Gruppe @@ -32,7 +33,7 @@ de: ldap_groups: label_menu_item: LDAP-Gruppensynchronisierung label_group_key: LDAP-Gruppenfilter - label_synchronize: Synchronisieren + label_synchronize: LDAP-Gruppen entdecken settings: name_attribute: Attribut für LDAP-Gruppenname name_attribute_text: Das LDAP-Attribut für das Benennen einer OpenProject-Gruppe, wenn sie durch einen Filter angelegt wird. @@ -55,6 +56,9 @@ de: filter_string_text: Geben Sie den RFC4515 LDAP-Filter ein, der Gruppen in Ihrem LDAP zur Synchronisierung mit OpenProject zurückgibt. base_dn_text: 'Geben Sie den Suchbase-DN ein, der für diesen Filter verwendet werden soll. Er muss unter dem Basis-DN der gewählten LDAP-Verbindung liegen. Lassen Sie diese Option leer, um den Basis-DN der Verbindung wiederverwenden + ' + member_lookup_attribute_text: 'Lassen Sie diese Option leer, um standardmäßig die Rückwärtssuche zu verwenden: OpenProject sucht nach Benutzern, deren memberOf-Attribut mit dem DN der Gruppe übereinstimmt. Dazu muss das Attribut memberOf in den Benutzereinträgen vorhanden sein (Active Directory, OpenLDAP mit memberof overlay). Setzen Sie dies auf den Attributnamen in Gruppeneinträgen, die Mitglieder-DNs auflisten, um stattdessen Forward Lookup zu verwenden. Beispiele: "uniqueMember" (groupOfUniqueNames), "member" (groupOfNames). Verwenden Sie dies für LDAP-Server, die das Attribut memberOf nicht für Benutzereinträge pflegen. + ' synchronized_groups: add_new: Synchronisierte LDAP-Gruppe hinzufügen @@ -64,10 +68,16 @@ de: confirmation: Wenn Sie fortfahren, werden die synchronisierte Gruppe %{name} und alle %{users_count} Benutzer, die durch sie synchronisiert wurden, entfernt. info: 'Hinweis: Die OpenProject Gruppe selbst und die Mitglieder, die außerhalb dieser LDAP-Synchronisation hinzugefügt wurden, werden nicht entfernt.' help_text_html: | - Mit diesem Modul können Sie eine Synchronisation zwischen LDAP und OpenProject Gruppen einrichten. - Es ist abhängig von LDAP-Gruppen müssen das groupOfNames / member Of Attribut verwenden, das für die Arbeit mit OpenProject eingestellt ist. + Mit diesem Modul können Sie eine Synchronisierung für Gruppen zwischen LDAP und OpenProject einrichten.
- Gruppen werden stündlich durch einen Cronjob synchronisiert. [Bitte lesen Sie unsere Dokumentation zu diesem Thema](docs_url). + Standardmäßig verwendet OpenProject die umgekehrte Suche: Es sucht nach Benutzern, deren memberOf-Attribut mit dem DN der Gruppe übereinstimmt. + Dazu muss das Attribut memberOf in den Benutzereinträgen vorhanden sein (Active Directory, OpenLDAP mit memberof overlay). +
+ Wenn Ihr LDAP-Server das Attribut memberOf für Benutzereinträge nicht enthält (er verwendet z.B. groupOfUniqueNames mit uniqueMember), + können Sie die Vorwärtssuche konfigurieren, indem Sie das Attribut Gruppenmitglied im Synchronisationsfilter setzen. +
+ Die Gruppen werden stündlich über einen Cron-Job synchronisiert. + [Bitte lesen Sie unsere Dokumentation zu diesem Thema](docs_url). no_results: Keine synchronisierten Gruppen gefunden. no_members: Diese Gruppe hat noch keine synchronisierten Mitglieder. plural: Synchronisierte LDAP-Gruppen diff --git a/modules/ldap_groups/config/locales/crowdin/el.yml b/modules/ldap_groups/config/locales/crowdin/el.yml index 4110f8a2086..44d2a86b5c2 100644 --- a/modules/ldap_groups/config/locales/crowdin/el.yml +++ b/modules/ldap_groups/config/locales/crowdin/el.yml @@ -22,6 +22,7 @@ el: group_name_attribute: Χαρακτηριστικό ονόματος ομάδας sync_users: Συγχρονισμός χρηστών base_dn: Αναζήτηση base DN + member_lookup_attribute: Group member attribute models: ldap_groups/synchronized_group: Συγχρονισμένη ομάδα LDAP ldap_groups/synchronized_filter: Φίλτρο συγχρονισμού ομάδας LDAP @@ -32,7 +33,7 @@ el: ldap_groups: label_menu_item: Ομαδικός συγχρονισμός LDAP label_group_key: Κλειδί φίλτρου ομάδα LDAP - label_synchronize: Συγχρονισμός + label_synchronize: Discover LDAP groups settings: name_attribute: Χαρακτηριστικό ονόματος ομάδας LDAP name_attribute_text: Το LDAP χαρακτηριστικό χρησιμοποιήθηκε για την ονομασία της ομάδας OpenProject όταν δημιουργήθηκε από ένα φίλτρο. @@ -55,6 +56,9 @@ el: filter_string_text: Εισάγετε το φίλτρο RFC4515 LDAP που επιστρέφει τις ομάδες στο LDAP σας για συγχρονισμό με το OpenProject. base_dn_text: 'Enter the search base DN to use for this filter. It needs to be below the base DN of the selected LDAP connection. Leave this option empty to reuse the base DN of the connection + ' + member_lookup_attribute_text: 'Leave empty to use the default reverse lookup: OpenProject searches for users whose memberOf attribute matches the group DN. This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). Set this to the attribute name on group entries that lists member DNs to use forward lookup instead. Examples: "uniqueMember" (groupOfUniqueNames), "member" (groupOfNames). Use this for LDAP servers that do not maintain the memberOf attribute on user entries. + ' synchronized_groups: add_new: Προσθήκη συγχρονισμένης LDAP ομάδας @@ -65,7 +69,12 @@ el: info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | This module allows you to set up a synchronization between LDAP and OpenProject groups. - It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. +
+ By default, OpenProject uses reverse lookup: it searches for users whose memberOf attribute matches the group DN. + This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). +
+ If your LDAP server does not maintain memberOf on user entries (e.g. it uses groupOfUniqueNames with uniqueMember), + you can configure forward lookup by setting the Group member attribute on the synchronization filter.
Groups are synchronized hourly through a cron job. [Please see our documentation on this topic](docs_url). diff --git a/modules/ldap_groups/config/locales/crowdin/eo.yml b/modules/ldap_groups/config/locales/crowdin/eo.yml index ba3d6cd18ca..0cac6d18c4a 100644 --- a/modules/ldap_groups/config/locales/crowdin/eo.yml +++ b/modules/ldap_groups/config/locales/crowdin/eo.yml @@ -22,6 +22,7 @@ eo: group_name_attribute: Group name attribute sync_users: Sync users base_dn: Search base DN + member_lookup_attribute: Group member attribute models: ldap_groups/synchronized_group: Synchronized LDAP group ldap_groups/synchronized_filter: LDAP Group synchronization filter @@ -32,7 +33,7 @@ eo: ldap_groups: label_menu_item: LDAP group synchronization label_group_key: LDAP group filter key - label_synchronize: Synchronize + label_synchronize: Discover LDAP groups settings: name_attribute: LDAP groups name attribute name_attribute_text: The LDAP attribute used for naming the OpenProject group when created by a filter @@ -55,6 +56,9 @@ eo: filter_string_text: Enter the RFC4515 LDAP filter that returns groups in your LDAP to synchronize with OpenProject. base_dn_text: 'Enter the search base DN to use for this filter. It needs to be below the base DN of the selected LDAP connection. Leave this option empty to reuse the base DN of the connection + ' + member_lookup_attribute_text: 'Leave empty to use the default reverse lookup: OpenProject searches for users whose memberOf attribute matches the group DN. This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). Set this to the attribute name on group entries that lists member DNs to use forward lookup instead. Examples: "uniqueMember" (groupOfUniqueNames), "member" (groupOfNames). Use this for LDAP servers that do not maintain the memberOf attribute on user entries. + ' synchronized_groups: add_new: Add synchronized LDAP group @@ -65,7 +69,12 @@ eo: info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | This module allows you to set up a synchronization between LDAP and OpenProject groups. - It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. +
+ By default, OpenProject uses reverse lookup: it searches for users whose memberOf attribute matches the group DN. + This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). +
+ If your LDAP server does not maintain memberOf on user entries (e.g. it uses groupOfUniqueNames with uniqueMember), + you can configure forward lookup by setting the Group member attribute on the synchronization filter.
Groups are synchronized hourly through a cron job. [Please see our documentation on this topic](docs_url). diff --git a/modules/ldap_groups/config/locales/crowdin/es.yml b/modules/ldap_groups/config/locales/crowdin/es.yml index 42550044b89..a170b57da21 100644 --- a/modules/ldap_groups/config/locales/crowdin/es.yml +++ b/modules/ldap_groups/config/locales/crowdin/es.yml @@ -22,6 +22,7 @@ es: group_name_attribute: Atributo de nombre de grupo sync_users: Sincronizar usuarios base_dn: DN base de búsqueda + member_lookup_attribute: Atributo del miembro del grupo models: ldap_groups/synchronized_group: Grupo de LDAP sincronizado ldap_groups/synchronized_filter: Filtro de sincronización de grupos de LDAP @@ -32,7 +33,7 @@ es: ldap_groups: label_menu_item: Sincronización de grupos de LDAP label_group_key: Clave de filtro de grupo de LDAP - label_synchronize: Sincronizar + label_synchronize: Descubrir grupos LDAP settings: name_attribute: Atributo de nombre de grupos de LDAP name_attribute_text: El atributo LDAP usado para asignar un nombre al grupo de OpenProject al crearlo mediante un filtro @@ -55,6 +56,9 @@ es: filter_string_text: Especifique el filtro LDAP RFC4515 que muestra los grupos en su entorno de LDAP que se sincronizarán con OpenProject. base_dn_text: 'Escriba el DN base de búsqueda que quiera usar con este filtro. Necesita estar debajo del DN base de la conexión LDAP seleccionada. Deje esta opción en blanco para reutilizar el DN base de la conexión + ' + member_lookup_attribute_text: 'Déjalo en blanco para usar la búsqueda inversa predeterminada: OpenProject busca usuarios cuyo atributo «memberOf» coincida con el DN del grupo. Para ello, es necesario que el atributo «memberOf» esté presente en las entradas de usuario (Active Directory, OpenLDAP con la superposición «memberof»). Configúralo con el nombre del atributo de las entradas de grupo que enumera los DN de los miembros para utilizar la búsqueda directa en su lugar. Ejemplos: «uniqueMember» (groupOfUniqueNames), «member» (groupOfNames). Utilízalo para servidores LDAP que no mantienen el atributo memberOf en las entradas de usuario. + ' synchronized_groups: add_new: Agregar grupo de LDAP sincronizado @@ -64,11 +68,16 @@ es: confirmation: Si continúa, se eliminarán el grupo sincronizado %{name} y %{users_count} usuarios sincronizados mediante este. info: El propio grupo OpenProject y los miembros añadidos fuera de esta sincronización LDAP no se eliminarán. help_text_html: | - Este módulo le permite configurar una sincronización entre los grupos LDAP y los grupos de OpenProject. - Para que funcione con OpenProject, es necesario que los grupos LDAP utilicen el conjunto de atributos groupOfNames / memberOf. + Este módulo te permite configurar una sincronización entre los grupos de LDAP y OpenProject. +
+ Por defecto, OpenProject utiliza la búsqueda inversa: busca usuarios cuyo atributo memberOf coincida con el DN del grupo. + Esto requiere que el atributo memberOf esté presente en las entradas de usuario (Active Directory, OpenLDAP con la superposición memberof). +
+ Si tu servidor LDAP no mantiene memberOf en las entradas de usuario (por ejemplo, si usa groupOfUniqueNames con uniqueMember), + puedes configurar la búsqueda directa estableciendo el atributo de miembro del grupo en el filtro de sincronización.
Los grupos se sincronizan cada hora mediante una tarea cron. - [Consulte nuestra documentación sobre este tema](docs_url). + [Consulta nuestra documentación sobre este tema](docs_url). no_results: No se encontraron grupos sincronizados. no_members: Este grupo aún no tiene miembros sincronizados. plural: Grupos de LDAP sincronizados diff --git a/modules/ldap_groups/config/locales/crowdin/et.yml b/modules/ldap_groups/config/locales/crowdin/et.yml index 3abb020e73e..21dec507b59 100644 --- a/modules/ldap_groups/config/locales/crowdin/et.yml +++ b/modules/ldap_groups/config/locales/crowdin/et.yml @@ -22,6 +22,7 @@ et: group_name_attribute: Group name attribute sync_users: Sync users base_dn: Search base DN + member_lookup_attribute: Group member attribute models: ldap_groups/synchronized_group: Synchronized LDAP group ldap_groups/synchronized_filter: LDAP Group synchronization filter @@ -32,7 +33,7 @@ et: ldap_groups: label_menu_item: LDAP group synchronization label_group_key: LDAP group filter key - label_synchronize: Sünkrooni + label_synchronize: Discover LDAP groups settings: name_attribute: LDAP groups name attribute name_attribute_text: The LDAP attribute used for naming the OpenProject group when created by a filter @@ -55,6 +56,9 @@ et: filter_string_text: Enter the RFC4515 LDAP filter that returns groups in your LDAP to synchronize with OpenProject. base_dn_text: 'Enter the search base DN to use for this filter. It needs to be below the base DN of the selected LDAP connection. Leave this option empty to reuse the base DN of the connection + ' + member_lookup_attribute_text: 'Leave empty to use the default reverse lookup: OpenProject searches for users whose memberOf attribute matches the group DN. This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). Set this to the attribute name on group entries that lists member DNs to use forward lookup instead. Examples: "uniqueMember" (groupOfUniqueNames), "member" (groupOfNames). Use this for LDAP servers that do not maintain the memberOf attribute on user entries. + ' synchronized_groups: add_new: Add synchronized LDAP group @@ -65,7 +69,12 @@ et: info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | This module allows you to set up a synchronization between LDAP and OpenProject groups. - It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. +
+ By default, OpenProject uses reverse lookup: it searches for users whose memberOf attribute matches the group DN. + This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). +
+ If your LDAP server does not maintain memberOf on user entries (e.g. it uses groupOfUniqueNames with uniqueMember), + you can configure forward lookup by setting the Group member attribute on the synchronization filter.
Groups are synchronized hourly through a cron job. [Please see our documentation on this topic](docs_url). diff --git a/modules/ldap_groups/config/locales/crowdin/eu.yml b/modules/ldap_groups/config/locales/crowdin/eu.yml index 69120444640..92da3de338e 100644 --- a/modules/ldap_groups/config/locales/crowdin/eu.yml +++ b/modules/ldap_groups/config/locales/crowdin/eu.yml @@ -22,6 +22,7 @@ eu: group_name_attribute: Group name attribute sync_users: Sync users base_dn: Search base DN + member_lookup_attribute: Group member attribute models: ldap_groups/synchronized_group: Synchronized LDAP group ldap_groups/synchronized_filter: LDAP Group synchronization filter @@ -32,7 +33,7 @@ eu: ldap_groups: label_menu_item: LDAP group synchronization label_group_key: LDAP group filter key - label_synchronize: Synchronize + label_synchronize: Discover LDAP groups settings: name_attribute: LDAP groups name attribute name_attribute_text: The LDAP attribute used for naming the OpenProject group when created by a filter @@ -55,6 +56,9 @@ eu: filter_string_text: Enter the RFC4515 LDAP filter that returns groups in your LDAP to synchronize with OpenProject. base_dn_text: 'Enter the search base DN to use for this filter. It needs to be below the base DN of the selected LDAP connection. Leave this option empty to reuse the base DN of the connection + ' + member_lookup_attribute_text: 'Leave empty to use the default reverse lookup: OpenProject searches for users whose memberOf attribute matches the group DN. This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). Set this to the attribute name on group entries that lists member DNs to use forward lookup instead. Examples: "uniqueMember" (groupOfUniqueNames), "member" (groupOfNames). Use this for LDAP servers that do not maintain the memberOf attribute on user entries. + ' synchronized_groups: add_new: Add synchronized LDAP group @@ -65,7 +69,12 @@ eu: info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | This module allows you to set up a synchronization between LDAP and OpenProject groups. - It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. +
+ By default, OpenProject uses reverse lookup: it searches for users whose memberOf attribute matches the group DN. + This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). +
+ If your LDAP server does not maintain memberOf on user entries (e.g. it uses groupOfUniqueNames with uniqueMember), + you can configure forward lookup by setting the Group member attribute on the synchronization filter.
Groups are synchronized hourly through a cron job. [Please see our documentation on this topic](docs_url). diff --git a/modules/ldap_groups/config/locales/crowdin/fa.yml b/modules/ldap_groups/config/locales/crowdin/fa.yml index e32c3598653..0179b5960db 100644 --- a/modules/ldap_groups/config/locales/crowdin/fa.yml +++ b/modules/ldap_groups/config/locales/crowdin/fa.yml @@ -22,6 +22,7 @@ fa: group_name_attribute: Group name attribute sync_users: همسان سازی کاربران base_dn: Search base DN + member_lookup_attribute: Group member attribute models: ldap_groups/synchronized_group: Synchronized LDAP group ldap_groups/synchronized_filter: LDAP Group synchronization filter @@ -32,7 +33,7 @@ fa: ldap_groups: label_menu_item: LDAP group synchronization label_group_key: LDAP group filter key - label_synchronize: Synchronize + label_synchronize: Discover LDAP groups settings: name_attribute: LDAP groups name attribute name_attribute_text: The LDAP attribute used for naming the OpenProject group when created by a filter @@ -55,6 +56,9 @@ fa: filter_string_text: Enter the RFC4515 LDAP filter that returns groups in your LDAP to synchronize with OpenProject. base_dn_text: 'Enter the search base DN to use for this filter. It needs to be below the base DN of the selected LDAP connection. Leave this option empty to reuse the base DN of the connection + ' + member_lookup_attribute_text: 'Leave empty to use the default reverse lookup: OpenProject searches for users whose memberOf attribute matches the group DN. This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). Set this to the attribute name on group entries that lists member DNs to use forward lookup instead. Examples: "uniqueMember" (groupOfUniqueNames), "member" (groupOfNames). Use this for LDAP servers that do not maintain the memberOf attribute on user entries. + ' synchronized_groups: add_new: Add synchronized LDAP group @@ -65,7 +69,12 @@ fa: info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | This module allows you to set up a synchronization between LDAP and OpenProject groups. - It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. +
+ By default, OpenProject uses reverse lookup: it searches for users whose memberOf attribute matches the group DN. + This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). +
+ If your LDAP server does not maintain memberOf on user entries (e.g. it uses groupOfUniqueNames with uniqueMember), + you can configure forward lookup by setting the Group member attribute on the synchronization filter.
Groups are synchronized hourly through a cron job. [Please see our documentation on this topic](docs_url). diff --git a/modules/ldap_groups/config/locales/crowdin/fi.yml b/modules/ldap_groups/config/locales/crowdin/fi.yml index 37a59dfde32..ae1a8a35bb3 100644 --- a/modules/ldap_groups/config/locales/crowdin/fi.yml +++ b/modules/ldap_groups/config/locales/crowdin/fi.yml @@ -22,6 +22,7 @@ fi: group_name_attribute: Group name attribute sync_users: Sync users base_dn: Search base DN + member_lookup_attribute: Group member attribute models: ldap_groups/synchronized_group: Synchronized LDAP group ldap_groups/synchronized_filter: LDAP Group synchronization filter @@ -32,7 +33,7 @@ fi: ldap_groups: label_menu_item: LDAP group synchronization label_group_key: LDAP group filter key - label_synchronize: Synchronize + label_synchronize: Discover LDAP groups settings: name_attribute: LDAP groups name attribute name_attribute_text: The LDAP attribute used for naming the OpenProject group when created by a filter @@ -55,6 +56,9 @@ fi: filter_string_text: Enter the RFC4515 LDAP filter that returns groups in your LDAP to synchronize with OpenProject. base_dn_text: 'Enter the search base DN to use for this filter. It needs to be below the base DN of the selected LDAP connection. Leave this option empty to reuse the base DN of the connection + ' + member_lookup_attribute_text: 'Leave empty to use the default reverse lookup: OpenProject searches for users whose memberOf attribute matches the group DN. This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). Set this to the attribute name on group entries that lists member DNs to use forward lookup instead. Examples: "uniqueMember" (groupOfUniqueNames), "member" (groupOfNames). Use this for LDAP servers that do not maintain the memberOf attribute on user entries. + ' synchronized_groups: add_new: Add synchronized LDAP group @@ -65,7 +69,12 @@ fi: info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | This module allows you to set up a synchronization between LDAP and OpenProject groups. - It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. +
+ By default, OpenProject uses reverse lookup: it searches for users whose memberOf attribute matches the group DN. + This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). +
+ If your LDAP server does not maintain memberOf on user entries (e.g. it uses groupOfUniqueNames with uniqueMember), + you can configure forward lookup by setting the Group member attribute on the synchronization filter.
Groups are synchronized hourly through a cron job. [Please see our documentation on this topic](docs_url). diff --git a/modules/ldap_groups/config/locales/crowdin/fil.yml b/modules/ldap_groups/config/locales/crowdin/fil.yml index 94950846d47..d691e220d7f 100644 --- a/modules/ldap_groups/config/locales/crowdin/fil.yml +++ b/modules/ldap_groups/config/locales/crowdin/fil.yml @@ -22,6 +22,7 @@ fil: group_name_attribute: Group name attribute sync_users: Sync users base_dn: Search base DN + member_lookup_attribute: Group member attribute models: ldap_groups/synchronized_group: Synchronized LDAP group ldap_groups/synchronized_filter: LDAP Group synchronization filter @@ -32,7 +33,7 @@ fil: ldap_groups: label_menu_item: LDAP group synchronization label_group_key: LDAP group filter key - label_synchronize: Synchronize + label_synchronize: Discover LDAP groups settings: name_attribute: LDAP groups name attribute name_attribute_text: The LDAP attribute used for naming the OpenProject group when created by a filter @@ -55,6 +56,9 @@ fil: filter_string_text: Enter the RFC4515 LDAP filter that returns groups in your LDAP to synchronize with OpenProject. base_dn_text: 'Enter the search base DN to use for this filter. It needs to be below the base DN of the selected LDAP connection. Leave this option empty to reuse the base DN of the connection + ' + member_lookup_attribute_text: 'Leave empty to use the default reverse lookup: OpenProject searches for users whose memberOf attribute matches the group DN. This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). Set this to the attribute name on group entries that lists member DNs to use forward lookup instead. Examples: "uniqueMember" (groupOfUniqueNames), "member" (groupOfNames). Use this for LDAP servers that do not maintain the memberOf attribute on user entries. + ' synchronized_groups: add_new: Add synchronized LDAP group @@ -65,7 +69,12 @@ fil: info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | This module allows you to set up a synchronization between LDAP and OpenProject groups. - It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. +
+ By default, OpenProject uses reverse lookup: it searches for users whose memberOf attribute matches the group DN. + This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). +
+ If your LDAP server does not maintain memberOf on user entries (e.g. it uses groupOfUniqueNames with uniqueMember), + you can configure forward lookup by setting the Group member attribute on the synchronization filter.
Groups are synchronized hourly through a cron job. [Please see our documentation on this topic](docs_url). diff --git a/modules/ldap_groups/config/locales/crowdin/fr.yml b/modules/ldap_groups/config/locales/crowdin/fr.yml index d40626a250c..8ed0e87317c 100644 --- a/modules/ldap_groups/config/locales/crowdin/fr.yml +++ b/modules/ldap_groups/config/locales/crowdin/fr.yml @@ -22,6 +22,7 @@ fr: group_name_attribute: Attribut nom de groupe sync_users: Synchroniser les utilisateurs base_dn: Rechercher dans la base DN + member_lookup_attribute: Attribut de membre du groupe models: ldap_groups/synchronized_group: Groupe LDAP synchronisé ldap_groups/synchronized_filter: Filtre de synchronisation des groupes LDAP @@ -32,7 +33,7 @@ fr: ldap_groups: label_menu_item: Synchronisation de groupe LDAP label_group_key: Clé de filtre de groupe LDAP - label_synchronize: Synchroniser + label_synchronize: Découvrir les groupes LDAP settings: name_attribute: Attribut nom des groupes LDAP name_attribute_text: L'attribut LDAP utilisé pour nommer le groupe OpenProject lorsqu'il est créé par un filtre @@ -55,6 +56,9 @@ fr: filter_string_text: Entrez le filtre RFC4515 LDAP qui renvoie les groupes dans votre LDAP pour les synchroniser avec OpenProject. base_dn_text: 'Entrez le DN de la base de recherche à utiliser pour ce filtre. Il doit être en dessous du DN de base de la connexion LDAP sélectionnée. Laissez cette option vide pour réutiliser le DN de base de la connexion + ' + member_lookup_attribute_text: 'Laissez vide pour utiliser la recherche inversée par défaut : OpenProject recherche les utilisateurs dont l''attribut memberOf correspond au DN du groupe. Cela nécessite que l''attribut memberOf soit présent dans les entrées utilisateur (Active Directory, OpenLDAP avec overlay memberof). Renseignez ici le nom de l''attribut des entrées de groupe qui répertorie les DN des membres pour utiliser plutôt la recherche directe. Exemples : « uniqueMember » (groupOfUniqueNames), « member » (groupOfNames). Utilisez cette option pour les serveurs LDAP qui ne maintiennent pas l’attribut memberOf dans les entrées utilisateur. + ' synchronized_groups: add_new: Ajouter un groupe LDAP synchronisé @@ -64,11 +68,14 @@ fr: confirmation: Si vous continuez, le groupe synchronisé %{name} et tous les utilisateurs %{users_count} synchronisés par le biais de celui-ci seront supprimés. info: Le groupe OpenProject lui-même et les membres ajoutés en dehors de cette synchronisation LDAP ne seront pas supprimés. help_text_html: | - Ce module vous permet de mettre en place une synchronisation entre les groupes LDAP et OpenProject. - Les groupes LDAP doivent utiliser le jeu d'attributs groupOfNames / memberOf pour fonctionner avec OpenProject. + Ce module vous permet de configurer une synchronisation entre les groupes LDAP et OpenProject.
+ Par défaut, OpenProject utilise la recherche inversée : la plateforme recherche les utilisateurs dont l'attribut memberOf correspond au DN du groupe. + Cela nécessite que l'attribut memberOf soit présent dans les entrées utilisateur (Active Directory, OpenLDAP avec overlay memberof).
- Les groupes sont synchronisés toutes les heures par un job cron. - [Veuillez consulter notre documentation à ce sujet](docs_url). + Si votre serveur LDAP ne maintient pas l'attribut memberOf dans les entrées utilisateur (par exemple, s'il utilise groupOfUniqueNames avec uniqueMember), vous pouvez configurer la recherche directe en définissant l'attribut de membre du groupe dans le filtre de synchronisation. +
+ Les groupes sont synchronisés toutes les heures via une tâche cron. + [Consultez notre documentation à ce sujet](docs_url). no_results: Aucun groupe synchronisé trouvé. no_members: Ce groupe n'a pas encore de membres synchronisés. plural: Groupes LDAP synchronisés diff --git a/modules/ldap_groups/config/locales/crowdin/he.yml b/modules/ldap_groups/config/locales/crowdin/he.yml index 2d6df1df9c4..33bbc612aac 100644 --- a/modules/ldap_groups/config/locales/crowdin/he.yml +++ b/modules/ldap_groups/config/locales/crowdin/he.yml @@ -22,6 +22,7 @@ he: group_name_attribute: Group name attribute sync_users: Sync users base_dn: Search base DN + member_lookup_attribute: Group member attribute models: ldap_groups/synchronized_group: Synchronized LDAP group ldap_groups/synchronized_filter: LDAP Group synchronization filter @@ -32,7 +33,7 @@ he: ldap_groups: label_menu_item: LDAP group synchronization label_group_key: LDAP group filter key - label_synchronize: Synchronize + label_synchronize: Discover LDAP groups settings: name_attribute: LDAP groups name attribute name_attribute_text: The LDAP attribute used for naming the OpenProject group when created by a filter @@ -55,6 +56,9 @@ he: filter_string_text: Enter the RFC4515 LDAP filter that returns groups in your LDAP to synchronize with OpenProject. base_dn_text: 'Enter the search base DN to use for this filter. It needs to be below the base DN of the selected LDAP connection. Leave this option empty to reuse the base DN of the connection + ' + member_lookup_attribute_text: 'Leave empty to use the default reverse lookup: OpenProject searches for users whose memberOf attribute matches the group DN. This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). Set this to the attribute name on group entries that lists member DNs to use forward lookup instead. Examples: "uniqueMember" (groupOfUniqueNames), "member" (groupOfNames). Use this for LDAP servers that do not maintain the memberOf attribute on user entries. + ' synchronized_groups: add_new: Add synchronized LDAP group @@ -65,7 +69,12 @@ he: info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | This module allows you to set up a synchronization between LDAP and OpenProject groups. - It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. +
+ By default, OpenProject uses reverse lookup: it searches for users whose memberOf attribute matches the group DN. + This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). +
+ If your LDAP server does not maintain memberOf on user entries (e.g. it uses groupOfUniqueNames with uniqueMember), + you can configure forward lookup by setting the Group member attribute on the synchronization filter.
Groups are synchronized hourly through a cron job. [Please see our documentation on this topic](docs_url). diff --git a/modules/ldap_groups/config/locales/crowdin/hi.yml b/modules/ldap_groups/config/locales/crowdin/hi.yml index cea4d07ed7c..934add7d741 100644 --- a/modules/ldap_groups/config/locales/crowdin/hi.yml +++ b/modules/ldap_groups/config/locales/crowdin/hi.yml @@ -22,6 +22,7 @@ hi: group_name_attribute: Group name attribute sync_users: Sync users base_dn: Search base DN + member_lookup_attribute: Group member attribute models: ldap_groups/synchronized_group: Synchronized LDAP group ldap_groups/synchronized_filter: LDAP Group synchronization filter @@ -32,7 +33,7 @@ hi: ldap_groups: label_menu_item: LDAP group synchronization label_group_key: LDAP group filter key - label_synchronize: Synchronize + label_synchronize: Discover LDAP groups settings: name_attribute: LDAP groups name attribute name_attribute_text: The LDAP attribute used for naming the OpenProject group when created by a filter @@ -55,6 +56,9 @@ hi: filter_string_text: Enter the RFC4515 LDAP filter that returns groups in your LDAP to synchronize with OpenProject. base_dn_text: 'Enter the search base DN to use for this filter. It needs to be below the base DN of the selected LDAP connection. Leave this option empty to reuse the base DN of the connection + ' + member_lookup_attribute_text: 'Leave empty to use the default reverse lookup: OpenProject searches for users whose memberOf attribute matches the group DN. This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). Set this to the attribute name on group entries that lists member DNs to use forward lookup instead. Examples: "uniqueMember" (groupOfUniqueNames), "member" (groupOfNames). Use this for LDAP servers that do not maintain the memberOf attribute on user entries. + ' synchronized_groups: add_new: Add synchronized LDAP group @@ -65,7 +69,12 @@ hi: info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | This module allows you to set up a synchronization between LDAP and OpenProject groups. - It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. +
+ By default, OpenProject uses reverse lookup: it searches for users whose memberOf attribute matches the group DN. + This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). +
+ If your LDAP server does not maintain memberOf on user entries (e.g. it uses groupOfUniqueNames with uniqueMember), + you can configure forward lookup by setting the Group member attribute on the synchronization filter.
Groups are synchronized hourly through a cron job. [Please see our documentation on this topic](docs_url). diff --git a/modules/ldap_groups/config/locales/crowdin/hr.yml b/modules/ldap_groups/config/locales/crowdin/hr.yml index 28ade2a3152..0a22189e0df 100644 --- a/modules/ldap_groups/config/locales/crowdin/hr.yml +++ b/modules/ldap_groups/config/locales/crowdin/hr.yml @@ -22,6 +22,7 @@ hr: group_name_attribute: Group name attribute sync_users: Sync users base_dn: Search base DN + member_lookup_attribute: Group member attribute models: ldap_groups/synchronized_group: Synchronized LDAP group ldap_groups/synchronized_filter: LDAP Group synchronization filter @@ -32,7 +33,7 @@ hr: ldap_groups: label_menu_item: LDAP group synchronization label_group_key: LDAP group filter key - label_synchronize: Synchronize + label_synchronize: Discover LDAP groups settings: name_attribute: LDAP groups name attribute name_attribute_text: The LDAP attribute used for naming the OpenProject group when created by a filter @@ -55,6 +56,9 @@ hr: filter_string_text: Enter the RFC4515 LDAP filter that returns groups in your LDAP to synchronize with OpenProject. base_dn_text: 'Enter the search base DN to use for this filter. It needs to be below the base DN of the selected LDAP connection. Leave this option empty to reuse the base DN of the connection + ' + member_lookup_attribute_text: 'Leave empty to use the default reverse lookup: OpenProject searches for users whose memberOf attribute matches the group DN. This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). Set this to the attribute name on group entries that lists member DNs to use forward lookup instead. Examples: "uniqueMember" (groupOfUniqueNames), "member" (groupOfNames). Use this for LDAP servers that do not maintain the memberOf attribute on user entries. + ' synchronized_groups: add_new: Add synchronized LDAP group @@ -65,7 +69,12 @@ hr: info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | This module allows you to set up a synchronization between LDAP and OpenProject groups. - It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. +
+ By default, OpenProject uses reverse lookup: it searches for users whose memberOf attribute matches the group DN. + This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). +
+ If your LDAP server does not maintain memberOf on user entries (e.g. it uses groupOfUniqueNames with uniqueMember), + you can configure forward lookup by setting the Group member attribute on the synchronization filter.
Groups are synchronized hourly through a cron job. [Please see our documentation on this topic](docs_url). diff --git a/modules/ldap_groups/config/locales/crowdin/hu.yml b/modules/ldap_groups/config/locales/crowdin/hu.yml index a1950a32c9f..e53c72bd0c8 100644 --- a/modules/ldap_groups/config/locales/crowdin/hu.yml +++ b/modules/ldap_groups/config/locales/crowdin/hu.yml @@ -22,6 +22,7 @@ hu: group_name_attribute: Csoport név attribútum sync_users: Felhasználók szinkronizálása base_dn: Keresési alap DN + member_lookup_attribute: Group member attribute models: ldap_groups/synchronized_group: Szinkronizált LDAP csoport ldap_groups/synchronized_filter: LDAP csoport szinkronizálása @@ -34,7 +35,7 @@ hu: ldap_groups: label_menu_item: LDAP csoport szinkronizálása label_group_key: LDAP csoport szűrési feltétel - label_synchronize: Szinkronizálás + label_synchronize: Discover LDAP groups settings: name_attribute: LDAP csoport érték name_attribute_text: 'Az OpenProject csoport elnevezésére használt LDAP attribútum szűrő létrehozásakor @@ -67,6 +68,9 @@ hu: ' base_dn_text: 'Írja be a keresési alap DN -jét a szűrőhöz. A kiválasztott LDAP -kapcsolat alap DN -je alatt kell lennie. Hagyja üresen ezt az opciót a kapcsolat alap DN -jének újbóli használatához + ' + member_lookup_attribute_text: 'Leave empty to use the default reverse lookup: OpenProject searches for users whose memberOf attribute matches the group DN. This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). Set this to the attribute name on group entries that lists member DNs to use forward lookup instead. Examples: "uniqueMember" (groupOfUniqueNames), "member" (groupOfNames). Use this for LDAP servers that do not maintain the memberOf attribute on user entries. + ' synchronized_groups: add_new: Szinkronizált LDAP csoport hozzáadása @@ -77,7 +81,12 @@ hu: info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | This module allows you to set up a synchronization between LDAP and OpenProject groups. - It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. +
+ By default, OpenProject uses reverse lookup: it searches for users whose memberOf attribute matches the group DN. + This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). +
+ If your LDAP server does not maintain memberOf on user entries (e.g. it uses groupOfUniqueNames with uniqueMember), + you can configure forward lookup by setting the Group member attribute on the synchronization filter.
Groups are synchronized hourly through a cron job. [Please see our documentation on this topic](docs_url). diff --git a/modules/ldap_groups/config/locales/crowdin/hy.yml b/modules/ldap_groups/config/locales/crowdin/hy.yml index 26b2330721e..6f2894bb8d4 100644 --- a/modules/ldap_groups/config/locales/crowdin/hy.yml +++ b/modules/ldap_groups/config/locales/crowdin/hy.yml @@ -22,6 +22,7 @@ hy: group_name_attribute: Group name attribute sync_users: Sync users base_dn: Search base DN + member_lookup_attribute: Group member attribute models: ldap_groups/synchronized_group: Synchronized LDAP group ldap_groups/synchronized_filter: LDAP Group synchronization filter @@ -32,7 +33,7 @@ hy: ldap_groups: label_menu_item: LDAP group synchronization label_group_key: LDAP group filter key - label_synchronize: Synchronize + label_synchronize: Discover LDAP groups settings: name_attribute: LDAP groups name attribute name_attribute_text: The LDAP attribute used for naming the OpenProject group when created by a filter @@ -55,6 +56,9 @@ hy: filter_string_text: Enter the RFC4515 LDAP filter that returns groups in your LDAP to synchronize with OpenProject. base_dn_text: 'Enter the search base DN to use for this filter. It needs to be below the base DN of the selected LDAP connection. Leave this option empty to reuse the base DN of the connection + ' + member_lookup_attribute_text: 'Leave empty to use the default reverse lookup: OpenProject searches for users whose memberOf attribute matches the group DN. This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). Set this to the attribute name on group entries that lists member DNs to use forward lookup instead. Examples: "uniqueMember" (groupOfUniqueNames), "member" (groupOfNames). Use this for LDAP servers that do not maintain the memberOf attribute on user entries. + ' synchronized_groups: add_new: Add synchronized LDAP group @@ -65,7 +69,12 @@ hy: info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | This module allows you to set up a synchronization between LDAP and OpenProject groups. - It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. +
+ By default, OpenProject uses reverse lookup: it searches for users whose memberOf attribute matches the group DN. + This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). +
+ If your LDAP server does not maintain memberOf on user entries (e.g. it uses groupOfUniqueNames with uniqueMember), + you can configure forward lookup by setting the Group member attribute on the synchronization filter.
Groups are synchronized hourly through a cron job. [Please see our documentation on this topic](docs_url). diff --git a/modules/ldap_groups/config/locales/crowdin/id.yml b/modules/ldap_groups/config/locales/crowdin/id.yml index b3f89d963d1..561895c7847 100644 --- a/modules/ldap_groups/config/locales/crowdin/id.yml +++ b/modules/ldap_groups/config/locales/crowdin/id.yml @@ -22,6 +22,7 @@ id: group_name_attribute: Atribut nama grup sync_users: Sinkronkan pengguna base_dn: Cari basis DN + member_lookup_attribute: Group member attribute models: ldap_groups/synchronized_group: Grup LDAP tersinkronisasi ldap_groups/synchronized_filter: Filter sinkronisasi Grup LDAP @@ -32,7 +33,7 @@ id: ldap_groups: label_menu_item: Sinkronisasi grup LDAP label_group_key: Kunci filter grup LDAP - label_synchronize: Sinkronkan + label_synchronize: Discover LDAP groups settings: name_attribute: Atribut nama grup LDAP name_attribute_text: Atribut LDAP yang digunakan untuk menamai grup OpenProject saat dibuat oleh filter @@ -55,6 +56,9 @@ id: filter_string_text: Masukkan filter LDAP RFC4515 yang mengembalikan grup di LDAP Anda untuk disinkronkan dengan OpenProject. base_dn_text: 'Masukkan DN basis pencarian yang akan digunakan untuk filter ini. Itu harus di bawah DN dasar dari koneksi LDAP yang dipilih. Biarkan opsi ini kosong untuk menggunakan kembali DN dasar koneksi + ' + member_lookup_attribute_text: 'Leave empty to use the default reverse lookup: OpenProject searches for users whose memberOf attribute matches the group DN. This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). Set this to the attribute name on group entries that lists member DNs to use forward lookup instead. Examples: "uniqueMember" (groupOfUniqueNames), "member" (groupOfNames). Use this for LDAP servers that do not maintain the memberOf attribute on user entries. + ' synchronized_groups: add_new: Tambahkan grup LDAP tersinkronisasi @@ -65,7 +69,12 @@ id: info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | This module allows you to set up a synchronization between LDAP and OpenProject groups. - It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. +
+ By default, OpenProject uses reverse lookup: it searches for users whose memberOf attribute matches the group DN. + This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). +
+ If your LDAP server does not maintain memberOf on user entries (e.g. it uses groupOfUniqueNames with uniqueMember), + you can configure forward lookup by setting the Group member attribute on the synchronization filter.
Groups are synchronized hourly through a cron job. [Please see our documentation on this topic](docs_url). diff --git a/modules/ldap_groups/config/locales/crowdin/it.yml b/modules/ldap_groups/config/locales/crowdin/it.yml index f1d29f5aab3..409be308010 100644 --- a/modules/ldap_groups/config/locales/crowdin/it.yml +++ b/modules/ldap_groups/config/locales/crowdin/it.yml @@ -22,6 +22,7 @@ it: group_name_attribute: Attributo nome gruppo sync_users: Sincronizza utenti base_dn: Ricerca DN base + member_lookup_attribute: Attributo del membro del gruppo models: ldap_groups/synchronized_group: Gruppo LDAP sincronizzato ldap_groups/synchronized_filter: Filtro sincronizzazione gruppo LDAP @@ -32,7 +33,7 @@ it: ldap_groups: label_menu_item: Sincronizzazione gruppo LDAP label_group_key: Chiave di filtro gruppo LDAP - label_synchronize: Sincronizza + label_synchronize: Scopri i gruppi LDAP settings: name_attribute: Attributo nome gruppi LDAP name_attribute_text: L'attributo LDAP usato per dare un nome al gruppo OpenProject quando viene creato da un filtro @@ -55,6 +56,9 @@ it: filter_string_text: Inserisci il filtro LDAP RFC4515 che restituisce i gruppi nel tuo LDAP per sincronizzare con OpenProject. base_dn_text: 'Immetti il DN della base di ricerca da utilizzare per questo filtro. Deve essere al livello inferiore rispetto al DN di base della connessione LDAP selezionata. Lascia questa opzione vuota per riutilizzare il DN di base della connessione + ' + member_lookup_attribute_text: 'Lascia vuoto per utilizzare la ricerca inversa predefinita: OpenProject cerca gli utenti il cui attributo memberOf corrisponde al DN del gruppo. Questo richiede che l''attributo memberOf sia presente nelle voci utente (Active Directory, OpenLDAP con overlay memberof). Imposta questo campo con il nome dell''attributo nelle voci di gruppo che elenca i DN dei membri per utilizzare invece la ricerca diretta. Esempi: "uniqueMember" (groupOfUniqueNames), "member" (groupOfNames). Usa questa opzione per i server LDAP che non mantengono l''attributo memberOf nelle voci utente. + ' synchronized_groups: add_new: Aggiungi gruppo LDAP sincronizzato @@ -64,11 +68,13 @@ it: confirmation: Se continui, il gruppo sincronizzato %{name} e tutti i %{users_count} utenti sincronizzati con esso verranno rimossi. info: Il gruppo OpenProject stesso e i membri aggiunti al di fuori di questa sincronizzazione LDAP non verranno rimossi. help_text_html: | - Questo modulo permette di impostare una sincronizzazione tra l'LDAP e i gruppi di OpenProject. - Dipende dall'impostazione dell'attributo groupOfNames / memberOf nei gruppi LDAP la possibilità di funzionare correttamente con OpenProject. -
- I gruppi sono sincronizzati ogni ora con una schedulazione del cron. - [Leggi la nostra documentazione su questo argomento](docs_url). + Questo modulo consente di configurare una sincronizzazione tra LDAP e i gruppi di OpenProject.
+ Per impostazione predefinita, OpenProject utilizza una ricerca inversa: cerca gli utenti il cui attributo memberOf corrisponde al DN del gruppo. + Ciò richiede che l'attributo memberOf sia presente nelle voci utente (Active Directory, OpenLDAP con overlay memberof).
+ Se il tuo server LDAP non mantiene l'attributo memberOf nelle voci utente (ad esempio utilizza groupOfUniqueNames con uniqueMember), + puoi configurare una ricerca diretta impostando l'attributo del membro del gruppo nel filtro di sincronizzazione.
+ I gruppi vengono sincronizzati ogni ora tramite un processo cron. + [Consulta la nostra documentazione sull'argomento](docs_url). no_results: Nessun gruppo sincronizzato trovato. no_members: Questo gruppo non ha ancora sincronizzato membri. plural: Gruppi LDAP sincronizzati diff --git a/modules/ldap_groups/config/locales/crowdin/ja.yml b/modules/ldap_groups/config/locales/crowdin/ja.yml index dee978c71a4..def490aafce 100644 --- a/modules/ldap_groups/config/locales/crowdin/ja.yml +++ b/modules/ldap_groups/config/locales/crowdin/ja.yml @@ -22,6 +22,7 @@ ja: group_name_attribute: グループ名属性 sync_users: ユーザーを同期 base_dn: ベース DN を検索 + member_lookup_attribute: Group member attribute models: ldap_groups/synchronized_group: 同期済 LDAP グループ ldap_groups/synchronized_filter: LDAP グループ同期フィルター @@ -32,7 +33,7 @@ ja: ldap_groups: label_menu_item: LDAP グループの同期 label_group_key: LDAP グループ フィルターキー - label_synchronize: 同期する + label_synchronize: Discover LDAP groups settings: name_attribute: LDAPグループ名属性 name_attribute_text: フィルタによって作成されたときに OpenProject グループに名前を付けるために使用されるLDAP属性 @@ -55,6 +56,9 @@ ja: filter_string_text: OpenProject と同期するための LDAP グループを返すRFC4515 LDAP フィルタを入力します。 base_dn_text: 'このフィルタに使用する検索ベース DN を入力します。選択したLDAP接続のベースのDNの下にある必要があります。 接続のベース DN を再利用するには、このオプションを空にしてください。 + ' + member_lookup_attribute_text: 'Leave empty to use the default reverse lookup: OpenProject searches for users whose memberOf attribute matches the group DN. This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). Set this to the attribute name on group entries that lists member DNs to use forward lookup instead. Examples: "uniqueMember" (groupOfUniqueNames), "member" (groupOfNames). Use this for LDAP servers that do not maintain the memberOf attribute on user entries. + ' synchronized_groups: add_new: 同期済 LDAP グループを追加 @@ -65,7 +69,12 @@ ja: info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | This module allows you to set up a synchronization between LDAP and OpenProject groups. - It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. +
+ By default, OpenProject uses reverse lookup: it searches for users whose memberOf attribute matches the group DN. + This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). +
+ If your LDAP server does not maintain memberOf on user entries (e.g. it uses groupOfUniqueNames with uniqueMember), + you can configure forward lookup by setting the Group member attribute on the synchronization filter.
Groups are synchronized hourly through a cron job. [Please see our documentation on this topic](docs_url). diff --git a/modules/ldap_groups/config/locales/crowdin/ka.yml b/modules/ldap_groups/config/locales/crowdin/ka.yml index 4b4bee434d0..b0b82774809 100644 --- a/modules/ldap_groups/config/locales/crowdin/ka.yml +++ b/modules/ldap_groups/config/locales/crowdin/ka.yml @@ -22,6 +22,7 @@ ka: group_name_attribute: Group name attribute sync_users: მომხმარებლების სინქრონიზაცია base_dn: ძირითადი DN-ის ძებნა + member_lookup_attribute: Group member attribute models: ldap_groups/synchronized_group: Synchronized LDAP group ldap_groups/synchronized_filter: LDAP Group synchronization filter @@ -32,7 +33,7 @@ ka: ldap_groups: label_menu_item: LDAP group synchronization label_group_key: LDAP group filter key - label_synchronize: სინქრონიზირება + label_synchronize: Discover LDAP groups settings: name_attribute: LDAP groups name attribute name_attribute_text: The LDAP attribute used for naming the OpenProject group when created by a filter @@ -55,6 +56,9 @@ ka: filter_string_text: Enter the RFC4515 LDAP filter that returns groups in your LDAP to synchronize with OpenProject. base_dn_text: 'Enter the search base DN to use for this filter. It needs to be below the base DN of the selected LDAP connection. Leave this option empty to reuse the base DN of the connection + ' + member_lookup_attribute_text: 'Leave empty to use the default reverse lookup: OpenProject searches for users whose memberOf attribute matches the group DN. This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). Set this to the attribute name on group entries that lists member DNs to use forward lookup instead. Examples: "uniqueMember" (groupOfUniqueNames), "member" (groupOfNames). Use this for LDAP servers that do not maintain the memberOf attribute on user entries. + ' synchronized_groups: add_new: Add synchronized LDAP group @@ -65,7 +69,12 @@ ka: info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | This module allows you to set up a synchronization between LDAP and OpenProject groups. - It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. +
+ By default, OpenProject uses reverse lookup: it searches for users whose memberOf attribute matches the group DN. + This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). +
+ If your LDAP server does not maintain memberOf on user entries (e.g. it uses groupOfUniqueNames with uniqueMember), + you can configure forward lookup by setting the Group member attribute on the synchronization filter.
Groups are synchronized hourly through a cron job. [Please see our documentation on this topic](docs_url). diff --git a/modules/ldap_groups/config/locales/crowdin/kk.yml b/modules/ldap_groups/config/locales/crowdin/kk.yml index 0ff0af5c325..05a63a8fcd3 100644 --- a/modules/ldap_groups/config/locales/crowdin/kk.yml +++ b/modules/ldap_groups/config/locales/crowdin/kk.yml @@ -22,6 +22,7 @@ kk: group_name_attribute: Group name attribute sync_users: Sync users base_dn: Search base DN + member_lookup_attribute: Group member attribute models: ldap_groups/synchronized_group: Synchronized LDAP group ldap_groups/synchronized_filter: LDAP Group synchronization filter @@ -32,7 +33,7 @@ kk: ldap_groups: label_menu_item: LDAP group synchronization label_group_key: LDAP group filter key - label_synchronize: Synchronize + label_synchronize: Discover LDAP groups settings: name_attribute: LDAP groups name attribute name_attribute_text: The LDAP attribute used for naming the OpenProject group when created by a filter @@ -55,6 +56,9 @@ kk: filter_string_text: Enter the RFC4515 LDAP filter that returns groups in your LDAP to synchronize with OpenProject. base_dn_text: 'Enter the search base DN to use for this filter. It needs to be below the base DN of the selected LDAP connection. Leave this option empty to reuse the base DN of the connection + ' + member_lookup_attribute_text: 'Leave empty to use the default reverse lookup: OpenProject searches for users whose memberOf attribute matches the group DN. This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). Set this to the attribute name on group entries that lists member DNs to use forward lookup instead. Examples: "uniqueMember" (groupOfUniqueNames), "member" (groupOfNames). Use this for LDAP servers that do not maintain the memberOf attribute on user entries. + ' synchronized_groups: add_new: Add synchronized LDAP group @@ -65,7 +69,12 @@ kk: info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | This module allows you to set up a synchronization between LDAP and OpenProject groups. - It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. +
+ By default, OpenProject uses reverse lookup: it searches for users whose memberOf attribute matches the group DN. + This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). +
+ If your LDAP server does not maintain memberOf on user entries (e.g. it uses groupOfUniqueNames with uniqueMember), + you can configure forward lookup by setting the Group member attribute on the synchronization filter.
Groups are synchronized hourly through a cron job. [Please see our documentation on this topic](docs_url). diff --git a/modules/ldap_groups/config/locales/crowdin/ko.yml b/modules/ldap_groups/config/locales/crowdin/ko.yml index 00967deffea..60a0ae6963e 100644 --- a/modules/ldap_groups/config/locales/crowdin/ko.yml +++ b/modules/ldap_groups/config/locales/crowdin/ko.yml @@ -22,6 +22,7 @@ ko: group_name_attribute: 그룹 이름 특성 sync_users: 사용자 동기화 base_dn: 기본 DN 검색 + member_lookup_attribute: 그룹 멤버 특성 models: ldap_groups/synchronized_group: 동기화된 LDAP 그룹 ldap_groups/synchronized_filter: LDAP 그룹 동기화 필터 @@ -32,7 +33,7 @@ ko: ldap_groups: label_menu_item: LDAP 그룹 동기화 label_group_key: LDAP 그룹 필터 키 - label_synchronize: 동기화 + label_synchronize: LDAP 그룹 검색 settings: name_attribute: LDAP 그룹 이름 특성 name_attribute_text: 필터에 의해 생성될 때 OpenProject 그룹 명명에 사용되는 LDAP 특성입니다. @@ -55,6 +56,9 @@ ko: filter_string_text: OpenProject와 동기화하려면 해당 LDAP에서 그룹을 반환하는 RFC4515 LDAP 필터를 입력하세요. base_dn_text: '이 필터에 사용할 검색 기본 DN을 입력하세요. 이 DN은 선택한 LDAP 연결의 기본 DN 아래에 있어야 합니다. 연결의 기본 DN을 재사용하려면 이 옵션을 비워두세요. + ' + member_lookup_attribute_text: '기본 역방향 조회를 사용하려면 비워 두세요: OpenProject는 memberOf 특성이 그룹 DN과 일치하는 사용자를 검색합니다. 이를 위해서는 사용자 항목에 memberOf 특성이 있어야 합니다(Active Directory, memberof 오버레이가 있는 OpenLDAP). 대신 정방향 조회를 사용하려면 멤버 DN이 나열되는 그룹 항목의 특성 이름으로 이 옵션을 설정하세요. 예: "uniqueMember" (groupOfUniqueNames), "member" (groupOfNames). 사용자 항목의 memberOf 특성을 유지 관리하지 않는 LDAP 서버에 이 옵션을 사용하세요. + ' synchronized_groups: add_new: 동기화된 LDAP 그룹 추가 @@ -64,8 +68,13 @@ ko: confirmation: 계속하는 경우, 동기화된 그룹 %{name} 및 이를 통해 동기화된 %{users_count}명의 사용자 모두가 제거됩니다. info: OpenProject 그룹 자체 그리고 이 LDAP 동기화 외부에서 추가된 멤버는 제거되지 않습니다. help_text_html: | - 이 모듈을 통해 LDAP 및 OpenProject 그룹 간에 동기화를 설정할 수 있습니다.. - OpenProject와 연동하려면 LDAP 그룹이 groupOfNames / memberOf 특성 집합을 사용해야 합니다. + 이 모듈에서는 LDAP와 OpenProject 그룹 간 동기화를 설정할 수 있습니다. +
+ 기본적으로 OpenProject는 역방향 조회를 사용합니다: memberOf 특성이 그룹 DN과 일치하는 사용자를 검색합니다. + 이를 위해서는 사용자 항목에 memberOf 특성이 있어야 합니다(Active Directory, memberof 오버레이가 있는 OpenLDAP). +
+ LDAP 서버가 사용자 항목의 memberOf를 유지 관리하지 않는 경우(예: groupOfUniqueNamesuniqueMember 사용), + 정방향 조회는 동기화 필터에서 그룹 멤버 특성을 설정하여 구성할 수 있습니다.
그룹은 cron 작업을 통해 시간별로 동기화됩니다. [이 항목은 설명서를 참조하세요](docs_url). diff --git a/modules/ldap_groups/config/locales/crowdin/lt.yml b/modules/ldap_groups/config/locales/crowdin/lt.yml index 1519bd27a80..796eab7a9c0 100644 --- a/modules/ldap_groups/config/locales/crowdin/lt.yml +++ b/modules/ldap_groups/config/locales/crowdin/lt.yml @@ -22,6 +22,7 @@ lt: group_name_attribute: Grupės pavadinimo atributas sync_users: Sinchronizuoti naudotojus base_dn: Paieškos pagrindo DN + member_lookup_attribute: Group member attribute models: ldap_groups/synchronized_group: Sinchronizuota LDAP grupė ldap_groups/synchronized_filter: LDAP grupių sinchronizavimo filtras @@ -32,7 +33,7 @@ lt: ldap_groups: label_menu_item: LDAP grupės sinchronizacija label_group_key: LDAP grupės filtro raktas - label_synchronize: Sinchronizuoti + label_synchronize: Discover LDAP groups settings: name_attribute: LDAP grupės pavadinimo atributas name_attribute_text: LDAP atributas, kuris bus naudojamas OpenProject grupės, sukurtos pagal filtrą, pavadinimui @@ -55,6 +56,9 @@ lt: filter_string_text: Įveskite RFC4515 LDAP filtrą, kuris iš jūsų LDAP grąžina sinchronizavimui su OpenProjectu reikalingas grupes. base_dn_text: 'Įveskite paieškos pagrindo DN norėdami naudoti šį filtrą. Jis turi būti pasirinktos LDAP jungties pagrindo DN viduje. Palikite šį nustatymą tuščia, jei norite naudoti LDAP jungties pagrindo DN. + ' + member_lookup_attribute_text: 'Leave empty to use the default reverse lookup: OpenProject searches for users whose memberOf attribute matches the group DN. This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). Set this to the attribute name on group entries that lists member DNs to use forward lookup instead. Examples: "uniqueMember" (groupOfUniqueNames), "member" (groupOfNames). Use this for LDAP servers that do not maintain the memberOf attribute on user entries. + ' synchronized_groups: add_new: Pridėti sinchronizuotą LDAP grupę @@ -65,7 +69,12 @@ lt: info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | This module allows you to set up a synchronization between LDAP and OpenProject groups. - It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. +
+ By default, OpenProject uses reverse lookup: it searches for users whose memberOf attribute matches the group DN. + This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). +
+ If your LDAP server does not maintain memberOf on user entries (e.g. it uses groupOfUniqueNames with uniqueMember), + you can configure forward lookup by setting the Group member attribute on the synchronization filter.
Groups are synchronized hourly through a cron job. [Please see our documentation on this topic](docs_url). diff --git a/modules/ldap_groups/config/locales/crowdin/lv.yml b/modules/ldap_groups/config/locales/crowdin/lv.yml index ffcfb3d1e39..8d2e19ea733 100644 --- a/modules/ldap_groups/config/locales/crowdin/lv.yml +++ b/modules/ldap_groups/config/locales/crowdin/lv.yml @@ -22,6 +22,7 @@ lv: group_name_attribute: Group name attribute sync_users: Sync users base_dn: Search base DN + member_lookup_attribute: Group member attribute models: ldap_groups/synchronized_group: Synchronized LDAP group ldap_groups/synchronized_filter: LDAP Group synchronization filter @@ -32,7 +33,7 @@ lv: ldap_groups: label_menu_item: LDAP group synchronization label_group_key: LDAP group filter key - label_synchronize: Synchronize + label_synchronize: Discover LDAP groups settings: name_attribute: LDAP groups name attribute name_attribute_text: The LDAP attribute used for naming the OpenProject group when created by a filter @@ -55,6 +56,9 @@ lv: filter_string_text: Enter the RFC4515 LDAP filter that returns groups in your LDAP to synchronize with OpenProject. base_dn_text: 'Enter the search base DN to use for this filter. It needs to be below the base DN of the selected LDAP connection. Leave this option empty to reuse the base DN of the connection + ' + member_lookup_attribute_text: 'Leave empty to use the default reverse lookup: OpenProject searches for users whose memberOf attribute matches the group DN. This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). Set this to the attribute name on group entries that lists member DNs to use forward lookup instead. Examples: "uniqueMember" (groupOfUniqueNames), "member" (groupOfNames). Use this for LDAP servers that do not maintain the memberOf attribute on user entries. + ' synchronized_groups: add_new: Add synchronized LDAP group @@ -65,7 +69,12 @@ lv: info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | This module allows you to set up a synchronization between LDAP and OpenProject groups. - It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. +
+ By default, OpenProject uses reverse lookup: it searches for users whose memberOf attribute matches the group DN. + This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). +
+ If your LDAP server does not maintain memberOf on user entries (e.g. it uses groupOfUniqueNames with uniqueMember), + you can configure forward lookup by setting the Group member attribute on the synchronization filter.
Groups are synchronized hourly through a cron job. [Please see our documentation on this topic](docs_url). diff --git a/modules/ldap_groups/config/locales/crowdin/mn.yml b/modules/ldap_groups/config/locales/crowdin/mn.yml index beab226ab2c..c75feab8d0b 100644 --- a/modules/ldap_groups/config/locales/crowdin/mn.yml +++ b/modules/ldap_groups/config/locales/crowdin/mn.yml @@ -22,6 +22,7 @@ mn: group_name_attribute: Group name attribute sync_users: Sync users base_dn: Search base DN + member_lookup_attribute: Group member attribute models: ldap_groups/synchronized_group: Synchronized LDAP group ldap_groups/synchronized_filter: LDAP Group synchronization filter @@ -32,7 +33,7 @@ mn: ldap_groups: label_menu_item: LDAP group synchronization label_group_key: LDAP group filter key - label_synchronize: Synchronize + label_synchronize: Discover LDAP groups settings: name_attribute: LDAP groups name attribute name_attribute_text: The LDAP attribute used for naming the OpenProject group when created by a filter @@ -55,6 +56,9 @@ mn: filter_string_text: Enter the RFC4515 LDAP filter that returns groups in your LDAP to synchronize with OpenProject. base_dn_text: 'Enter the search base DN to use for this filter. It needs to be below the base DN of the selected LDAP connection. Leave this option empty to reuse the base DN of the connection + ' + member_lookup_attribute_text: 'Leave empty to use the default reverse lookup: OpenProject searches for users whose memberOf attribute matches the group DN. This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). Set this to the attribute name on group entries that lists member DNs to use forward lookup instead. Examples: "uniqueMember" (groupOfUniqueNames), "member" (groupOfNames). Use this for LDAP servers that do not maintain the memberOf attribute on user entries. + ' synchronized_groups: add_new: Add synchronized LDAP group @@ -65,7 +69,12 @@ mn: info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | This module allows you to set up a synchronization between LDAP and OpenProject groups. - It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. +
+ By default, OpenProject uses reverse lookup: it searches for users whose memberOf attribute matches the group DN. + This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). +
+ If your LDAP server does not maintain memberOf on user entries (e.g. it uses groupOfUniqueNames with uniqueMember), + you can configure forward lookup by setting the Group member attribute on the synchronization filter.
Groups are synchronized hourly through a cron job. [Please see our documentation on this topic](docs_url). diff --git a/modules/ldap_groups/config/locales/crowdin/ms.yml b/modules/ldap_groups/config/locales/crowdin/ms.yml index ff1b2e7416e..13155ea35f8 100644 --- a/modules/ldap_groups/config/locales/crowdin/ms.yml +++ b/modules/ldap_groups/config/locales/crowdin/ms.yml @@ -22,6 +22,7 @@ ms: group_name_attribute: Atribut nama kumpulan sync_users: Selaraskan pengguna-pengguna base_dn: Pangkalan carian DN + member_lookup_attribute: Group member attribute models: ldap_groups/synchronized_group: Kumpulan LDAP yang diselaraskan ldap_groups/synchronized_filter: Penyaring sinkronisasi kumpulan LDAP @@ -32,7 +33,7 @@ ms: ldap_groups: label_menu_item: Sinkronisasi kumpulan LDAP label_group_key: Kekunci saringan kumpulan LDAP - label_synchronize: Selaraskan + label_synchronize: Discover LDAP groups settings: name_attribute: Atribut nama kumpulan LDAP name_attribute_text: Atribut LDAP yang digunakan untuk menamakan kumpulan OpenProject apabila dicipta oleh penyaring @@ -55,6 +56,9 @@ ms: filter_string_text: Masukkan penyaring LDAP RFC4515 yang kembalikan kumpulan dalam LDAP anda untuk diselaraskan dengan OpenProject. base_dn_text: 'Masukkan pangkalan carian DN untuk gunakan penyaring ini. Ia perlulah berada di bawah pangkalan DN daripada sambungan LDAP yang dipilih. Tinggalkan pilihan ini kosong untuk gunakan semula sambungan pangkalan DN + ' + member_lookup_attribute_text: 'Leave empty to use the default reverse lookup: OpenProject searches for users whose memberOf attribute matches the group DN. This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). Set this to the attribute name on group entries that lists member DNs to use forward lookup instead. Examples: "uniqueMember" (groupOfUniqueNames), "member" (groupOfNames). Use this for LDAP servers that do not maintain the memberOf attribute on user entries. + ' synchronized_groups: add_new: Tambah kumpulan LDAP yang diselaraskan @@ -65,7 +69,12 @@ ms: info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | This module allows you to set up a synchronization between LDAP and OpenProject groups. - It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. +
+ By default, OpenProject uses reverse lookup: it searches for users whose memberOf attribute matches the group DN. + This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). +
+ If your LDAP server does not maintain memberOf on user entries (e.g. it uses groupOfUniqueNames with uniqueMember), + you can configure forward lookup by setting the Group member attribute on the synchronization filter.
Groups are synchronized hourly through a cron job. [Please see our documentation on this topic](docs_url). diff --git a/modules/ldap_groups/config/locales/crowdin/ne.yml b/modules/ldap_groups/config/locales/crowdin/ne.yml index 3847b435bc5..8540b122191 100644 --- a/modules/ldap_groups/config/locales/crowdin/ne.yml +++ b/modules/ldap_groups/config/locales/crowdin/ne.yml @@ -22,6 +22,7 @@ ne: group_name_attribute: Group name attribute sync_users: Sync users base_dn: Search base DN + member_lookup_attribute: Group member attribute models: ldap_groups/synchronized_group: Synchronized LDAP group ldap_groups/synchronized_filter: LDAP Group synchronization filter @@ -32,7 +33,7 @@ ne: ldap_groups: label_menu_item: LDAP group synchronization label_group_key: LDAP group filter key - label_synchronize: Synchronize + label_synchronize: Discover LDAP groups settings: name_attribute: LDAP groups name attribute name_attribute_text: The LDAP attribute used for naming the OpenProject group when created by a filter @@ -55,6 +56,9 @@ ne: filter_string_text: Enter the RFC4515 LDAP filter that returns groups in your LDAP to synchronize with OpenProject. base_dn_text: 'Enter the search base DN to use for this filter. It needs to be below the base DN of the selected LDAP connection. Leave this option empty to reuse the base DN of the connection + ' + member_lookup_attribute_text: 'Leave empty to use the default reverse lookup: OpenProject searches for users whose memberOf attribute matches the group DN. This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). Set this to the attribute name on group entries that lists member DNs to use forward lookup instead. Examples: "uniqueMember" (groupOfUniqueNames), "member" (groupOfNames). Use this for LDAP servers that do not maintain the memberOf attribute on user entries. + ' synchronized_groups: add_new: Add synchronized LDAP group @@ -65,7 +69,12 @@ ne: info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | This module allows you to set up a synchronization between LDAP and OpenProject groups. - It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. +
+ By default, OpenProject uses reverse lookup: it searches for users whose memberOf attribute matches the group DN. + This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). +
+ If your LDAP server does not maintain memberOf on user entries (e.g. it uses groupOfUniqueNames with uniqueMember), + you can configure forward lookup by setting the Group member attribute on the synchronization filter.
Groups are synchronized hourly through a cron job. [Please see our documentation on this topic](docs_url). diff --git a/modules/ldap_groups/config/locales/crowdin/nl.yml b/modules/ldap_groups/config/locales/crowdin/nl.yml index 4ed0a188de1..df376858e95 100644 --- a/modules/ldap_groups/config/locales/crowdin/nl.yml +++ b/modules/ldap_groups/config/locales/crowdin/nl.yml @@ -22,6 +22,7 @@ nl: group_name_attribute: Attribuut groepsnaam sync_users: Gebruikers synchroniseren base_dn: Zoek basis DN + member_lookup_attribute: Group member attribute models: ldap_groups/synchronized_group: Gesynchroniseerde LDAP groep ldap_groups/synchronized_filter: LDAP-groep synchronisatie filter @@ -32,7 +33,7 @@ nl: ldap_groups: label_menu_item: LDAP groep synchronisatie label_group_key: LDAP groep filtersleutel - label_synchronize: Synchroniseer + label_synchronize: Discover LDAP groups settings: name_attribute: LDAP groepen naam attribuut name_attribute_text: Het LDAP attribuut gebruikt om de OpenProject groep te noemen wanneer deze is aangemaakt door een filter @@ -55,6 +56,9 @@ nl: filter_string_text: Voer het RFC4515 LDAP filter in dat terugstuurt groepen in je LDAP om te synchroniseren met OpenProject. base_dn_text: 'Voer de basis DN in om te gebruiken voor dit filter. Het moet onder de basis DN van de geselecteerde LDAP-verbinding liggen. Laat deze optie leeg om de basis DN van de verbinding te hergebruiken + ' + member_lookup_attribute_text: 'Leave empty to use the default reverse lookup: OpenProject searches for users whose memberOf attribute matches the group DN. This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). Set this to the attribute name on group entries that lists member DNs to use forward lookup instead. Examples: "uniqueMember" (groupOfUniqueNames), "member" (groupOfNames). Use this for LDAP servers that do not maintain the memberOf attribute on user entries. + ' synchronized_groups: add_new: Gesynchroniseerde LDAP groep toevoegen @@ -65,7 +69,12 @@ nl: info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | This module allows you to set up a synchronization between LDAP and OpenProject groups. - It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. +
+ By default, OpenProject uses reverse lookup: it searches for users whose memberOf attribute matches the group DN. + This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). +
+ If your LDAP server does not maintain memberOf on user entries (e.g. it uses groupOfUniqueNames with uniqueMember), + you can configure forward lookup by setting the Group member attribute on the synchronization filter.
Groups are synchronized hourly through a cron job. [Please see our documentation on this topic](docs_url). diff --git a/modules/ldap_groups/config/locales/crowdin/no.yml b/modules/ldap_groups/config/locales/crowdin/no.yml index 4a225c82503..f59955bfdea 100644 --- a/modules/ldap_groups/config/locales/crowdin/no.yml +++ b/modules/ldap_groups/config/locales/crowdin/no.yml @@ -22,6 +22,7 @@ group_name_attribute: Gruppenavn-egenskap sync_users: Synkroniser brukere base_dn: Søk i DN-basen + member_lookup_attribute: Group member attribute models: ldap_groups/synchronized_group: Synkronisert LDAP-gruppe ldap_groups/synchronized_filter: Synkroniseringsfilter for LDAP-gruppe @@ -32,7 +33,7 @@ ldap_groups: label_menu_item: Synkronisering for LDAP-gruppe label_group_key: Filternøkkel for LDAP-gruppe - label_synchronize: Synkroniser + label_synchronize: Discover LDAP groups settings: name_attribute: LDAP-gruppens navneattributt name_attribute_text: LDAP-attributten brukt til navngiving av OpenProject-gruppen når den er opprettet av et filter @@ -55,6 +56,9 @@ filter_string_text: Skriv inn RFC4515 LDAP-filteret som returnerer grupper i din LDAP for å synkronisere med OpenProject. base_dn_text: 'Skriv inn standard DN for å bruke i dette filteret. Det må være under base DN for den valgte LDAP-tilkoblingen. La dette valget være tomt for gjenbruk av base DN for tilkoblingen + ' + member_lookup_attribute_text: 'Leave empty to use the default reverse lookup: OpenProject searches for users whose memberOf attribute matches the group DN. This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). Set this to the attribute name on group entries that lists member DNs to use forward lookup instead. Examples: "uniqueMember" (groupOfUniqueNames), "member" (groupOfNames). Use this for LDAP servers that do not maintain the memberOf attribute on user entries. + ' synchronized_groups: add_new: Legg til synkronisert LDAP-gruppe @@ -65,7 +69,12 @@ info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | This module allows you to set up a synchronization between LDAP and OpenProject groups. - It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. +
+ By default, OpenProject uses reverse lookup: it searches for users whose memberOf attribute matches the group DN. + This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). +
+ If your LDAP server does not maintain memberOf on user entries (e.g. it uses groupOfUniqueNames with uniqueMember), + you can configure forward lookup by setting the Group member attribute on the synchronization filter.
Groups are synchronized hourly through a cron job. [Please see our documentation on this topic](docs_url). diff --git a/modules/ldap_groups/config/locales/crowdin/pl.yml b/modules/ldap_groups/config/locales/crowdin/pl.yml index c8fa6901bcb..b18bc5a6965 100644 --- a/modules/ldap_groups/config/locales/crowdin/pl.yml +++ b/modules/ldap_groups/config/locales/crowdin/pl.yml @@ -22,6 +22,7 @@ pl: group_name_attribute: Atrybut nazwy grupy sync_users: Synchronizuj użytkowników base_dn: Wyszukaj bazową nazwę wyróżniającą + member_lookup_attribute: Atrybut członka grupy models: ldap_groups/synchronized_group: Synchronizowana grupa LDAP ldap_groups/synchronized_filter: Filtr synchronizacji grupy LDAP @@ -32,7 +33,7 @@ pl: ldap_groups: label_menu_item: Synchronizacja grupy LDAP label_group_key: Klucz filtru grupy LDAP - label_synchronize: Synchronizuj + label_synchronize: Wykryj grupy LDAP settings: name_attribute: Atrybut nazwy grupy LDAP name_attribute_text: Atrybut LDAP stosowany w celu nazwania grupy OpenProject po utworzeniu przez filtr @@ -55,6 +56,9 @@ pl: filter_string_text: Wprowadź filtr LDAP RFC4515, który zwraca grupy z LDAP w celu ich zsynchronizowania z OpenProject. base_dn_text: 'Wprowadź bazową nazwę wyróżniającą wyszukiwania do użycia w tym filtrze. Musi znajdować się poniżej bazowej nazwy wyróżniającej wybranego połączenia LDAP. Pozostaw tę opcję pustą, aby ponownie użyć bazowej nazwy wyróżniającej połączenia + ' + member_lookup_attribute_text: 'Pozostaw puste, aby skorzystać z domyślnego wyszukiwania wstecznego: OpenProject wyszukuje użytkowników, których atrybut memberOf odpowiada nazwie DN grupy. Wymaga to obecności atrybutu memberOf w rekordach użytkowników (Active Directory, OpenLDAP z nakładką memberof). Ustaw tę opcję na nazwę atrybutu we wpisach grupowych, który zawiera listę nazw DN członków, aby zamiast tego używać wyszukiwania bezpośredniego. Przykłady: „uniqueMember” (groupOfUniqueNames), „member” (groupOfNames). Użyj tej opcji w przypadku serwerów LDAP, które nie przechowują atrybutu memberOf w wpisach użytkowników. + ' synchronized_groups: add_new: Dodaj synchronizowaną grupę LDAP @@ -64,11 +68,16 @@ pl: confirmation: W przypadku kontynuacji usunięta zostanie synchronizowana grupa %{name} i wszyscy użytkownicy (%{users_count}) synchronizowani za jej pośrednictwem. info: Nie zostanie usunięta sama grupa OpenProject ani członkowie dodani poza tą synchronizacją LDAP. help_text_html: | - Ten moduł umożliwia skonfigurowanie synchronizacji między grupami LDAP i OpenProject. - Zależy to od tego, czy grupy LDAP muszą do pracy z OpenProject używać ustawionego atrybutu groupOfNames / memberOf. + Ten moduł umożliwia skonfigurowanie synchronizacji między grupami LDAP a grupami OpenProject.
- Grupy są synchronizowane co godzinę przy użyciu zadania cron. - Zapoznaj się z naszą dokumentacją na ten temat(docs_url). + Domyślnie OpenProject korzysta z wyszukiwania odwrotnego: wyszukuje użytkowników, których atrybut memberOf odpowiada identyfikatorowi DN grupy. + Wymaga to, aby w rekordach użytkowników występował atrybut memberOf (Active Directory, OpenLDAP z nakładką memberof). +
+ Jeśli serwer LDAP nie przechowuje atrybutu memberOf we wpisach użytkowników (np. używa atrybutu groupOfUniqueNames i uniqueMember), + można skonfigurować wyszukiwanie bezpośrednie, ustawiając atrybut Group member w filtrze synchronizacji. +
+ Grupy są synchronizowane co godzinę za pomocą zadania cron. + [Zapoznaj się z naszą dokumentacją na ten temat](docs_url). no_results: Nie znaleziono żadnych synchronizowanych grup. no_members: Ta grupa nie ma jeszcze synchronizowanych członków. plural: Synchronizowane grupy LDAP diff --git a/modules/ldap_groups/config/locales/crowdin/pt-BR.yml b/modules/ldap_groups/config/locales/crowdin/pt-BR.yml index fc4e41c40fc..b737620e1f7 100644 --- a/modules/ldap_groups/config/locales/crowdin/pt-BR.yml +++ b/modules/ldap_groups/config/locales/crowdin/pt-BR.yml @@ -22,6 +22,7 @@ pt-BR: group_name_attribute: Atributo de nome de grupo sync_users: Sincronizar usuários base_dn: Procurar DN base + member_lookup_attribute: Atributo de membro do grupo models: ldap_groups/synchronized_group: Grupo LDAP sincronizado ldap_groups/synchronized_filter: Filtro de sincronização de grupo LDAP @@ -32,7 +33,7 @@ pt-BR: ldap_groups: label_menu_item: Sincronização de grupo LDAP label_group_key: Chave de filtro de grupo LDAP - label_synchronize: Sincronizado + label_synchronize: Descobrir grupos LDAP settings: name_attribute: Atributo de nome de grupo LDAP name_attribute_text: O atributo LDAP usado para nomear o grupo OpenProject quando criado por um filtro @@ -55,6 +56,9 @@ pt-BR: filter_string_text: Insira o filtro RFC4515 LDAP que retorna grupos em seu LDAP para sincronizar com o OpenProject. base_dn_text: 'Insira o DN base da busca para usar este filtro. Ele preciosa ser inferior ao DN base da conexão LDAP selecionada. Deixe esta opção fazia para reutilizar o DN base da conexão. + ' + member_lookup_attribute_text: 'Deixe em branco para usar a pesquisa reversa padrão: o OpenProject procura usuários cujo atributo memberOf corresponde ao DN do grupo. Isso requer que o atributo memberOf esteja presente nos objetos de usuário (Active Directory, OpenLDAP com o overlay memberof). Defina isto como o nome do atributo nos objetos de grupo que lista os DNs dos membros para usar a pesquisa direta em vez disso. Exemplos: “uniqueMember” (groupOfUniqueNames), “member” (groupOfNames). Use isso para servidores LDAP que não mantêm o atributo memberOf nos objetos de usuário. + ' synchronized_groups: add_new: Adicionar grupo LDAP sincronizado @@ -64,11 +68,16 @@ pt-BR: confirmation: Se você continuar, o grupo sincronizado %{name} e todos os %{users_count} usuários sincronizados por meio dele serão removidos. info: O próprio grupo OpenProject e os membros adicionados fora desta sincronização LDAP não serão removidos. help_text_html: | - Este módulo permite configurar uma sincronização entre grupos LDAP e grupos do OpenProject. - Ele depende de grupos LDAP que utilizem o conjunto de atributos groupOfNames / memberOf para funcionar com o OpenProject. + Este módulo permite configurar a sincronização entre LDAP e grupos do OpenProject. +
+ Por padrão, o OpenProject usa pesquisa reversa: ele procura usuários cujo atributo memberOf corresponde ao DN do grupo. + Isso requer que o atributo memberOf esteja presente nos objetos de usuário (Active Directory, OpenLDAP com o overlay memberof). +
+ Se o seu servidor LDAP não mantém memberOf nos objetos de usuário (por exemplo, quando usa groupOfUniqueNames com uniqueMember), + você pode configurar pesquisa direta definindo o atributo de membro do grupo no filtro de sincronização.
Os grupos são sincronizados a cada hora por meio de uma tarefa cron. - [Consulte nossa documentação sobre este tópico](docs_url). + [Consulte nossa documentação sobre este tema](docs_url). no_results: Nenhum grupo sincronizado encontrado. no_members: Este grupo ainda não tem membros sincronizados. plural: Grupos LDAP sincronizados diff --git a/modules/ldap_groups/config/locales/crowdin/pt-PT.yml b/modules/ldap_groups/config/locales/crowdin/pt-PT.yml index cf4abea09ef..2c6e669040d 100644 --- a/modules/ldap_groups/config/locales/crowdin/pt-PT.yml +++ b/modules/ldap_groups/config/locales/crowdin/pt-PT.yml @@ -22,6 +22,7 @@ pt-PT: group_name_attribute: Atributo nome do grupo sync_users: Sincronizar utilizadores base_dn: Pesquisar DN base + member_lookup_attribute: Atributo de membro do grupo models: ldap_groups/synchronized_group: Grupo LDAP sincronizado ldap_groups/synchronized_filter: Filtro de sincronização de grupo LDAP @@ -32,7 +33,7 @@ pt-PT: ldap_groups: label_menu_item: Sincronização de grupo LDAP label_group_key: Chave de filtro de grupo LDAP - label_synchronize: Sincronizar + label_synchronize: Descubrir grupos LDAP settings: name_attribute: Atributo de nome de grupo LDAP name_attribute_text: O atributo LDAP usado para nomear o grupo OpenProject quando criado por um filtro @@ -55,6 +56,9 @@ pt-PT: filter_string_text: Insira o filtro RFC4515 LDAP que devolve grupos no seu LDAP para sincronizar com o OpenProject. base_dn_text: 'Insira o DN base da pesquisa para usar este filtro. Tem de ser inferior ao DN base da ligação LDAP selecionada. Deixe esta opção em branco para reutilizar o DN base da ligação. + ' + member_lookup_attribute_text: 'Deixe em branco para utilizar a pesquisa inversa predefinida: o OpenProject procura utilizadores cujo atributo memberOf corresponde ao DN do grupo. Isto requer que o atributo memberOf esteja presente nas entradas de utilizador (Active Directory, OpenLDAP com overlay memberof). Defina este campo com o nome do atributo nas entradas de grupo que lista os DNs dos membros para utilizar a pesquisa direta. Exemplos: "uniqueMember" (groupOfUniqueNames), "member" (groupOfNames). Utilize esta opção para servidores LDAP que não mantêm o atributo memberOf nas entradas de utilizador. + ' synchronized_groups: add_new: Adicionar grupo LDAP sincronizado @@ -64,11 +68,16 @@ pt-PT: confirmation: Se continuar, o grupo sincronizado %{name} e todos os utilizadores sincronizados com %{users_count} serão removidos. info: O próprio grupo OpenProject e membros adicionados fora desta sincronização LDAP não serão removidos. help_text_html: | - Este módulo permite configurar uma sincronização entre grupos LDAP e OpenProject. - Depende da necessidade dos grupos LDAP usarem o atributo groupOfNames / memberOf para trabalharem com o OpenProject. + Este módulo permite configurar uma sincronização entre grupos LDAP e grupos do OpenProject.
- Os grupos são sincronizados de hora a hora através de um cron job. - [Consulte a nossa documentação sobre este tópico](docs_url). + Por predefinição, o OpenProject utiliza a pesquisa inversa: procura utilizadores cujo atributo memberOf corresponde ao DN do grupo. + Isto requer que o atributo memberOf esteja presente nas entradas de utilizador (Active Directory, OpenLDAP com overlay memberof). +
+ Se o seu servidor LDAP não mantiver o atributo memberOf nas entradas de utilizador (por exemplo, se utilizar groupOfUniqueNames com uniqueMember), + pode configurar a pesquisa direta definindo o Atributo de membro do grupo no filtro de sincronização. +
+ Os grupos são sincronizados de hora a hora através de uma tarefa cron. + [Consulte a nossa documentação sobre este tema](docs_url). no_results: Nenhum grupo sincronizado encontrado. no_members: Este grupo ainda não tem membros sincronizados. plural: Grupos LDAP sincronizados diff --git a/modules/ldap_groups/config/locales/crowdin/ro.yml b/modules/ldap_groups/config/locales/crowdin/ro.yml index 085c9ddeaf7..65c57d5fff6 100644 --- a/modules/ldap_groups/config/locales/crowdin/ro.yml +++ b/modules/ldap_groups/config/locales/crowdin/ro.yml @@ -22,6 +22,7 @@ ro: group_name_attribute: Atributul nume de grup sync_users: Sincronizează utilizatorii base_dn: Baza de căutare DN + member_lookup_attribute: Group member attribute models: ldap_groups/synchronized_group: Grup LDAP sincronizat ldap_groups/synchronized_filter: Filtru de sincronizare a grupului LDAP @@ -32,7 +33,7 @@ ro: ldap_groups: label_menu_item: Sincronizarea grupurilor LDAP label_group_key: Cheia de filtrare a grupului LDAP - label_synchronize: Sincronizare + label_synchronize: Discover LDAP groups settings: name_attribute: Atributul "nume de grup LDAP name_attribute_text: Atributul LDAP utilizat pentru denumirea grupului OpenProject atunci când este creat de un filtru @@ -55,6 +56,9 @@ ro: filter_string_text: Introdu filtrul LDAP RFC4515 care returnează grupurile din LDAP pentru a le sincroniza cu OpenProject. base_dn_text: 'Introdu DN-ul de bază de căutare care urmează să fie utilizat pentru acest filtru. Acesta trebuie să fie sub DN de bază al conexiunii LDAP selectate. Lasă această opțiune goală pentru a reutiliza DN-ul de bază al conexiunii + ' + member_lookup_attribute_text: 'Leave empty to use the default reverse lookup: OpenProject searches for users whose memberOf attribute matches the group DN. This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). Set this to the attribute name on group entries that lists member DNs to use forward lookup instead. Examples: "uniqueMember" (groupOfUniqueNames), "member" (groupOfNames). Use this for LDAP servers that do not maintain the memberOf attribute on user entries. + ' synchronized_groups: add_new: Adaugă grup LDAP sincronizat @@ -65,7 +69,12 @@ ro: info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | This module allows you to set up a synchronization between LDAP and OpenProject groups. - It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. +
+ By default, OpenProject uses reverse lookup: it searches for users whose memberOf attribute matches the group DN. + This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). +
+ If your LDAP server does not maintain memberOf on user entries (e.g. it uses groupOfUniqueNames with uniqueMember), + you can configure forward lookup by setting the Group member attribute on the synchronization filter.
Groups are synchronized hourly through a cron job. [Please see our documentation on this topic](docs_url). diff --git a/modules/ldap_groups/config/locales/crowdin/ru.yml b/modules/ldap_groups/config/locales/crowdin/ru.yml index 3c75c6379e2..2afd8528a38 100644 --- a/modules/ldap_groups/config/locales/crowdin/ru.yml +++ b/modules/ldap_groups/config/locales/crowdin/ru.yml @@ -22,6 +22,7 @@ ru: group_name_attribute: Атрибут имени группы sync_users: Синхронизация пользователей base_dn: Поиск базы DN + member_lookup_attribute: Group member attribute models: ldap_groups/synchronized_group: Синхронизированная LDAP-группа ldap_groups/synchronized_filter: Фильтр синхронизации групп LDAP @@ -32,7 +33,7 @@ ru: ldap_groups: label_menu_item: Синхронизация LDAP-группы label_group_key: Ключ фильтра LDAP-группы - label_synchronize: Синхронизировать + label_synchronize: Discover LDAP groups settings: name_attribute: Атрибут имени группы LDAP name_attribute_text: Атрибут LDAP, используемый для именования группы OpenProject при создании фильтром @@ -55,6 +56,9 @@ ru: filter_string_text: Введите фильтр RFC4515 LDAP, который возвращает группы в ваш LDAP для синхронизации с OpenProject. base_dn_text: 'Введите базу поиска DN, чтобы использовать этот фильтр. Он должен быть ниже базового DN выбранного подключения LDAP. Оставьте этот параметр пустым для повторного использования базового DN соединения + ' + member_lookup_attribute_text: 'Leave empty to use the default reverse lookup: OpenProject searches for users whose memberOf attribute matches the group DN. This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). Set this to the attribute name on group entries that lists member DNs to use forward lookup instead. Examples: "uniqueMember" (groupOfUniqueNames), "member" (groupOfNames). Use this for LDAP servers that do not maintain the memberOf attribute on user entries. + ' synchronized_groups: add_new: Добавить синхронизированную LDAP-группу @@ -64,11 +68,16 @@ ru: confirmation: Если продолжите, синхронизированная группа %{name} и все %{users_count} пользователи синхронизированые через нее будут удалены. info: Сама группа OpenProject и участники, добавленные вне этой синхронизации LDAP, не будут удалены. help_text_html: | - Этот модуль позволяет Вам настроить синхронизацию между группами LDAP и OpenProject. - Для работы с OpenProject группам LDAP необходимо использовать набор атрибутов groupOfNames / memberOf. + This module allows you to set up a synchronization between LDAP and OpenProject groups.
- Группы синхронизируются ежечасно с помощью задания cron. - [Пожалуйста, ознакомьтесь с нашей документацией по этой теме](docs_url). + By default, OpenProject uses reverse lookup: it searches for users whose memberOf attribute matches the group DN. + This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). +
+ If your LDAP server does not maintain memberOf on user entries (e.g. it uses groupOfUniqueNames with uniqueMember), + you can configure forward lookup by setting the Group member attribute on the synchronization filter. +
+ Groups are synchronized hourly through a cron job. + [Please see our documentation on this topic](docs_url). no_results: Синхронизированные группы не найдены. no_members: У этой группы пока нет синхронизированных участников. plural: Синхронизированные LDAP-группы diff --git a/modules/ldap_groups/config/locales/crowdin/rw.yml b/modules/ldap_groups/config/locales/crowdin/rw.yml index a3681ca06c3..d8d17052c16 100644 --- a/modules/ldap_groups/config/locales/crowdin/rw.yml +++ b/modules/ldap_groups/config/locales/crowdin/rw.yml @@ -22,6 +22,7 @@ rw: group_name_attribute: Group name attribute sync_users: Sync users base_dn: Search base DN + member_lookup_attribute: Group member attribute models: ldap_groups/synchronized_group: Synchronized LDAP group ldap_groups/synchronized_filter: LDAP Group synchronization filter @@ -32,7 +33,7 @@ rw: ldap_groups: label_menu_item: LDAP group synchronization label_group_key: LDAP group filter key - label_synchronize: Synchronize + label_synchronize: Discover LDAP groups settings: name_attribute: LDAP groups name attribute name_attribute_text: The LDAP attribute used for naming the OpenProject group when created by a filter @@ -55,6 +56,9 @@ rw: filter_string_text: Enter the RFC4515 LDAP filter that returns groups in your LDAP to synchronize with OpenProject. base_dn_text: 'Enter the search base DN to use for this filter. It needs to be below the base DN of the selected LDAP connection. Leave this option empty to reuse the base DN of the connection + ' + member_lookup_attribute_text: 'Leave empty to use the default reverse lookup: OpenProject searches for users whose memberOf attribute matches the group DN. This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). Set this to the attribute name on group entries that lists member DNs to use forward lookup instead. Examples: "uniqueMember" (groupOfUniqueNames), "member" (groupOfNames). Use this for LDAP servers that do not maintain the memberOf attribute on user entries. + ' synchronized_groups: add_new: Add synchronized LDAP group @@ -65,7 +69,12 @@ rw: info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | This module allows you to set up a synchronization between LDAP and OpenProject groups. - It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. +
+ By default, OpenProject uses reverse lookup: it searches for users whose memberOf attribute matches the group DN. + This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). +
+ If your LDAP server does not maintain memberOf on user entries (e.g. it uses groupOfUniqueNames with uniqueMember), + you can configure forward lookup by setting the Group member attribute on the synchronization filter.
Groups are synchronized hourly through a cron job. [Please see our documentation on this topic](docs_url). diff --git a/modules/ldap_groups/config/locales/crowdin/si.yml b/modules/ldap_groups/config/locales/crowdin/si.yml index 58f56f74212..855876eff3b 100644 --- a/modules/ldap_groups/config/locales/crowdin/si.yml +++ b/modules/ldap_groups/config/locales/crowdin/si.yml @@ -22,6 +22,7 @@ si: group_name_attribute: Group name attribute sync_users: Sync users base_dn: Search base DN + member_lookup_attribute: Group member attribute models: ldap_groups/synchronized_group: Synchronized LDAP group ldap_groups/synchronized_filter: LDAP Group synchronization filter @@ -32,7 +33,7 @@ si: ldap_groups: label_menu_item: LDAP group synchronization label_group_key: LDAP group filter key - label_synchronize: Synchronize + label_synchronize: Discover LDAP groups settings: name_attribute: LDAP groups name attribute name_attribute_text: The LDAP attribute used for naming the OpenProject group when created by a filter @@ -55,6 +56,9 @@ si: filter_string_text: Enter the RFC4515 LDAP filter that returns groups in your LDAP to synchronize with OpenProject. base_dn_text: 'Enter the search base DN to use for this filter. It needs to be below the base DN of the selected LDAP connection. Leave this option empty to reuse the base DN of the connection + ' + member_lookup_attribute_text: 'Leave empty to use the default reverse lookup: OpenProject searches for users whose memberOf attribute matches the group DN. This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). Set this to the attribute name on group entries that lists member DNs to use forward lookup instead. Examples: "uniqueMember" (groupOfUniqueNames), "member" (groupOfNames). Use this for LDAP servers that do not maintain the memberOf attribute on user entries. + ' synchronized_groups: add_new: Add synchronized LDAP group @@ -65,7 +69,12 @@ si: info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | This module allows you to set up a synchronization between LDAP and OpenProject groups. - It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. +
+ By default, OpenProject uses reverse lookup: it searches for users whose memberOf attribute matches the group DN. + This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). +
+ If your LDAP server does not maintain memberOf on user entries (e.g. it uses groupOfUniqueNames with uniqueMember), + you can configure forward lookup by setting the Group member attribute on the synchronization filter.
Groups are synchronized hourly through a cron job. [Please see our documentation on this topic](docs_url). diff --git a/modules/ldap_groups/config/locales/crowdin/sk.yml b/modules/ldap_groups/config/locales/crowdin/sk.yml index 2453e819969..62dda73356b 100644 --- a/modules/ldap_groups/config/locales/crowdin/sk.yml +++ b/modules/ldap_groups/config/locales/crowdin/sk.yml @@ -22,6 +22,7 @@ sk: group_name_attribute: Group name attribute sync_users: Sync users base_dn: Search base DN + member_lookup_attribute: Group member attribute models: ldap_groups/synchronized_group: Synchronized LDAP group ldap_groups/synchronized_filter: LDAP Group synchronization filter @@ -32,7 +33,7 @@ sk: ldap_groups: label_menu_item: LDAP group synchronization label_group_key: LDAP group filter key - label_synchronize: Synchronizovať + label_synchronize: Discover LDAP groups settings: name_attribute: LDAP groups name attribute name_attribute_text: The LDAP attribute used for naming the OpenProject group when created by a filter @@ -55,6 +56,9 @@ sk: filter_string_text: Enter the RFC4515 LDAP filter that returns groups in your LDAP to synchronize with OpenProject. base_dn_text: 'Enter the search base DN to use for this filter. It needs to be below the base DN of the selected LDAP connection. Leave this option empty to reuse the base DN of the connection + ' + member_lookup_attribute_text: 'Leave empty to use the default reverse lookup: OpenProject searches for users whose memberOf attribute matches the group DN. This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). Set this to the attribute name on group entries that lists member DNs to use forward lookup instead. Examples: "uniqueMember" (groupOfUniqueNames), "member" (groupOfNames). Use this for LDAP servers that do not maintain the memberOf attribute on user entries. + ' synchronized_groups: add_new: Add synchronized LDAP group @@ -65,7 +69,12 @@ sk: info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | This module allows you to set up a synchronization between LDAP and OpenProject groups. - It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. +
+ By default, OpenProject uses reverse lookup: it searches for users whose memberOf attribute matches the group DN. + This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). +
+ If your LDAP server does not maintain memberOf on user entries (e.g. it uses groupOfUniqueNames with uniqueMember), + you can configure forward lookup by setting the Group member attribute on the synchronization filter.
Groups are synchronized hourly through a cron job. [Please see our documentation on this topic](docs_url). diff --git a/modules/ldap_groups/config/locales/crowdin/sl.yml b/modules/ldap_groups/config/locales/crowdin/sl.yml index c600f22229e..aa66987b306 100644 --- a/modules/ldap_groups/config/locales/crowdin/sl.yml +++ b/modules/ldap_groups/config/locales/crowdin/sl.yml @@ -24,6 +24,7 @@ sl: ' sync_users: Sinhroniziraj uporabnike base_dn: Išči po bazi DN + member_lookup_attribute: Group member attribute models: ldap_groups/synchronized_group: sinhronizacija LDAP skupine ldap_groups/synchronized_filter: Sinhronizacijski filter skupine LDAP @@ -34,7 +35,7 @@ sl: ldap_groups: label_menu_item: LDAP sinhronizacija skupine label_group_key: LDAP skupinski filter ključ - label_synchronize: Sinhroniziraj + label_synchronize: Discover LDAP groups settings: name_attribute: 'Atribut imena skupine LDAP @@ -65,6 +66,9 @@ sl: filter_string_text: Vnesite filter RFC4515 LDAP, ki vrne skupine v vašem LDAP za sinhronizacijo z OpenProject. base_dn_text: 'Vnesite iskalno osnovo DN za uporabo s tem filtrom. Mora biti pod osnovo za DN izbrane LDAP povezave. Pustite to opcijo prazno za ponovno uporabo osnove DN za povezavo + ' + member_lookup_attribute_text: 'Leave empty to use the default reverse lookup: OpenProject searches for users whose memberOf attribute matches the group DN. This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). Set this to the attribute name on group entries that lists member DNs to use forward lookup instead. Examples: "uniqueMember" (groupOfUniqueNames), "member" (groupOfNames). Use this for LDAP servers that do not maintain the memberOf attribute on user entries. + ' synchronized_groups: add_new: dodaj sinhronizirano LDAP skupino @@ -75,7 +79,12 @@ sl: info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | This module allows you to set up a synchronization between LDAP and OpenProject groups. - It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. +
+ By default, OpenProject uses reverse lookup: it searches for users whose memberOf attribute matches the group DN. + This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). +
+ If your LDAP server does not maintain memberOf on user entries (e.g. it uses groupOfUniqueNames with uniqueMember), + you can configure forward lookup by setting the Group member attribute on the synchronization filter.
Groups are synchronized hourly through a cron job. [Please see our documentation on this topic](docs_url). diff --git a/modules/ldap_groups/config/locales/crowdin/sr.yml b/modules/ldap_groups/config/locales/crowdin/sr.yml index 879a9dda5cf..c3975e731ca 100644 --- a/modules/ldap_groups/config/locales/crowdin/sr.yml +++ b/modules/ldap_groups/config/locales/crowdin/sr.yml @@ -22,6 +22,7 @@ sr: group_name_attribute: Group name attribute sync_users: Sync users base_dn: Search base DN + member_lookup_attribute: Group member attribute models: ldap_groups/synchronized_group: Synchronized LDAP group ldap_groups/synchronized_filter: LDAP Group synchronization filter @@ -32,7 +33,7 @@ sr: ldap_groups: label_menu_item: LDAP group synchronization label_group_key: LDAP group filter key - label_synchronize: Synchronize + label_synchronize: Discover LDAP groups settings: name_attribute: LDAP groups name attribute name_attribute_text: The LDAP attribute used for naming the OpenProject group when created by a filter @@ -55,6 +56,9 @@ sr: filter_string_text: Enter the RFC4515 LDAP filter that returns groups in your LDAP to synchronize with OpenProject. base_dn_text: 'Enter the search base DN to use for this filter. It needs to be below the base DN of the selected LDAP connection. Leave this option empty to reuse the base DN of the connection + ' + member_lookup_attribute_text: 'Leave empty to use the default reverse lookup: OpenProject searches for users whose memberOf attribute matches the group DN. This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). Set this to the attribute name on group entries that lists member DNs to use forward lookup instead. Examples: "uniqueMember" (groupOfUniqueNames), "member" (groupOfNames). Use this for LDAP servers that do not maintain the memberOf attribute on user entries. + ' synchronized_groups: add_new: Add synchronized LDAP group @@ -65,7 +69,12 @@ sr: info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | This module allows you to set up a synchronization between LDAP and OpenProject groups. - It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. +
+ By default, OpenProject uses reverse lookup: it searches for users whose memberOf attribute matches the group DN. + This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). +
+ If your LDAP server does not maintain memberOf on user entries (e.g. it uses groupOfUniqueNames with uniqueMember), + you can configure forward lookup by setting the Group member attribute on the synchronization filter.
Groups are synchronized hourly through a cron job. [Please see our documentation on this topic](docs_url). diff --git a/modules/ldap_groups/config/locales/crowdin/sv.yml b/modules/ldap_groups/config/locales/crowdin/sv.yml index 5db16c3e51d..3b511706a67 100644 --- a/modules/ldap_groups/config/locales/crowdin/sv.yml +++ b/modules/ldap_groups/config/locales/crowdin/sv.yml @@ -22,6 +22,7 @@ sv: group_name_attribute: Attribut för gruppnamn sync_users: Synkronisera användare base_dn: 'Sök bas DN:' + member_lookup_attribute: Group member attribute models: ldap_groups/synchronized_group: Synkroniserad LDAP-grupp ldap_groups/synchronized_filter: LDAP-gruppens synkroniseringsfilter @@ -32,7 +33,7 @@ sv: ldap_groups: label_menu_item: Synkronisering av LDAP-grupp label_group_key: Filternyckel för LDAP-grupp - label_synchronize: Synkronisera + label_synchronize: Discover LDAP groups settings: name_attribute: LDAP-gruppers namn attribut name_attribute_text: LDAP-attributet som används för att namnge OpenProject-gruppen när den skapas av ett filter @@ -55,6 +56,9 @@ sv: filter_string_text: Ange RFC4515 LDAP-filtret som returnerar grupper i din LDAP för att synkronisera med OpenProject. base_dn_text: 'Ange sökbasen DN för att använda det här filtret. Den måste ligga under basen DN för den valda LDAP-anslutningen. Lämna detta alternativ tomt för att återanvända basen DN för anslutningen + ' + member_lookup_attribute_text: 'Leave empty to use the default reverse lookup: OpenProject searches for users whose memberOf attribute matches the group DN. This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). Set this to the attribute name on group entries that lists member DNs to use forward lookup instead. Examples: "uniqueMember" (groupOfUniqueNames), "member" (groupOfNames). Use this for LDAP servers that do not maintain the memberOf attribute on user entries. + ' synchronized_groups: add_new: Lägg till synkroniserad LDAP-grupp @@ -65,7 +69,12 @@ sv: info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | This module allows you to set up a synchronization between LDAP and OpenProject groups. - It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. +
+ By default, OpenProject uses reverse lookup: it searches for users whose memberOf attribute matches the group DN. + This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). +
+ If your LDAP server does not maintain memberOf on user entries (e.g. it uses groupOfUniqueNames with uniqueMember), + you can configure forward lookup by setting the Group member attribute on the synchronization filter.
Groups are synchronized hourly through a cron job. [Please see our documentation on this topic](docs_url). diff --git a/modules/ldap_groups/config/locales/crowdin/th.yml b/modules/ldap_groups/config/locales/crowdin/th.yml index 4883ff68a7f..e3cf5b4c4f8 100644 --- a/modules/ldap_groups/config/locales/crowdin/th.yml +++ b/modules/ldap_groups/config/locales/crowdin/th.yml @@ -22,6 +22,7 @@ th: group_name_attribute: Group name attribute sync_users: Sync users base_dn: Search base DN + member_lookup_attribute: Group member attribute models: ldap_groups/synchronized_group: Synchronized LDAP group ldap_groups/synchronized_filter: LDAP Group synchronization filter @@ -32,7 +33,7 @@ th: ldap_groups: label_menu_item: LDAP group synchronization label_group_key: LDAP group filter key - label_synchronize: Synchronize + label_synchronize: Discover LDAP groups settings: name_attribute: LDAP groups name attribute name_attribute_text: The LDAP attribute used for naming the OpenProject group when created by a filter @@ -55,6 +56,9 @@ th: filter_string_text: Enter the RFC4515 LDAP filter that returns groups in your LDAP to synchronize with OpenProject. base_dn_text: 'Enter the search base DN to use for this filter. It needs to be below the base DN of the selected LDAP connection. Leave this option empty to reuse the base DN of the connection + ' + member_lookup_attribute_text: 'Leave empty to use the default reverse lookup: OpenProject searches for users whose memberOf attribute matches the group DN. This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). Set this to the attribute name on group entries that lists member DNs to use forward lookup instead. Examples: "uniqueMember" (groupOfUniqueNames), "member" (groupOfNames). Use this for LDAP servers that do not maintain the memberOf attribute on user entries. + ' synchronized_groups: add_new: Add synchronized LDAP group @@ -65,7 +69,12 @@ th: info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | This module allows you to set up a synchronization between LDAP and OpenProject groups. - It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. +
+ By default, OpenProject uses reverse lookup: it searches for users whose memberOf attribute matches the group DN. + This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). +
+ If your LDAP server does not maintain memberOf on user entries (e.g. it uses groupOfUniqueNames with uniqueMember), + you can configure forward lookup by setting the Group member attribute on the synchronization filter.
Groups are synchronized hourly through a cron job. [Please see our documentation on this topic](docs_url). diff --git a/modules/ldap_groups/config/locales/crowdin/tr.yml b/modules/ldap_groups/config/locales/crowdin/tr.yml index 5d76fd75157..2536d1f77e0 100644 --- a/modules/ldap_groups/config/locales/crowdin/tr.yml +++ b/modules/ldap_groups/config/locales/crowdin/tr.yml @@ -22,6 +22,7 @@ tr: group_name_attribute: Grup adı özelliği sync_users: Kullanıcıları senkronize et base_dn: Arama tabanı DN + member_lookup_attribute: Group member attribute models: ldap_groups/synchronized_group: Senkronize LDAP grubu ldap_groups/synchronized_filter: LDAP Grubu senkronizasyon filtresi @@ -32,7 +33,7 @@ tr: ldap_groups: label_menu_item: LDAP grup senkronizasyonu label_group_key: LDAP grubu filtre anahtarı - label_synchronize: Senkronize et + label_synchronize: Discover LDAP groups settings: name_attribute: LDAP grupları ad özelliği name_attribute_text: Bir filtre tarafından oluşturulduğunda OpenProject grubunu adlandırmak için kullanılan LDAP özelliği @@ -55,6 +56,9 @@ tr: filter_string_text: OpenProject ile senkronize etmek için LDAP'nizdeki grupları döndüren RFC4515 LDAP filtresini girin. base_dn_text: 'Bu filtre için kullanmak üzere arama tabanı DN''sini girin. Seçilen LDAP bağlantısının temel DN''sinin altında olması gerekir. Bağlantının temel DN''sini yeniden kullanmak için bu seçeneği boş bırakın + ' + member_lookup_attribute_text: 'Leave empty to use the default reverse lookup: OpenProject searches for users whose memberOf attribute matches the group DN. This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). Set this to the attribute name on group entries that lists member DNs to use forward lookup instead. Examples: "uniqueMember" (groupOfUniqueNames), "member" (groupOfNames). Use this for LDAP servers that do not maintain the memberOf attribute on user entries. + ' synchronized_groups: add_new: Senkronize LDAP grubu ekle @@ -65,7 +69,12 @@ tr: info: OpenProject grubunun kendisi ve bu LDAP senkronizasyonunun dışına eklenen üyeler kaldırılmaz. help_text_html: | This module allows you to set up a synchronization between LDAP and OpenProject groups. - It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. +
+ By default, OpenProject uses reverse lookup: it searches for users whose memberOf attribute matches the group DN. + This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). +
+ If your LDAP server does not maintain memberOf on user entries (e.g. it uses groupOfUniqueNames with uniqueMember), + you can configure forward lookup by setting the Group member attribute on the synchronization filter.
Groups are synchronized hourly through a cron job. [Please see our documentation on this topic](docs_url). diff --git a/modules/ldap_groups/config/locales/crowdin/uk.yml b/modules/ldap_groups/config/locales/crowdin/uk.yml index 87f17ddfa71..d0fc7c138b1 100644 --- a/modules/ldap_groups/config/locales/crowdin/uk.yml +++ b/modules/ldap_groups/config/locales/crowdin/uk.yml @@ -22,6 +22,7 @@ uk: group_name_attribute: Атрибут назви групи sync_users: Синхронізація користувачів base_dn: База пошуку унікальних імен + member_lookup_attribute: Атрибут учасника групи models: ldap_groups/synchronized_group: Синхронізована група LDAP ldap_groups/synchronized_filter: Фільтр синхронізації групи LDAP @@ -32,7 +33,7 @@ uk: ldap_groups: label_menu_item: Синхронізація групи LDAP label_group_key: Ключ фільтра LDAP-групи - label_synchronize: Синхронізувати + label_synchronize: Ознайомтеся з групами LDAP settings: name_attribute: Атрибут назви груп LDAP name_attribute_text: Атрибут LDAP, який використовується для іменування групи OpenProject під час створення фільтром @@ -55,6 +56,9 @@ uk: filter_string_text: Введіть LDAP-фільтр RFC4515, який повертає групи у ваш протокол LDAP, щоб виконати синхронізацію з OpenProject. base_dn_text: 'Введіть унікальне ім’я бази даних, щоб використовувати цей фільтр. Його має бути розташовано під базовим унікальним іменем вибраного LDAP-підключення. Не вказуйте тут нічого, щоб повторно використовувати базове унікальне ім’я підключення + ' + member_lookup_attribute_text: 'Нічого не вказуйте, щоб використовувати зворотний пошук за замовчуванням, і OpenProject знайде користувачів, атрибут memberOf яких відповідає DN групи. Для цього потрібно, щоб атрибут memberOf був у записах користувачів (Active Directory, OpenLDAP з накладанням memberof). Щоб використовувати прямий пошук, укажіть тут ім’я атрибута із запису групи, який містить список DN членів групи. Приклади: "uniqueMember" (groupOfUniqueNames), "member" (groupOfNames). Використовуйте це для серверів LDAP, які не підтримують атрибут memberOf у записах користувачів. + ' synchronized_groups: add_new: Додати синхронізовану групу LDAP @@ -64,11 +68,15 @@ uk: confirmation: Якщо ви продовжите, синхронізовану групу %{name} і всіх користувачі (%{users_count}), синхронізованих через неї, буде вилучено. info: Групу OpenProject і учасників, доданих з-поза меж цієї синхронізації LDAP, не буде вилучено. help_text_html: | - Цей модуль дає змогу налаштувати синхронізацію між групами LDAP й OpenProject. - Для роботи з OpenProject групам LDAP потрібно використовувати набір атрибутів groupOfNames / memberOf. + Цей модуль дозволяє налаштувати синхронізацію між групами LDAP й OpenProject. +
+ За замовчуванням OpenProject використовує зворотний пошук: знаходить користувачів, атрибут memberOf яких збігається з DN групи. + Для цього потрібно, щоб атрибут memberOf був у записах користувачів (Active Directory, OpenLDAP з накладанням memberof). +
+ Якщо ваш LDAP-сервер не підтримує атрибут memberOf у записах користувачів (наприклад, використовує groupOfUniqueNames із uniqueMember), ви можете налаштувати прямий пошук, указавши атрибут учасника групи у фільтрі синхронізації.
Групи синхронізуються щогодини за допомогою запланованого завдання (cron). - [Перегляньте нашу документацію на цю тему](docs_url). + [Перегляньте документацію на цю тему](docs_url). no_results: Не знайдено синхронізованих груп. no_members: У цієї групи поки немає синхронізованих учасників. plural: Синхронізовані групи LDAP diff --git a/modules/ldap_groups/config/locales/crowdin/uz.yml b/modules/ldap_groups/config/locales/crowdin/uz.yml index 55f1236f18c..4e868665262 100644 --- a/modules/ldap_groups/config/locales/crowdin/uz.yml +++ b/modules/ldap_groups/config/locales/crowdin/uz.yml @@ -22,6 +22,7 @@ uz: group_name_attribute: Group name attribute sync_users: Sync users base_dn: Search base DN + member_lookup_attribute: Group member attribute models: ldap_groups/synchronized_group: Synchronized LDAP group ldap_groups/synchronized_filter: LDAP Group synchronization filter @@ -32,7 +33,7 @@ uz: ldap_groups: label_menu_item: LDAP group synchronization label_group_key: LDAP group filter key - label_synchronize: Synchronize + label_synchronize: Discover LDAP groups settings: name_attribute: LDAP groups name attribute name_attribute_text: The LDAP attribute used for naming the OpenProject group when created by a filter @@ -55,6 +56,9 @@ uz: filter_string_text: Enter the RFC4515 LDAP filter that returns groups in your LDAP to synchronize with OpenProject. base_dn_text: 'Enter the search base DN to use for this filter. It needs to be below the base DN of the selected LDAP connection. Leave this option empty to reuse the base DN of the connection + ' + member_lookup_attribute_text: 'Leave empty to use the default reverse lookup: OpenProject searches for users whose memberOf attribute matches the group DN. This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). Set this to the attribute name on group entries that lists member DNs to use forward lookup instead. Examples: "uniqueMember" (groupOfUniqueNames), "member" (groupOfNames). Use this for LDAP servers that do not maintain the memberOf attribute on user entries. + ' synchronized_groups: add_new: Add synchronized LDAP group @@ -65,7 +69,12 @@ uz: info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | This module allows you to set up a synchronization between LDAP and OpenProject groups. - It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. +
+ By default, OpenProject uses reverse lookup: it searches for users whose memberOf attribute matches the group DN. + This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). +
+ If your LDAP server does not maintain memberOf on user entries (e.g. it uses groupOfUniqueNames with uniqueMember), + you can configure forward lookup by setting the Group member attribute on the synchronization filter.
Groups are synchronized hourly through a cron job. [Please see our documentation on this topic](docs_url). diff --git a/modules/ldap_groups/config/locales/crowdin/vi.yml b/modules/ldap_groups/config/locales/crowdin/vi.yml index ac09873435a..6e3b7fbd596 100644 --- a/modules/ldap_groups/config/locales/crowdin/vi.yml +++ b/modules/ldap_groups/config/locales/crowdin/vi.yml @@ -22,6 +22,7 @@ vi: group_name_attribute: Thuộc tính tên nhóm sync_users: Đồng bộ hóa người dùng base_dn: Tìm kiếm cơ sở DN + member_lookup_attribute: Group member attribute models: ldap_groups/synchronized_group: Nhóm LDAP được đồng bộ hóa ldap_groups/synchronized_filter: Bộ lọc đồng bộ hóa nhóm LDAP @@ -32,7 +33,7 @@ vi: ldap_groups: label_menu_item: Đồng bộ hóa nhóm LDAP label_group_key: Khóa bộ lọc nhóm LDAP - label_synchronize: Đồng bộ + label_synchronize: Discover LDAP groups settings: name_attribute: Thuộc tính tên nhóm LDAP name_attribute_text: Thuộc tính LDAP được sử dụng để đặt tên cho nhóm OpenProject khi được tạo bởi bộ lọc @@ -55,6 +56,9 @@ vi: filter_string_text: Nhập bộ lọc LDAP RFC4515 trả về các nhóm trong LDAP của bạn để đồng bộ hóa với OpenProject. base_dn_text: 'Nhập DN cơ sở tìm kiếm để sử dụng cho bộ lọc này. Nó phải ở dưới DN cơ sở của kết nối LDAP đã chọn. Để trống tùy chọn này để sử dụng lại DN cơ sở của kết nối + ' + member_lookup_attribute_text: 'Leave empty to use the default reverse lookup: OpenProject searches for users whose memberOf attribute matches the group DN. This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). Set this to the attribute name on group entries that lists member DNs to use forward lookup instead. Examples: "uniqueMember" (groupOfUniqueNames), "member" (groupOfNames). Use this for LDAP servers that do not maintain the memberOf attribute on user entries. + ' synchronized_groups: add_new: Thêm nhóm LDAP được đồng bộ hóa @@ -65,7 +69,12 @@ vi: info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | This module allows you to set up a synchronization between LDAP and OpenProject groups. - It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. +
+ By default, OpenProject uses reverse lookup: it searches for users whose memberOf attribute matches the group DN. + This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). +
+ If your LDAP server does not maintain memberOf on user entries (e.g. it uses groupOfUniqueNames with uniqueMember), + you can configure forward lookup by setting the Group member attribute on the synchronization filter.
Groups are synchronized hourly through a cron job. [Please see our documentation on this topic](docs_url). diff --git a/modules/ldap_groups/config/locales/crowdin/zh-CN.yml b/modules/ldap_groups/config/locales/crowdin/zh-CN.yml index 9063cf1400d..2781cac02b1 100644 --- a/modules/ldap_groups/config/locales/crowdin/zh-CN.yml +++ b/modules/ldap_groups/config/locales/crowdin/zh-CN.yml @@ -7,7 +7,7 @@ zh-CN: description: 与 OpenProject 组同步 LDAP 组以管理用户,更改他们的权限以便不同组的用户管理。 plugin_openproject_ldap_groups: name: OpenProject LDAP 组 - description: LDAP组成员同步。 + description: LDAP 组成员同步。 activerecord: attributes: ldap_groups/synchronized_group: @@ -22,6 +22,7 @@ zh-CN: group_name_attribute: 组名称属性 sync_users: 同步用户 base_dn: 搜索基础 DN + member_lookup_attribute: 群组成员特性 models: ldap_groups/synchronized_group: 同步的 LDAP 组 ldap_groups/synchronized_filter: LDAP 组同步筛选器 @@ -32,7 +33,7 @@ zh-CN: ldap_groups: label_menu_item: LDAP 组同步 label_group_key: LDAP 组筛选器密钥 - label_synchronize: 同步 + label_synchronize: 发现 LDAP 群组 settings: name_attribute: LDAP 组名称属性 name_attribute_text: 由筛选器创建时用于为 OpenProject 组命名的 LDAP 属性 @@ -55,6 +56,9 @@ zh-CN: filter_string_text: 输入 RFC4515 LDAP 筛选器,该筛选器将返回 LDAP 中的组以与 OpenProject 同步。 base_dn_text: '输入用于此筛选器的搜索基础 DN。它必须低于所选 LDAP 连接的基础 DN。 将此选项留空以重复使用连接的基础 DN + ' + member_lookup_attribute_text: '留空可使用默认反向查找:OpenProject 会搜索其 memberOf 特性与群组 DN 匹配的用户。这要求用户条目上存在 memberOf 特性(Active Directory,具有 memberof 叠加的 OpenLDAP)。 将此项设置为群组条目上列出成员 DN 的特性名称,以改为使用正向查找。示例:“uniqueMember”(groupOfUniqueNames)、“member”(groupOfNames)。为不在用户条目上保留 memberOf 特性的 LDAP 服务器使用此设置。 + ' synchronized_groups: add_new: 添加同步的 LDAP 组 @@ -64,8 +68,12 @@ zh-CN: confirmation: 如果您继续,将移除同步组 %{name} 和通过该组同步的全部 %{users_count} 个用户。 info: OpenProject 群组本身以及在此 LDAP 同步之外添加的成员将不会被移除。 help_text_html: | - 此模块允许您在 LDAP 与 OpenProject 群组之间建立同步。 - 它会根据 LDAP 群组的需求使用 groupOfNames / memberOf 特性集来与 OpenProject 协同工作。 + 此模块允许您设置 LDAP 与 OpenProject 群组之间的同步。 +
+ 默认情况下,OpenProject 使用反向查找:它会搜索其 memberOf 特性与群组 DN 匹配的用户。 + 这要求用户条目上存在 memberOf 特性(Active Directory,具有 memberof 叠加的 OpenLDAP)。 +
+ 如果 LDAP 服务器不在用户条目上保留 memberOf(例如将 groupOfUniqueNamesuniqueMember 配合使用),则可配置正向查找(在同步筛选条件上设置群组成员特性即可)。
群组通过 cron 作业每小时同步一次。 [请参阅我们关于此主题的文档](docs_url)。 diff --git a/modules/ldap_groups/config/locales/crowdin/zh-TW.yml b/modules/ldap_groups/config/locales/crowdin/zh-TW.yml index c54e53b8c8e..137c51a6566 100644 --- a/modules/ldap_groups/config/locales/crowdin/zh-TW.yml +++ b/modules/ldap_groups/config/locales/crowdin/zh-TW.yml @@ -16,12 +16,13 @@ zh-TW: ldap_auth_source: LDAP 連線 sync_users: 同步使用者 ldap_groups/synchronized_filter: - filter_string: LDAP篩選條件 + filter_string: 簡約登入目錄制約(LDAP)篩選 auth_source: 驗證來源 ldap_auth_source: LDAP 連線 group_name_attribute: 群組名字屬性 sync_users: 同步使用者 base_dn: 搜尋基礎 DN + member_lookup_attribute: Group member attribute models: ldap_groups/synchronized_group: LDAP 同步群組 ldap_groups/synchronized_filter: LDAP群組同步篩選 @@ -32,7 +33,7 @@ zh-TW: ldap_groups: label_menu_item: LDAP 群組同步 label_group_key: LDAP 組篩選條件 - label_synchronize: 同步 + label_synchronize: Discover LDAP groups settings: name_attribute: LDAP群組名屬性 name_attribute_text: LDAP篩選出的屬性名稱當作OpenProject群組 @@ -55,6 +56,9 @@ zh-TW: filter_string_text: 輸入 RFC4515 LDAP 篩選條件以取得LDAP 中的群組。 base_dn_text: '輸入用於此篩選器的搜尋基礎 DN,它必須在所選的 LDAP 連接的基礎 DN 之下。將此選項留空以使用連接的基礎 DN + ' + member_lookup_attribute_text: 'Leave empty to use the default reverse lookup: OpenProject searches for users whose memberOf attribute matches the group DN. This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). Set this to the attribute name on group entries that lists member DNs to use forward lookup instead. Examples: "uniqueMember" (groupOfUniqueNames), "member" (groupOfNames). Use this for LDAP servers that do not maintain the memberOf attribute on user entries. + ' synchronized_groups: add_new: 新增 LDAP 同步群組 @@ -65,7 +69,12 @@ zh-TW: info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | This module allows you to set up a synchronization between LDAP and OpenProject groups. - It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. +
+ By default, OpenProject uses reverse lookup: it searches for users whose memberOf attribute matches the group DN. + This requires the memberOf attribute to be present on user entries (Active Directory, OpenLDAP with memberof overlay). +
+ If your LDAP server does not maintain memberOf on user entries (e.g. it uses groupOfUniqueNames with uniqueMember), + you can configure forward lookup by setting the Group member attribute on the synchronization filter.
Groups are synchronized hourly through a cron job. [Please see our documentation on this topic](docs_url). diff --git a/modules/meeting/config/locales/crowdin/af.yml b/modules/meeting/config/locales/crowdin/af.yml index fefd8c8555d..f43457b5f5c 100644 --- a/modules/meeting/config/locales/crowdin/af.yml +++ b/modules/meeting/config/locales/crowdin/af.yml @@ -374,58 +374,22 @@ af: caption: This text will appear on every page at the center of the footer. submit_button: Laai af notifications: + disabled: Participants will not receive email updates informing them of changes to the date, time or list of participants. + enabled: All participants will receive updated calendar invites informing them of changes to date, time or list of participants. sidepanel: title: Email calendar updates description: - disabled: Participants will not receive an email informing them of changes. - enabled: All participants will receive updated calendar invites via email informing them of changes. change_via_template: To change this, edit the series template. dialog: title: enable: Enable email calendar updates? disable: Disable email calendar updates? message: - enable: 'All participants will receive updated calendar invites via email every time there is a change to the meeting date, time, location or participants. Once enabled, an email will be sent out immediately to all participants. - - ' - disable: 'Participants will no longer receive updated calendar invites via email when there are changes to the meeting date, time, location or participants. If they already had an invite for this meeting, it might no longer be accurate. - - ' + enable: Once enabled, an email will be sent out immediately to all participants. + disable: If they already had an invite for this meeting, it might no longer be accurate. confirm_label: enable: Enable email updates disable: Disable email updates - banner: - participants: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Email calendar updates are disabled. Participants will not receive an email informing them when you add or remove participants. - - ' - draft_disabled: 'Participants will not receive an email informing them when you add or remove participants. - - ' - onetime: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Participants will not receive an email informing them of changes to meeting date, time or participants. - - ' - occurrence: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this occurrence. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this occurrence. - - ' - template: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this template or to individual occurrences. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this template or to individual occurrences. - - ' presentation_mode: title: Presentation Mode button_present: Present @@ -638,6 +602,7 @@ af: label_agenda_item_duplicate_in_next_title: Duplicate in next meeting? label_agenda_item_add_notes: Add notes label_agenda_item_add_outcome: Add outcome + label_agenda_item_convert_to_work_package: Convert to work package label_agenda_item_work_package_add: Add work package label_agenda_item_work_package: Agenda item work package label_section_rename: Rename section diff --git a/modules/meeting/config/locales/crowdin/ar.yml b/modules/meeting/config/locales/crowdin/ar.yml index e2e21fd6298..a52e5423036 100644 --- a/modules/meeting/config/locales/crowdin/ar.yml +++ b/modules/meeting/config/locales/crowdin/ar.yml @@ -394,58 +394,22 @@ ar: caption: This text will appear on every page at the center of the footer. submit_button: تحميل notifications: + disabled: Participants will not receive email updates informing them of changes to the date, time or list of participants. + enabled: All participants will receive updated calendar invites informing them of changes to date, time or list of participants. sidepanel: title: Email calendar updates description: - disabled: Participants will not receive an email informing them of changes. - enabled: All participants will receive updated calendar invites via email informing them of changes. change_via_template: To change this, edit the series template. dialog: title: enable: Enable email calendar updates? disable: Disable email calendar updates? message: - enable: 'All participants will receive updated calendar invites via email every time there is a change to the meeting date, time, location or participants. Once enabled, an email will be sent out immediately to all participants. - - ' - disable: 'Participants will no longer receive updated calendar invites via email when there are changes to the meeting date, time, location or participants. If they already had an invite for this meeting, it might no longer be accurate. - - ' + enable: Once enabled, an email will be sent out immediately to all participants. + disable: If they already had an invite for this meeting, it might no longer be accurate. confirm_label: enable: Enable email updates disable: Disable email updates - banner: - participants: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Email calendar updates are disabled. Participants will not receive an email informing them when you add or remove participants. - - ' - draft_disabled: 'Participants will not receive an email informing them when you add or remove participants. - - ' - onetime: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Participants will not receive an email informing them of changes to meeting date, time or participants. - - ' - occurrence: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this occurrence. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this occurrence. - - ' - template: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this template or to individual occurrences. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this template or to individual occurrences. - - ' presentation_mode: title: Presentation Mode button_present: Present @@ -670,6 +634,7 @@ ar: label_agenda_item_duplicate_in_next_title: Duplicate in next meeting? label_agenda_item_add_notes: إضافة ملاحظات label_agenda_item_add_outcome: Add outcome + label_agenda_item_convert_to_work_package: Convert to work package label_agenda_item_work_package_add: Add work package label_agenda_item_work_package: Agenda item work package label_section_rename: Rename section diff --git a/modules/meeting/config/locales/crowdin/az.yml b/modules/meeting/config/locales/crowdin/az.yml index b52abe78b87..f9751803f99 100644 --- a/modules/meeting/config/locales/crowdin/az.yml +++ b/modules/meeting/config/locales/crowdin/az.yml @@ -374,58 +374,22 @@ az: caption: This text will appear on every page at the center of the footer. submit_button: Download notifications: + disabled: Participants will not receive email updates informing them of changes to the date, time or list of participants. + enabled: All participants will receive updated calendar invites informing them of changes to date, time or list of participants. sidepanel: title: Email calendar updates description: - disabled: Participants will not receive an email informing them of changes. - enabled: All participants will receive updated calendar invites via email informing them of changes. change_via_template: To change this, edit the series template. dialog: title: enable: Enable email calendar updates? disable: Disable email calendar updates? message: - enable: 'All participants will receive updated calendar invites via email every time there is a change to the meeting date, time, location or participants. Once enabled, an email will be sent out immediately to all participants. - - ' - disable: 'Participants will no longer receive updated calendar invites via email when there are changes to the meeting date, time, location or participants. If they already had an invite for this meeting, it might no longer be accurate. - - ' + enable: Once enabled, an email will be sent out immediately to all participants. + disable: If they already had an invite for this meeting, it might no longer be accurate. confirm_label: enable: Enable email updates disable: Disable email updates - banner: - participants: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Email calendar updates are disabled. Participants will not receive an email informing them when you add or remove participants. - - ' - draft_disabled: 'Participants will not receive an email informing them when you add or remove participants. - - ' - onetime: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Participants will not receive an email informing them of changes to meeting date, time or participants. - - ' - occurrence: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this occurrence. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this occurrence. - - ' - template: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this template or to individual occurrences. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this template or to individual occurrences. - - ' presentation_mode: title: Presentation Mode button_present: Present @@ -638,6 +602,7 @@ az: label_agenda_item_duplicate_in_next_title: Duplicate in next meeting? label_agenda_item_add_notes: Add notes label_agenda_item_add_outcome: Add outcome + label_agenda_item_convert_to_work_package: Convert to work package label_agenda_item_work_package_add: Add work package label_agenda_item_work_package: Agenda item work package label_section_rename: Rename section diff --git a/modules/meeting/config/locales/crowdin/be.yml b/modules/meeting/config/locales/crowdin/be.yml index 65bf18f0f70..b494f1a5f15 100644 --- a/modules/meeting/config/locales/crowdin/be.yml +++ b/modules/meeting/config/locales/crowdin/be.yml @@ -384,58 +384,22 @@ be: caption: This text will appear on every page at the center of the footer. submit_button: Download notifications: + disabled: Participants will not receive email updates informing them of changes to the date, time or list of participants. + enabled: All participants will receive updated calendar invites informing them of changes to date, time or list of participants. sidepanel: title: Email calendar updates description: - disabled: Participants will not receive an email informing them of changes. - enabled: All participants will receive updated calendar invites via email informing them of changes. change_via_template: To change this, edit the series template. dialog: title: enable: Enable email calendar updates? disable: Disable email calendar updates? message: - enable: 'All participants will receive updated calendar invites via email every time there is a change to the meeting date, time, location or participants. Once enabled, an email will be sent out immediately to all participants. - - ' - disable: 'Participants will no longer receive updated calendar invites via email when there are changes to the meeting date, time, location or participants. If they already had an invite for this meeting, it might no longer be accurate. - - ' + enable: Once enabled, an email will be sent out immediately to all participants. + disable: If they already had an invite for this meeting, it might no longer be accurate. confirm_label: enable: Enable email updates disable: Disable email updates - banner: - participants: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Email calendar updates are disabled. Participants will not receive an email informing them when you add or remove participants. - - ' - draft_disabled: 'Participants will not receive an email informing them when you add or remove participants. - - ' - onetime: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Participants will not receive an email informing them of changes to meeting date, time or participants. - - ' - occurrence: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this occurrence. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this occurrence. - - ' - template: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this template or to individual occurrences. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this template or to individual occurrences. - - ' presentation_mode: title: Presentation Mode button_present: Present @@ -654,6 +618,7 @@ be: label_agenda_item_duplicate_in_next_title: Duplicate in next meeting? label_agenda_item_add_notes: Add notes label_agenda_item_add_outcome: Add outcome + label_agenda_item_convert_to_work_package: Convert to work package label_agenda_item_work_package_add: Add work package label_agenda_item_work_package: Agenda item work package label_section_rename: Rename section diff --git a/modules/meeting/config/locales/crowdin/bg.yml b/modules/meeting/config/locales/crowdin/bg.yml index 703a9d31af3..63639f24726 100644 --- a/modules/meeting/config/locales/crowdin/bg.yml +++ b/modules/meeting/config/locales/crowdin/bg.yml @@ -374,58 +374,22 @@ bg: caption: This text will appear on every page at the center of the footer. submit_button: Изтегли notifications: + disabled: Participants will not receive email updates informing them of changes to the date, time or list of participants. + enabled: All participants will receive updated calendar invites informing them of changes to date, time or list of participants. sidepanel: title: Email calendar updates description: - disabled: Participants will not receive an email informing them of changes. - enabled: All participants will receive updated calendar invites via email informing them of changes. change_via_template: To change this, edit the series template. dialog: title: enable: Enable email calendar updates? disable: Disable email calendar updates? message: - enable: 'All participants will receive updated calendar invites via email every time there is a change to the meeting date, time, location or participants. Once enabled, an email will be sent out immediately to all participants. - - ' - disable: 'Participants will no longer receive updated calendar invites via email when there are changes to the meeting date, time, location or participants. If they already had an invite for this meeting, it might no longer be accurate. - - ' + enable: Once enabled, an email will be sent out immediately to all participants. + disable: If they already had an invite for this meeting, it might no longer be accurate. confirm_label: enable: Enable email updates disable: Disable email updates - banner: - participants: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Email calendar updates are disabled. Participants will not receive an email informing them when you add or remove participants. - - ' - draft_disabled: 'Participants will not receive an email informing them when you add or remove participants. - - ' - onetime: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Participants will not receive an email informing them of changes to meeting date, time or participants. - - ' - occurrence: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this occurrence. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this occurrence. - - ' - template: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this template or to individual occurrences. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this template or to individual occurrences. - - ' presentation_mode: title: Presentation Mode button_present: Present @@ -638,6 +602,7 @@ bg: label_agenda_item_duplicate_in_next_title: Duplicate in next meeting? label_agenda_item_add_notes: Добавяне на бележки label_agenda_item_add_outcome: Add outcome + label_agenda_item_convert_to_work_package: Convert to work package label_agenda_item_work_package_add: Add work package label_agenda_item_work_package: Agenda item work package label_section_rename: Rename section diff --git a/modules/meeting/config/locales/crowdin/ca.yml b/modules/meeting/config/locales/crowdin/ca.yml index 41e83286a61..c17d378d5ef 100644 --- a/modules/meeting/config/locales/crowdin/ca.yml +++ b/modules/meeting/config/locales/crowdin/ca.yml @@ -374,58 +374,22 @@ ca: caption: This text will appear on every page at the center of the footer. submit_button: Descàrrega notifications: + disabled: Participants will not receive email updates informing them of changes to the date, time or list of participants. + enabled: All participants will receive updated calendar invites informing them of changes to date, time or list of participants. sidepanel: title: Email calendar updates description: - disabled: Participants will not receive an email informing them of changes. - enabled: All participants will receive updated calendar invites via email informing them of changes. change_via_template: To change this, edit the series template. dialog: title: enable: Enable email calendar updates? disable: Disable email calendar updates? message: - enable: 'All participants will receive updated calendar invites via email every time there is a change to the meeting date, time, location or participants. Once enabled, an email will be sent out immediately to all participants. - - ' - disable: 'Participants will no longer receive updated calendar invites via email when there are changes to the meeting date, time, location or participants. If they already had an invite for this meeting, it might no longer be accurate. - - ' + enable: Once enabled, an email will be sent out immediately to all participants. + disable: If they already had an invite for this meeting, it might no longer be accurate. confirm_label: enable: Enable email updates disable: Disable email updates - banner: - participants: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Email calendar updates are disabled. Participants will not receive an email informing them when you add or remove participants. - - ' - draft_disabled: 'Participants will not receive an email informing them when you add or remove participants. - - ' - onetime: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Participants will not receive an email informing them of changes to meeting date, time or participants. - - ' - occurrence: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this occurrence. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this occurrence. - - ' - template: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this template or to individual occurrences. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this template or to individual occurrences. - - ' presentation_mode: title: Presentation Mode button_present: Present @@ -638,6 +602,7 @@ ca: label_agenda_item_duplicate_in_next_title: Duplicate in next meeting? label_agenda_item_add_notes: Afegir notes label_agenda_item_add_outcome: Add outcome + label_agenda_item_convert_to_work_package: Convert to work package label_agenda_item_work_package_add: Add work package label_agenda_item_work_package: Paquet de treball d'elements de l'agenda label_section_rename: Rename section diff --git a/modules/meeting/config/locales/crowdin/ckb-IR.yml b/modules/meeting/config/locales/crowdin/ckb-IR.yml index 50e6c2358f5..566b6d56971 100644 --- a/modules/meeting/config/locales/crowdin/ckb-IR.yml +++ b/modules/meeting/config/locales/crowdin/ckb-IR.yml @@ -374,58 +374,22 @@ ckb-IR: caption: This text will appear on every page at the center of the footer. submit_button: Download notifications: + disabled: Participants will not receive email updates informing them of changes to the date, time or list of participants. + enabled: All participants will receive updated calendar invites informing them of changes to date, time or list of participants. sidepanel: title: Email calendar updates description: - disabled: Participants will not receive an email informing them of changes. - enabled: All participants will receive updated calendar invites via email informing them of changes. change_via_template: To change this, edit the series template. dialog: title: enable: Enable email calendar updates? disable: Disable email calendar updates? message: - enable: 'All participants will receive updated calendar invites via email every time there is a change to the meeting date, time, location or participants. Once enabled, an email will be sent out immediately to all participants. - - ' - disable: 'Participants will no longer receive updated calendar invites via email when there are changes to the meeting date, time, location or participants. If they already had an invite for this meeting, it might no longer be accurate. - - ' + enable: Once enabled, an email will be sent out immediately to all participants. + disable: If they already had an invite for this meeting, it might no longer be accurate. confirm_label: enable: Enable email updates disable: Disable email updates - banner: - participants: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Email calendar updates are disabled. Participants will not receive an email informing them when you add or remove participants. - - ' - draft_disabled: 'Participants will not receive an email informing them when you add or remove participants. - - ' - onetime: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Participants will not receive an email informing them of changes to meeting date, time or participants. - - ' - occurrence: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this occurrence. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this occurrence. - - ' - template: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this template or to individual occurrences. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this template or to individual occurrences. - - ' presentation_mode: title: Presentation Mode button_present: Present @@ -638,6 +602,7 @@ ckb-IR: label_agenda_item_duplicate_in_next_title: Duplicate in next meeting? label_agenda_item_add_notes: Add notes label_agenda_item_add_outcome: Add outcome + label_agenda_item_convert_to_work_package: Convert to work package label_agenda_item_work_package_add: Add work package label_agenda_item_work_package: Agenda item work package label_section_rename: Rename section diff --git a/modules/meeting/config/locales/crowdin/cs.yml b/modules/meeting/config/locales/crowdin/cs.yml index 45d5c5d027e..0228cefe006 100644 --- a/modules/meeting/config/locales/crowdin/cs.yml +++ b/modules/meeting/config/locales/crowdin/cs.yml @@ -386,58 +386,22 @@ cs: caption: Tento text se zobrazí na každé stránce uprostřed zápatí. submit_button: Stáhnout notifications: + disabled: Participants will not receive email updates informing them of changes to the date, time or list of participants. + enabled: All participants will receive updated calendar invites informing them of changes to date, time or list of participants. sidepanel: title: Email calendar updates description: - disabled: Participants will not receive an email informing them of changes. - enabled: All participants will receive updated calendar invites via email informing them of changes. change_via_template: Chcete-li provést změnu, upravte šablonu série. dialog: title: enable: Povolit e-mailové aktualizace kalendáře? disable: Zakázat e-mailové aktualizace kalendáře? message: - enable: 'Všichni účastníci obdrží e-mailem aktualizované pozvánky do kalendáře vždy, když dojde ke změně data, času, místa nebo účastníků schůzky. Po aktivaci bude všem účastníkům okamžitě odeslán e-mail. - - ' - disable: 'Participants will no longer receive updated calendar invites via email when there are changes to the meeting date, time, location or participants. If they already had an invite for this meeting, it might no longer be accurate. - - ' + enable: Once enabled, an email will be sent out immediately to all participants. + disable: If they already had an invite for this meeting, it might no longer be accurate. confirm_label: enable: Povolit aktualizací e-mailem disable: Zakázat aktualizací e-mailem - banner: - participants: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Email calendar updates are disabled. Participants will not receive an email informing them when you add or remove participants. - - ' - draft_disabled: 'Participants will not receive an email informing them when you add or remove participants. - - ' - onetime: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Participants will not receive an email informing them of changes to meeting date, time or participants. - - ' - occurrence: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this occurrence. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this occurrence. - - ' - template: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this template or to individual occurrences. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this template or to individual occurrences. - - ' presentation_mode: title: Prezentační mód button_present: Prezentovat @@ -600,7 +564,7 @@ cs: ' permission_edit_meetings: Upravit schůzku - permission_delete_meetings: Odstranit schůzky + permission_delete_meetings: Smazat schůzku permission_view_meetings: Zobrazit schůzky permission_manage_agendas: Správa zápisů permission_manage_agendas_explanation: Allows creating, editing and removing agenda items @@ -660,6 +624,7 @@ cs: label_agenda_item_duplicate_in_next_title: Duplicate in next meeting? label_agenda_item_add_notes: Přidat poznámky label_agenda_item_add_outcome: Přidat výsledek + label_agenda_item_convert_to_work_package: Convert to work package label_agenda_item_work_package_add: Přidat pracovní balíček label_agenda_item_work_package: Pracovní balíček k bodu programu label_section_rename: Přejmenovat sekci diff --git a/modules/meeting/config/locales/crowdin/da.yml b/modules/meeting/config/locales/crowdin/da.yml index ee3b0544c76..cc2abc8dc01 100644 --- a/modules/meeting/config/locales/crowdin/da.yml +++ b/modules/meeting/config/locales/crowdin/da.yml @@ -374,58 +374,22 @@ da: caption: This text will appear on every page at the center of the footer. submit_button: Hent notifications: + disabled: Participants will not receive email updates informing them of changes to the date, time or list of participants. + enabled: All participants will receive updated calendar invites informing them of changes to date, time or list of participants. sidepanel: title: Email calendar updates description: - disabled: Participants will not receive an email informing them of changes. - enabled: All participants will receive updated calendar invites via email informing them of changes. change_via_template: To change this, edit the series template. dialog: title: enable: Enable email calendar updates? disable: Disable email calendar updates? message: - enable: 'All participants will receive updated calendar invites via email every time there is a change to the meeting date, time, location or participants. Once enabled, an email will be sent out immediately to all participants. - - ' - disable: 'Participants will no longer receive updated calendar invites via email when there are changes to the meeting date, time, location or participants. If they already had an invite for this meeting, it might no longer be accurate. - - ' + enable: Once enabled, an email will be sent out immediately to all participants. + disable: If they already had an invite for this meeting, it might no longer be accurate. confirm_label: enable: Enable email updates disable: Disable email updates - banner: - participants: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Email calendar updates are disabled. Participants will not receive an email informing them when you add or remove participants. - - ' - draft_disabled: 'Participants will not receive an email informing them when you add or remove participants. - - ' - onetime: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Participants will not receive an email informing them of changes to meeting date, time or participants. - - ' - occurrence: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this occurrence. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this occurrence. - - ' - template: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this template or to individual occurrences. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this template or to individual occurrences. - - ' presentation_mode: title: Presentation Mode button_present: Present @@ -638,6 +602,7 @@ da: label_agenda_item_duplicate_in_next_title: Duplicate in next meeting? label_agenda_item_add_notes: Tilføj noter label_agenda_item_add_outcome: Add outcome + label_agenda_item_convert_to_work_package: Convert to work package label_agenda_item_work_package_add: Add work package label_agenda_item_work_package: Agenda item work package label_section_rename: Rename section diff --git a/modules/meeting/config/locales/crowdin/de.yml b/modules/meeting/config/locales/crowdin/de.yml index 291101955b1..5b14bf546c8 100644 --- a/modules/meeting/config/locales/crowdin/de.yml +++ b/modules/meeting/config/locales/crowdin/de.yml @@ -23,8 +23,8 @@ --- de: plugin_openproject_meeting: - name: OpenProject Besprechung - description: Besprechungen für OpenProject + name: OpenProject Besprechungen + description: Dieses Modul fügt Funktionen zur Unterstützung von Besprechungen zu OpenProject hinzu. Sie können Besprechungen planen und dabei Teilnehmende aus demselben Projekt auswählen, die an der Besprechung teilnehmen sollen. Es kann eine Tagesordnung erstellt und an die Eingeladenen gesendet werden. Nach der Besprechung können die Teilnehmenden ausgewählt und Protokolle auf der Grundlage der Tagesordnung erstellt werden. Schließlich kann das Protokoll an alle Teilnehmenden und Eingeladenen gesendet werden. activerecord: attributes: meeting: @@ -93,7 +93,7 @@ de: section_not_belong_to_meeting: Die Sektion gehört nicht zur gleichen Besprechung. user_invalid: ist kein gültiger Teilnehmer. recurring_meeting_interim_response: - not_an_occurrence: ist keine gültige Uhrzeit für diese wiederkehrende Besprechung + not_an_occurrence: ist keine gültige Uhrzeit für dieses wiederkehrende Treffen recurring_meeting: must_cover_existing_meetings: one: Es gibt eine offene Besprechung in der Terminserie, die nicht durch den neuen Zeitplan abgedeckt ist. Passen Sie den Zeitplan an, um alle bestehenden Meetings einzuschließen. @@ -374,58 +374,22 @@ de: caption: Dieser Text wird auf jeder Seite in der Mitte der Fußzeile angezeigt. submit_button: Download notifications: + disabled: Die Teilnehmenden erhalten keine E-Mail, die sie über Änderungen des Datums, der Uhrzeit oder der Teilnehmer der Besprechung informiert. + enabled: Alle Teilnehmer erhalten aktualisierte Kalendereinladungen, die sie über Änderungen von Datum, Uhrzeit oder Teilnehmerliste informieren. sidepanel: title: E-Mail-Kalender-Aktualisierungen description: - disabled: Teilnehmende erhalten keine E-Mail bei Änderungen an der Besprechung. - enabled: Alle Teilnehmenden erhalten aktualisierte Kalendereinladungen per E-Mail bei wesentlichen Änderungen der Besprechung. change_via_template: Bearbeiten Sie die Vorlage der Terminserie, um diese Einstellung zu ändern. dialog: title: enable: E-Mail-Kalender-Aktualisierungen aktivieren? disable: E-Mail-Kalender-Aktualisierungen deaktivieren? message: - enable: 'Alle Teilnehmenden erhalten aktualisierte Kalendereinladungen per E-Mail, wenn sich das Datum, die Uhrzeit, der Ort oder die Teilnehmenden der Besprechung geändert haben. Sobald die Funktion aktiviert ist, wird sofort eine E-Mail an alle Teilnehmenden gesendet. - - ' - disable: 'Teilnehmende erhalten keine aktualisierten Kalendereinladungen mehr per E-Mail, wenn sich Datum, Uhrzeit, Ort oder Teilnehmende der Besprechung ändern. Wenn sie bereits eine Einladung für diese Besprechung erhalten haben, wird diese nicht mehr aktualisiert und könnte veraltete Informationen enthalten. - - ' + enable: Nach der Aktivierung wird sofort eine E-Mail an alle Teilnehmer verschickt. + disable: Wenn sie bereits eine Einladung für dieses Treffen hatten, ist diese möglicherweise nicht mehr korrekt. confirm_label: enable: E-Mail-Aktualisierungen aktivieren disable: E-Mail-Aktualisierungen deaktivieren - banner: - participants: - enabled: 'Alle Teilnehmenden erhalten aktualisierte Kalendereinladungen per E-Mail, wenn Sie Teilnehmende hinzufügen oder entfernen. - - ' - disabled: 'E-Mail-Benachrichtigungen zu Kalenderänderungen sind deaktiviert. Die Teilnehmenden erhalten keine E-Mail, wenn Sie Teilnehmende hinzufügen oder entfernen. - - ' - draft_disabled: 'Die Teilnehmer erhalten keine E-Mail, die sie über Änderungen des Datums, der Uhrzeit oder der Teilnehmer der Besprechung informiert. - - ' - onetime: - enabled: 'Alle Teilnehmenden erhalten aktualisierte Kalendereinladungen per E-Mail, wenn Sie Teilnehmende hinzufügen oder entfernen. - - ' - disabled: 'Die Teilnehmended erhalten keine E-Mail, die sie über Änderungen des Datums, der Uhrzeit oder der Teilnehmer der Besprechung informiert. - - ' - occurrence: - enabled: 'E-Mail-Kalenderaktualisierungen sind für die Terminserie aktiviert. Alle Teilnehmenden erhalten aktualisierte Kalendereinladungen, die sie über Ihre Änderungen an dieser Besprechung informieren. - - ' - disabled: 'E-Mail-Kalenderaktualisierungen sind für die Terminserie deaktiviert. Die Teilnehmenden erhalten keine E-Mail, die sie über Ihre Änderungen informiert. - - ' - template: - enabled: 'E-Mail-Kalenderaktualisierungen sind für die Terminserie aktiviert. Alle Teilnehmenden erhalten aktualisierte Kalendereinladungen, die sie über Ihre Änderungen an dieser Vorlage oder an einzelnen Ereignissen vornehmen. - - ' - disabled: 'E-Mail-Kalenderaktualisierungen sind für die Terminserie deaktiviert. Die Teilnehmenden erhalten keine E-Mail, die sie über Ihre Änderungen an dieser Vorlage oder Ereignisse der Serie informiert. - - ' presentation_mode: title: Präsentationsmodus button_present: Präsentieren @@ -638,6 +602,7 @@ de: label_agenda_item_duplicate_in_next_title: In die nächste Besprechung duplizieren? label_agenda_item_add_notes: Notiz hinzufügen label_agenda_item_add_outcome: Ergebnis hinzufügen + label_agenda_item_convert_to_work_package: In Arbeitspaket umwandeln label_agenda_item_work_package_add: Arbeitspaket hinzufügen label_agenda_item_work_package: Tagesordnungspunkt Arbeitspaket label_section_rename: Abschnitt umbenennen diff --git a/modules/meeting/config/locales/crowdin/el.yml b/modules/meeting/config/locales/crowdin/el.yml index 84ca8520229..5906b3b8810 100644 --- a/modules/meeting/config/locales/crowdin/el.yml +++ b/modules/meeting/config/locales/crowdin/el.yml @@ -374,58 +374,22 @@ el: caption: This text will appear on every page at the center of the footer. submit_button: Λήψη notifications: + disabled: Participants will not receive email updates informing them of changes to the date, time or list of participants. + enabled: All participants will receive updated calendar invites informing them of changes to date, time or list of participants. sidepanel: title: Email calendar updates description: - disabled: Participants will not receive an email informing them of changes. - enabled: All participants will receive updated calendar invites via email informing them of changes. change_via_template: To change this, edit the series template. dialog: title: enable: Enable email calendar updates? disable: Disable email calendar updates? message: - enable: 'All participants will receive updated calendar invites via email every time there is a change to the meeting date, time, location or participants. Once enabled, an email will be sent out immediately to all participants. - - ' - disable: 'Participants will no longer receive updated calendar invites via email when there are changes to the meeting date, time, location or participants. If they already had an invite for this meeting, it might no longer be accurate. - - ' + enable: Once enabled, an email will be sent out immediately to all participants. + disable: If they already had an invite for this meeting, it might no longer be accurate. confirm_label: enable: Enable email updates disable: Disable email updates - banner: - participants: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Email calendar updates are disabled. Participants will not receive an email informing them when you add or remove participants. - - ' - draft_disabled: 'Participants will not receive an email informing them when you add or remove participants. - - ' - onetime: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Participants will not receive an email informing them of changes to meeting date, time or participants. - - ' - occurrence: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this occurrence. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this occurrence. - - ' - template: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this template or to individual occurrences. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this template or to individual occurrences. - - ' presentation_mode: title: Presentation Mode button_present: Present @@ -638,6 +602,7 @@ el: label_agenda_item_duplicate_in_next_title: Αντίγραφή στην επόμενη συνάντηση; label_agenda_item_add_notes: Προσθήκη σημειώσεων label_agenda_item_add_outcome: Add outcome + label_agenda_item_convert_to_work_package: Convert to work package label_agenda_item_work_package_add: Add work package label_agenda_item_work_package: Agenda item work package label_section_rename: Rename section diff --git a/modules/meeting/config/locales/crowdin/eo.yml b/modules/meeting/config/locales/crowdin/eo.yml index 16603a268aa..33216d86321 100644 --- a/modules/meeting/config/locales/crowdin/eo.yml +++ b/modules/meeting/config/locales/crowdin/eo.yml @@ -374,58 +374,22 @@ eo: caption: This text will appear on every page at the center of the footer. submit_button: Elŝuti notifications: + disabled: Participants will not receive email updates informing them of changes to the date, time or list of participants. + enabled: All participants will receive updated calendar invites informing them of changes to date, time or list of participants. sidepanel: title: Email calendar updates description: - disabled: Participants will not receive an email informing them of changes. - enabled: All participants will receive updated calendar invites via email informing them of changes. change_via_template: To change this, edit the series template. dialog: title: enable: Enable email calendar updates? disable: Disable email calendar updates? message: - enable: 'All participants will receive updated calendar invites via email every time there is a change to the meeting date, time, location or participants. Once enabled, an email will be sent out immediately to all participants. - - ' - disable: 'Participants will no longer receive updated calendar invites via email when there are changes to the meeting date, time, location or participants. If they already had an invite for this meeting, it might no longer be accurate. - - ' + enable: Once enabled, an email will be sent out immediately to all participants. + disable: If they already had an invite for this meeting, it might no longer be accurate. confirm_label: enable: Enable email updates disable: Disable email updates - banner: - participants: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Email calendar updates are disabled. Participants will not receive an email informing them when you add or remove participants. - - ' - draft_disabled: 'Participants will not receive an email informing them when you add or remove participants. - - ' - onetime: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Participants will not receive an email informing them of changes to meeting date, time or participants. - - ' - occurrence: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this occurrence. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this occurrence. - - ' - template: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this template or to individual occurrences. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this template or to individual occurrences. - - ' presentation_mode: title: Presentation Mode button_present: Present @@ -638,6 +602,7 @@ eo: label_agenda_item_duplicate_in_next_title: Duplicate in next meeting? label_agenda_item_add_notes: Add notes label_agenda_item_add_outcome: Add outcome + label_agenda_item_convert_to_work_package: Convert to work package label_agenda_item_work_package_add: Add work package label_agenda_item_work_package: Agenda item work package label_section_rename: Rename section diff --git a/modules/meeting/config/locales/crowdin/es.yml b/modules/meeting/config/locales/crowdin/es.yml index 12d0b3f6503..06960217ddf 100644 --- a/modules/meeting/config/locales/crowdin/es.yml +++ b/modules/meeting/config/locales/crowdin/es.yml @@ -374,58 +374,22 @@ es: caption: Este texto aparecerá en cada página en el centro del pie de página. submit_button: Descargar notifications: + disabled: Los participantes no recibirán notificaciones por correo electrónico sobre cambios en la fecha, la hora o la lista de participantes. + enabled: Todos los participantes recibirán invitaciones actualizadas en el calendario para informarles de cualquier cambio en la fecha, la hora o la lista de participantes. sidepanel: title: Enviar actualizaciones de calendario por correo electrónico description: - disabled: Los participantes no recibirán un correo electrónico informándoles de los cambios. - enabled: Todos los participantes recibirán por correo electrónico invitaciones de calendario actualizadas en las que se les informará de los cambios. change_via_template: Para cambiar esto, edite la plantilla de la serie. dialog: title: enable: "¿Habilitar actualizaciones de calendario por correo electrónico?" disable: "¿Deshabilitar actualizaciones de calendario por correo electrónico?" message: - enable: 'Todos los participantes recibirán invitaciones de calendario actualizadas por correo electrónico cada vez que se produzca un cambio en la fecha, hora, lugar o participantes de la reunión. Una vez habilitada, se enviará inmediatamente un correo electrónico a todos los participantes. - - ' - disable: 'Los participantes ya no recibirán invitaciones de calendario actualizadas por correo electrónico cuando se produzcan cambios en la fecha, hora, lugar o participantes de la reunión. Si ya tenían una invitación a esta reunión, es posible que ya no sea precisa. - - ' + enable: Una vez activado, se enviará inmediatamente un correo electrónico a todos los participantes. + disable: Si ya tenían una invitación para esta reunión, es posible que ya no sea válida. confirm_label: enable: Habilitar actualizaciones por correo electrónico disable: Deshabilitar actualizaciones por correo electrónico - banner: - participants: - enabled: 'Todos los participantes recibirán por correo electrónico invitaciones actualizadas del calendario cuando usted añada o elimine participantes. - - ' - disabled: 'Las actualizaciones de calendario por correo electrónico están deshabilitadas. Los participantes no recibirán un correo electrónico informándoles cuando usted añada o elimine participantes. - - ' - draft_disabled: 'Los participantes no recibirán un correo electrónico en el que se les informe de que has añadido o eliminado a alguien. - - ' - onetime: - enabled: 'Todos los participantes recibirán por correo electrónico invitaciones actualizadas del calendario cuando usted añada o elimine participantes. - - ' - disabled: 'Los participantes no recibirán un correo electrónico informándoles de los cambios en la fecha, la hora o los participantes de la reunión. - - ' - occurrence: - enabled: 'Las actualizaciones de calendario por correo electrónico están habilitadas para la serie de reuniones. Todos los participantes recibirán invitaciones de calendario actualizadas en las que se les informará de los cambios en esta reunión. - - ' - disabled: 'Las actualizaciones de calendario por correo electrónico están deshabilitadas para la serie de reuniones. Los participantes no recibirán un correo electrónico informándoles de los cambios en esta reunión. - - ' - template: - enabled: 'Las actualizaciones de calendario por correo electrónico están habilitadas para la serie de reuniones. Todos los participantes recibirán invitaciones de calendario actualizadas en las que se les informará de los cambios en esta plantilla o en reuniones individuales. - - ' - disabled: 'Las actualizaciones de calendario por correo electrónico están deshabilitadas para la serie de reuniones. Los participantes no recibirán un correo electrónico informándoles de los cambios en esta plantilla o en reuniones individuales. - - ' presentation_mode: title: Modo de presentación button_present: Presente @@ -638,6 +602,7 @@ es: label_agenda_item_duplicate_in_next_title: "¿Duplicar en la próxima reunión?" label_agenda_item_add_notes: Añadir notas label_agenda_item_add_outcome: Añadir resultado + label_agenda_item_convert_to_work_package: Convertir a paquete de trabajo label_agenda_item_work_package_add: Añadir paquete de trabajo label_agenda_item_work_package: Paquete de trabajo del punto del orden del día label_section_rename: Renombrar sección diff --git a/modules/meeting/config/locales/crowdin/et.yml b/modules/meeting/config/locales/crowdin/et.yml index 4e3702c265f..4c86d150eeb 100644 --- a/modules/meeting/config/locales/crowdin/et.yml +++ b/modules/meeting/config/locales/crowdin/et.yml @@ -374,58 +374,22 @@ et: caption: This text will appear on every page at the center of the footer. submit_button: Laadi alla notifications: + disabled: Participants will not receive email updates informing them of changes to the date, time or list of participants. + enabled: All participants will receive updated calendar invites informing them of changes to date, time or list of participants. sidepanel: title: Email calendar updates description: - disabled: Participants will not receive an email informing them of changes. - enabled: All participants will receive updated calendar invites via email informing them of changes. change_via_template: To change this, edit the series template. dialog: title: enable: Enable email calendar updates? disable: Disable email calendar updates? message: - enable: 'All participants will receive updated calendar invites via email every time there is a change to the meeting date, time, location or participants. Once enabled, an email will be sent out immediately to all participants. - - ' - disable: 'Participants will no longer receive updated calendar invites via email when there are changes to the meeting date, time, location or participants. If they already had an invite for this meeting, it might no longer be accurate. - - ' + enable: Once enabled, an email will be sent out immediately to all participants. + disable: If they already had an invite for this meeting, it might no longer be accurate. confirm_label: enable: Enable email updates disable: Disable email updates - banner: - participants: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Email calendar updates are disabled. Participants will not receive an email informing them when you add or remove participants. - - ' - draft_disabled: 'Participants will not receive an email informing them when you add or remove participants. - - ' - onetime: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Participants will not receive an email informing them of changes to meeting date, time or participants. - - ' - occurrence: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this occurrence. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this occurrence. - - ' - template: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this template or to individual occurrences. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this template or to individual occurrences. - - ' presentation_mode: title: Presentation Mode button_present: Present @@ -638,6 +602,7 @@ et: label_agenda_item_duplicate_in_next_title: Duplicate in next meeting? label_agenda_item_add_notes: Märkusi lisada label_agenda_item_add_outcome: Lisa tulemus + label_agenda_item_convert_to_work_package: Convert to work package label_agenda_item_work_package_add: Add work package label_agenda_item_work_package: Agenda item work package label_section_rename: Rename section diff --git a/modules/meeting/config/locales/crowdin/eu.yml b/modules/meeting/config/locales/crowdin/eu.yml index 35cb4112363..765cb7c20f1 100644 --- a/modules/meeting/config/locales/crowdin/eu.yml +++ b/modules/meeting/config/locales/crowdin/eu.yml @@ -374,58 +374,22 @@ eu: caption: This text will appear on every page at the center of the footer. submit_button: Download notifications: + disabled: Participants will not receive email updates informing them of changes to the date, time or list of participants. + enabled: All participants will receive updated calendar invites informing them of changes to date, time or list of participants. sidepanel: title: Email calendar updates description: - disabled: Participants will not receive an email informing them of changes. - enabled: All participants will receive updated calendar invites via email informing them of changes. change_via_template: To change this, edit the series template. dialog: title: enable: Enable email calendar updates? disable: Disable email calendar updates? message: - enable: 'All participants will receive updated calendar invites via email every time there is a change to the meeting date, time, location or participants. Once enabled, an email will be sent out immediately to all participants. - - ' - disable: 'Participants will no longer receive updated calendar invites via email when there are changes to the meeting date, time, location or participants. If they already had an invite for this meeting, it might no longer be accurate. - - ' + enable: Once enabled, an email will be sent out immediately to all participants. + disable: If they already had an invite for this meeting, it might no longer be accurate. confirm_label: enable: Enable email updates disable: Disable email updates - banner: - participants: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Email calendar updates are disabled. Participants will not receive an email informing them when you add or remove participants. - - ' - draft_disabled: 'Participants will not receive an email informing them when you add or remove participants. - - ' - onetime: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Participants will not receive an email informing them of changes to meeting date, time or participants. - - ' - occurrence: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this occurrence. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this occurrence. - - ' - template: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this template or to individual occurrences. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this template or to individual occurrences. - - ' presentation_mode: title: Presentation Mode button_present: Present @@ -638,6 +602,7 @@ eu: label_agenda_item_duplicate_in_next_title: Duplicate in next meeting? label_agenda_item_add_notes: Add notes label_agenda_item_add_outcome: Add outcome + label_agenda_item_convert_to_work_package: Convert to work package label_agenda_item_work_package_add: Add work package label_agenda_item_work_package: Agenda item work package label_section_rename: Rename section diff --git a/modules/meeting/config/locales/crowdin/fa.yml b/modules/meeting/config/locales/crowdin/fa.yml index 0ae237a37dd..22ebe2a5865 100644 --- a/modules/meeting/config/locales/crowdin/fa.yml +++ b/modules/meeting/config/locales/crowdin/fa.yml @@ -374,58 +374,22 @@ fa: caption: This text will appear on every page at the center of the footer. submit_button: Download notifications: + disabled: Participants will not receive email updates informing them of changes to the date, time or list of participants. + enabled: All participants will receive updated calendar invites informing them of changes to date, time or list of participants. sidepanel: title: Email calendar updates description: - disabled: Participants will not receive an email informing them of changes. - enabled: All participants will receive updated calendar invites via email informing them of changes. change_via_template: To change this, edit the series template. dialog: title: enable: Enable email calendar updates? disable: Disable email calendar updates? message: - enable: 'All participants will receive updated calendar invites via email every time there is a change to the meeting date, time, location or participants. Once enabled, an email will be sent out immediately to all participants. - - ' - disable: 'Participants will no longer receive updated calendar invites via email when there are changes to the meeting date, time, location or participants. If they already had an invite for this meeting, it might no longer be accurate. - - ' + enable: Once enabled, an email will be sent out immediately to all participants. + disable: If they already had an invite for this meeting, it might no longer be accurate. confirm_label: enable: Enable email updates disable: Disable email updates - banner: - participants: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Email calendar updates are disabled. Participants will not receive an email informing them when you add or remove participants. - - ' - draft_disabled: 'Participants will not receive an email informing them when you add or remove participants. - - ' - onetime: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Participants will not receive an email informing them of changes to meeting date, time or participants. - - ' - occurrence: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this occurrence. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this occurrence. - - ' - template: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this template or to individual occurrences. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this template or to individual occurrences. - - ' presentation_mode: title: Presentation Mode button_present: Present @@ -638,6 +602,7 @@ fa: label_agenda_item_duplicate_in_next_title: Duplicate in next meeting? label_agenda_item_add_notes: Add notes label_agenda_item_add_outcome: Add outcome + label_agenda_item_convert_to_work_package: Convert to work package label_agenda_item_work_package_add: Add work package label_agenda_item_work_package: Agenda item work package label_section_rename: Rename section diff --git a/modules/meeting/config/locales/crowdin/fi.yml b/modules/meeting/config/locales/crowdin/fi.yml index f9f1a27365a..cfbd94d4ce9 100644 --- a/modules/meeting/config/locales/crowdin/fi.yml +++ b/modules/meeting/config/locales/crowdin/fi.yml @@ -374,58 +374,22 @@ fi: caption: This text will appear on every page at the center of the footer. submit_button: Lataa notifications: + disabled: Participants will not receive email updates informing them of changes to the date, time or list of participants. + enabled: All participants will receive updated calendar invites informing them of changes to date, time or list of participants. sidepanel: title: Email calendar updates description: - disabled: Participants will not receive an email informing them of changes. - enabled: All participants will receive updated calendar invites via email informing them of changes. change_via_template: To change this, edit the series template. dialog: title: enable: Enable email calendar updates? disable: Disable email calendar updates? message: - enable: 'All participants will receive updated calendar invites via email every time there is a change to the meeting date, time, location or participants. Once enabled, an email will be sent out immediately to all participants. - - ' - disable: 'Participants will no longer receive updated calendar invites via email when there are changes to the meeting date, time, location or participants. If they already had an invite for this meeting, it might no longer be accurate. - - ' + enable: Once enabled, an email will be sent out immediately to all participants. + disable: If they already had an invite for this meeting, it might no longer be accurate. confirm_label: enable: Enable email updates disable: Disable email updates - banner: - participants: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Email calendar updates are disabled. Participants will not receive an email informing them when you add or remove participants. - - ' - draft_disabled: 'Participants will not receive an email informing them when you add or remove participants. - - ' - onetime: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Participants will not receive an email informing them of changes to meeting date, time or participants. - - ' - occurrence: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this occurrence. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this occurrence. - - ' - template: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this template or to individual occurrences. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this template or to individual occurrences. - - ' presentation_mode: title: Presentation Mode button_present: Present @@ -638,6 +602,7 @@ fi: label_agenda_item_duplicate_in_next_title: Duplicate in next meeting? label_agenda_item_add_notes: Lisää kommentteja label_agenda_item_add_outcome: Add outcome + label_agenda_item_convert_to_work_package: Convert to work package label_agenda_item_work_package_add: Add work package label_agenda_item_work_package: Agenda item work package label_section_rename: Rename section diff --git a/modules/meeting/config/locales/crowdin/fil.yml b/modules/meeting/config/locales/crowdin/fil.yml index a45bcf4eb84..e16017014b1 100644 --- a/modules/meeting/config/locales/crowdin/fil.yml +++ b/modules/meeting/config/locales/crowdin/fil.yml @@ -374,58 +374,22 @@ fil: caption: This text will appear on every page at the center of the footer. submit_button: I-download notifications: + disabled: Participants will not receive email updates informing them of changes to the date, time or list of participants. + enabled: All participants will receive updated calendar invites informing them of changes to date, time or list of participants. sidepanel: title: Email calendar updates description: - disabled: Participants will not receive an email informing them of changes. - enabled: All participants will receive updated calendar invites via email informing them of changes. change_via_template: To change this, edit the series template. dialog: title: enable: Enable email calendar updates? disable: Disable email calendar updates? message: - enable: 'All participants will receive updated calendar invites via email every time there is a change to the meeting date, time, location or participants. Once enabled, an email will be sent out immediately to all participants. - - ' - disable: 'Participants will no longer receive updated calendar invites via email when there are changes to the meeting date, time, location or participants. If they already had an invite for this meeting, it might no longer be accurate. - - ' + enable: Once enabled, an email will be sent out immediately to all participants. + disable: If they already had an invite for this meeting, it might no longer be accurate. confirm_label: enable: Enable email updates disable: Disable email updates - banner: - participants: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Email calendar updates are disabled. Participants will not receive an email informing them when you add or remove participants. - - ' - draft_disabled: 'Participants will not receive an email informing them when you add or remove participants. - - ' - onetime: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Participants will not receive an email informing them of changes to meeting date, time or participants. - - ' - occurrence: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this occurrence. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this occurrence. - - ' - template: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this template or to individual occurrences. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this template or to individual occurrences. - - ' presentation_mode: title: Presentation Mode button_present: Present @@ -638,6 +602,7 @@ fil: label_agenda_item_duplicate_in_next_title: Duplicate in next meeting? label_agenda_item_add_notes: Magdagdag ng mga talaan label_agenda_item_add_outcome: Add outcome + label_agenda_item_convert_to_work_package: Convert to work package label_agenda_item_work_package_add: Add work package label_agenda_item_work_package: Agenda item work package label_section_rename: Rename section diff --git a/modules/meeting/config/locales/crowdin/fr.yml b/modules/meeting/config/locales/crowdin/fr.yml index 16d64575106..ca53d350c2f 100644 --- a/modules/meeting/config/locales/crowdin/fr.yml +++ b/modules/meeting/config/locales/crowdin/fr.yml @@ -374,58 +374,22 @@ fr: caption: Ce texte apparaîtra sur chaque page au centre du pied de page. submit_button: Télécharger notifications: + disabled: Les participants ne recevront pas de mises à jour par courriel les informant des modifications apportées à la date, à l'heure ou à la liste des participants. + enabled: Tous les participants recevront des invitations de calendrier mises à jour les informant des modifications apportées à la date, à l'heure ou à la liste des participants. sidepanel: title: Mises à jour du calendrier par e-mail description: - disabled: Les participants ne recevront aucun e-mail pour les informer des modifications. - enabled: Tous les participants recevront des invitations de calendrier mises à jour par e-mail les informant des modifications. change_via_template: Pour modifier cela, éditez le modèle de la série. dialog: title: enable: Activer les mises à jour du calendrier par e-mail ? disable: Désactiver les mises à jour du calendrier par e-mail ? message: - enable: 'Tous les participants recevront des invitations actualisées par e-mail chaque fois que la date, l''heure, le lieu ou les participants de la réunion seront modifiés. Une fois l''option activée, un e-mail sera immédiatement envoyé à tous les participants. - - ' - disable: 'Les participants ne recevront plus d''invitations actualisées par e-mail lorsque la date, l''heure, le lieu ou les participants de la réunion seront modifiés. S''ils ont déjà reçu une invitation pour cette réunion, il se peut qu''elle ne soit plus exacte. - - ' + enable: Une fois cette option activée, un e-mail sera immédiatement envoyé à tous les participants. + disable: S'ils avaient déjà reçu une invitation pour cette réunion, celle-ci pourrait ne plus être exacte. confirm_label: enable: Activer les mises à jour par e-mail disable: Désactiver les mises à jour par e-mail - banner: - participants: - enabled: 'Tous les participants recevront des invitations de calendrier mises à jour par e-mail lorsque vous ajouterez ou supprimerez des participants. - - ' - disabled: 'Les mises à jour du calendrier par e-mail sont désactivées. Les participants ne recevront pas d''e-mail les informant de l''ajout ou de la suppression de participants. - - ' - draft_disabled: 'Les participants ne recevront pas d''e-mail les informant de l''ajout ou de la suppression de participants. - - ' - onetime: - enabled: 'Tous les participants recevront des invitations de calendrier mises à jour par e-mail lorsque vous ajouterez ou supprimerez des participants. - - ' - disabled: 'Les participants ne recevront pas d''e-mail les informant des changements de date, d''heure ou de participants. - - ' - occurrence: - enabled: 'Les mises à jour du calendrier par e-mail sont activées pour la série de réunions. Tous les participants recevront des invitations de calendrier mises à jour les informant des modifications que vous avez apportées à cet événement. - - ' - disabled: 'Les mises à jour du calendrier par e-mail sont désactivées pour la série de réunions. Les participants ne recevront pas d''e-mail les informant des modifications apportées à cet événement. - - ' - template: - enabled: 'Les mises à jour du calendrier par e-mail sont activées pour la série de réunions. Tous les participants recevront des invitations de calendrier mises à jour les informant des changements que vous avez apportés à ce modèle ou à des occurrences individuelles. - - ' - disabled: 'Les mises à jour du calendrier par e-mail sont désactivées pour la série de réunions. Les participants ne recevront pas d''e-mail les informant des modifications que vous avez apportées à ce modèle ou aux événements individuels. - - ' presentation_mode: title: Mode de Présentation button_present: Présenter @@ -638,6 +602,7 @@ fr: label_agenda_item_duplicate_in_next_title: Duplication lors de la prochaine réunion ? label_agenda_item_add_notes: Ajouter des notes label_agenda_item_add_outcome: Ajouter un résultat + label_agenda_item_convert_to_work_package: Convertir en lot de travaux label_agenda_item_work_package_add: Ajouter lot de travaux label_agenda_item_work_package: Lot de travaux du point de l'ordre du jour label_section_rename: Renommer la section diff --git a/modules/meeting/config/locales/crowdin/he.yml b/modules/meeting/config/locales/crowdin/he.yml index 6b5301f715a..b61749f9dcf 100644 --- a/modules/meeting/config/locales/crowdin/he.yml +++ b/modules/meeting/config/locales/crowdin/he.yml @@ -384,58 +384,22 @@ he: caption: This text will appear on every page at the center of the footer. submit_button: הורד notifications: + disabled: Participants will not receive email updates informing them of changes to the date, time or list of participants. + enabled: All participants will receive updated calendar invites informing them of changes to date, time or list of participants. sidepanel: title: Email calendar updates description: - disabled: Participants will not receive an email informing them of changes. - enabled: All participants will receive updated calendar invites via email informing them of changes. change_via_template: To change this, edit the series template. dialog: title: enable: Enable email calendar updates? disable: Disable email calendar updates? message: - enable: 'All participants will receive updated calendar invites via email every time there is a change to the meeting date, time, location or participants. Once enabled, an email will be sent out immediately to all participants. - - ' - disable: 'Participants will no longer receive updated calendar invites via email when there are changes to the meeting date, time, location or participants. If they already had an invite for this meeting, it might no longer be accurate. - - ' + enable: Once enabled, an email will be sent out immediately to all participants. + disable: If they already had an invite for this meeting, it might no longer be accurate. confirm_label: enable: Enable email updates disable: Disable email updates - banner: - participants: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Email calendar updates are disabled. Participants will not receive an email informing them when you add or remove participants. - - ' - draft_disabled: 'Participants will not receive an email informing them when you add or remove participants. - - ' - onetime: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Participants will not receive an email informing them of changes to meeting date, time or participants. - - ' - occurrence: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this occurrence. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this occurrence. - - ' - template: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this template or to individual occurrences. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this template or to individual occurrences. - - ' presentation_mode: title: Presentation Mode button_present: Present @@ -654,6 +618,7 @@ he: label_agenda_item_duplicate_in_next_title: Duplicate in next meeting? label_agenda_item_add_notes: הוסף הערות label_agenda_item_add_outcome: Add outcome + label_agenda_item_convert_to_work_package: Convert to work package label_agenda_item_work_package_add: Add work package label_agenda_item_work_package: Agenda item work package label_section_rename: Rename section diff --git a/modules/meeting/config/locales/crowdin/hi.yml b/modules/meeting/config/locales/crowdin/hi.yml index 044d739e4ea..fe7813be332 100644 --- a/modules/meeting/config/locales/crowdin/hi.yml +++ b/modules/meeting/config/locales/crowdin/hi.yml @@ -374,58 +374,22 @@ hi: caption: This text will appear on every page at the center of the footer. submit_button: डाउनलोड notifications: + disabled: Participants will not receive email updates informing them of changes to the date, time or list of participants. + enabled: All participants will receive updated calendar invites informing them of changes to date, time or list of participants. sidepanel: title: Email calendar updates description: - disabled: Participants will not receive an email informing them of changes. - enabled: All participants will receive updated calendar invites via email informing them of changes. change_via_template: To change this, edit the series template. dialog: title: enable: Enable email calendar updates? disable: Disable email calendar updates? message: - enable: 'All participants will receive updated calendar invites via email every time there is a change to the meeting date, time, location or participants. Once enabled, an email will be sent out immediately to all participants. - - ' - disable: 'Participants will no longer receive updated calendar invites via email when there are changes to the meeting date, time, location or participants. If they already had an invite for this meeting, it might no longer be accurate. - - ' + enable: Once enabled, an email will be sent out immediately to all participants. + disable: If they already had an invite for this meeting, it might no longer be accurate. confirm_label: enable: Enable email updates disable: Disable email updates - banner: - participants: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Email calendar updates are disabled. Participants will not receive an email informing them when you add or remove participants. - - ' - draft_disabled: 'Participants will not receive an email informing them when you add or remove participants. - - ' - onetime: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Participants will not receive an email informing them of changes to meeting date, time or participants. - - ' - occurrence: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this occurrence. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this occurrence. - - ' - template: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this template or to individual occurrences. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this template or to individual occurrences. - - ' presentation_mode: title: Presentation Mode button_present: Present @@ -638,6 +602,7 @@ hi: label_agenda_item_duplicate_in_next_title: Duplicate in next meeting? label_agenda_item_add_notes: Add notes label_agenda_item_add_outcome: Add outcome + label_agenda_item_convert_to_work_package: Convert to work package label_agenda_item_work_package_add: Add work package label_agenda_item_work_package: Agenda item work package label_section_rename: Rename section diff --git a/modules/meeting/config/locales/crowdin/hr.yml b/modules/meeting/config/locales/crowdin/hr.yml index 0576920f43c..db1e8d795c8 100644 --- a/modules/meeting/config/locales/crowdin/hr.yml +++ b/modules/meeting/config/locales/crowdin/hr.yml @@ -379,58 +379,22 @@ hr: caption: This text will appear on every page at the center of the footer. submit_button: Preuzmi notifications: + disabled: Participants will not receive email updates informing them of changes to the date, time or list of participants. + enabled: All participants will receive updated calendar invites informing them of changes to date, time or list of participants. sidepanel: title: Email calendar updates description: - disabled: Participants will not receive an email informing them of changes. - enabled: All participants will receive updated calendar invites via email informing them of changes. change_via_template: To change this, edit the series template. dialog: title: enable: Enable email calendar updates? disable: Disable email calendar updates? message: - enable: 'All participants will receive updated calendar invites via email every time there is a change to the meeting date, time, location or participants. Once enabled, an email will be sent out immediately to all participants. - - ' - disable: 'Participants will no longer receive updated calendar invites via email when there are changes to the meeting date, time, location or participants. If they already had an invite for this meeting, it might no longer be accurate. - - ' + enable: Once enabled, an email will be sent out immediately to all participants. + disable: If they already had an invite for this meeting, it might no longer be accurate. confirm_label: enable: Enable email updates disable: Disable email updates - banner: - participants: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Email calendar updates are disabled. Participants will not receive an email informing them when you add or remove participants. - - ' - draft_disabled: 'Participants will not receive an email informing them when you add or remove participants. - - ' - onetime: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Participants will not receive an email informing them of changes to meeting date, time or participants. - - ' - occurrence: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this occurrence. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this occurrence. - - ' - template: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this template or to individual occurrences. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this template or to individual occurrences. - - ' presentation_mode: title: Presentation Mode button_present: Present @@ -646,6 +610,7 @@ hr: label_agenda_item_duplicate_in_next_title: Duplicate in next meeting? label_agenda_item_add_notes: Dodaj bilješke label_agenda_item_add_outcome: Add outcome + label_agenda_item_convert_to_work_package: Convert to work package label_agenda_item_work_package_add: Add work package label_agenda_item_work_package: Agenda item work package label_section_rename: Rename section diff --git a/modules/meeting/config/locales/crowdin/hu.yml b/modules/meeting/config/locales/crowdin/hu.yml index fbf6e417cc8..fd1e16a948c 100644 --- a/modules/meeting/config/locales/crowdin/hu.yml +++ b/modules/meeting/config/locales/crowdin/hu.yml @@ -374,58 +374,22 @@ hu: caption: Ez a szöveg minden oldalon, a fejléc közepén fog megjelenni. submit_button: Letöltés notifications: + disabled: Participants will not receive email updates informing them of changes to the date, time or list of participants. + enabled: All participants will receive updated calendar invites informing them of changes to date, time or list of participants. sidepanel: title: E-mail naptárfrissítések description: - disabled: A résztvevők nem fognak e-mailt kapni a módosításokról. - enabled: Minden résztvevő e-mail meghívót fog kapni az új módosításokkal. change_via_template: Az elem szerkesztéséhez a sorozat sablont kell szerkeszteni. dialog: title: enable: E-mail naptárfrissítések engedélyezése? disable: E-mail naptárfrissítések letiltása? message: - enable: 'All participants will receive updated calendar invites via email every time there is a change to the meeting date, time, location or participants. Once enabled, an email will be sent out immediately to all participants. - - ' - disable: 'A résztvevők nem fognak új naptármeghívót kapni e-mailben az alábbiak módosításakor: megbeszélés dátuma, ideje, helye vagy résztvevői. Amennyiben már kaptak meghívót, az pontatlanná válaht. - - ' + enable: Once enabled, an email will be sent out immediately to all participants. + disable: If they already had an invite for this meeting, it might no longer be accurate. confirm_label: enable: E-mail frissítések engedélyezése disable: E-mail frissítések tiltása - banner: - participants: - enabled: 'Minden résztvevő e-mail meghívót fog kapni az új módosításokkal amikor a résztvevőket módosították. - - ' - disabled: 'E-mail naptárfrissítések letiltva. A résztvevők nemkapnak e-mailt a résztvevők módisításáról. - - ' - draft_disabled: 'Participants will not receive an email informing them when you add or remove participants. - - ' - onetime: - enabled: 'A résztvevők hozzáadásakor vagy eltávolításakor minden résztvevő frissített naptármeghívókat kap e-mailben. - - ' - disabled: 'Participants will not receive an email informing them of changes to meeting date, time or participants. - - ' - occurrence: - enabled: 'E-mail naptárfrissítések engedélyezve az ismétlődő megbeszélésnek. Minden résztvevő frissített naptármeghívót kap, amelyben tájékoztatják őket az eseményre vonatkozó változtatásokról. - - ' - disabled: 'E-mail naptárfrissítések le vannak tiltva az ismétlődő megbeszéléshez. A résztvevők nem fognak frissített naptármeghívót kapni, amelyben tájékoztatják őket az eseményre vonatkozó változtatásokról. - - ' - template: - enabled: 'E-mail naptárfrissítések engedélyezve az ismétlődő megbeszélésnek. Minden résztvevő frissített naptármeghívót kap, amelyben tájékoztatják őket a sablon, vagy egyedi esemény változásairól. - - ' - disabled: 'E-mail naptárfrissítések le vannak tiltva az ismétlődő megbeszéléshez. A résztvevők nem fognak e-mail értesítőt kapni a sablon, vagy egyedi esemény változásairól. - - ' presentation_mode: title: Presentation Mode button_present: Megbeszélés indítása @@ -638,6 +602,7 @@ hu: label_agenda_item_duplicate_in_next_title: Duplicate in next meeting? label_agenda_item_add_notes: Megjegyzések hozzáadása label_agenda_item_add_outcome: Add outcome + label_agenda_item_convert_to_work_package: Convert to work package label_agenda_item_work_package_add: Add work package label_agenda_item_work_package: Napirendi ponthoz kapcsolódó feladatcsoport label_section_rename: Rename section diff --git a/modules/meeting/config/locales/crowdin/hy.yml b/modules/meeting/config/locales/crowdin/hy.yml index 9e64f6f97ff..8715918758f 100644 --- a/modules/meeting/config/locales/crowdin/hy.yml +++ b/modules/meeting/config/locales/crowdin/hy.yml @@ -374,58 +374,22 @@ hy: caption: This text will appear on every page at the center of the footer. submit_button: Download notifications: + disabled: Participants will not receive email updates informing them of changes to the date, time or list of participants. + enabled: All participants will receive updated calendar invites informing them of changes to date, time or list of participants. sidepanel: title: Email calendar updates description: - disabled: Participants will not receive an email informing them of changes. - enabled: All participants will receive updated calendar invites via email informing them of changes. change_via_template: To change this, edit the series template. dialog: title: enable: Enable email calendar updates? disable: Disable email calendar updates? message: - enable: 'All participants will receive updated calendar invites via email every time there is a change to the meeting date, time, location or participants. Once enabled, an email will be sent out immediately to all participants. - - ' - disable: 'Participants will no longer receive updated calendar invites via email when there are changes to the meeting date, time, location or participants. If they already had an invite for this meeting, it might no longer be accurate. - - ' + enable: Once enabled, an email will be sent out immediately to all participants. + disable: If they already had an invite for this meeting, it might no longer be accurate. confirm_label: enable: Enable email updates disable: Disable email updates - banner: - participants: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Email calendar updates are disabled. Participants will not receive an email informing them when you add or remove participants. - - ' - draft_disabled: 'Participants will not receive an email informing them when you add or remove participants. - - ' - onetime: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Participants will not receive an email informing them of changes to meeting date, time or participants. - - ' - occurrence: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this occurrence. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this occurrence. - - ' - template: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this template or to individual occurrences. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this template or to individual occurrences. - - ' presentation_mode: title: Presentation Mode button_present: Present @@ -638,6 +602,7 @@ hy: label_agenda_item_duplicate_in_next_title: Duplicate in next meeting? label_agenda_item_add_notes: Add notes label_agenda_item_add_outcome: Add outcome + label_agenda_item_convert_to_work_package: Convert to work package label_agenda_item_work_package_add: Add work package label_agenda_item_work_package: Agenda item work package label_section_rename: Rename section diff --git a/modules/meeting/config/locales/crowdin/id.yml b/modules/meeting/config/locales/crowdin/id.yml index e527fdeda13..1fa5d80c7ef 100644 --- a/modules/meeting/config/locales/crowdin/id.yml +++ b/modules/meeting/config/locales/crowdin/id.yml @@ -369,58 +369,22 @@ id: caption: Teks ini akan muncul di setiap halaman di tengah footer. submit_button: Download notifications: + disabled: Participants will not receive email updates informing them of changes to the date, time or list of participants. + enabled: All participants will receive updated calendar invites informing them of changes to date, time or list of participants. sidepanel: title: Pembaruan kalender email description: - disabled: Peserta tidak akan menerima email yang memberitahukan mereka tentang perubahan. - enabled: Seluruh peserta akan menerima undangan kalender yang diperbarui melalui email yang memberitahukan mereka tentang perubahan. change_via_template: Untuk mengubahnya, sunting templat serinya. dialog: title: enable: Aktifkan pembaruan kalender melalui email? disable: Nonaktifkan pembaruan kalender melalui email? message: - enable: 'All participants will receive updated calendar invites via email every time there is a change to the meeting date, time, location or participants. Once enabled, an email will be sent out immediately to all participants. - - ' - disable: 'Peserta tidak lagi akan menerima undangan kalender yang diperbarui melalui email ketika ada perubahan pada tanggal, waktu, lokasi, atau peserta rapat. Jika mereka sudah menerima undangan untuk rapat ini, undangan tersebut mungkin tidak lagi akurat. - - ' + enable: Once enabled, an email will be sent out immediately to all participants. + disable: If they already had an invite for this meeting, it might no longer be accurate. confirm_label: enable: Aktifkan pembaruan email disable: Nonaktifkan pembaruan email - banner: - participants: - enabled: 'Seluruh peserta akan menerima undangan kalender yang diperbarui melalui email saat Anda menambahkan atau menghapus peserta. - - ' - disabled: 'Pembaruan kalender melalui email telah dinonaktifkan. Peserta tidak akan menerima email pemberitahuan ketika Anda menambahkan atau menghapus peserta. - - ' - draft_disabled: 'Participants will not receive an email informing them when you add or remove participants. - - ' - onetime: - enabled: 'Seluruh peserta akan menerima undangan kalender yang diperbarui melalui email saat Anda menambahkan atau menghapus peserta. - - ' - disabled: 'Peserta tidak akan menerima email yang memberitahukan perubahan tanggal, waktu, atau peserta rapat. - - ' - occurrence: - enabled: 'Pembaruan kalender melalui email telah diaktifkan untuk rangkaian pertemuan ini. Semua peserta akan menerima undangan kalender yang diperbarui yang memberitahukan mereka tentang perubahan yang Anda lakukan pada pertemuan ini. - - ' - disabled: 'Pembaruan kalender melalui email dinonaktifkan untuk seri pertemuan ini. Peserta tidak akan menerima email yang memberitahukan mereka tentang perubahan yang Anda lakukan pada pertemuan ini. - - ' - template: - enabled: 'Pembaruan kalender melalui email telah diaktifkan untuk rangkaian pertemuan ini. Semua peserta akan menerima undangan kalender yang diperbarui yang memberitahukan mereka tentang perubahan yang Anda lakukan pada templat ini atau pada acara individu. - - ' - disabled: 'Pembaruan kalender melalui email dinonaktifkan untuk seri pertemuan ini. Peserta tidak akan menerima email yang memberitahukan mereka tentang perubahan yang Anda lakukan pada templat ini atau pada kejadian individu. - - ' presentation_mode: title: Mode Presentasi button_present: Presentasikan @@ -630,6 +594,7 @@ id: label_agenda_item_duplicate_in_next_title: Duplicate in next meeting? label_agenda_item_add_notes: Tambahkan catatan label_agenda_item_add_outcome: Tambahkan hasil + label_agenda_item_convert_to_work_package: Convert to work package label_agenda_item_work_package_add: Tambahkan paket kerja label_agenda_item_work_package: Paket kerja item agenda label_section_rename: Ganti nama bagian diff --git a/modules/meeting/config/locales/crowdin/it.yml b/modules/meeting/config/locales/crowdin/it.yml index fbf324c5cfd..34862cda05b 100644 --- a/modules/meeting/config/locales/crowdin/it.yml +++ b/modules/meeting/config/locales/crowdin/it.yml @@ -374,58 +374,22 @@ it: caption: Questo testo apparirà in ogni pagina al centro del piè di pagina. submit_button: Scarica notifications: + disabled: I partecipanti non riceveranno aggiornamenti via email sulle modifiche a data, ora o elenco dei partecipanti. + enabled: Tutti i partecipanti riceveranno inviti del calendario aggiornati che li informeranno delle modifiche a data, ora o elenco dei partecipanti. sidepanel: title: Aggiornamenti del calendario via email description: - disabled: I partecipanti non riceveranno un'email che li informerà delle modifiche. - enabled: Tutti i partecipanti riceveranno via email inviti aggiornati al calendario per informarli delle modifiche. change_via_template: Per cambiare l'impostazione, modifica il modello della serie. dialog: title: enable: Abilitare gli aggiornamenti del calendario via email? disable: Disabilitare gli aggiornamenti del calendario via email? message: - enable: 'Tutti i partecipanti riceveranno inviti aggiornati tramite email ogni volta che si verificherà una modifica alla data, all''ora, al luogo o ai partecipanti della riunione. Una volta attivata, un''email verrà inviata immediatamente a tutti i partecipanti. - - ' - disable: 'I partecipanti non riceveranno più inviti aggiornati al calendario via email in caso di modifiche alla data, all''ora, al luogo o ai partecipanti della riunione. Se avevano già un invito per questa riunione, potrebbe non essere più corretto. - - ' + enable: Una volta attivata, verrà immediatamente inviata un'email a tutti i partecipanti. + disable: Se avevano già ricevuto un invito a questa riunione, potrebbe non essere più aggiornato. confirm_label: enable: Abilita gli aggiornamenti via email disable: Disabilita gli aggiornamenti via email - banner: - participants: - enabled: 'Tutti i partecipanti riceveranno via e-mail inviti di calendario aggiornati quando aggiungi o rimuovi partecipanti. - - ' - disabled: 'Gli aggiornamenti del calendario via e-mail sono disattivati. I partecipanti non riceveranno un''e-mail quando aggiungi o rimuovi partecipanti. - - ' - draft_disabled: 'I partecipanti non riceveranno un''e-mail quando aggiungi o rimuovi partecipanti. - - ' - onetime: - enabled: 'Tutti i partecipanti riceveranno via e-mail inviti di calendario aggiornati quando aggiungi o rimuovi partecipanti. - - ' - disabled: 'I partecipanti non riceveranno un''email che li informa delle modifiche alla data, all''orario o ai partecipanti della riunione. - - ' - occurrence: - enabled: 'Gli aggiornamenti del calendario via email sono abilitati per la serie di riunioni. Tutti i partecipanti riceveranno inviti aggiornati al calendario, che li informeranno delle modifiche apportate a questo evento. - - ' - disabled: 'Gli aggiornamenti del calendario via email sono disabilitati per la serie di riunioni. I partecipanti non riceveranno un''email che li informerà delle modifiche apportate a questo evento. - - ' - template: - enabled: 'Gli aggiornamenti del calendario via e-mail sono abilitati per la serie di riunioni. Tutti i partecipanti riceveranno inviti al calendario aggiornati che li informeranno delle modifiche apportate a questo modello o ai singoli eventi. - - ' - disabled: 'Gli aggiornamenti del calendario via email sono disabilitati per la serie di riunioni. I partecipanti non riceveranno un''email che li informerà delle modifiche apportate a questo modello o ai singoli eventi. - - ' presentation_mode: title: Modalità Presentazione button_present: Presenta @@ -638,6 +602,7 @@ it: label_agenda_item_duplicate_in_next_title: Duplicare nella prossima riunione? label_agenda_item_add_notes: Aggiungi nota label_agenda_item_add_outcome: Aggiungi risultato + label_agenda_item_convert_to_work_package: Converti in macro-attività label_agenda_item_work_package_add: Aggiungi macro-attività label_agenda_item_work_package: Macro-attività nei punti all'ordine del giorno label_section_rename: Rinomina sezione diff --git a/modules/meeting/config/locales/crowdin/ja.yml b/modules/meeting/config/locales/crowdin/ja.yml index 9f173d1e6cd..8d40f15027f 100644 --- a/modules/meeting/config/locales/crowdin/ja.yml +++ b/modules/meeting/config/locales/crowdin/ja.yml @@ -272,7 +272,7 @@ ja: summary_occurrence: An occurrence of '%{title}' has been cancelled by %{actor}, or you have been removed as a participant summary_series: Meeting series '%{title}' has been cancelled by %{actor}, or you have been removed as a participant summary: "'%{title}' has been cancelled by %{actor}, or you have been removed as a participant" - date_time: 予定日時 + date_time: スケジュールされた日時 ended: header_series: 'Ended: Meeting series ''%{title}''' summary_series: Meeting series '%{title}' has been ended by %{actor} @@ -312,7 +312,7 @@ ja: occurrence: title: 会議のキャンセル heading: この会議をキャンセルしますか? - confirmation_message_html: 'テンプレートにない会議情報は失われます。 続行しますか? + confirmation_message_html: 'テンプレートにない会議情報は失われます。 続けますか? ' confirm_button: 発生をキャンセル @@ -369,58 +369,22 @@ ja: caption: このテキストはフッターの中央にあるすべてのページに表示されます。 submit_button: ダウンロード notifications: + disabled: Participants will not receive email updates informing them of changes to the date, time or list of participants. + enabled: All participants will receive updated calendar invites informing them of changes to date, time or list of participants. sidepanel: title: カレンダーの更新をメールする description: - disabled: 参加者は変更を通知するメールを受信しません。 - enabled: すべての参加者は、変更を通知する電子メールで更新されたカレンダー招待を受け取ります。 change_via_template: これを変更するには、シリーズテンプレートを編集します。 dialog: title: enable: メールカレンダーの更新を有効にしますか? disable: メールカレンダーの更新を無効にしますか? message: - enable: 'すべての参加者は、会議の日時、場所、参加者に変更があるたびに、更新されたカレンダーの招待メールを受け取ります。有効にすると、参加者全員にすぐにメールが送信されます。 - - ' - disable: '会議の日付、時間、場所または参加者に変更があった場合、参加者はメールで更新されたカレンダー招待を受信できなくなります。 彼らがすでにこの会議のための招待を持っていた場合、それはもはや正確ではないかもしれません。 - - ' + enable: Once enabled, an email will be sent out immediately to all participants. + disable: If they already had an invite for this meeting, it might no longer be accurate. confirm_label: enable: メールアドレスの更新を有効にする disable: メールアドレスの更新を無効にする - banner: - participants: - enabled: '参加者を追加または削除すると、すべての参加者に最新のカレンダー招待メールが送信されます。 - - ' - disabled: '電子メールによるカレンダーの更新は無効になっています。参加者を追加または削除しても、参加者に通知メールは送信されません。 - - ' - draft_disabled: 'Participants will not receive an email informing them when you add or remove participants. - - ' - onetime: - enabled: '参加者を追加または削除すると、すべての参加者にメールで更新されたカレンダー招待状が届きます。 - - ' - disabled: '参加者は、会議の日付、時間、参加者への変更を知らせるメールを受信しません。 - - ' - occurrence: - enabled: '一連の会議のメールカレンダーの更新が有効になっています.すべての参加者は,この発生に対するあなたの変更を通知する更新されたカレンダー招待を受け取ります。 - - ' - disabled: '一連の会議のメールカレンダーの更新は無効になっています。出席者はこの出来事に対するあなたの変更を通知するメールを受信しません。 - - ' - template: - enabled: '一連の会議では,メールカレンダーの更新が有効になります. すべての参加者は、更新されたカレンダー招待状を受け取り、このテンプレートまたは個々のオカレンダーへの変更を通知します。 - - ' - disabled: '一連の会議のメールカレンダーの更新は無効になっています. 参加者は、このテンプレートまたは個々のオカレンスへの変更を通知するメールを受信しません。 - - ' presentation_mode: title: プレゼンテーションモード button_present: プレゼント @@ -562,7 +526,7 @@ ja: confirm_button: この予定をキャンセル end_series_dialog: title: 一連の会議を終了 - notice_successful_notification: 参加者全員にカレンダー更新の電子メールを送信 + notice_successful_notification: すべての出席者にカレンダーの更新をメールしました notice_meeting_template_created: Template successfully created notice_timezone_missing: タイムゾーンが設定されていない場合、%{zone} が使用されます。タイムゾーンを選択するには、ここをクリックしてください。 notice_meeting_updated: このページは他の誰かによって更新されました。変更を表示するには再読み込みしてください。 @@ -626,6 +590,7 @@ ja: label_agenda_item_duplicate_in_next_title: Duplicate in next meeting? label_agenda_item_add_notes: 注記の追加 label_agenda_item_add_outcome: 結果を追加 + label_agenda_item_convert_to_work_package: Convert to work package label_agenda_item_work_package_add: ワークパッケージの追加 label_agenda_item_work_package: 議題項目のワークパッケージ label_section_rename: セクション名を変更 @@ -647,7 +612,7 @@ ja: ' label_agenda_backlog_clear_title: 議題のバックログをクリアしますか? - text_agenda_backlog_clear_description: '現在アジェンダバックログにあるすべての項目を削除してもよろしいですか?このアクションは元に戻せません。 + text_agenda_backlog_clear_description: '議題のバックログ内のすべての項目を削除してもよろしいですか?この操作は取り消せません。 ' label_series_backlog: シリーズバックログ @@ -683,7 +648,7 @@ ja: text_meeting_closed_description: この会議は終了しています。これ以上、議題項目の追加/削除はできません。 text_meeting_in_progress_description: 議題を変更したり、各項目のアウトカムを記録したり、参加者の出席を追跡することができます。 会議が完了すると、会議をクローズとしてマークしてロックできます。 text_meeting_open_dropdown_description: 既存の結果は残りますが、ユーザーは新しい結果を追加することはできません。 - text_meeting_in_progress_dropdown_description: 会議中に必要な情報や決定事項などの成果を文書化する。 + text_meeting_in_progress_dropdown_description: 会議中に取られた情報のニーズや意思決定などの成果を記録します。 text_meeting_closed_dropdown_description: この会議は終了しました。これ以上、議題や結果を変更することはできません。 text_meeting_draft_banner: 現在下書きモードです。 会議の詳細を変更したり出席者を追加/削除したりしても,この会議はカレンダーの更新や招待状を送信しません。 text_onetime_meeting_template_banner: You are currently editing a meeting template. You can use this template to create one-time meetings with a predefined agenda. Changes will not affect already-created meetings. diff --git a/modules/meeting/config/locales/crowdin/ka.yml b/modules/meeting/config/locales/crowdin/ka.yml index 80624f54597..9be58becad2 100644 --- a/modules/meeting/config/locales/crowdin/ka.yml +++ b/modules/meeting/config/locales/crowdin/ka.yml @@ -374,58 +374,22 @@ ka: caption: This text will appear on every page at the center of the footer. submit_button: გადმოწერა notifications: + disabled: Participants will not receive email updates informing them of changes to the date, time or list of participants. + enabled: All participants will receive updated calendar invites informing them of changes to date, time or list of participants. sidepanel: title: Email calendar updates description: - disabled: Participants will not receive an email informing them of changes. - enabled: All participants will receive updated calendar invites via email informing them of changes. change_via_template: To change this, edit the series template. dialog: title: enable: Enable email calendar updates? disable: Disable email calendar updates? message: - enable: 'All participants will receive updated calendar invites via email every time there is a change to the meeting date, time, location or participants. Once enabled, an email will be sent out immediately to all participants. - - ' - disable: 'Participants will no longer receive updated calendar invites via email when there are changes to the meeting date, time, location or participants. If they already had an invite for this meeting, it might no longer be accurate. - - ' + enable: Once enabled, an email will be sent out immediately to all participants. + disable: If they already had an invite for this meeting, it might no longer be accurate. confirm_label: enable: Enable email updates disable: Disable email updates - banner: - participants: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Email calendar updates are disabled. Participants will not receive an email informing them when you add or remove participants. - - ' - draft_disabled: 'Participants will not receive an email informing them when you add or remove participants. - - ' - onetime: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Participants will not receive an email informing them of changes to meeting date, time or participants. - - ' - occurrence: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this occurrence. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this occurrence. - - ' - template: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this template or to individual occurrences. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this template or to individual occurrences. - - ' presentation_mode: title: Presentation Mode button_present: Present @@ -638,6 +602,7 @@ ka: label_agenda_item_duplicate_in_next_title: Duplicate in next meeting? label_agenda_item_add_notes: შენიშვნების დამატება label_agenda_item_add_outcome: Add outcome + label_agenda_item_convert_to_work_package: Convert to work package label_agenda_item_work_package_add: Add work package label_agenda_item_work_package: Agenda item work package label_section_rename: Rename section diff --git a/modules/meeting/config/locales/crowdin/kk.yml b/modules/meeting/config/locales/crowdin/kk.yml index f65d8438079..32bdc04dad0 100644 --- a/modules/meeting/config/locales/crowdin/kk.yml +++ b/modules/meeting/config/locales/crowdin/kk.yml @@ -374,58 +374,22 @@ kk: caption: This text will appear on every page at the center of the footer. submit_button: Download notifications: + disabled: Participants will not receive email updates informing them of changes to the date, time or list of participants. + enabled: All participants will receive updated calendar invites informing them of changes to date, time or list of participants. sidepanel: title: Email calendar updates description: - disabled: Participants will not receive an email informing them of changes. - enabled: All participants will receive updated calendar invites via email informing them of changes. change_via_template: To change this, edit the series template. dialog: title: enable: Enable email calendar updates? disable: Disable email calendar updates? message: - enable: 'All participants will receive updated calendar invites via email every time there is a change to the meeting date, time, location or participants. Once enabled, an email will be sent out immediately to all participants. - - ' - disable: 'Participants will no longer receive updated calendar invites via email when there are changes to the meeting date, time, location or participants. If they already had an invite for this meeting, it might no longer be accurate. - - ' + enable: Once enabled, an email will be sent out immediately to all participants. + disable: If they already had an invite for this meeting, it might no longer be accurate. confirm_label: enable: Enable email updates disable: Disable email updates - banner: - participants: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Email calendar updates are disabled. Participants will not receive an email informing them when you add or remove participants. - - ' - draft_disabled: 'Participants will not receive an email informing them when you add or remove participants. - - ' - onetime: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Participants will not receive an email informing them of changes to meeting date, time or participants. - - ' - occurrence: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this occurrence. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this occurrence. - - ' - template: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this template or to individual occurrences. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this template or to individual occurrences. - - ' presentation_mode: title: Presentation Mode button_present: Present @@ -638,6 +602,7 @@ kk: label_agenda_item_duplicate_in_next_title: Duplicate in next meeting? label_agenda_item_add_notes: Add notes label_agenda_item_add_outcome: Add outcome + label_agenda_item_convert_to_work_package: Convert to work package label_agenda_item_work_package_add: Add work package label_agenda_item_work_package: Agenda item work package label_section_rename: Rename section diff --git a/modules/meeting/config/locales/crowdin/ko.yml b/modules/meeting/config/locales/crowdin/ko.yml index 109d83d82fc..a5ac8f76475 100644 --- a/modules/meeting/config/locales/crowdin/ko.yml +++ b/modules/meeting/config/locales/crowdin/ko.yml @@ -369,58 +369,22 @@ ko: caption: 이 텍스트는 모든 페이지의 바닥글 가운데에 나타납니다. submit_button: 다운로드 notifications: + disabled: 참가자들은 날짜, 시간 또는 명단 변경 사항을 알리는 이메일 업데이트를 받지 못할 것입니다. + enabled: 모든 참가자는 날짜, 시간 또는 참가자 목록 변경 사항을 알려주는 업데이트된 캘린더 초대를 받게 됩니다. sidepanel: title: 이메일 캘린더 업데이트 description: - disabled: 참가자에게는 변경 사항을 알려주는 이메일이 전송되지 않습니다. - enabled: 변경 사항을 알려주는 이메일을 통해 업데이트된 캘린더 초대장이 모든 참가자에게 전송됩니다. change_via_template: 이를 변경하려면 시리즈 템플릿을 편집하십시오. dialog: title: enable: 이메일 캘린더 업데이트를 활성화하시겠습니까? disable: 이메일 캘린더 업데이트를 비활성화하시겠습니까? message: - enable: '미팅 날짜, 시간, 위치 또는 참가자가 변경될 때마다 이메일을 통해 업데이트된 캘린더 초대장이 모든 참가자에게 전송됩니다. 이 옵션을 활성화하면 모든 참가자에게 즉시 이메일이 전송됩니다. - - ' - disable: '미팅 날짜, 시간, 위치 또는 참가자가 변경된 경우 참가자는 더 이상 이메일을 통해 업데이트된 캘린더 초대장을 받지 못합니다. 참가자가 이미 이 미팅에 대한 초대장을 받았다면 더 이상 정확하지 않을 수 있습니다. - - ' + enable: 활성화되면 모든 참가자에게 즉시 이메일이 발송됩니다. + disable: 이미 이 미팅에 대한 초대를 받았다면 더 이상 정확하지 않을 수 있습니다. confirm_label: enable: 이메일 업데이트 활성화 disable: 이메일 업데이트 비활성화 - banner: - participants: - enabled: '참가자를 추가 또는 제거하는 경우 이메일을 통해 업데이트된 캘린더 초대장이 모든 참가자에게 전송됩니다. - - ' - disabled: '이메일 캘린더 업데이트가 비활성화되었습니다. 참가자를 추가 또는 제거하는 경우 알려주는 이메일이 참가자에게 전송되지 않습니다. - - ' - draft_disabled: '참가자를 추가 또는 제거하는 경우 알려주는 이메일이 참가자에게 전송되지 않습니다. - - ' - onetime: - enabled: '참가자를 추가 또는 제거하는 경우 이메일을 통해 업데이트된 캘린더 초대장이 모든 참가자에게 전송됩니다. - - ' - disabled: '참가자에게는 미팅 날짜, 시간 또는 참가자의 변경 사항을 알려주는 이메일이 전송되지 않습니다. - - ' - occurrence: - enabled: '미팅 시리즈에 대한 이메일 캘린더 업데이트가 활성화되었습니다. 이 항목에 대한 변경 사항을 알려주는 업데이트된 캘린더 초대장이 모든 참가자에게 전송됩니다. - - ' - disabled: '미팅 시리즈에 대한 이메일 캘린더 업데이트가 비활성화되었습니다. 이 항목에 대한 변경 사항을 알려주는 이메일이 참가자에게 전송되지 않습니다. - - ' - template: - enabled: '미팅 시리즈에 대한 이메일 캘린더 업데이트가 활성화되었습니다. 이 템플릿 또는 개별 항목에 대한 변경 사항을 알려주는 업데이트된 캘린더 초대장이 모든 참가자에게 전송됩니다. - - ' - disabled: '미팅 시리즈에 대한 이메일 캘린더 업데이트가 비활성화되었습니다. 이 템플릿 또는 개별 항목에 대한 변경 사항을 알려주는 이메일이 참가자에게 전송되지 않습니다. - - ' presentation_mode: title: 프레젠테이션 모드 button_present: 프레젠테이션 @@ -626,6 +590,7 @@ ko: label_agenda_item_duplicate_in_next_title: 다음 미팅에 복제하시겠습니까? label_agenda_item_add_notes: 메모 추가 label_agenda_item_add_outcome: 결과 추가 + label_agenda_item_convert_to_work_package: 작업 패키지로 전환 label_agenda_item_work_package_add: 작업 패키지 추가 label_agenda_item_work_package: 의제 항목 작업 패키지 label_section_rename: 섹션 이름 바꾸기 diff --git a/modules/meeting/config/locales/crowdin/lt.yml b/modules/meeting/config/locales/crowdin/lt.yml index 113149d70b0..93e6a395bf3 100644 --- a/modules/meeting/config/locales/crowdin/lt.yml +++ b/modules/meeting/config/locales/crowdin/lt.yml @@ -384,58 +384,22 @@ lt: caption: This text will appear on every page at the center of the footer. submit_button: Atsiųsti notifications: + disabled: Participants will not receive email updates informing them of changes to the date, time or list of participants. + enabled: All participants will receive updated calendar invites informing them of changes to date, time or list of participants. sidepanel: title: Email calendar updates description: - disabled: Participants will not receive an email informing them of changes. - enabled: All participants will receive updated calendar invites via email informing them of changes. change_via_template: To change this, edit the series template. dialog: title: enable: Enable email calendar updates? disable: Disable email calendar updates? message: - enable: 'All participants will receive updated calendar invites via email every time there is a change to the meeting date, time, location or participants. Once enabled, an email will be sent out immediately to all participants. - - ' - disable: 'Participants will no longer receive updated calendar invites via email when there are changes to the meeting date, time, location or participants. If they already had an invite for this meeting, it might no longer be accurate. - - ' + enable: Once enabled, an email will be sent out immediately to all participants. + disable: If they already had an invite for this meeting, it might no longer be accurate. confirm_label: enable: Enable email updates disable: Disable email updates - banner: - participants: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Email calendar updates are disabled. Participants will not receive an email informing them when you add or remove participants. - - ' - draft_disabled: 'Participants will not receive an email informing them when you add or remove participants. - - ' - onetime: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Participants will not receive an email informing them of changes to meeting date, time or participants. - - ' - occurrence: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this occurrence. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this occurrence. - - ' - template: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this template or to individual occurrences. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this template or to individual occurrences. - - ' presentation_mode: title: Presentation Mode button_present: Present @@ -654,6 +618,7 @@ lt: label_agenda_item_duplicate_in_next_title: Duplicate in next meeting? label_agenda_item_add_notes: Pridėti pastabų label_agenda_item_add_outcome: Add outcome + label_agenda_item_convert_to_work_package: Convert to work package label_agenda_item_work_package_add: Add work package label_agenda_item_work_package: Darbotvarkės elemento darbo paketas label_section_rename: Rename section diff --git a/modules/meeting/config/locales/crowdin/lv.yml b/modules/meeting/config/locales/crowdin/lv.yml index 53145179769..33cc0619145 100644 --- a/modules/meeting/config/locales/crowdin/lv.yml +++ b/modules/meeting/config/locales/crowdin/lv.yml @@ -379,58 +379,22 @@ lv: caption: This text will appear on every page at the center of the footer. submit_button: Download notifications: + disabled: Participants will not receive email updates informing them of changes to the date, time or list of participants. + enabled: All participants will receive updated calendar invites informing them of changes to date, time or list of participants. sidepanel: title: Email calendar updates description: - disabled: Participants will not receive an email informing them of changes. - enabled: All participants will receive updated calendar invites via email informing them of changes. change_via_template: To change this, edit the series template. dialog: title: enable: Enable email calendar updates? disable: Disable email calendar updates? message: - enable: 'All participants will receive updated calendar invites via email every time there is a change to the meeting date, time, location or participants. Once enabled, an email will be sent out immediately to all participants. - - ' - disable: 'Participants will no longer receive updated calendar invites via email when there are changes to the meeting date, time, location or participants. If they already had an invite for this meeting, it might no longer be accurate. - - ' + enable: Once enabled, an email will be sent out immediately to all participants. + disable: If they already had an invite for this meeting, it might no longer be accurate. confirm_label: enable: Enable email updates disable: Disable email updates - banner: - participants: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Email calendar updates are disabled. Participants will not receive an email informing them when you add or remove participants. - - ' - draft_disabled: 'Participants will not receive an email informing them when you add or remove participants. - - ' - onetime: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Participants will not receive an email informing them of changes to meeting date, time or participants. - - ' - occurrence: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this occurrence. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this occurrence. - - ' - template: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this template or to individual occurrences. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this template or to individual occurrences. - - ' presentation_mode: title: Presentation Mode button_present: Present @@ -646,6 +610,7 @@ lv: label_agenda_item_duplicate_in_next_title: Duplicate in next meeting? label_agenda_item_add_notes: Add notes label_agenda_item_add_outcome: Add outcome + label_agenda_item_convert_to_work_package: Convert to work package label_agenda_item_work_package_add: Add work package label_agenda_item_work_package: Agenda item work package label_section_rename: Rename section diff --git a/modules/meeting/config/locales/crowdin/mn.yml b/modules/meeting/config/locales/crowdin/mn.yml index 670a084fc33..83dcdca147d 100644 --- a/modules/meeting/config/locales/crowdin/mn.yml +++ b/modules/meeting/config/locales/crowdin/mn.yml @@ -374,58 +374,22 @@ mn: caption: This text will appear on every page at the center of the footer. submit_button: Download notifications: + disabled: Participants will not receive email updates informing them of changes to the date, time or list of participants. + enabled: All participants will receive updated calendar invites informing them of changes to date, time or list of participants. sidepanel: title: Email calendar updates description: - disabled: Participants will not receive an email informing them of changes. - enabled: All participants will receive updated calendar invites via email informing them of changes. change_via_template: To change this, edit the series template. dialog: title: enable: Enable email calendar updates? disable: Disable email calendar updates? message: - enable: 'All participants will receive updated calendar invites via email every time there is a change to the meeting date, time, location or participants. Once enabled, an email will be sent out immediately to all participants. - - ' - disable: 'Participants will no longer receive updated calendar invites via email when there are changes to the meeting date, time, location or participants. If they already had an invite for this meeting, it might no longer be accurate. - - ' + enable: Once enabled, an email will be sent out immediately to all participants. + disable: If they already had an invite for this meeting, it might no longer be accurate. confirm_label: enable: Enable email updates disable: Disable email updates - banner: - participants: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Email calendar updates are disabled. Participants will not receive an email informing them when you add or remove participants. - - ' - draft_disabled: 'Participants will not receive an email informing them when you add or remove participants. - - ' - onetime: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Participants will not receive an email informing them of changes to meeting date, time or participants. - - ' - occurrence: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this occurrence. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this occurrence. - - ' - template: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this template or to individual occurrences. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this template or to individual occurrences. - - ' presentation_mode: title: Presentation Mode button_present: Present @@ -638,6 +602,7 @@ mn: label_agenda_item_duplicate_in_next_title: Duplicate in next meeting? label_agenda_item_add_notes: Add notes label_agenda_item_add_outcome: Add outcome + label_agenda_item_convert_to_work_package: Convert to work package label_agenda_item_work_package_add: Add work package label_agenda_item_work_package: Agenda item work package label_section_rename: Rename section diff --git a/modules/meeting/config/locales/crowdin/ms.yml b/modules/meeting/config/locales/crowdin/ms.yml index dbab46609ef..a4a76e862ab 100644 --- a/modules/meeting/config/locales/crowdin/ms.yml +++ b/modules/meeting/config/locales/crowdin/ms.yml @@ -371,58 +371,22 @@ ms: caption: This text will appear on every page at the center of the footer. submit_button: Muat turun notifications: + disabled: Participants will not receive email updates informing them of changes to the date, time or list of participants. + enabled: All participants will receive updated calendar invites informing them of changes to date, time or list of participants. sidepanel: title: Email calendar updates description: - disabled: Participants will not receive an email informing them of changes. - enabled: All participants will receive updated calendar invites via email informing them of changes. change_via_template: To change this, edit the series template. dialog: title: enable: Enable email calendar updates? disable: Disable email calendar updates? message: - enable: 'All participants will receive updated calendar invites via email every time there is a change to the meeting date, time, location or participants. Once enabled, an email will be sent out immediately to all participants. - - ' - disable: 'Participants will no longer receive updated calendar invites via email when there are changes to the meeting date, time, location or participants. If they already had an invite for this meeting, it might no longer be accurate. - - ' + enable: Once enabled, an email will be sent out immediately to all participants. + disable: If they already had an invite for this meeting, it might no longer be accurate. confirm_label: enable: Enable email updates disable: Disable email updates - banner: - participants: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Email calendar updates are disabled. Participants will not receive an email informing them when you add or remove participants. - - ' - draft_disabled: 'Participants will not receive an email informing them when you add or remove participants. - - ' - onetime: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Participants will not receive an email informing them of changes to meeting date, time or participants. - - ' - occurrence: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this occurrence. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this occurrence. - - ' - template: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this template or to individual occurrences. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this template or to individual occurrences. - - ' presentation_mode: title: Presentation Mode button_present: Present @@ -632,6 +596,7 @@ ms: label_agenda_item_duplicate_in_next_title: Duplicate in next meeting? label_agenda_item_add_notes: Tambah nota label_agenda_item_add_outcome: Add outcome + label_agenda_item_convert_to_work_package: Convert to work package label_agenda_item_work_package_add: Add work package label_agenda_item_work_package: Pakej kerja item agenda label_section_rename: Rename section diff --git a/modules/meeting/config/locales/crowdin/ne.yml b/modules/meeting/config/locales/crowdin/ne.yml index 748b18359f8..ed88e9a4733 100644 --- a/modules/meeting/config/locales/crowdin/ne.yml +++ b/modules/meeting/config/locales/crowdin/ne.yml @@ -374,58 +374,22 @@ ne: caption: This text will appear on every page at the center of the footer. submit_button: Download notifications: + disabled: Participants will not receive email updates informing them of changes to the date, time or list of participants. + enabled: All participants will receive updated calendar invites informing them of changes to date, time or list of participants. sidepanel: title: Email calendar updates description: - disabled: Participants will not receive an email informing them of changes. - enabled: All participants will receive updated calendar invites via email informing them of changes. change_via_template: To change this, edit the series template. dialog: title: enable: Enable email calendar updates? disable: Disable email calendar updates? message: - enable: 'All participants will receive updated calendar invites via email every time there is a change to the meeting date, time, location or participants. Once enabled, an email will be sent out immediately to all participants. - - ' - disable: 'Participants will no longer receive updated calendar invites via email when there are changes to the meeting date, time, location or participants. If they already had an invite for this meeting, it might no longer be accurate. - - ' + enable: Once enabled, an email will be sent out immediately to all participants. + disable: If they already had an invite for this meeting, it might no longer be accurate. confirm_label: enable: Enable email updates disable: Disable email updates - banner: - participants: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Email calendar updates are disabled. Participants will not receive an email informing them when you add or remove participants. - - ' - draft_disabled: 'Participants will not receive an email informing them when you add or remove participants. - - ' - onetime: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Participants will not receive an email informing them of changes to meeting date, time or participants. - - ' - occurrence: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this occurrence. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this occurrence. - - ' - template: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this template or to individual occurrences. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this template or to individual occurrences. - - ' presentation_mode: title: Presentation Mode button_present: Present @@ -638,6 +602,7 @@ ne: label_agenda_item_duplicate_in_next_title: Duplicate in next meeting? label_agenda_item_add_notes: Add notes label_agenda_item_add_outcome: Add outcome + label_agenda_item_convert_to_work_package: Convert to work package label_agenda_item_work_package_add: Add work package label_agenda_item_work_package: Agenda item work package label_section_rename: Rename section diff --git a/modules/meeting/config/locales/crowdin/nl.yml b/modules/meeting/config/locales/crowdin/nl.yml index c2343fc7e13..fa16fb03e5c 100644 --- a/modules/meeting/config/locales/crowdin/nl.yml +++ b/modules/meeting/config/locales/crowdin/nl.yml @@ -374,58 +374,22 @@ nl: caption: Deze tekst verschijnt op elke pagina in het midden van de voettekst. submit_button: Downloaden notifications: + disabled: Participants will not receive email updates informing them of changes to the date, time or list of participants. + enabled: All participants will receive updated calendar invites informing them of changes to date, time or list of participants. sidepanel: title: Email calendar updates description: - disabled: Deelnemers ontvangen geen e-mail om hen op de hoogte te stellen van wijzigingen. - enabled: All participants will receive updated calendar invites via email informing them of changes. change_via_template: To change this, edit the series template. dialog: title: enable: Enable email calendar updates? disable: Disable email calendar updates? message: - enable: 'All participants will receive updated calendar invites via email every time there is a change to the meeting date, time, location or participants. Once enabled, an email will be sent out immediately to all participants. - - ' - disable: 'Participants will no longer receive updated calendar invites via email when there are changes to the meeting date, time, location or participants. If they already had an invite for this meeting, it might no longer be accurate. - - ' + enable: Once enabled, an email will be sent out immediately to all participants. + disable: If they already had an invite for this meeting, it might no longer be accurate. confirm_label: enable: Enable email updates disable: Disable email updates - banner: - participants: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Email calendar updates are disabled. Participants will not receive an email informing them when you add or remove participants. - - ' - draft_disabled: 'Participants will not receive an email informing them when you add or remove participants. - - ' - onetime: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Participants will not receive an email informing them of changes to meeting date, time or participants. - - ' - occurrence: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this occurrence. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this occurrence. - - ' - template: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this template or to individual occurrences. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this template or to individual occurrences. - - ' presentation_mode: title: Presentation Mode button_present: Present @@ -638,6 +602,7 @@ nl: label_agenda_item_duplicate_in_next_title: Duplicate in next meeting? label_agenda_item_add_notes: Notities toevoegen label_agenda_item_add_outcome: Add outcome + label_agenda_item_convert_to_work_package: Convert to work package label_agenda_item_work_package_add: Add work package label_agenda_item_work_package: Agendapunt werkpakket label_section_rename: Rename section diff --git a/modules/meeting/config/locales/crowdin/no.yml b/modules/meeting/config/locales/crowdin/no.yml index 564fa64d6b5..87f6e7a6851 100644 --- a/modules/meeting/config/locales/crowdin/no.yml +++ b/modules/meeting/config/locales/crowdin/no.yml @@ -374,58 +374,22 @@ caption: This text will appear on every page at the center of the footer. submit_button: Last ned notifications: + disabled: Participants will not receive email updates informing them of changes to the date, time or list of participants. + enabled: All participants will receive updated calendar invites informing them of changes to date, time or list of participants. sidepanel: title: Email calendar updates description: - disabled: Participants will not receive an email informing them of changes. - enabled: All participants will receive updated calendar invites via email informing them of changes. change_via_template: To change this, edit the series template. dialog: title: enable: Enable email calendar updates? disable: Disable email calendar updates? message: - enable: 'All participants will receive updated calendar invites via email every time there is a change to the meeting date, time, location or participants. Once enabled, an email will be sent out immediately to all participants. - - ' - disable: 'Participants will no longer receive updated calendar invites via email when there are changes to the meeting date, time, location or participants. If they already had an invite for this meeting, it might no longer be accurate. - - ' + enable: Once enabled, an email will be sent out immediately to all participants. + disable: If they already had an invite for this meeting, it might no longer be accurate. confirm_label: enable: Enable email updates disable: Disable email updates - banner: - participants: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Email calendar updates are disabled. Participants will not receive an email informing them when you add or remove participants. - - ' - draft_disabled: 'Participants will not receive an email informing them when you add or remove participants. - - ' - onetime: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Participants will not receive an email informing them of changes to meeting date, time or participants. - - ' - occurrence: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this occurrence. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this occurrence. - - ' - template: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this template or to individual occurrences. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this template or to individual occurrences. - - ' presentation_mode: title: Presentation Mode button_present: Present @@ -638,6 +602,7 @@ label_agenda_item_duplicate_in_next_title: Duplicate in next meeting? label_agenda_item_add_notes: Legg til notater label_agenda_item_add_outcome: Add outcome + label_agenda_item_convert_to_work_package: Convert to work package label_agenda_item_work_package_add: Add work package label_agenda_item_work_package: Arbeidspakke for dagsordenen label_section_rename: Rename section diff --git a/modules/meeting/config/locales/crowdin/pl.yml b/modules/meeting/config/locales/crowdin/pl.yml index 52c60982262..ca026faf8bc 100644 --- a/modules/meeting/config/locales/crowdin/pl.yml +++ b/modules/meeting/config/locales/crowdin/pl.yml @@ -384,58 +384,22 @@ pl: caption: Ten tekst będzie wyświetlany na każdej stronie pośrodku stopki. submit_button: Pobierz notifications: + disabled: Uczestnicy nie będą otrzymywać wiadomości e-mail informujących o zmianach daty, godziny lub listy uczestników. + enabled: Wszyscy uczestnicy będą otrzymywać zaktualizowane zaproszenia z kalendarza informujące o zmianach daty, godziny lub listy uczestników. sidepanel: title: Wysyłaj aktualizacje kalendarza pocztą elektroniczną description: - disabled: Uczestnicy nie będą otrzymywać wiadomości e-mail z informacjami o zmianach. - enabled: Wszyscy uczestnicy będą otrzymywać aktualizowane zaproszenia do kalendarza pocztą elektroniczną z informacjami o zmianach. change_via_template: Aby to zmienić, edytuj szablon serii. dialog: title: enable: Włączyć wysyłanie aktualizacji kalendarza pocztą elektroniczną? disable: Wyłączyć wysyłanie aktualizacji kalendarza pocztą elektroniczną? message: - enable: 'Wszyscy uczestnicy będą otrzymywać zaktualizowane zaproszenia do kalendarza pocztą elektroniczną za każdym razem, gdy nastąpi zmiana daty, godziny, lokalizacji lub uczestników spotkania. Po włączeniu wiadomości e-mail zostaną natychmiast wysłane do wszystkich uczestników. - - ' - disable: 'Uczestnicy nie będą już otrzymywać zaktualizowanych zaproszeń do kalendarza w wiadomościach e-mail, gdy nastąpi zmiana daty, godziny, lokalizacji lub uczestników spotkania. Jeśli mieli już zaproszenie na to spotkanie, może ono być już nieaktualne. - - ' + enable: Po włączeniu tej funkcji wiadomość e-mail zostanie natychmiast wysłana do wszystkich uczestników. + disable: Jeśli mieli już zaproszenie na to spotkanie, może ono być już nieaktualne. confirm_label: enable: Włącz wysyłanie aktualizacji pocztą elektroniczną disable: Wyłącz wysyłanie aktualizacji pocztą elektroniczną - banner: - participants: - enabled: 'Po dodaniu lub usunięciu uczestników wszyscy uczestnicy otrzymają zaktualizowane zaproszenia do kalendarza za pośrednictwem wiadomości e-mail. - - ' - disabled: 'Aktualizacje kalendarza pocztą elektroniczną są wyłączone. Uczestnicy nie będą otrzymywać wiadomości e-mail z informacją o dodaniu lub usunięciu uczestników. - - ' - draft_disabled: 'Uczestnicy nie otrzymają wiadomości e-mail z informacją o dodaniu lub usunięciu przez Ciebie uczestników. - - ' - onetime: - enabled: 'Po dodaniu lub usunięciu uczestników wszyscy uczestnicy otrzymają zaktualizowane zaproszenia do kalendarza za pośrednictwem wiadomości e-mail. - - ' - disabled: 'Uczestnicy nie będą otrzymywać wiadomości e-mail z informacją o zmianie daty, godziny lub uczestników spotkania. - - ' - occurrence: - enabled: 'Wysyłanie aktualizacji kalendarza pocztą elektroniczną jest włączone dla serii spotkań. Wszyscy uczestnicy będą otrzymywać zaktualizowane zaproszenia do kalendarza z informacjami o zmianach tego wystąpienia. - - ' - disabled: 'Wysyłanie aktualizacji kalendarza pocztą elektroniczną jest wyłączone dla serii spotkań. Uczestnicy nie będą otrzymywać wiadomości e-mail z informacjami o zmianach tego wystąpienia. - - ' - template: - enabled: 'Wysyłanie aktualizacji kalendarza pocztą elektroniczną jest włączone dla serii spotkań. Wszyscy uczestnicy będą otrzymywać zaktualizowane zaproszenia do kalendarza z informacjami o zmianach tego szablonu lub poszczególnych wystąpień. - - ' - disabled: 'Wysyłanie aktualizacji kalendarza pocztą elektroniczną jest wyłączone dla serii spotkań. Uczestnicy nie będą otrzymywać wiadomości e-mail z informacjami o zmianach tego szablonu lub poszczególnych wystąpień. - - ' presentation_mode: title: Tryb prezentacji button_present: Prezentuj @@ -654,6 +618,7 @@ pl: label_agenda_item_duplicate_in_next_title: Zduplikować w następnym spotkaniu? label_agenda_item_add_notes: Dodawanie notatek label_agenda_item_add_outcome: Dodaj wynik + label_agenda_item_convert_to_work_package: Przekonwertuj na pakiet roboczy label_agenda_item_work_package_add: Dodaj pakiet roboczy label_agenda_item_work_package: Pakiet roboczy punktu planu spotkania label_section_rename: Zmień nazwę sekcji diff --git a/modules/meeting/config/locales/crowdin/pt-BR.yml b/modules/meeting/config/locales/crowdin/pt-BR.yml index d8f966dbd66..a732052f7a2 100644 --- a/modules/meeting/config/locales/crowdin/pt-BR.yml +++ b/modules/meeting/config/locales/crowdin/pt-BR.yml @@ -374,58 +374,22 @@ pt-BR: caption: Este texto aparecerá centralizado no rodapé de todas as páginas. submit_button: Baixar notifications: + disabled: Os participantes não receberão notificações por e-mail sobre alterações na data, horário ou lista de participantes. + enabled: Todos os participantes receberão convites de calendário atualizados informando sobre alterações na data, horário ou lista de participantes. sidepanel: title: Atualizações do calendário por e-mail description: - disabled: Os participantes não receberão um e-mail informando sobre as alterações. - enabled: Todos os participantes receberão convites de calendário atualizados por e-mail, informando sobre as alterações. change_via_template: Para alterar isso, edite o modelo da série. dialog: title: enable: Habilitar atualizações de calendário por e-mail? disable: Desabilitar atualizações de calendário por e-mail? message: - enable: 'Todos os participantes receberão, por e-mail, convites de calendário atualizados sempre que houver mudança na data, hora, local ou lista de participantes da reunião. Ao ativar essa opção, o envio é feito imediatamente para todos. - - ' - disable: 'Os participantes deixarão de receber convites de calendário atualizados por e-mail sempre que houver alterações na data, horário, local ou participantes da reunião. Caso já tenham recebido um convite anterior, ele pode estar desatualizado. - - ' + enable: Uma vez ativado, um e-mail será enviado imediatamente a todos os participantes. + disable: Se já tiverem um convite para esta reunião, ele pode não estar mais válido. confirm_label: enable: Habilitar atualizações por e-mail disable: Desabilitar atualizações por e-mail - banner: - participants: - enabled: 'Todos os participantes receberão convites de calendário atualizados por e-mail quando você adicionar ou remover participantes. - - ' - disabled: 'As atualizações de calendário por e-mail estão desativadas. Os participantes não receberão e-mails quando você adicionar ou remover participantes. - - ' - draft_disabled: 'Os participantes não receberão e-mail informando quando você adicionar ou remover participantes. - - ' - onetime: - enabled: 'Todos os participantes receberão atualização do convite de calendário via e-mail quando você adicionar ou remover participantes. - - ' - disabled: 'Os participantes não receberão um e-mail os informando sobre mudanças de data de reunião, tempo ou participantes. - - ' - occurrence: - enabled: 'As atualizações de calendário por e-mail estão ativadas para a série de reuniões. Todos os participantes receberão convites atualizados informando sobre suas alterações nesta ocorrência. - - ' - disabled: 'As atualizações de calendário por e-mail estão desativadas para a série de reuniões. Os participantes não receberão um e-mail informando sobre suas alterações nesta ocorrência. - - ' - template: - enabled: 'As atualizações de calendário por e-mail estão ativadas para a série de reuniões. Todos os participantes receberão convites atualizados informando sobre suas alterações neste modelo ou em ocorrências individuais. - - ' - disabled: 'As atualizações de calendário por e-mail estão desativadas para a série de reuniões. Os participantes não receberão um e-mail informando sobre suas alterações neste modelo ou em ocorrências individuais. - - ' presentation_mode: title: Modo de apresentação button_present: Presente @@ -640,6 +604,7 @@ pt-BR: label_agenda_item_duplicate_in_next_title: Duplicar na próxima reunião? label_agenda_item_add_notes: Adicionar anotações label_agenda_item_add_outcome: Adicionar resultado + label_agenda_item_convert_to_work_package: Converter para pacote de trabalho label_agenda_item_work_package_add: Adicionar pacote de trabalho label_agenda_item_work_package: Pacote de trabalho do Item da pauta label_section_rename: Renomear seção diff --git a/modules/meeting/config/locales/crowdin/pt-PT.yml b/modules/meeting/config/locales/crowdin/pt-PT.yml index 277f9c57c32..8e8c769a9e9 100644 --- a/modules/meeting/config/locales/crowdin/pt-PT.yml +++ b/modules/meeting/config/locales/crowdin/pt-PT.yml @@ -374,58 +374,22 @@ pt-PT: caption: Este texto vai aparecer em todas as páginas ao centro do rodapé. submit_button: Transferir notifications: + disabled: Os participantes não receberão e-mails a informá-los sobre alterações na data, hora ou lista de participantes. + enabled: Todos os participantes receberão convites atualizados no calendário, informando-os sobre alterações na data, hora ou lista de participantes. sidepanel: title: Atualizações do calendário por e-mail description: - disabled: Os participantes não receberão um e-mail a informá-los das alterações. - enabled: Todos os participantes receberão convites de calendário atualizados por e-mail, com informações sobre as alterações. change_via_template: Para alterar, edite o modelo de série. dialog: title: enable: Ativar atualizações do calendário por e-mail? disable: Desativar atualizações do calendário por e-mail? message: - enable: 'Todos os participantes receberão convites de calendário atualizados por e-mail sempre que houver uma alteração na data, hora, local ou participantes da reunião. Uma vez ativado, será enviado imediatamente um e-mail a todos os participantes. - - ' - disable: 'Os participantes deixarão de receber convites de calendário atualizados por e-mail quando houver alterações a data, hora, local ou participantes da reunião. Se já tiverem um convite para esta reunião, este poderá já não estar correto. - - ' + enable: Uma vez ativado, será imediatamente enviado um e-mail a todos os participantes. + disable: Se já receberam um convite para esta reunião, é possível que não esteja atualizado. confirm_label: enable: Ativar atualizações por e-mail disable: Desativar atualizações por e-mail - banner: - participants: - enabled: 'Todos os participantes receberão convites de calendário atualizados via e-mail quando adicionar ou remover participantes. - - ' - disabled: 'As atualizações de calendário por e-mails estão desativadas. Os participantes não receberão um e-mail a informar quando adiciona ou remove participantes. - - ' - draft_disabled: 'Os participantes não receberão um e-mail a informá-los quando adiciona ou remove participantes. - - ' - onetime: - enabled: 'Todos os participantes receberão convites de calendário atualizados via e-mail quando adicionar ou remover participantes. - - ' - disabled: 'Os participantes não receberão um e-mail a informá-los de alterações à data, hora ou aos participantes da reunião. - - ' - occurrence: - enabled: 'As atualizações da agenda de e-mail estão ativadas para as séries de reuniões. Todos os participantes receberão convites atualizados da agenda a informar sobre as suas alterações nesta ocorrência. - - ' - disabled: 'As atualizações da agenda de e-mail estão desativadas para as séries de reuniões. Os participantes não vão receber um e-mail a informar sobre as suas alterações nesta ocorrência. - - ' - template: - enabled: 'As atualizações da agenda de e-mail estão ativadas para as séries de reuniões. Todos os participantes receberão convites atualizados da agenda a informar sobre as suas alterações a este modelo ou a ocorrências individuais. - - ' - disabled: 'As atualizações da agenda de e-mail estão desativadas para as séries de reuniões. Os participantes não vão receber um e-mail a informar sobre as suas alterações a ocorrências individuais. - - ' presentation_mode: title: Modo de apresentação button_present: Apresentar @@ -638,6 +602,7 @@ pt-PT: label_agenda_item_duplicate_in_next_title: Duplicar na próxima reunião? label_agenda_item_add_notes: Adicionar notas label_agenda_item_add_outcome: Adicionar resultado + label_agenda_item_convert_to_work_package: Converter em pacote de trabalho label_agenda_item_work_package_add: Adicionar pacote de trabalho label_agenda_item_work_package: Pacote de trabalho do ponto da ordem de trabalhos label_section_rename: Mudar o nome da secção diff --git a/modules/meeting/config/locales/crowdin/ro.yml b/modules/meeting/config/locales/crowdin/ro.yml index 13e6f2c4fb7..6f7e156ca44 100644 --- a/modules/meeting/config/locales/crowdin/ro.yml +++ b/modules/meeting/config/locales/crowdin/ro.yml @@ -379,58 +379,22 @@ ro: caption: Acest text va apărea pe fiecare pagină în centrul subsolului. submit_button: Descarcă notifications: + disabled: Participants will not receive email updates informing them of changes to the date, time or list of participants. + enabled: All participants will receive updated calendar invites informing them of changes to date, time or list of participants. sidepanel: title: Actualizări calendar prin e-mail description: - disabled: Participants will not receive an email informing them of changes. - enabled: All participants will receive updated calendar invites via email informing them of changes. change_via_template: Pentru a schimba aceasta, editează șablonul seriei. dialog: title: enable: Activează actualizările calendarului prin e-mail? disable: Dezactivează actualizările calendarului prin e-mail? message: - enable: 'All participants will receive updated calendar invites via email every time there is a change to the meeting date, time, location or participants. Once enabled, an email will be sent out immediately to all participants. - - ' - disable: 'Participants will no longer receive updated calendar invites via email when there are changes to the meeting date, time, location or participants. If they already had an invite for this meeting, it might no longer be accurate. - - ' + enable: Once enabled, an email will be sent out immediately to all participants. + disable: If they already had an invite for this meeting, it might no longer be accurate. confirm_label: enable: Activează actualizările prin e-mail disable: Dezactivează actualizările prin e-mail - banner: - participants: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Email calendar updates are disabled. Participants will not receive an email informing them when you add or remove participants. - - ' - draft_disabled: 'Participants will not receive an email informing them when you add or remove participants. - - ' - onetime: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Participants will not receive an email informing them of changes to meeting date, time or participants. - - ' - occurrence: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this occurrence. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this occurrence. - - ' - template: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this template or to individual occurrences. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this template or to individual occurrences. - - ' presentation_mode: title: Presentation Mode button_present: Present @@ -646,6 +610,7 @@ ro: label_agenda_item_duplicate_in_next_title: Duplicate in next meeting? label_agenda_item_add_notes: Adaugă note label_agenda_item_add_outcome: Add outcome + label_agenda_item_convert_to_work_package: Convert to work package label_agenda_item_work_package_add: Add work package label_agenda_item_work_package: Agenda item work package label_section_rename: Rename section diff --git a/modules/meeting/config/locales/crowdin/ru.yml b/modules/meeting/config/locales/crowdin/ru.yml index 80fb8716e96..f8d85d3f0cd 100644 --- a/modules/meeting/config/locales/crowdin/ru.yml +++ b/modules/meeting/config/locales/crowdin/ru.yml @@ -384,58 +384,22 @@ ru: caption: Этот текст появится на каждой странице в центре нижнего колонтитула. submit_button: Скачать notifications: + disabled: Participants will not receive email updates informing them of changes to the date, time or list of participants. + enabled: All participants will receive updated calendar invites informing them of changes to date, time or list of participants. sidepanel: title: Обновления календаря по электронной почте description: - disabled: Участники не получат электронного письма с уведомлением об изменениях. - enabled: Все участники получат по электронной почте обновленные приглашения календаря, информирующие их об изменениях. change_via_template: Чтобы изменить это, отредактируйте шаблон серии. dialog: title: enable: Включить обновления календаря по электронной почте? disable: Отключить обновления календаря по электронной почте? message: - enable: 'Все участники будут получать обновленные календарные приглашения по электронной почте каждый раз, когда изменяется дата, время, место или участники встречи. Как только эта функция включена, всем участникам будет немедленно отправлено электронное письмо. - - ' - disable: 'Участники больше не будут получать по электронной почте обновленные приглашения календаря, если изменились дата, время, место проведения или участники собрания. Если у них уже было приглашение на эту встречу, оно может перестать быть точным. - - ' + enable: Once enabled, an email will be sent out immediately to all participants. + disable: If they already had an invite for this meeting, it might no longer be accurate. confirm_label: enable: Включить уведомления по электронной почте disable: Отключить уведомления по электронной почте - banner: - participants: - enabled: 'Все участники будут получать обновления приглашений в календарь по электронной почте при добавлении или удалении участников. - - ' - disabled: 'Обновления календаря отключены. Участники не получат письмо, информирующее их при добавлении или удалении участников. - - ' - draft_disabled: 'Участники не получат письмо, информирующее их при добавлении или удалении участников. - - ' - onetime: - enabled: 'Все участники будут получать обновления приглашений в календарь по электронной почте при добавлении или удалении участников. - - ' - disabled: 'Участники не получат электронное письмо с уведомлением об изменении даты, времени или участников совещания. - - ' - occurrence: - enabled: 'Для этой серии встреч включено обновление календаря по электронной почте. Все участники получат обновленные приглашения календаря, информирующие их о Ваших изменениях в этом событии. - - ' - disabled: 'Обновления календаря по электронной почте отключены для этой серии встреч. Участники не будут получать электронные письма, информирующие их о Ваших изменениях в этом событии. - - ' - template: - enabled: 'Для серии встреч включено обновление календаря по электронной почте. Все участники будут получать обновленные приглашения календаря, информирующие их о Ваших изменениях в этом шаблоне или отдельных событиях. - - ' - disabled: 'Обновления календаря по электронной почте отключены для серии встреч. Участники не будут получать электронные письма, информирующие их о Ваших изменениях в этом шаблоне или отдельных событиях. - - ' presentation_mode: title: Режим презентации button_present: Презентация @@ -654,6 +618,7 @@ ru: label_agenda_item_duplicate_in_next_title: Продублировать в следующее совещание? label_agenda_item_add_notes: Добавить заметки label_agenda_item_add_outcome: Добавить итог + label_agenda_item_convert_to_work_package: Convert to work package label_agenda_item_work_package_add: Добавить пакет работ label_agenda_item_work_package: Пакет работ по пунктам повестки label_section_rename: Переименовать раздел diff --git a/modules/meeting/config/locales/crowdin/rw.yml b/modules/meeting/config/locales/crowdin/rw.yml index 9510a7d741c..761debe78e6 100644 --- a/modules/meeting/config/locales/crowdin/rw.yml +++ b/modules/meeting/config/locales/crowdin/rw.yml @@ -374,58 +374,22 @@ rw: caption: This text will appear on every page at the center of the footer. submit_button: Download notifications: + disabled: Participants will not receive email updates informing them of changes to the date, time or list of participants. + enabled: All participants will receive updated calendar invites informing them of changes to date, time or list of participants. sidepanel: title: Email calendar updates description: - disabled: Participants will not receive an email informing them of changes. - enabled: All participants will receive updated calendar invites via email informing them of changes. change_via_template: To change this, edit the series template. dialog: title: enable: Enable email calendar updates? disable: Disable email calendar updates? message: - enable: 'All participants will receive updated calendar invites via email every time there is a change to the meeting date, time, location or participants. Once enabled, an email will be sent out immediately to all participants. - - ' - disable: 'Participants will no longer receive updated calendar invites via email when there are changes to the meeting date, time, location or participants. If they already had an invite for this meeting, it might no longer be accurate. - - ' + enable: Once enabled, an email will be sent out immediately to all participants. + disable: If they already had an invite for this meeting, it might no longer be accurate. confirm_label: enable: Enable email updates disable: Disable email updates - banner: - participants: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Email calendar updates are disabled. Participants will not receive an email informing them when you add or remove participants. - - ' - draft_disabled: 'Participants will not receive an email informing them when you add or remove participants. - - ' - onetime: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Participants will not receive an email informing them of changes to meeting date, time or participants. - - ' - occurrence: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this occurrence. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this occurrence. - - ' - template: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this template or to individual occurrences. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this template or to individual occurrences. - - ' presentation_mode: title: Presentation Mode button_present: Present @@ -638,6 +602,7 @@ rw: label_agenda_item_duplicate_in_next_title: Duplicate in next meeting? label_agenda_item_add_notes: Add notes label_agenda_item_add_outcome: Add outcome + label_agenda_item_convert_to_work_package: Convert to work package label_agenda_item_work_package_add: Add work package label_agenda_item_work_package: Agenda item work package label_section_rename: Rename section diff --git a/modules/meeting/config/locales/crowdin/si.yml b/modules/meeting/config/locales/crowdin/si.yml index 6400eca609f..85e01a3d795 100644 --- a/modules/meeting/config/locales/crowdin/si.yml +++ b/modules/meeting/config/locales/crowdin/si.yml @@ -374,58 +374,22 @@ si: caption: This text will appear on every page at the center of the footer. submit_button: බාගත කරන්න notifications: + disabled: Participants will not receive email updates informing them of changes to the date, time or list of participants. + enabled: All participants will receive updated calendar invites informing them of changes to date, time or list of participants. sidepanel: title: Email calendar updates description: - disabled: Participants will not receive an email informing them of changes. - enabled: All participants will receive updated calendar invites via email informing them of changes. change_via_template: To change this, edit the series template. dialog: title: enable: Enable email calendar updates? disable: Disable email calendar updates? message: - enable: 'All participants will receive updated calendar invites via email every time there is a change to the meeting date, time, location or participants. Once enabled, an email will be sent out immediately to all participants. - - ' - disable: 'Participants will no longer receive updated calendar invites via email when there are changes to the meeting date, time, location or participants. If they already had an invite for this meeting, it might no longer be accurate. - - ' + enable: Once enabled, an email will be sent out immediately to all participants. + disable: If they already had an invite for this meeting, it might no longer be accurate. confirm_label: enable: Enable email updates disable: Disable email updates - banner: - participants: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Email calendar updates are disabled. Participants will not receive an email informing them when you add or remove participants. - - ' - draft_disabled: 'Participants will not receive an email informing them when you add or remove participants. - - ' - onetime: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Participants will not receive an email informing them of changes to meeting date, time or participants. - - ' - occurrence: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this occurrence. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this occurrence. - - ' - template: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this template or to individual occurrences. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this template or to individual occurrences. - - ' presentation_mode: title: Presentation Mode button_present: Present @@ -638,6 +602,7 @@ si: label_agenda_item_duplicate_in_next_title: Duplicate in next meeting? label_agenda_item_add_notes: සටහන් එකතු කරන්න label_agenda_item_add_outcome: Add outcome + label_agenda_item_convert_to_work_package: Convert to work package label_agenda_item_work_package_add: Add work package label_agenda_item_work_package: Agenda item work package label_section_rename: Rename section diff --git a/modules/meeting/config/locales/crowdin/sk.yml b/modules/meeting/config/locales/crowdin/sk.yml index da5ee6796a0..2b0b1ffc2c6 100644 --- a/modules/meeting/config/locales/crowdin/sk.yml +++ b/modules/meeting/config/locales/crowdin/sk.yml @@ -384,58 +384,22 @@ sk: caption: This text will appear on every page at the center of the footer. submit_button: Prevziať notifications: + disabled: Participants will not receive email updates informing them of changes to the date, time or list of participants. + enabled: All participants will receive updated calendar invites informing them of changes to date, time or list of participants. sidepanel: title: Email calendar updates description: - disabled: Participants will not receive an email informing them of changes. - enabled: All participants will receive updated calendar invites via email informing them of changes. change_via_template: To change this, edit the series template. dialog: title: enable: Enable email calendar updates? disable: Disable email calendar updates? message: - enable: 'All participants will receive updated calendar invites via email every time there is a change to the meeting date, time, location or participants. Once enabled, an email will be sent out immediately to all participants. - - ' - disable: 'Participants will no longer receive updated calendar invites via email when there are changes to the meeting date, time, location or participants. If they already had an invite for this meeting, it might no longer be accurate. - - ' + enable: Once enabled, an email will be sent out immediately to all participants. + disable: If they already had an invite for this meeting, it might no longer be accurate. confirm_label: enable: Enable email updates disable: Disable email updates - banner: - participants: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Email calendar updates are disabled. Participants will not receive an email informing them when you add or remove participants. - - ' - draft_disabled: 'Participants will not receive an email informing them when you add or remove participants. - - ' - onetime: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Participants will not receive an email informing them of changes to meeting date, time or participants. - - ' - occurrence: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this occurrence. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this occurrence. - - ' - template: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this template or to individual occurrences. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this template or to individual occurrences. - - ' presentation_mode: title: Presentation Mode button_present: Present @@ -654,6 +618,7 @@ sk: label_agenda_item_duplicate_in_next_title: Duplicate in next meeting? label_agenda_item_add_notes: Pridať poznámky label_agenda_item_add_outcome: Add outcome + label_agenda_item_convert_to_work_package: Convert to work package label_agenda_item_work_package_add: Add work package label_agenda_item_work_package: Agenda item work package label_section_rename: Rename section diff --git a/modules/meeting/config/locales/crowdin/sl.yml b/modules/meeting/config/locales/crowdin/sl.yml index ce2c65b5467..fc3f6b868f7 100644 --- a/modules/meeting/config/locales/crowdin/sl.yml +++ b/modules/meeting/config/locales/crowdin/sl.yml @@ -384,58 +384,22 @@ sl: caption: This text will appear on every page at the center of the footer. submit_button: Prenesi notifications: + disabled: Participants will not receive email updates informing them of changes to the date, time or list of participants. + enabled: All participants will receive updated calendar invites informing them of changes to date, time or list of participants. sidepanel: title: Email calendar updates description: - disabled: Participants will not receive an email informing them of changes. - enabled: All participants will receive updated calendar invites via email informing them of changes. change_via_template: To change this, edit the series template. dialog: title: enable: Enable email calendar updates? disable: Disable email calendar updates? message: - enable: 'All participants will receive updated calendar invites via email every time there is a change to the meeting date, time, location or participants. Once enabled, an email will be sent out immediately to all participants. - - ' - disable: 'Participants will no longer receive updated calendar invites via email when there are changes to the meeting date, time, location or participants. If they already had an invite for this meeting, it might no longer be accurate. - - ' + enable: Once enabled, an email will be sent out immediately to all participants. + disable: If they already had an invite for this meeting, it might no longer be accurate. confirm_label: enable: Enable email updates disable: Disable email updates - banner: - participants: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Email calendar updates are disabled. Participants will not receive an email informing them when you add or remove participants. - - ' - draft_disabled: 'Participants will not receive an email informing them when you add or remove participants. - - ' - onetime: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Participants will not receive an email informing them of changes to meeting date, time or participants. - - ' - occurrence: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this occurrence. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this occurrence. - - ' - template: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this template or to individual occurrences. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this template or to individual occurrences. - - ' presentation_mode: title: Presentation Mode button_present: Present @@ -654,6 +618,7 @@ sl: label_agenda_item_duplicate_in_next_title: Duplicate in next meeting? label_agenda_item_add_notes: Dodaj zapiske label_agenda_item_add_outcome: Add outcome + label_agenda_item_convert_to_work_package: Convert to work package label_agenda_item_work_package_add: Add work package label_agenda_item_work_package: Agenda item work package label_section_rename: Rename section diff --git a/modules/meeting/config/locales/crowdin/sr.yml b/modules/meeting/config/locales/crowdin/sr.yml index 8c62a18f8cc..2a1c15ab761 100644 --- a/modules/meeting/config/locales/crowdin/sr.yml +++ b/modules/meeting/config/locales/crowdin/sr.yml @@ -379,58 +379,22 @@ sr: caption: This text will appear on every page at the center of the footer. submit_button: Download notifications: + disabled: Participants will not receive email updates informing them of changes to the date, time or list of participants. + enabled: All participants will receive updated calendar invites informing them of changes to date, time or list of participants. sidepanel: title: Email calendar updates description: - disabled: Participants will not receive an email informing them of changes. - enabled: All participants will receive updated calendar invites via email informing them of changes. change_via_template: To change this, edit the series template. dialog: title: enable: Enable email calendar updates? disable: Disable email calendar updates? message: - enable: 'All participants will receive updated calendar invites via email every time there is a change to the meeting date, time, location or participants. Once enabled, an email will be sent out immediately to all participants. - - ' - disable: 'Participants will no longer receive updated calendar invites via email when there are changes to the meeting date, time, location or participants. If they already had an invite for this meeting, it might no longer be accurate. - - ' + enable: Once enabled, an email will be sent out immediately to all participants. + disable: If they already had an invite for this meeting, it might no longer be accurate. confirm_label: enable: Enable email updates disable: Disable email updates - banner: - participants: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Email calendar updates are disabled. Participants will not receive an email informing them when you add or remove participants. - - ' - draft_disabled: 'Participants will not receive an email informing them when you add or remove participants. - - ' - onetime: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Participants will not receive an email informing them of changes to meeting date, time or participants. - - ' - occurrence: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this occurrence. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this occurrence. - - ' - template: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this template or to individual occurrences. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this template or to individual occurrences. - - ' presentation_mode: title: Presentation Mode button_present: Present @@ -646,6 +610,7 @@ sr: label_agenda_item_duplicate_in_next_title: Duplicate in next meeting? label_agenda_item_add_notes: Add notes label_agenda_item_add_outcome: Add outcome + label_agenda_item_convert_to_work_package: Convert to work package label_agenda_item_work_package_add: Add work package label_agenda_item_work_package: Agenda item work package label_section_rename: Rename section diff --git a/modules/meeting/config/locales/crowdin/sv.yml b/modules/meeting/config/locales/crowdin/sv.yml index f06af369b3e..e89a931da34 100644 --- a/modules/meeting/config/locales/crowdin/sv.yml +++ b/modules/meeting/config/locales/crowdin/sv.yml @@ -374,58 +374,22 @@ sv: caption: Denna text visas på varje sida i mitten av sidfoten. submit_button: Ladda ner notifications: + disabled: Participants will not receive email updates informing them of changes to the date, time or list of participants. + enabled: All participants will receive updated calendar invites informing them of changes to date, time or list of participants. sidepanel: title: E-posta kalenderuppdateringar description: - disabled: Deltagarna kommer inte att få något e-postmeddelande med information om ändringarna. - enabled: Alla deltagare kommer att få uppdaterade kalenderinbjudningar via e-post med information om ändringar. change_via_template: För att ändra detta, redigera seriemallen. dialog: title: enable: Aktivera kalenderuppdateringar via e-post? disable: Inaktivera kalenderuppdateringar via e-post? message: - enable: 'Alla deltagare kommer att få uppdaterade kalenderinbjudningar via e-post varje gång det sker en ändring av mötesdatum, tid, plats eller deltagare. När detta är aktiverat kommer ett mail att skickas ut direkt till alla deltagare. - - ' - disable: 'Deltagarna får inte längre uppdaterade kalenderinbjudningar via e-post när mötesdatum, tid, plats eller deltagare har ändrats. Om de redan hade en inbjudan till detta möte kanske det inte längre är korrekt. - - ' + enable: Once enabled, an email will be sent out immediately to all participants. + disable: If they already had an invite for this meeting, it might no longer be accurate. confirm_label: enable: Aktivera e-postuppdateringar disable: Inaktivera e-postuppdateringar - banner: - participants: - enabled: 'Alla deltagare får uppdaterade kalenderinbjudningar via e-post när du lägger till eller tar bort deltagare. - - ' - disabled: 'Kalenderuppdateringar via e-post är inaktiverade. Deltagarna kommer inte att få ett e-postmeddelande när du lägger till eller tar bort deltagare. - - ' - draft_disabled: 'Participants will not receive an email informing them when you add or remove participants. - - ' - onetime: - enabled: 'Alla deltagare får uppdaterade kalenderinbjudningar via e-post när du lägger till eller tar bort deltagare. - - ' - disabled: 'Deltagarna kommer inte att få ett e-postmeddelande med information om ändringar av mötesdatum, tid eller deltagare. - - ' - occurrence: - enabled: 'Uppdateringar av e-postkalendern är aktiverade för mötesserien. Alla deltagare kommer att få uppdaterade kalenderinbjudningar som informerar dem om dina ändringar av denna händelse. - - ' - disabled: 'Uppdateringar av e-postkalendern är inaktiverade för mötesserien. Deltagarna kommer inte att få ett e-postmeddelande med information om dina ändringar av denna händelse. - - ' - template: - enabled: 'Uppdateringar av e-postkalendern är aktiverade för mötesserien. Alla deltagare kommer att få uppdaterade kalenderinbjudningar med information om dina ändringar i den här mallen eller i enskilda händelser. - - ' - disabled: 'Uppdateringar av e-postkalender är inaktiverade för mötesserien. Deltagarna kommer inte att få ett e-postmeddelande som informerar dem om dina ändringar i denna mall eller enskilda händelser. - - ' presentation_mode: title: Presentationsläge button_present: Presentera @@ -638,6 +602,7 @@ sv: label_agenda_item_duplicate_in_next_title: Duplicate in next meeting? label_agenda_item_add_notes: Lägg till anteckningar label_agenda_item_add_outcome: Lägg till resultat + label_agenda_item_convert_to_work_package: Convert to work package label_agenda_item_work_package_add: Lägg till arbetspaket label_agenda_item_work_package: Dagordningspunkt arbetspaket label_section_rename: Döp om sektion diff --git a/modules/meeting/config/locales/crowdin/th.yml b/modules/meeting/config/locales/crowdin/th.yml index 5f893c4a442..db446d8767b 100644 --- a/modules/meeting/config/locales/crowdin/th.yml +++ b/modules/meeting/config/locales/crowdin/th.yml @@ -369,58 +369,22 @@ th: caption: This text will appear on every page at the center of the footer. submit_button: ดาวน์โหลด notifications: + disabled: Participants will not receive email updates informing them of changes to the date, time or list of participants. + enabled: All participants will receive updated calendar invites informing them of changes to date, time or list of participants. sidepanel: title: Email calendar updates description: - disabled: Participants will not receive an email informing them of changes. - enabled: All participants will receive updated calendar invites via email informing them of changes. change_via_template: To change this, edit the series template. dialog: title: enable: Enable email calendar updates? disable: Disable email calendar updates? message: - enable: 'All participants will receive updated calendar invites via email every time there is a change to the meeting date, time, location or participants. Once enabled, an email will be sent out immediately to all participants. - - ' - disable: 'Participants will no longer receive updated calendar invites via email when there are changes to the meeting date, time, location or participants. If they already had an invite for this meeting, it might no longer be accurate. - - ' + enable: Once enabled, an email will be sent out immediately to all participants. + disable: If they already had an invite for this meeting, it might no longer be accurate. confirm_label: enable: Enable email updates disable: Disable email updates - banner: - participants: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Email calendar updates are disabled. Participants will not receive an email informing them when you add or remove participants. - - ' - draft_disabled: 'Participants will not receive an email informing them when you add or remove participants. - - ' - onetime: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Participants will not receive an email informing them of changes to meeting date, time or participants. - - ' - occurrence: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this occurrence. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this occurrence. - - ' - template: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this template or to individual occurrences. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this template or to individual occurrences. - - ' presentation_mode: title: Presentation Mode button_present: Present @@ -630,6 +594,7 @@ th: label_agenda_item_duplicate_in_next_title: Duplicate in next meeting? label_agenda_item_add_notes: เพิ่มหมายเหตุ label_agenda_item_add_outcome: Add outcome + label_agenda_item_convert_to_work_package: Convert to work package label_agenda_item_work_package_add: Add work package label_agenda_item_work_package: Agenda item work package label_section_rename: Rename section diff --git a/modules/meeting/config/locales/crowdin/tr.yml b/modules/meeting/config/locales/crowdin/tr.yml index 095041ed4c1..48283945ac6 100644 --- a/modules/meeting/config/locales/crowdin/tr.yml +++ b/modules/meeting/config/locales/crowdin/tr.yml @@ -374,56 +374,22 @@ tr: caption: Bu metin her sayfada altbilginin ortasında görünecektir. submit_button: İndir notifications: + disabled: Participants will not receive email updates informing them of changes to the date, time or list of participants. + enabled: All participants will receive updated calendar invites informing them of changes to date, time or list of participants. sidepanel: title: E-posta takvim güncellemeleri description: - disabled: Katılımcılara değişiklikleri bildiren bir e-posta gönderilmeyecektir. - enabled: Tüm katılımcılar, değişiklikleri bildiren güncellenmiş takvim davetiyelerini e-posta yoluyla alacaktır. change_via_template: Bunu değiştirmek için seri şablonunu düzenleyin. dialog: title: enable: E-posta takvim güncellemeleri etkinleştirilsin mi? disable: E-posta takvim güncellemeleri devre dışı bırakılsın mı? message: - enable: 'Toplantı tarihi, saati, konumu veya katılımcılarında herhangi bir değişiklik olduğunda, tüm katılımcılara e-posta yoluyla güncellenmiş takvim davetleri gönderilir. Bu özellik etkinleştirildiğinde, tüm katılımcılara anında bir e-posta gönderilir. - - ' - disable: 'Toplantı tarihi, saati, yeri veya katılımcılarında değişiklik olduğunda katılımcılar artık e-posta yoluyla güncellenmiş takvim davetleri almayacaktır. Bu toplantı için zaten bir davetleri varsa, artık doğru olmayabilir. - - ' + enable: Once enabled, an email will be sent out immediately to all participants. + disable: If they already had an invite for this meeting, it might no longer be accurate. confirm_label: enable: E-posta güncellemelerini etkinleştir disable: E-posta güncellemelerini devre dışı bırak - banner: - participants: - enabled: 'Katılımcı eklediğinizde veya çıkardığınızda tüm katılımcılar e-posta yoluyla güncellenmiş takvim davetiyeleri alacaktır. - - ' - disabled: 'E-posta takvim güncellemeleri devre dışı bırakılmıştır. Katılımcılar, katılımcı eklediğinizde veya çıkardığınızda onları bilgilendiren bir e-posta almayacaktır. - - ' - draft_disabled: 'Participants will not receive an email informing them when you add or remove participants. - - ' - onetime: - enabled: 'Katılımcı eklediğinizde veya çıkardığınızda tüm katılımcılar e-posta yoluyla güncellenmiş takvim davetiyeleri alacaktır. - - ' - disabled: 'Katılımcılara toplantı tarihi, saati veya katılımcılarla ilgili değişiklikleri bildiren bir e-posta gönderilmeyecektir. - - ' - occurrence: - enabled: '' - disabled: 'Toplantı serisi için e-posta takvimi güncellemeleri devre dışı bırakılmıştır. Katılımcılar, bu olayda yaptığınız değişiklikleri bildiren bir e-posta almayacaktır. - - ' - template: - enabled: 'Toplantı serisi için e-posta takvimi güncellemeleri etkinleştirilmiştir. Tüm katılımcılar, bu şablonda veya münferit olaylarda yaptığınız değişiklikleri bildiren güncellenmiş takvim davetiyeleri alacaktır. - - ' - disabled: 'Toplantı serisi için e-posta takvimi güncellemeleri devre dışı bırakılmıştır. Katılımcılar, bu şablonda veya münferit olaylarda yaptığınız değişiklikleri bildiren bir e-posta almayacaktır. - - ' presentation_mode: title: Sunum modu button_present: Sunumu başlat @@ -630,6 +596,7 @@ tr: label_agenda_item_duplicate_in_next_title: Bir sonraki toplantıda tekrarlansın mı? label_agenda_item_add_notes: Not ekle label_agenda_item_add_outcome: Sonuç ekle + label_agenda_item_convert_to_work_package: Convert to work package label_agenda_item_work_package_add: İş paketi ekle label_agenda_item_work_package: Gündem maddesinin iş parçası label_section_rename: Seçimi yeniden adlandır diff --git a/modules/meeting/config/locales/crowdin/uk.yml b/modules/meeting/config/locales/crowdin/uk.yml index 251952d0fa8..40e06c46fa0 100644 --- a/modules/meeting/config/locales/crowdin/uk.yml +++ b/modules/meeting/config/locales/crowdin/uk.yml @@ -384,58 +384,22 @@ uk: caption: Цей текст з’явиться на кожній сторінці в центрі нижнього колонтитула. submit_button: Завантажити notifications: + disabled: Учасники не отримуватимуть листів з інформацією про зміни, які вносяться в дату, час і список учасників. + enabled: Усі учасники отримуватимуть оновлені запрошення з календаря з інформацією про зміни, які вносяться в дату, час і список учасників. sidepanel: title: Оновлення з календаря електронною поштою description: - disabled: Учасники не отримуватимуть електронних листів щодо змін. - enabled: Усі учасники отримуватимуть електронною поштою оновлені запрошення з календаря, які інформуватимуть їх про зміни. change_via_template: Щоб змінити це, відредагуйте шаблон серії. dialog: title: enable: Увімкнути оновлення з календаря електронною поштою? disable: Вимкнути оновлення з календаря електронною поштою? message: - enable: 'Усі учасники отримуватимуть електронною поштою оновлені запрошення з календаря щоразу, коли мінятиметься дата, час, місце проведення або перелік учасників наради. Після ввімкнення всім учасникам буде негайно надіслано електронний лист. - - ' - disable: 'Учасникам більше не надходитимуть електронною поштою оновлені запрошення з календаря після внесення змін у дату, час, місце або перелік учасників наради. Через це інформація із запрошення на цю нараду, яке вони отримали раніше, може більше не бути точною. - - ' + enable: Після ввімкнення всі учасники негайно отримають електронний лист. + disable: Якщо в них уже є запрошення на цю зустріч, тепер зазначена в ньому інформація може бути неточною. confirm_label: enable: Увімкнути оновлення електронною поштою disable: Вимкнути оновлення електронною поштою - banner: - participants: - enabled: 'Якщо ви додасте нових учасників чи вилучите наявних, усі учасники отримають електронною поштою оновлені запрошення з календаря. - - ' - disabled: 'Надсилання електронною поштою оновлень із календаря вимкнено. Якщо ви додасте нових учасників чи вилучите наявних, учасники не отримають листа з інформацією про це. - - ' - draft_disabled: 'Учасники не отримають електронного листа з відповідним повідомленням після того, як ви додасте чи вилучите когось із них. - - ' - onetime: - enabled: 'Усі учасники отримають оновлені запрошення в календарі електронною поштою, коли ви додасте або видалите учасників. - - ' - disabled: 'Учасники не отримають електронного листа з повідомленням про зміни дати, часу чи учасників зустрічі. - - ' - occurrence: - enabled: 'Надсилання електронною поштою оновлень із календаря ввімкнено для цієї серії нарад. Усі учасники отримають оновлені запрошення з календаря, що міститимуть інформацію про зміни, які ви вносите в цю нараду серії. - - ' - disabled: 'Надсилання електронною поштою оновлень із календаря вимкнено для цієї серії нарад. Учасники не отримають листа з інформацією про зміни, які ви вносите в цю нараду серії. - - ' - template: - enabled: 'Надсилання електронною поштою оновлень із календаря ввімкнено для цієї серії нарад. Усі учасники отримають оновлені запрошення з календаря, що міститимуть інформацію про зміни, які ви вносите в цей шаблон або окремі наради серії. - - ' - disabled: 'Надсилання електронною поштою оновлень із календаря вимкнено для цієї серії нарад. Учасники не отримають електронного листа з інформацією про зміни, які ви вносите в цей шаблон або окремі наради серії. - - ' presentation_mode: title: Режим презентації button_present: Презентувати @@ -654,6 +618,7 @@ uk: label_agenda_item_duplicate_in_next_title: Дублювати в наступну нараду? label_agenda_item_add_notes: Додати примітки label_agenda_item_add_outcome: Додати результат + label_agenda_item_convert_to_work_package: Перетворити в пакет робіт label_agenda_item_work_package_add: Додати пакет робіт label_agenda_item_work_package: Пакет робіт пункту порядку денного label_section_rename: Перейменувати розділ diff --git a/modules/meeting/config/locales/crowdin/uz.yml b/modules/meeting/config/locales/crowdin/uz.yml index 9f1d1893673..99007392e95 100644 --- a/modules/meeting/config/locales/crowdin/uz.yml +++ b/modules/meeting/config/locales/crowdin/uz.yml @@ -374,58 +374,22 @@ uz: caption: This text will appear on every page at the center of the footer. submit_button: Download notifications: + disabled: Participants will not receive email updates informing them of changes to the date, time or list of participants. + enabled: All participants will receive updated calendar invites informing them of changes to date, time or list of participants. sidepanel: title: Email calendar updates description: - disabled: Participants will not receive an email informing them of changes. - enabled: All participants will receive updated calendar invites via email informing them of changes. change_via_template: To change this, edit the series template. dialog: title: enable: Enable email calendar updates? disable: Disable email calendar updates? message: - enable: 'All participants will receive updated calendar invites via email every time there is a change to the meeting date, time, location or participants. Once enabled, an email will be sent out immediately to all participants. - - ' - disable: 'Participants will no longer receive updated calendar invites via email when there are changes to the meeting date, time, location or participants. If they already had an invite for this meeting, it might no longer be accurate. - - ' + enable: Once enabled, an email will be sent out immediately to all participants. + disable: If they already had an invite for this meeting, it might no longer be accurate. confirm_label: enable: Enable email updates disable: Disable email updates - banner: - participants: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Email calendar updates are disabled. Participants will not receive an email informing them when you add or remove participants. - - ' - draft_disabled: 'Participants will not receive an email informing them when you add or remove participants. - - ' - onetime: - enabled: 'All participants will receive updated calendar invites via email when you add or remove participants. - - ' - disabled: 'Participants will not receive an email informing them of changes to meeting date, time or participants. - - ' - occurrence: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this occurrence. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this occurrence. - - ' - template: - enabled: 'Email calendar updates are enabled for the meeting series. All participants will receive updated calendar invites informing them of your changes to this template or to individual occurrences. - - ' - disabled: 'Email calendar updates are disabled for the meeting series. Participants will not receive an email informing them of your changes to this template or to individual occurrences. - - ' presentation_mode: title: Presentation Mode button_present: Present @@ -638,6 +602,7 @@ uz: label_agenda_item_duplicate_in_next_title: Duplicate in next meeting? label_agenda_item_add_notes: Add notes label_agenda_item_add_outcome: Add outcome + label_agenda_item_convert_to_work_package: Convert to work package label_agenda_item_work_package_add: Add work package label_agenda_item_work_package: Agenda item work package label_section_rename: Rename section diff --git a/modules/meeting/config/locales/crowdin/vi.yml b/modules/meeting/config/locales/crowdin/vi.yml index 467bc312a36..e36c5dece77 100644 --- a/modules/meeting/config/locales/crowdin/vi.yml +++ b/modules/meeting/config/locales/crowdin/vi.yml @@ -369,58 +369,22 @@ vi: caption: Văn bản này sẽ xuất hiện trên mỗi trang ở giữa chân trang. submit_button: tải về notifications: + disabled: Participants will not receive email updates informing them of changes to the date, time or list of participants. + enabled: All participants will receive updated calendar invites informing them of changes to date, time or list of participants. sidepanel: title: Cập nhật lịch qua email description: - disabled: Những người tham gia sẽ không nhận được email thông báo về những thay đổi. - enabled: Tất cả những người tham gia sẽ nhận được lời mời lịch cập nhật qua email thông báo cho họ về những thay đổi. change_via_template: Để thay đổi điều này, hãy chỉnh sửa mẫu chuỗi. dialog: title: enable: Bật cập nhật lịch email? disable: Tắt cập nhật lịch email? message: - enable: 'Tất cả những người tham gia sẽ nhận được lời mời lịch cập nhật qua email mỗi khi có thay đổi về ngày, giờ, địa điểm hoặc người tham gia cuộc họp. Sau khi được bật, một email sẽ được gửi ngay lập tức đến tất cả người tham gia. - - ' - disable: 'Người tham gia sẽ không còn nhận được lời mời lịch cập nhật qua email khi có thay đổi về ngày, giờ, địa điểm hoặc người tham gia cuộc họp. Nếu họ đã có lời mời tham dự cuộc họp này thì lời mời đó có thể không còn chính xác nữa. - - ' + enable: Once enabled, an email will be sent out immediately to all participants. + disable: If they already had an invite for this meeting, it might no longer be accurate. confirm_label: enable: Kích hoạt cập nhật email disable: Vô hiệu hóa cập nhật email - banner: - participants: - enabled: 'Tất cả người tham gia sẽ nhận được lời mời lịch cập nhật qua email khi bạn thêm hoặc xóa người tham gia. - - ' - disabled: 'Cập nhật lịch email bị vô hiệu hóa. Người tham gia sẽ không nhận được email thông báo cho họ khi bạn thêm hoặc xóa người tham gia. - - ' - draft_disabled: 'Participants will not receive an email informing them when you add or remove participants. - - ' - onetime: - enabled: 'Tất cả người tham gia sẽ nhận được lời mời lịch cập nhật qua email khi bạn thêm hoặc xóa người tham gia. - - ' - disabled: 'Những người tham gia sẽ không nhận được email thông báo về những thay đổi về ngày, giờ họp hoặc người tham gia. - - ' - occurrence: - enabled: 'Cập nhật lịch email được bật cho chuỗi cuộc họp. Tất cả những người tham gia sẽ nhận được lời mời cập nhật trên lịch thông báo cho họ về những thay đổi của bạn đối với lần xuất hiện này. - - ' - disabled: 'Cập nhật lịch email bị vô hiệu hóa cho chuỗi cuộc họp. Những người tham gia sẽ không nhận được email thông báo cho họ về những thay đổi của bạn đối với lần xuất hiện này. - - ' - template: - enabled: 'Cập nhật lịch email được bật cho chuỗi cuộc họp. Tất cả những người tham gia sẽ nhận được lời mời lịch cập nhật thông báo cho họ về những thay đổi của bạn đối với mẫu này hoặc đối với các lần xuất hiện riêng lẻ. - - ' - disabled: 'Cập nhật lịch email bị vô hiệu hóa cho chuỗi cuộc họp. Những người tham gia sẽ không nhận được email thông báo cho họ về những thay đổi của bạn đối với mẫu này hoặc đối với các lần xuất hiện riêng lẻ. - - ' presentation_mode: title: Chế độ trình bày button_present: hiện tại @@ -630,6 +594,7 @@ vi: label_agenda_item_duplicate_in_next_title: Có lặp lại trong cuộc họp tiếp theo không? label_agenda_item_add_notes: Thêm ghi chú label_agenda_item_add_outcome: Thêm kết quả + label_agenda_item_convert_to_work_package: Convert to work package label_agenda_item_work_package_add: Thêm gói công việc label_agenda_item_work_package: Gói công việc mục chương trình nghị sự label_section_rename: Đổi tên phần diff --git a/modules/meeting/config/locales/crowdin/zh-CN.yml b/modules/meeting/config/locales/crowdin/zh-CN.yml index 4ab64c87967..7661cddd16e 100644 --- a/modules/meeting/config/locales/crowdin/zh-CN.yml +++ b/modules/meeting/config/locales/crowdin/zh-CN.yml @@ -369,58 +369,22 @@ zh-CN: caption: 此文本将出现在每一页的页脚中心。 submit_button: 下载 notifications: + disabled: 参与者不会收到向其通知日期、时间或参与者名单更改的电子邮件更新。 + enabled: 所有参与者都将收到通知其日期、时间或参与者名单更改的更新日历邀请。 sidepanel: title: 电子邮件日历更新 description: - disabled: 与会者不会收到向其通知更改的电子邮件。 - enabled: 所有与会者都将通过电子邮件收到更新的日历邀请,向其通知相关更改。 change_via_template: 要更改此设置,请编辑系列模板。 dialog: title: enable: 启用电子邮件日历更新? disable: 禁用电子邮件日历更新? message: - enable: '每次会议日期、时间、地点或与会者更改时,所有与会者都将通过电子邮件收到更新日历的邀请。 一旦启用,将立即向所有参与者发送一封电子邮件。 - - ' - disable: '当会议日期、时间、地点或与会者发生更改时,与会者将不再通过电子邮件收到更新的日历邀请。如果他们已经收到过此次会议的邀请,则该邀请可能不再准确。 - - ' + enable: 启用后,将立即向所有参与者发送电子邮件。 + disable: 如果他们已经收到这次会议的邀请,该邀请的信息可能不再准确。 confirm_label: enable: 启用电子邮件更新 disable: 禁用电子邮件更新 - banner: - participants: - enabled: '当您添加或移除参与者时,所有参与者都将通过电子邮件收到更新的日历邀请。 - - ' - disabled: '电子邮件日历更新已禁用。在您添加或移除参与者时,参与者不会收到电子邮件通知。 - - ' - draft_disabled: '在您添加或移除参与者时,参与者不会收到电子邮件通知。 - - ' - onetime: - enabled: '当您添加或移除参与者时,所有参与者都将通过电子邮件收到更新后的日历邀请。 - - ' - disabled: '参与者不会收到向其通知会议日期、时间或参与者更改的电子邮件。 - - ' - occurrence: - enabled: '已对会议系列启用电子邮件日历更新。所有与会者都会收到更新的日历邀请,向其通知您对此次事件所做的更改。 - - ' - disabled: '已对会议系列禁用电子邮件日历更新。与会者将不会收到向其通知您对此次事件所做更改的电子邮件。 - - ' - template: - enabled: '已对会议系列启用电子邮件日历更新。所有与会者都会收到更新的日历邀请,向其通知您对此模板或各个事件所做的更改。 - - ' - disabled: '已对会议系列禁用电子邮件日历更新。与会者将不会收到向其通知您对此模板或各个事件所做更改的电子邮件。 - - ' presentation_mode: title: 演示模式 button_present: 演示 @@ -634,6 +598,7 @@ zh-CN: label_agenda_item_duplicate_in_next_title: 是否在下次会议中重复? label_agenda_item_add_notes: 添加备注 label_agenda_item_add_outcome: 添加成果 + label_agenda_item_convert_to_work_package: 转换为工作包 label_agenda_item_work_package_add: 添加工作包 label_agenda_item_work_package: 议程项目工作包 label_section_rename: 重命名章节 diff --git a/modules/meeting/config/locales/crowdin/zh-TW.yml b/modules/meeting/config/locales/crowdin/zh-TW.yml index e3a7249d948..aca5811a52b 100644 --- a/modules/meeting/config/locales/crowdin/zh-TW.yml +++ b/modules/meeting/config/locales/crowdin/zh-TW.yml @@ -371,58 +371,22 @@ zh-TW: caption: 此文字將出現在每頁的頁尾中央。 submit_button: 下載 notifications: + disabled: Participants will not receive email updates informing them of changes to the date, time or list of participants. + enabled: All participants will receive updated calendar invites informing them of changes to date, time or list of participants. sidepanel: title: 電子郵件行事曆更新 description: - disabled: 參與者不會收到通知變更的電子郵件。 - enabled: 所有與會者都會透過電子郵件收到更新的行事曆邀請,通知他們相關變更。 change_via_template: 若要變更,請編輯系列範本。 dialog: title: enable: 啟用電子郵件行事曆更新? disable: 停用電子郵件行事曆更新? message: - enable: '每次會議日期、時間、地點或與會者有變更時,所有與會者都會透過電子郵件收到更新的行事曆邀請。啟用後,電子郵件會立即傳送給所有與會者。 - - ' - disable: '當會議日期、時間、地點或與會者有變更時,與會者將不會再透過電子郵件收到更新的行事曆邀請。如果他們已經有這個會議的邀請,則可能不再準確。 - - ' + enable: Once enabled, an email will be sent out immediately to all participants. + disable: If they already had an invite for this meeting, it might no longer be accurate. confirm_label: enable: 啟用電子郵件更新 disable: 停用電子郵件更新 - banner: - participants: - enabled: '當您新增或移除參與者時,所有參與者都會透過電子郵件收到更新的行事曆邀請。 - - ' - disabled: '電子郵件行事曆更新已停用。當您新增或移除參與者時,參與者將不會收到通知他們的電子郵件。 - - ' - draft_disabled: 'Participants will not receive an email informing them when you add or remove participants. - - ' - onetime: - enabled: '當您新增或移除參與者時,所有參與者都會透過電子郵件收到更新的行事曆。 - - ' - disabled: '參與者將不會收到有關會議日期、時間或參與者變更的通知電子郵件。 - - ' - occurrence: - enabled: '已啟用系列會議的電子郵件行事曆更新。所有與會者都會收到更新的行事曆邀請,通知他們您對此事件所做的變更。 - - ' - disabled: '系列會議的電子郵件行事曆更新已停用。與會者將不會收到電子郵件,通知他們您對此發生的變更。 - - ' - template: - enabled: '已為會議系列啟用電子郵件行事曆更新。所有與會者都會收到更新的行事曆邀請,通知他們您對此範本或個別事件所做的變更。 - - ' - disabled: '會議系列的電子郵件行事曆更新已停用。與會者將不會收到電子郵件,通知他們您對此範本或個別事件所做的變更。 - - ' presentation_mode: title: 簡報模式 button_present: 顯示按鈕 @@ -632,6 +596,7 @@ zh-TW: label_agenda_item_duplicate_in_next_title: 在下次會議中重複? label_agenda_item_add_notes: 新增註記 label_agenda_item_add_outcome: 新增結果 + label_agenda_item_convert_to_work_package: Convert to work package label_agenda_item_work_package_add: 新增工作套件 label_agenda_item_work_package: 議程項目工作套件 label_section_rename: 重新命名區段 diff --git a/modules/reporting/config/locales/crowdin/ro.yml b/modules/reporting/config/locales/crowdin/ro.yml index 44c763a7a16..6948e28b90a 100644 --- a/modules/reporting/config/locales/crowdin/ro.yml +++ b/modules/reporting/config/locales/crowdin/ro.yml @@ -71,7 +71,7 @@ ro: label_filter: Filtrează label_filter_add: Adaugă filtru label_filter_plural: Filtre - label_group_by: Grupează după + label_group_by: Grupare după label_group_by_add: Adaugă atributul Grupează-după label_inactive: Inactiv label_no: Nu diff --git a/modules/reporting/config/locales/crowdin/vi.yml b/modules/reporting/config/locales/crowdin/vi.yml index 263f24943f1..b64d64cd638 100644 --- a/modules/reporting/config/locales/crowdin/vi.yml +++ b/modules/reporting/config/locales/crowdin/vi.yml @@ -74,7 +74,7 @@ vi: label_group_by: Nhóm theo label_group_by_add: Thêm thuộc tính theo nhóm label_inactive: "«không hoạt động»" - label_no: không + label_no: Không label_none: "(không có dữ liệu)" label_no_reports: Chưa có báo cáo chi phí. label_report: Báo cáo diff --git a/modules/reporting/config/locales/crowdin/zh-TW.yml b/modules/reporting/config/locales/crowdin/zh-TW.yml index 3bfe7515afd..232cc7de50e 100644 --- a/modules/reporting/config/locales/crowdin/zh-TW.yml +++ b/modules/reporting/config/locales/crowdin/zh-TW.yml @@ -54,7 +54,7 @@ zh-TW: label_money: 金額 label_month_reporting: 月 label_new_report: 新建成本報表 - label_open: 開啟 + label_open: 開啟中 label_operator: 操作員 label_private_report_plural: 私密成本報告 label_progress_bar_explanation: 產生報告中... @@ -71,7 +71,7 @@ zh-TW: label_filter: 篩選條件 label_filter_add: 新增篩選條件 label_filter_plural: 篩選條件 - label_group_by: 分類 + label_group_by: 分組依據 label_group_by_add: 新增群組欄位 label_inactive: "«不活動»" label_no: 否 diff --git a/modules/resource_management/config/locales/crowdin/af.yml b/modules/resource_management/config/locales/crowdin/af.yml index 7ef34709854..be061cc05a2 100644 --- a/modules/resource_management/config/locales/crowdin/af.yml +++ b/modules/resource_management/config/locales/crowdin/af.yml @@ -2,72 +2,131 @@ af: activerecord: attributes: - resource_planner: - name: Name - start_date: Start date - end_date: Finish date - default_view_class_name: Default view - public: Public - favorite: Favorite resource_allocation: + allocated_time: Allocated time + end_date: Finish date entity: Entity principal: Assignee - state: State start_date: Start date - end_date: Finish date - allocated_time: Allocated time + state: State user_filter: User filter + resource_planner: + default_view_class_name: Default view + end_date: Finish date + favorite: Favorite + name: Name + public: Public + start_date: Start date errors: models: - resource_planner: - attributes: - end_date: - greater_than_start_date: must be after the start date. resource_allocation: attributes: end_date: greater_than_start_date: must be after the start date. - plugin_openproject_resource_management: - name: OpenProject Resource Management - description: Provides resource management and capacity planning. - project_module_resource_management: Resource management - permission_view_resource_planners: View resource planners - permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. + resource_planner: + attributes: + end_date: + greater_than_start_date: must be after the start date. + resource_work_package_list: + attributes: + query: + must_be_work_package_query: must be a work package query. + models: + resource_allocation: Resource Allocation + resource_planner: Resource Planner + resource_work_package_list: Work packages list + user_card: User cards + button_next: Next + label_resource_management: Resource planning + permission_allocate_user_resources: Allocate user resources + permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. ' permission_manage_public_resource_planners: Manage public resource planners permission_manage_public_resource_planners_explanation: 'Allows users to create and manage public resource planners. It allows them to view, create, manage and publish their own resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - permission_allocate_user_resources: Allocate user resources - permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. + permission_view_resource_planners: View resource planners + permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - label_resource_management: Resource planning - button_next: Save + plugin_openproject_resource_management: + description: Provides resource management and capacity planning. + name: OpenProject Resource Management + project_module_resource_management: Resource management resource_management: - label_resource_planner: Resource planner - label_resource_planner_plural: Resource planners - label_new_resource_planner: New resource planner - public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. - - ' + action: + delete: Delete + favorite: Add to favorites + make_private: Make private + make_public: Make public + unfavorite: Remove from favorites + blankslate: + desc: Create a resource planner to start planning capacity for this project. + title: No resource planners yet + configure_view_dialog: + delete_confirmation: Are you sure you want to delete this view? This cannot be undone. + filter_mode: + automatic: + caption: An automatically-generated list that displays items that meet criteria you define. + label: Automatically filtered + label: Item selection + manual: + caption: A custom list of items you manually add and remove. Filtering is not possible. + label: Manually hand-picked + title: Configure view favorite_caption: 'Make this view a favorite to add it on the top section of the sidebar menu. ' - view_types: - UserCardView: Users cards - action: - favorite: Add to favorites - unfavorite: Remove from favorites - make_public: Make public - make_private: Make private - delete: Delete - sidebar: - public: Public - private: Private - blankslate: - title: No resource planners yet - desc: Create a resource planner to start planning capacity for this project. + label_new_resource_planner: New resource planner + label_resource_planner: Resource planner + label_resource_planner_plural: Resource planners + new_view_dialog: + title: Add View + public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. + + ' show: placeholder: The detailed view for this resource planner is coming soon. + sidebar: + private: Private + public: Public + sub_views: Views in this resource planner + view_types: + resource_work_package_list: + caption: Create a view based on work packages and see its details and allocation in a list + label: Work packages list + user_card: + caption: Create a view based on users and see their details and allocation in a list of user cards + label: Users card list + work_package_list: + add_work_package_dialog: + title: Add work package + allocation_placeholder: "—" + blank: + description: There are no work packages matching this view's filters yet. + title: No work packages to display + columns: + allocated_members: Allocated members + allocation: Allocation + dates: Dates + context_menu: + add_filter_criteria: Add filter criteria + add_user_group: Add user group + edit_total_work: Edit total work + label: More actions + move: Move + move_down: Move down + move_to_bottom: Move to bottom + move_to_top: Move to top + move_up: Move up + remove: Remove + remove_confirmation: Remove this work package from the view? + see_allocation: See allocation + mobile_title: Work packages + query_name: 'Resource management work packages: %{name}' + subheader: + add: Add + add_work_package: Add work package + allocate: Allocate + settings: Configure view diff --git a/modules/resource_management/config/locales/crowdin/ar.yml b/modules/resource_management/config/locales/crowdin/ar.yml index 9bf494f0c9e..bc2559af31c 100644 --- a/modules/resource_management/config/locales/crowdin/ar.yml +++ b/modules/resource_management/config/locales/crowdin/ar.yml @@ -2,72 +2,131 @@ ar: activerecord: attributes: - resource_planner: - name: Name - start_date: Start date - end_date: Finish date - default_view_class_name: Default view - public: Public - favorite: Favorite resource_allocation: + allocated_time: Allocated time + end_date: Finish date entity: Entity principal: Assignee - state: State start_date: Start date - end_date: Finish date - allocated_time: Allocated time + state: State user_filter: User filter + resource_planner: + default_view_class_name: Default view + end_date: Finish date + favorite: Favorite + name: Name + public: Public + start_date: Start date errors: models: - resource_planner: - attributes: - end_date: - greater_than_start_date: must be after the start date. resource_allocation: attributes: end_date: greater_than_start_date: must be after the start date. - plugin_openproject_resource_management: - name: OpenProject Resource Management - description: Provides resource management and capacity planning. - project_module_resource_management: Resource management - permission_view_resource_planners: View resource planners - permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. + resource_planner: + attributes: + end_date: + greater_than_start_date: must be after the start date. + resource_work_package_list: + attributes: + query: + must_be_work_package_query: must be a work package query. + models: + resource_allocation: Resource Allocation + resource_planner: Resource Planner + resource_work_package_list: Work packages list + user_card: User cards + button_next: Next + label_resource_management: Resource planning + permission_allocate_user_resources: Allocate user resources + permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. ' permission_manage_public_resource_planners: Manage public resource planners permission_manage_public_resource_planners_explanation: 'Allows users to create and manage public resource planners. It allows them to view, create, manage and publish their own resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - permission_allocate_user_resources: Allocate user resources - permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. + permission_view_resource_planners: View resource planners + permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - label_resource_management: Resource planning - button_next: Save + plugin_openproject_resource_management: + description: Provides resource management and capacity planning. + name: OpenProject Resource Management + project_module_resource_management: Resource management resource_management: - label_resource_planner: Resource planner - label_resource_planner_plural: Resource planners - label_new_resource_planner: New resource planner - public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. - - ' + action: + delete: Delete + favorite: Add to favorites + make_private: Make private + make_public: Make public + unfavorite: Remove from favorites + blankslate: + desc: Create a resource planner to start planning capacity for this project. + title: No resource planners yet + configure_view_dialog: + delete_confirmation: Are you sure you want to delete this view? This cannot be undone. + filter_mode: + automatic: + caption: An automatically-generated list that displays items that meet criteria you define. + label: Automatically filtered + label: Item selection + manual: + caption: A custom list of items you manually add and remove. Filtering is not possible. + label: Manually hand-picked + title: Configure view favorite_caption: 'Make this view a favorite to add it on the top section of the sidebar menu. ' - view_types: - UserCardView: Users cards - action: - favorite: Add to favorites - unfavorite: Remove from favorites - make_public: Make public - make_private: Make private - delete: Delete - sidebar: - public: Public - private: Private - blankslate: - title: No resource planners yet - desc: Create a resource planner to start planning capacity for this project. + label_new_resource_planner: New resource planner + label_resource_planner: Resource planner + label_resource_planner_plural: Resource planners + new_view_dialog: + title: Add View + public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. + + ' show: placeholder: The detailed view for this resource planner is coming soon. + sidebar: + private: Private + public: Public + sub_views: Views in this resource planner + view_types: + resource_work_package_list: + caption: Create a view based on work packages and see its details and allocation in a list + label: Work packages list + user_card: + caption: Create a view based on users and see their details and allocation in a list of user cards + label: Users card list + work_package_list: + add_work_package_dialog: + title: Add work package + allocation_placeholder: "—" + blank: + description: There are no work packages matching this view's filters yet. + title: No work packages to display + columns: + allocated_members: Allocated members + allocation: Allocation + dates: Dates + context_menu: + add_filter_criteria: Add filter criteria + add_user_group: Add user group + edit_total_work: Edit total work + label: More actions + move: Move + move_down: Move down + move_to_bottom: Move to bottom + move_to_top: Move to top + move_up: Move up + remove: Remove + remove_confirmation: Remove this work package from the view? + see_allocation: See allocation + mobile_title: Work packages + query_name: 'Resource management work packages: %{name}' + subheader: + add: Add + add_work_package: Add work package + allocate: Allocate + settings: Configure view diff --git a/modules/resource_management/config/locales/crowdin/az.yml b/modules/resource_management/config/locales/crowdin/az.yml index 00e59557e55..f5431ee04e7 100644 --- a/modules/resource_management/config/locales/crowdin/az.yml +++ b/modules/resource_management/config/locales/crowdin/az.yml @@ -2,72 +2,131 @@ az: activerecord: attributes: - resource_planner: - name: Name - start_date: Start date - end_date: Finish date - default_view_class_name: Default view - public: Public - favorite: Favorite resource_allocation: + allocated_time: Allocated time + end_date: Finish date entity: Entity principal: Assignee - state: State start_date: Start date - end_date: Finish date - allocated_time: Allocated time + state: State user_filter: User filter + resource_planner: + default_view_class_name: Default view + end_date: Finish date + favorite: Favorite + name: Name + public: Public + start_date: Start date errors: models: - resource_planner: - attributes: - end_date: - greater_than_start_date: must be after the start date. resource_allocation: attributes: end_date: greater_than_start_date: must be after the start date. - plugin_openproject_resource_management: - name: OpenProject Resource Management - description: Provides resource management and capacity planning. - project_module_resource_management: Resource management - permission_view_resource_planners: View resource planners - permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. + resource_planner: + attributes: + end_date: + greater_than_start_date: must be after the start date. + resource_work_package_list: + attributes: + query: + must_be_work_package_query: must be a work package query. + models: + resource_allocation: Resource Allocation + resource_planner: Resource Planner + resource_work_package_list: Work packages list + user_card: User cards + button_next: Next + label_resource_management: Resource planning + permission_allocate_user_resources: Allocate user resources + permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. ' permission_manage_public_resource_planners: Manage public resource planners permission_manage_public_resource_planners_explanation: 'Allows users to create and manage public resource planners. It allows them to view, create, manage and publish their own resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - permission_allocate_user_resources: Allocate user resources - permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. + permission_view_resource_planners: View resource planners + permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - label_resource_management: Resource planning - button_next: Save + plugin_openproject_resource_management: + description: Provides resource management and capacity planning. + name: OpenProject Resource Management + project_module_resource_management: Resource management resource_management: - label_resource_planner: Resource planner - label_resource_planner_plural: Resource planners - label_new_resource_planner: New resource planner - public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. - - ' + action: + delete: Delete + favorite: Add to favorites + make_private: Make private + make_public: Make public + unfavorite: Remove from favorites + blankslate: + desc: Create a resource planner to start planning capacity for this project. + title: No resource planners yet + configure_view_dialog: + delete_confirmation: Are you sure you want to delete this view? This cannot be undone. + filter_mode: + automatic: + caption: An automatically-generated list that displays items that meet criteria you define. + label: Automatically filtered + label: Item selection + manual: + caption: A custom list of items you manually add and remove. Filtering is not possible. + label: Manually hand-picked + title: Configure view favorite_caption: 'Make this view a favorite to add it on the top section of the sidebar menu. ' - view_types: - UserCardView: Users cards - action: - favorite: Add to favorites - unfavorite: Remove from favorites - make_public: Make public - make_private: Make private - delete: Delete - sidebar: - public: Public - private: Private - blankslate: - title: No resource planners yet - desc: Create a resource planner to start planning capacity for this project. + label_new_resource_planner: New resource planner + label_resource_planner: Resource planner + label_resource_planner_plural: Resource planners + new_view_dialog: + title: Add View + public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. + + ' show: placeholder: The detailed view for this resource planner is coming soon. + sidebar: + private: Private + public: Public + sub_views: Views in this resource planner + view_types: + resource_work_package_list: + caption: Create a view based on work packages and see its details and allocation in a list + label: Work packages list + user_card: + caption: Create a view based on users and see their details and allocation in a list of user cards + label: Users card list + work_package_list: + add_work_package_dialog: + title: Add work package + allocation_placeholder: "—" + blank: + description: There are no work packages matching this view's filters yet. + title: No work packages to display + columns: + allocated_members: Allocated members + allocation: Allocation + dates: Dates + context_menu: + add_filter_criteria: Add filter criteria + add_user_group: Add user group + edit_total_work: Edit total work + label: More actions + move: Move + move_down: Move down + move_to_bottom: Move to bottom + move_to_top: Move to top + move_up: Move up + remove: Remove + remove_confirmation: Remove this work package from the view? + see_allocation: See allocation + mobile_title: Work packages + query_name: 'Resource management work packages: %{name}' + subheader: + add: Add + add_work_package: Add work package + allocate: Allocate + settings: Configure view diff --git a/modules/resource_management/config/locales/crowdin/be.yml b/modules/resource_management/config/locales/crowdin/be.yml index 3b4722ecde6..a95150fab75 100644 --- a/modules/resource_management/config/locales/crowdin/be.yml +++ b/modules/resource_management/config/locales/crowdin/be.yml @@ -2,72 +2,131 @@ be: activerecord: attributes: - resource_planner: - name: Name - start_date: Start date - end_date: Finish date - default_view_class_name: Default view - public: Public - favorite: Favorite resource_allocation: + allocated_time: Allocated time + end_date: Finish date entity: Entity principal: Assignee - state: State start_date: Start date - end_date: Finish date - allocated_time: Allocated time + state: State user_filter: User filter + resource_planner: + default_view_class_name: Default view + end_date: Finish date + favorite: Favorite + name: Name + public: Public + start_date: Start date errors: models: - resource_planner: - attributes: - end_date: - greater_than_start_date: must be after the start date. resource_allocation: attributes: end_date: greater_than_start_date: must be after the start date. - plugin_openproject_resource_management: - name: OpenProject Resource Management - description: Provides resource management and capacity planning. - project_module_resource_management: Resource management - permission_view_resource_planners: View resource planners - permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. + resource_planner: + attributes: + end_date: + greater_than_start_date: must be after the start date. + resource_work_package_list: + attributes: + query: + must_be_work_package_query: must be a work package query. + models: + resource_allocation: Resource Allocation + resource_planner: Resource Planner + resource_work_package_list: Work packages list + user_card: User cards + button_next: Next + label_resource_management: Resource planning + permission_allocate_user_resources: Allocate user resources + permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. ' permission_manage_public_resource_planners: Manage public resource planners permission_manage_public_resource_planners_explanation: 'Allows users to create and manage public resource planners. It allows them to view, create, manage and publish their own resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - permission_allocate_user_resources: Allocate user resources - permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. + permission_view_resource_planners: View resource planners + permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - label_resource_management: Resource planning - button_next: Save + plugin_openproject_resource_management: + description: Provides resource management and capacity planning. + name: OpenProject Resource Management + project_module_resource_management: Resource management resource_management: - label_resource_planner: Resource planner - label_resource_planner_plural: Resource planners - label_new_resource_planner: New resource planner - public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. - - ' + action: + delete: Delete + favorite: Add to favorites + make_private: Make private + make_public: Make public + unfavorite: Remove from favorites + blankslate: + desc: Create a resource planner to start planning capacity for this project. + title: No resource planners yet + configure_view_dialog: + delete_confirmation: Are you sure you want to delete this view? This cannot be undone. + filter_mode: + automatic: + caption: An automatically-generated list that displays items that meet criteria you define. + label: Automatically filtered + label: Item selection + manual: + caption: A custom list of items you manually add and remove. Filtering is not possible. + label: Manually hand-picked + title: Configure view favorite_caption: 'Make this view a favorite to add it on the top section of the sidebar menu. ' - view_types: - UserCardView: Users cards - action: - favorite: Add to favorites - unfavorite: Remove from favorites - make_public: Make public - make_private: Make private - delete: Delete - sidebar: - public: Public - private: Private - blankslate: - title: No resource planners yet - desc: Create a resource planner to start planning capacity for this project. + label_new_resource_planner: New resource planner + label_resource_planner: Resource planner + label_resource_planner_plural: Resource planners + new_view_dialog: + title: Add View + public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. + + ' show: placeholder: The detailed view for this resource planner is coming soon. + sidebar: + private: Private + public: Public + sub_views: Views in this resource planner + view_types: + resource_work_package_list: + caption: Create a view based on work packages and see its details and allocation in a list + label: Work packages list + user_card: + caption: Create a view based on users and see their details and allocation in a list of user cards + label: Users card list + work_package_list: + add_work_package_dialog: + title: Add work package + allocation_placeholder: "—" + blank: + description: There are no work packages matching this view's filters yet. + title: No work packages to display + columns: + allocated_members: Allocated members + allocation: Allocation + dates: Dates + context_menu: + add_filter_criteria: Add filter criteria + add_user_group: Add user group + edit_total_work: Edit total work + label: More actions + move: Move + move_down: Move down + move_to_bottom: Move to bottom + move_to_top: Move to top + move_up: Move up + remove: Remove + remove_confirmation: Remove this work package from the view? + see_allocation: See allocation + mobile_title: Work packages + query_name: 'Resource management work packages: %{name}' + subheader: + add: Add + add_work_package: Add work package + allocate: Allocate + settings: Configure view diff --git a/modules/resource_management/config/locales/crowdin/bg.yml b/modules/resource_management/config/locales/crowdin/bg.yml index 2fda2d4e89d..32188f9cffd 100644 --- a/modules/resource_management/config/locales/crowdin/bg.yml +++ b/modules/resource_management/config/locales/crowdin/bg.yml @@ -2,72 +2,131 @@ bg: activerecord: attributes: - resource_planner: - name: Name - start_date: Start date - end_date: Finish date - default_view_class_name: Default view - public: Public - favorite: Favorite resource_allocation: + allocated_time: Allocated time + end_date: Finish date entity: Entity principal: Assignee - state: State start_date: Start date - end_date: Finish date - allocated_time: Allocated time + state: State user_filter: User filter + resource_planner: + default_view_class_name: Default view + end_date: Finish date + favorite: Favorite + name: Name + public: Public + start_date: Start date errors: models: - resource_planner: - attributes: - end_date: - greater_than_start_date: must be after the start date. resource_allocation: attributes: end_date: greater_than_start_date: must be after the start date. - plugin_openproject_resource_management: - name: OpenProject Resource Management - description: Provides resource management and capacity planning. - project_module_resource_management: Resource management - permission_view_resource_planners: View resource planners - permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. + resource_planner: + attributes: + end_date: + greater_than_start_date: must be after the start date. + resource_work_package_list: + attributes: + query: + must_be_work_package_query: must be a work package query. + models: + resource_allocation: Resource Allocation + resource_planner: Resource Planner + resource_work_package_list: Work packages list + user_card: User cards + button_next: Next + label_resource_management: Resource planning + permission_allocate_user_resources: Allocate user resources + permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. ' permission_manage_public_resource_planners: Manage public resource planners permission_manage_public_resource_planners_explanation: 'Allows users to create and manage public resource planners. It allows them to view, create, manage and publish their own resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - permission_allocate_user_resources: Allocate user resources - permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. + permission_view_resource_planners: View resource planners + permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - label_resource_management: Resource planning - button_next: Save + plugin_openproject_resource_management: + description: Provides resource management and capacity planning. + name: OpenProject Resource Management + project_module_resource_management: Resource management resource_management: - label_resource_planner: Resource planner - label_resource_planner_plural: Resource planners - label_new_resource_planner: New resource planner - public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. - - ' + action: + delete: Delete + favorite: Add to favorites + make_private: Make private + make_public: Make public + unfavorite: Remove from favorites + blankslate: + desc: Create a resource planner to start planning capacity for this project. + title: No resource planners yet + configure_view_dialog: + delete_confirmation: Are you sure you want to delete this view? This cannot be undone. + filter_mode: + automatic: + caption: An automatically-generated list that displays items that meet criteria you define. + label: Automatically filtered + label: Item selection + manual: + caption: A custom list of items you manually add and remove. Filtering is not possible. + label: Manually hand-picked + title: Configure view favorite_caption: 'Make this view a favorite to add it on the top section of the sidebar menu. ' - view_types: - UserCardView: Users cards - action: - favorite: Add to favorites - unfavorite: Remove from favorites - make_public: Make public - make_private: Make private - delete: Delete - sidebar: - public: Public - private: Private - blankslate: - title: No resource planners yet - desc: Create a resource planner to start planning capacity for this project. + label_new_resource_planner: New resource planner + label_resource_planner: Resource planner + label_resource_planner_plural: Resource planners + new_view_dialog: + title: Add View + public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. + + ' show: placeholder: The detailed view for this resource planner is coming soon. + sidebar: + private: Private + public: Public + sub_views: Views in this resource planner + view_types: + resource_work_package_list: + caption: Create a view based on work packages and see its details and allocation in a list + label: Work packages list + user_card: + caption: Create a view based on users and see their details and allocation in a list of user cards + label: Users card list + work_package_list: + add_work_package_dialog: + title: Add work package + allocation_placeholder: "—" + blank: + description: There are no work packages matching this view's filters yet. + title: No work packages to display + columns: + allocated_members: Allocated members + allocation: Allocation + dates: Dates + context_menu: + add_filter_criteria: Add filter criteria + add_user_group: Add user group + edit_total_work: Edit total work + label: More actions + move: Move + move_down: Move down + move_to_bottom: Move to bottom + move_to_top: Move to top + move_up: Move up + remove: Remove + remove_confirmation: Remove this work package from the view? + see_allocation: See allocation + mobile_title: Work packages + query_name: 'Resource management work packages: %{name}' + subheader: + add: Add + add_work_package: Add work package + allocate: Allocate + settings: Configure view diff --git a/modules/resource_management/config/locales/crowdin/ca.yml b/modules/resource_management/config/locales/crowdin/ca.yml index 8b7f21c87f8..0a725fa2369 100644 --- a/modules/resource_management/config/locales/crowdin/ca.yml +++ b/modules/resource_management/config/locales/crowdin/ca.yml @@ -2,72 +2,131 @@ ca: activerecord: attributes: - resource_planner: - name: Name - start_date: Start date - end_date: Finish date - default_view_class_name: Default view - public: Public - favorite: Favorite resource_allocation: + allocated_time: Allocated time + end_date: Finish date entity: Entity principal: Assignee - state: State start_date: Start date - end_date: Finish date - allocated_time: Allocated time + state: State user_filter: User filter + resource_planner: + default_view_class_name: Default view + end_date: Finish date + favorite: Favorite + name: Name + public: Public + start_date: Start date errors: models: - resource_planner: - attributes: - end_date: - greater_than_start_date: must be after the start date. resource_allocation: attributes: end_date: greater_than_start_date: must be after the start date. - plugin_openproject_resource_management: - name: OpenProject Resource Management - description: Provides resource management and capacity planning. - project_module_resource_management: Resource management - permission_view_resource_planners: View resource planners - permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. + resource_planner: + attributes: + end_date: + greater_than_start_date: must be after the start date. + resource_work_package_list: + attributes: + query: + must_be_work_package_query: must be a work package query. + models: + resource_allocation: Resource Allocation + resource_planner: Resource Planner + resource_work_package_list: Work packages list + user_card: User cards + button_next: Next + label_resource_management: Resource planning + permission_allocate_user_resources: Allocate user resources + permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. ' permission_manage_public_resource_planners: Manage public resource planners permission_manage_public_resource_planners_explanation: 'Allows users to create and manage public resource planners. It allows them to view, create, manage and publish their own resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - permission_allocate_user_resources: Allocate user resources - permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. + permission_view_resource_planners: View resource planners + permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - label_resource_management: Resource planning - button_next: Save + plugin_openproject_resource_management: + description: Provides resource management and capacity planning. + name: OpenProject Resource Management + project_module_resource_management: Resource management resource_management: - label_resource_planner: Resource planner - label_resource_planner_plural: Resource planners - label_new_resource_planner: New resource planner - public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. - - ' + action: + delete: Delete + favorite: Add to favorites + make_private: Make private + make_public: Make public + unfavorite: Remove from favorites + blankslate: + desc: Create a resource planner to start planning capacity for this project. + title: No resource planners yet + configure_view_dialog: + delete_confirmation: Are you sure you want to delete this view? This cannot be undone. + filter_mode: + automatic: + caption: An automatically-generated list that displays items that meet criteria you define. + label: Automatically filtered + label: Item selection + manual: + caption: A custom list of items you manually add and remove. Filtering is not possible. + label: Manually hand-picked + title: Configure view favorite_caption: 'Make this view a favorite to add it on the top section of the sidebar menu. ' - view_types: - UserCardView: Users cards - action: - favorite: Add to favorites - unfavorite: Remove from favorites - make_public: Make public - make_private: Make private - delete: Delete - sidebar: - public: Public - private: Private - blankslate: - title: No resource planners yet - desc: Create a resource planner to start planning capacity for this project. + label_new_resource_planner: New resource planner + label_resource_planner: Resource planner + label_resource_planner_plural: Resource planners + new_view_dialog: + title: Add View + public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. + + ' show: placeholder: The detailed view for this resource planner is coming soon. + sidebar: + private: Private + public: Public + sub_views: Views in this resource planner + view_types: + resource_work_package_list: + caption: Create a view based on work packages and see its details and allocation in a list + label: Work packages list + user_card: + caption: Create a view based on users and see their details and allocation in a list of user cards + label: Users card list + work_package_list: + add_work_package_dialog: + title: Add work package + allocation_placeholder: "—" + blank: + description: There are no work packages matching this view's filters yet. + title: No work packages to display + columns: + allocated_members: Allocated members + allocation: Allocation + dates: Dates + context_menu: + add_filter_criteria: Add filter criteria + add_user_group: Add user group + edit_total_work: Edit total work + label: More actions + move: Move + move_down: Move down + move_to_bottom: Move to bottom + move_to_top: Move to top + move_up: Move up + remove: Remove + remove_confirmation: Remove this work package from the view? + see_allocation: See allocation + mobile_title: Work packages + query_name: 'Resource management work packages: %{name}' + subheader: + add: Add + add_work_package: Add work package + allocate: Allocate + settings: Configure view diff --git a/modules/resource_management/config/locales/crowdin/ckb-IR.yml b/modules/resource_management/config/locales/crowdin/ckb-IR.yml index 8d3518d5b51..c1aa5bbf4e9 100644 --- a/modules/resource_management/config/locales/crowdin/ckb-IR.yml +++ b/modules/resource_management/config/locales/crowdin/ckb-IR.yml @@ -2,72 +2,131 @@ ckb-IR: activerecord: attributes: - resource_planner: - name: Name - start_date: Start date - end_date: Finish date - default_view_class_name: Default view - public: Public - favorite: Favorite resource_allocation: + allocated_time: Allocated time + end_date: Finish date entity: Entity principal: Assignee - state: State start_date: Start date - end_date: Finish date - allocated_time: Allocated time + state: State user_filter: User filter + resource_planner: + default_view_class_name: Default view + end_date: Finish date + favorite: Favorite + name: Name + public: Public + start_date: Start date errors: models: - resource_planner: - attributes: - end_date: - greater_than_start_date: must be after the start date. resource_allocation: attributes: end_date: greater_than_start_date: must be after the start date. - plugin_openproject_resource_management: - name: OpenProject Resource Management - description: Provides resource management and capacity planning. - project_module_resource_management: Resource management - permission_view_resource_planners: View resource planners - permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. + resource_planner: + attributes: + end_date: + greater_than_start_date: must be after the start date. + resource_work_package_list: + attributes: + query: + must_be_work_package_query: must be a work package query. + models: + resource_allocation: Resource Allocation + resource_planner: Resource Planner + resource_work_package_list: Work packages list + user_card: User cards + button_next: Next + label_resource_management: Resource planning + permission_allocate_user_resources: Allocate user resources + permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. ' permission_manage_public_resource_planners: Manage public resource planners permission_manage_public_resource_planners_explanation: 'Allows users to create and manage public resource planners. It allows them to view, create, manage and publish their own resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - permission_allocate_user_resources: Allocate user resources - permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. + permission_view_resource_planners: View resource planners + permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - label_resource_management: Resource planning - button_next: Save + plugin_openproject_resource_management: + description: Provides resource management and capacity planning. + name: OpenProject Resource Management + project_module_resource_management: Resource management resource_management: - label_resource_planner: Resource planner - label_resource_planner_plural: Resource planners - label_new_resource_planner: New resource planner - public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. - - ' + action: + delete: Delete + favorite: Add to favorites + make_private: Make private + make_public: Make public + unfavorite: Remove from favorites + blankslate: + desc: Create a resource planner to start planning capacity for this project. + title: No resource planners yet + configure_view_dialog: + delete_confirmation: Are you sure you want to delete this view? This cannot be undone. + filter_mode: + automatic: + caption: An automatically-generated list that displays items that meet criteria you define. + label: Automatically filtered + label: Item selection + manual: + caption: A custom list of items you manually add and remove. Filtering is not possible. + label: Manually hand-picked + title: Configure view favorite_caption: 'Make this view a favorite to add it on the top section of the sidebar menu. ' - view_types: - UserCardView: Users cards - action: - favorite: Add to favorites - unfavorite: Remove from favorites - make_public: Make public - make_private: Make private - delete: Delete - sidebar: - public: Public - private: Private - blankslate: - title: No resource planners yet - desc: Create a resource planner to start planning capacity for this project. + label_new_resource_planner: New resource planner + label_resource_planner: Resource planner + label_resource_planner_plural: Resource planners + new_view_dialog: + title: Add View + public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. + + ' show: placeholder: The detailed view for this resource planner is coming soon. + sidebar: + private: Private + public: Public + sub_views: Views in this resource planner + view_types: + resource_work_package_list: + caption: Create a view based on work packages and see its details and allocation in a list + label: Work packages list + user_card: + caption: Create a view based on users and see their details and allocation in a list of user cards + label: Users card list + work_package_list: + add_work_package_dialog: + title: Add work package + allocation_placeholder: "—" + blank: + description: There are no work packages matching this view's filters yet. + title: No work packages to display + columns: + allocated_members: Allocated members + allocation: Allocation + dates: Dates + context_menu: + add_filter_criteria: Add filter criteria + add_user_group: Add user group + edit_total_work: Edit total work + label: More actions + move: Move + move_down: Move down + move_to_bottom: Move to bottom + move_to_top: Move to top + move_up: Move up + remove: Remove + remove_confirmation: Remove this work package from the view? + see_allocation: See allocation + mobile_title: Work packages + query_name: 'Resource management work packages: %{name}' + subheader: + add: Add + add_work_package: Add work package + allocate: Allocate + settings: Configure view diff --git a/modules/resource_management/config/locales/crowdin/cs.yml b/modules/resource_management/config/locales/crowdin/cs.yml index a1e875e1417..5773d4af0ab 100644 --- a/modules/resource_management/config/locales/crowdin/cs.yml +++ b/modules/resource_management/config/locales/crowdin/cs.yml @@ -2,72 +2,131 @@ cs: activerecord: attributes: - resource_planner: - name: Name - start_date: Start date - end_date: Finish date - default_view_class_name: Default view - public: Public - favorite: Favorite resource_allocation: + allocated_time: Allocated time + end_date: Finish date entity: Entity principal: Assignee - state: State start_date: Start date - end_date: Finish date - allocated_time: Allocated time + state: State user_filter: User filter + resource_planner: + default_view_class_name: Default view + end_date: Finish date + favorite: Favorite + name: Name + public: Public + start_date: Start date errors: models: - resource_planner: - attributes: - end_date: - greater_than_start_date: must be after the start date. resource_allocation: attributes: end_date: greater_than_start_date: must be after the start date. - plugin_openproject_resource_management: - name: OpenProject Resource Management - description: Provides resource management and capacity planning. - project_module_resource_management: Resource management - permission_view_resource_planners: View resource planners - permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. + resource_planner: + attributes: + end_date: + greater_than_start_date: must be after the start date. + resource_work_package_list: + attributes: + query: + must_be_work_package_query: must be a work package query. + models: + resource_allocation: Resource Allocation + resource_planner: Resource Planner + resource_work_package_list: Work packages list + user_card: User cards + button_next: Next + label_resource_management: Resource planning + permission_allocate_user_resources: Allocate user resources + permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. ' permission_manage_public_resource_planners: Manage public resource planners permission_manage_public_resource_planners_explanation: 'Allows users to create and manage public resource planners. It allows them to view, create, manage and publish their own resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - permission_allocate_user_resources: Allocate user resources - permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. + permission_view_resource_planners: View resource planners + permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - label_resource_management: Resource planning - button_next: Save + plugin_openproject_resource_management: + description: Provides resource management and capacity planning. + name: OpenProject Resource Management + project_module_resource_management: Resource management resource_management: - label_resource_planner: Resource planner - label_resource_planner_plural: Resource planners - label_new_resource_planner: New resource planner - public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. - - ' + action: + delete: Delete + favorite: Add to favorites + make_private: Make private + make_public: Make public + unfavorite: Remove from favorites + blankslate: + desc: Create a resource planner to start planning capacity for this project. + title: No resource planners yet + configure_view_dialog: + delete_confirmation: Are you sure you want to delete this view? This cannot be undone. + filter_mode: + automatic: + caption: An automatically-generated list that displays items that meet criteria you define. + label: Automatically filtered + label: Item selection + manual: + caption: A custom list of items you manually add and remove. Filtering is not possible. + label: Manually hand-picked + title: Configure view favorite_caption: 'Make this view a favorite to add it on the top section of the sidebar menu. ' - view_types: - UserCardView: Users cards - action: - favorite: Add to favorites - unfavorite: Remove from favorites - make_public: Make public - make_private: Make private - delete: Delete - sidebar: - public: Public - private: Private - blankslate: - title: No resource planners yet - desc: Create a resource planner to start planning capacity for this project. + label_new_resource_planner: New resource planner + label_resource_planner: Resource planner + label_resource_planner_plural: Resource planners + new_view_dialog: + title: Add View + public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. + + ' show: placeholder: The detailed view for this resource planner is coming soon. + sidebar: + private: Private + public: Public + sub_views: Views in this resource planner + view_types: + resource_work_package_list: + caption: Create a view based on work packages and see its details and allocation in a list + label: Work packages list + user_card: + caption: Create a view based on users and see their details and allocation in a list of user cards + label: Users card list + work_package_list: + add_work_package_dialog: + title: Add work package + allocation_placeholder: "—" + blank: + description: There are no work packages matching this view's filters yet. + title: No work packages to display + columns: + allocated_members: Allocated members + allocation: Allocation + dates: Dates + context_menu: + add_filter_criteria: Add filter criteria + add_user_group: Add user group + edit_total_work: Edit total work + label: More actions + move: Move + move_down: Move down + move_to_bottom: Move to bottom + move_to_top: Move to top + move_up: Move up + remove: Remove + remove_confirmation: Remove this work package from the view? + see_allocation: See allocation + mobile_title: Work packages + query_name: 'Resource management work packages: %{name}' + subheader: + add: Add + add_work_package: Add work package + allocate: Allocate + settings: Configure view diff --git a/modules/resource_management/config/locales/crowdin/da.yml b/modules/resource_management/config/locales/crowdin/da.yml index 83cf3e3c6c7..70b18202409 100644 --- a/modules/resource_management/config/locales/crowdin/da.yml +++ b/modules/resource_management/config/locales/crowdin/da.yml @@ -2,72 +2,131 @@ da: activerecord: attributes: - resource_planner: - name: Name - start_date: Start date - end_date: Finish date - default_view_class_name: Default view - public: Public - favorite: Favorite resource_allocation: + allocated_time: Allocated time + end_date: Finish date entity: Entity principal: Assignee - state: State start_date: Start date - end_date: Finish date - allocated_time: Allocated time + state: State user_filter: User filter + resource_planner: + default_view_class_name: Default view + end_date: Finish date + favorite: Favorite + name: Name + public: Public + start_date: Start date errors: models: - resource_planner: - attributes: - end_date: - greater_than_start_date: must be after the start date. resource_allocation: attributes: end_date: greater_than_start_date: must be after the start date. - plugin_openproject_resource_management: - name: OpenProject Resource Management - description: Provides resource management and capacity planning. - project_module_resource_management: Resource management - permission_view_resource_planners: View resource planners - permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. + resource_planner: + attributes: + end_date: + greater_than_start_date: must be after the start date. + resource_work_package_list: + attributes: + query: + must_be_work_package_query: must be a work package query. + models: + resource_allocation: Resource Allocation + resource_planner: Resource Planner + resource_work_package_list: Work packages list + user_card: User cards + button_next: Next + label_resource_management: Resource planning + permission_allocate_user_resources: Allocate user resources + permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. ' permission_manage_public_resource_planners: Manage public resource planners permission_manage_public_resource_planners_explanation: 'Allows users to create and manage public resource planners. It allows them to view, create, manage and publish their own resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - permission_allocate_user_resources: Allocate user resources - permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. + permission_view_resource_planners: View resource planners + permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - label_resource_management: Resource planning - button_next: Save + plugin_openproject_resource_management: + description: Provides resource management and capacity planning. + name: OpenProject Resource Management + project_module_resource_management: Resource management resource_management: - label_resource_planner: Resource planner - label_resource_planner_plural: Resource planners - label_new_resource_planner: New resource planner - public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. - - ' + action: + delete: Delete + favorite: Add to favorites + make_private: Make private + make_public: Make public + unfavorite: Remove from favorites + blankslate: + desc: Create a resource planner to start planning capacity for this project. + title: No resource planners yet + configure_view_dialog: + delete_confirmation: Are you sure you want to delete this view? This cannot be undone. + filter_mode: + automatic: + caption: An automatically-generated list that displays items that meet criteria you define. + label: Automatically filtered + label: Item selection + manual: + caption: A custom list of items you manually add and remove. Filtering is not possible. + label: Manually hand-picked + title: Configure view favorite_caption: 'Make this view a favorite to add it on the top section of the sidebar menu. ' - view_types: - UserCardView: Users cards - action: - favorite: Add to favorites - unfavorite: Remove from favorites - make_public: Make public - make_private: Make private - delete: Delete - sidebar: - public: Public - private: Private - blankslate: - title: No resource planners yet - desc: Create a resource planner to start planning capacity for this project. + label_new_resource_planner: New resource planner + label_resource_planner: Resource planner + label_resource_planner_plural: Resource planners + new_view_dialog: + title: Add View + public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. + + ' show: placeholder: The detailed view for this resource planner is coming soon. + sidebar: + private: Private + public: Public + sub_views: Views in this resource planner + view_types: + resource_work_package_list: + caption: Create a view based on work packages and see its details and allocation in a list + label: Work packages list + user_card: + caption: Create a view based on users and see their details and allocation in a list of user cards + label: Users card list + work_package_list: + add_work_package_dialog: + title: Add work package + allocation_placeholder: "—" + blank: + description: There are no work packages matching this view's filters yet. + title: No work packages to display + columns: + allocated_members: Allocated members + allocation: Allocation + dates: Dates + context_menu: + add_filter_criteria: Add filter criteria + add_user_group: Add user group + edit_total_work: Edit total work + label: More actions + move: Move + move_down: Move down + move_to_bottom: Move to bottom + move_to_top: Move to top + move_up: Move up + remove: Remove + remove_confirmation: Remove this work package from the view? + see_allocation: See allocation + mobile_title: Work packages + query_name: 'Resource management work packages: %{name}' + subheader: + add: Add + add_work_package: Add work package + allocate: Allocate + settings: Configure view diff --git a/modules/resource_management/config/locales/crowdin/de.yml b/modules/resource_management/config/locales/crowdin/de.yml index 378f88fe3c8..f0687b4ba8d 100644 --- a/modules/resource_management/config/locales/crowdin/de.yml +++ b/modules/resource_management/config/locales/crowdin/de.yml @@ -2,72 +2,131 @@ de: activerecord: attributes: - resource_planner: - name: Name - start_date: Anfangstermin - end_date: Endtermin - default_view_class_name: Standardansicht - public: Öffentlich - favorite: Favorit resource_allocation: + allocated_time: Zugewiesene Zeit + end_date: Endtermin entity: Entität principal: Zugewiesen an - state: Status start_date: Anfangstermin - end_date: Endtermin - allocated_time: Zugewiesene Zeit + state: Status user_filter: Benutzerfilter + resource_planner: + default_view_class_name: Standardansicht + end_date: Endtermin + favorite: Favorit + name: Name + public: Öffentlich + start_date: Anfangstermin errors: models: - resource_planner: - attributes: - end_date: - greater_than_start_date: muss nach dem Anfangstermin liegen. resource_allocation: attributes: end_date: greater_than_start_date: muss nach dem Anfangstermin liegen. - plugin_openproject_resource_management: - name: OpenProject Ressourcenmanagement - description: Bietet Ressourcenmanagement und Kapazitätsplanung. - project_module_resource_management: Ressourcen Management - permission_view_resource_planners: Ressourcenplaner anzeigen - permission_view_resource_planners_explanation: 'Ermöglicht Benutzern den Zugang zu Ressourcenplanern. Sie können damit eigenen Ressourcenplaner erstellen, verwalten und öffentliche Ressourcenplaner einsehen. Es erlaubt Benutzern nicht, die von anderen Benutzern erstellten Ressourcenplaner, die nicht öffentlich freigegeben sind, einzusehen. + resource_planner: + attributes: + end_date: + greater_than_start_date: muss nach dem Anfangstermin liegen. + resource_work_package_list: + attributes: + query: + must_be_work_package_query: muss mit einer Arbeitspaket-Abfrage verbunden sein. + models: + resource_allocation: Ressourcenzuteilung + resource_planner: Ressourcenplanung + resource_work_package_list: Liste von Arbeitspaketen + user_card: Benutzer-Karten + button_next: Weiter + label_resource_management: Ressourcenplanung + permission_allocate_user_resources: Benutzer-Ressourcen zuweisen + permission_allocate_user_resources_explanation: 'Ermöglicht Benutzern das Erstellen, Aktualisieren und Löschen von Ressourcenzuweisungen innerhalb eines Ressourcenplaners. Dazu gehört die Zuweisung von Benutzern (oder Benutzerfiltern) zu einem Planer und die Anpassung des zugewiesenen Zeit- und Datumsbereichs. ' permission_manage_public_resource_planners: Öffentliche Ressourcenplaner verwalten permission_manage_public_resource_planners_explanation: 'Ermöglicht Benutzern das Erstellen und Verwalten von öffentlichen Ressourcenplanern. Sie können damit ihre eigenen Ressourcenplaner anzeigen, erstellen, verwalten und veröffentlichen. Es erlaubt Benutzern nicht, die von anderen Benutzern erstellten Ressourcenplaner, die nicht öffentlich freigegeben sind, einzusehen. ' - permission_allocate_user_resources: Benutzer-Ressourcen zuweisen - permission_allocate_user_resources_explanation: 'Ermöglicht Benutzern das Erstellen, Aktualisieren und Löschen von Ressourcenzuweisungen innerhalb eines Ressourcenplaners. Dazu gehört die Zuweisung von Benutzern (oder Benutzerfiltern) zu einem Planer und die Anpassung des zugewiesenen Zeit- und Datumsbereichs. + permission_view_resource_planners: Ressourcenplaner anzeigen + permission_view_resource_planners_explanation: 'Ermöglicht Benutzern den Zugang zu Ressourcenplanern. Sie können damit eigenen Ressourcenplaner erstellen, verwalten und öffentliche Ressourcenplaner einsehen. Es erlaubt Benutzern nicht, die von anderen Benutzern erstellten Ressourcenplaner, die nicht öffentlich freigegeben sind, einzusehen. ' - label_resource_management: Ressourcenplanung - button_next: Speichern + plugin_openproject_resource_management: + description: Bietet Ressourcenmanagement und Kapazitätsplanung. + name: OpenProject Ressourcenmanagement + project_module_resource_management: Ressourcen Management resource_management: - label_resource_planner: Ressourcenplaner - label_resource_planner_plural: Ressourcenplaner - label_new_resource_planner: Ressourcenplaner erstellen - public_caption: 'Machen Sie diese Ansicht für alle Mitglieder des Projekts öffentlich. Dies hat keine Auswirkungen auf die Sichtbarkeit von Arbeitspaketen, die immer noch von den jeweiligen Benutzerrechten abhängt. - - ' + action: + delete: Löschen + favorite: Zu Favoriten hinzufügen + make_private: Als Privat festlegen + make_public: Veröffentlichen + unfavorite: Aus Favoriten entfernen + blankslate: + desc: Erstellen Sie einen Ressourcenplaner, um Kapazitäten für dieses Projekt zu planen. + title: Keine Ressourcenplaner vorhanden + configure_view_dialog: + delete_confirmation: Sind Sie sicher, dass Sie diese Ansicht löschen möchten? Dies kann nicht rückgängig gemacht werden. + filter_mode: + automatic: + caption: Eine automatisch generierte Liste, die Arbeitspakete anzeigt, die den von ihnen definierten Kriterien entsprechen. + label: Automatisch gefiltert + label: Auswahl + manual: + caption: Eine benutzerdefinierte Liste von Artikeln, die Sie manuell hinzufügen und entfernen. Eine Filterung ist nicht möglich. + label: Manuell ausgewählt + title: Ansicht konfigurieren favorite_caption: 'Machen Sie diese Ansicht zu einem Favoriten, um sie im oberen Bereich des Seitenleistenmenüs hinzuzufügen. ' - view_types: - UserCardView: Benutzer-Karten - action: - favorite: Zu Favoriten hinzufügen - unfavorite: Aus Favoriten entfernen - make_public: Veröffentlichen - make_private: Als Privat festlegen - delete: Löschen - sidebar: - public: Öffentlich - private: Privat - blankslate: - title: Keine Ressourcenplaner vorhanden - desc: Erstellen Sie einen Ressourcenplaner, um Kapazitäten für dieses Projekt zu planen. + label_new_resource_planner: Ressourcenplaner erstellen + label_resource_planner: Ressourcenplaner + label_resource_planner_plural: Ressourcenplaner + new_view_dialog: + title: Ansicht hinzufügen + public_caption: 'Machen Sie diese Ansicht für alle Mitglieder des Projekts öffentlich. Dies hat keine Auswirkungen auf die Sichtbarkeit von Arbeitspaketen, die immer noch von den jeweiligen Benutzerrechten abhängt. + + ' show: placeholder: Die detaillierte Ansicht für diesen Ressourcenplaner wird in Kürze erscheinen. + sidebar: + private: Privat + public: Öffentlich + sub_views: Ansichten in dieser Ressourcenplanung + view_types: + resource_work_package_list: + caption: Erstellen Sie eine Ansicht auf Basis von Arbeitspaketen und sehen Sie deren Details und Zuweisungen in einer Liste + label: Liste von Arbeitspaketen + user_card: + caption: Erstellen Sie eine Ansicht auf der Basis von Benutzern und sehen Sie deren Details und Zuordnung in einer Kachelansicht von Benutzerkarten + label: Benutzer-Karten + work_package_list: + add_work_package_dialog: + title: Arbeitspaket hinzufügen + allocation_placeholder: "—" + blank: + description: Es gibt noch keine Arbeitspakete, die den Filtern dieser Ansicht entsprechen. + title: Keine Arbeitspakete anzuzeigen + columns: + allocated_members: Zugewiesene Benutzer + allocation: Zuweisung + dates: Daten + context_menu: + add_filter_criteria: Filter hinzufügen + add_user_group: Benutzergruppe hinzufügen + edit_total_work: Gesamte Arbeit bearbeiten + label: Weitere Aktionen + move: Verschieben + move_down: Nach unten verschieben + move_to_bottom: Nach ganz unten verschieben + move_to_top: Nach ganz oben verschieben + move_up: Nach oben verschieben + remove: Entfernen + remove_confirmation: Dieses Arbeitspaket aus der Ansicht entfernen? + see_allocation: Zuteilung anzeigen + mobile_title: Arbeitspakete + query_name: 'Arbeitspakete zur Ressourcenverwaltung: %{name}' + subheader: + add: Hinzufügen + add_work_package: Arbeitspaket hinzufügen + allocate: Zuweisen + settings: Ansicht konfigurieren diff --git a/modules/resource_management/config/locales/crowdin/el.yml b/modules/resource_management/config/locales/crowdin/el.yml index c52de9a4161..06f9cbede2e 100644 --- a/modules/resource_management/config/locales/crowdin/el.yml +++ b/modules/resource_management/config/locales/crowdin/el.yml @@ -2,72 +2,131 @@ el: activerecord: attributes: - resource_planner: - name: Name - start_date: Start date - end_date: Finish date - default_view_class_name: Default view - public: Public - favorite: Favorite resource_allocation: + allocated_time: Allocated time + end_date: Finish date entity: Entity principal: Assignee - state: State start_date: Start date - end_date: Finish date - allocated_time: Allocated time + state: State user_filter: User filter + resource_planner: + default_view_class_name: Default view + end_date: Finish date + favorite: Favorite + name: Name + public: Public + start_date: Start date errors: models: - resource_planner: - attributes: - end_date: - greater_than_start_date: must be after the start date. resource_allocation: attributes: end_date: greater_than_start_date: must be after the start date. - plugin_openproject_resource_management: - name: OpenProject Resource Management - description: Provides resource management and capacity planning. - project_module_resource_management: Resource management - permission_view_resource_planners: View resource planners - permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. + resource_planner: + attributes: + end_date: + greater_than_start_date: must be after the start date. + resource_work_package_list: + attributes: + query: + must_be_work_package_query: must be a work package query. + models: + resource_allocation: Resource Allocation + resource_planner: Resource Planner + resource_work_package_list: Work packages list + user_card: User cards + button_next: Next + label_resource_management: Resource planning + permission_allocate_user_resources: Allocate user resources + permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. ' permission_manage_public_resource_planners: Manage public resource planners permission_manage_public_resource_planners_explanation: 'Allows users to create and manage public resource planners. It allows them to view, create, manage and publish their own resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - permission_allocate_user_resources: Allocate user resources - permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. + permission_view_resource_planners: View resource planners + permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - label_resource_management: Resource planning - button_next: Save + plugin_openproject_resource_management: + description: Provides resource management and capacity planning. + name: OpenProject Resource Management + project_module_resource_management: Resource management resource_management: - label_resource_planner: Resource planner - label_resource_planner_plural: Resource planners - label_new_resource_planner: New resource planner - public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. - - ' + action: + delete: Delete + favorite: Add to favorites + make_private: Make private + make_public: Make public + unfavorite: Remove from favorites + blankslate: + desc: Create a resource planner to start planning capacity for this project. + title: No resource planners yet + configure_view_dialog: + delete_confirmation: Are you sure you want to delete this view? This cannot be undone. + filter_mode: + automatic: + caption: An automatically-generated list that displays items that meet criteria you define. + label: Automatically filtered + label: Item selection + manual: + caption: A custom list of items you manually add and remove. Filtering is not possible. + label: Manually hand-picked + title: Configure view favorite_caption: 'Make this view a favorite to add it on the top section of the sidebar menu. ' - view_types: - UserCardView: Users cards - action: - favorite: Add to favorites - unfavorite: Remove from favorites - make_public: Make public - make_private: Make private - delete: Delete - sidebar: - public: Public - private: Private - blankslate: - title: No resource planners yet - desc: Create a resource planner to start planning capacity for this project. + label_new_resource_planner: New resource planner + label_resource_planner: Resource planner + label_resource_planner_plural: Resource planners + new_view_dialog: + title: Add View + public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. + + ' show: placeholder: The detailed view for this resource planner is coming soon. + sidebar: + private: Private + public: Public + sub_views: Views in this resource planner + view_types: + resource_work_package_list: + caption: Create a view based on work packages and see its details and allocation in a list + label: Work packages list + user_card: + caption: Create a view based on users and see their details and allocation in a list of user cards + label: Users card list + work_package_list: + add_work_package_dialog: + title: Add work package + allocation_placeholder: "—" + blank: + description: There are no work packages matching this view's filters yet. + title: No work packages to display + columns: + allocated_members: Allocated members + allocation: Allocation + dates: Dates + context_menu: + add_filter_criteria: Add filter criteria + add_user_group: Add user group + edit_total_work: Edit total work + label: More actions + move: Move + move_down: Move down + move_to_bottom: Move to bottom + move_to_top: Move to top + move_up: Move up + remove: Remove + remove_confirmation: Remove this work package from the view? + see_allocation: See allocation + mobile_title: Work packages + query_name: 'Resource management work packages: %{name}' + subheader: + add: Add + add_work_package: Add work package + allocate: Allocate + settings: Configure view diff --git a/modules/resource_management/config/locales/crowdin/eo.yml b/modules/resource_management/config/locales/crowdin/eo.yml index ce10dbc3e60..4287f269db8 100644 --- a/modules/resource_management/config/locales/crowdin/eo.yml +++ b/modules/resource_management/config/locales/crowdin/eo.yml @@ -2,72 +2,131 @@ eo: activerecord: attributes: - resource_planner: - name: Name - start_date: Start date - end_date: Finish date - default_view_class_name: Default view - public: Public - favorite: Favorite resource_allocation: + allocated_time: Allocated time + end_date: Finish date entity: Entity principal: Assignee - state: State start_date: Start date - end_date: Finish date - allocated_time: Allocated time + state: State user_filter: User filter + resource_planner: + default_view_class_name: Default view + end_date: Finish date + favorite: Favorite + name: Name + public: Public + start_date: Start date errors: models: - resource_planner: - attributes: - end_date: - greater_than_start_date: must be after the start date. resource_allocation: attributes: end_date: greater_than_start_date: must be after the start date. - plugin_openproject_resource_management: - name: OpenProject Resource Management - description: Provides resource management and capacity planning. - project_module_resource_management: Resource management - permission_view_resource_planners: View resource planners - permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. + resource_planner: + attributes: + end_date: + greater_than_start_date: must be after the start date. + resource_work_package_list: + attributes: + query: + must_be_work_package_query: must be a work package query. + models: + resource_allocation: Resource Allocation + resource_planner: Resource Planner + resource_work_package_list: Work packages list + user_card: User cards + button_next: Next + label_resource_management: Resource planning + permission_allocate_user_resources: Allocate user resources + permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. ' permission_manage_public_resource_planners: Manage public resource planners permission_manage_public_resource_planners_explanation: 'Allows users to create and manage public resource planners. It allows them to view, create, manage and publish their own resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - permission_allocate_user_resources: Allocate user resources - permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. + permission_view_resource_planners: View resource planners + permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - label_resource_management: Resource planning - button_next: Save + plugin_openproject_resource_management: + description: Provides resource management and capacity planning. + name: OpenProject Resource Management + project_module_resource_management: Resource management resource_management: - label_resource_planner: Resource planner - label_resource_planner_plural: Resource planners - label_new_resource_planner: New resource planner - public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. - - ' + action: + delete: Delete + favorite: Add to favorites + make_private: Make private + make_public: Make public + unfavorite: Remove from favorites + blankslate: + desc: Create a resource planner to start planning capacity for this project. + title: No resource planners yet + configure_view_dialog: + delete_confirmation: Are you sure you want to delete this view? This cannot be undone. + filter_mode: + automatic: + caption: An automatically-generated list that displays items that meet criteria you define. + label: Automatically filtered + label: Item selection + manual: + caption: A custom list of items you manually add and remove. Filtering is not possible. + label: Manually hand-picked + title: Configure view favorite_caption: 'Make this view a favorite to add it on the top section of the sidebar menu. ' - view_types: - UserCardView: Users cards - action: - favorite: Add to favorites - unfavorite: Remove from favorites - make_public: Make public - make_private: Make private - delete: Delete - sidebar: - public: Public - private: Private - blankslate: - title: No resource planners yet - desc: Create a resource planner to start planning capacity for this project. + label_new_resource_planner: New resource planner + label_resource_planner: Resource planner + label_resource_planner_plural: Resource planners + new_view_dialog: + title: Add View + public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. + + ' show: placeholder: The detailed view for this resource planner is coming soon. + sidebar: + private: Private + public: Public + sub_views: Views in this resource planner + view_types: + resource_work_package_list: + caption: Create a view based on work packages and see its details and allocation in a list + label: Work packages list + user_card: + caption: Create a view based on users and see their details and allocation in a list of user cards + label: Users card list + work_package_list: + add_work_package_dialog: + title: Add work package + allocation_placeholder: "—" + blank: + description: There are no work packages matching this view's filters yet. + title: No work packages to display + columns: + allocated_members: Allocated members + allocation: Allocation + dates: Dates + context_menu: + add_filter_criteria: Add filter criteria + add_user_group: Add user group + edit_total_work: Edit total work + label: More actions + move: Move + move_down: Move down + move_to_bottom: Move to bottom + move_to_top: Move to top + move_up: Move up + remove: Remove + remove_confirmation: Remove this work package from the view? + see_allocation: See allocation + mobile_title: Work packages + query_name: 'Resource management work packages: %{name}' + subheader: + add: Add + add_work_package: Add work package + allocate: Allocate + settings: Configure view diff --git a/modules/resource_management/config/locales/crowdin/es.yml b/modules/resource_management/config/locales/crowdin/es.yml index bcb5a6a4734..291953208f0 100644 --- a/modules/resource_management/config/locales/crowdin/es.yml +++ b/modules/resource_management/config/locales/crowdin/es.yml @@ -2,72 +2,131 @@ es: activerecord: attributes: - resource_planner: - name: Nombre - start_date: Fecha de inicio - end_date: Fecha de finalización - default_view_class_name: Vista por defecto - public: Público - favorite: Favorito resource_allocation: + allocated_time: Tiempo asignado + end_date: Fecha de finalización entity: Entidad principal: Asignado - state: Estado start_date: Fecha de inicio - end_date: Fecha de finalización - allocated_time: Tiempo asignado + state: Estado user_filter: Filtro de usuarios + resource_planner: + default_view_class_name: Vista por defecto + end_date: Fecha de finalización + favorite: Favorito + name: Nombre + public: Público + start_date: Fecha de inicio errors: models: - resource_planner: - attributes: - end_date: - greater_than_start_date: debe ser posterior a la fecha de inicio. resource_allocation: attributes: end_date: greater_than_start_date: debe ser posterior a la fecha de inicio. - plugin_openproject_resource_management: - name: Gestión de recursos de OpenProject - description: Proporciona gestión de recursos y planificación de capacidades. - project_module_resource_management: Gestión de recursos - permission_view_resource_planners: Ver planificadores de recursos - permission_view_resource_planners_explanation: 'Permite a los usuarios acceder a los planificadores de recursos. Les permite crear y gestionar sus propios planificadores de recursos, así como consultar los planificadores de recursos públicos. No permite a los usuarios consultar los planificadores de recursos creados por otros usuarios que no se hayan compartido públicamente. + resource_planner: + attributes: + end_date: + greater_than_start_date: debe ser posterior a la fecha de inicio. + resource_work_package_list: + attributes: + query: + must_be_work_package_query: debe ser una consulta del paquete de trabajo. + models: + resource_allocation: Asignación de recursos + resource_planner: Planificador de recursos + resource_work_package_list: Lista de paquetes de trabajo + user_card: Tarjetas de usuario + button_next: Siguiente + label_resource_management: Planificación de recursos + permission_allocate_user_resources: Asignar recursos de usuario + permission_allocate_user_resources_explanation: 'Permite a los usuarios crear, actualizar y eliminar asignaciones de recursos dentro de un planificador de recursos. Esto incluye asignar usuarios (o filtros de usuarios) a un planificador y ajustar el intervalo de tiempo y fecha asignado. ' permission_manage_public_resource_planners: Gestionar los planificadores de recursos públicos permission_manage_public_resource_planners_explanation: 'Permite a los usuarios crear y gestionar planificadores de recursos públicos. Les permite ver, crear, gestionar y publicar sus propios planificadores de recursos. No permite a los usuarios ver los planificadores de recursos creados por otros usuarios que no se hayan compartido públicamente. ' - permission_allocate_user_resources: Asignar recursos de usuario - permission_allocate_user_resources_explanation: 'Permite a los usuarios crear, actualizar y eliminar asignaciones de recursos dentro de un planificador de recursos. Esto incluye asignar usuarios (o filtros de usuarios) a un planificador y ajustar el intervalo de tiempo y fecha asignado. + permission_view_resource_planners: Ver planificadores de recursos + permission_view_resource_planners_explanation: 'Permite a los usuarios acceder a los planificadores de recursos. Les permite crear y gestionar sus propios planificadores de recursos, así como consultar los planificadores de recursos públicos. No permite a los usuarios consultar los planificadores de recursos creados por otros usuarios que no se hayan compartido públicamente. ' - label_resource_management: Planificación de recursos - button_next: Guardar + plugin_openproject_resource_management: + description: Proporciona gestión de recursos y planificación de capacidades. + name: Gestión de recursos de OpenProject + project_module_resource_management: Gestión de recursos resource_management: - label_resource_planner: Planificador de recursos - label_resource_planner_plural: Planificadores de recursos - label_new_resource_planner: Nuevo planificador de recursos - public_caption: 'Haga que esta vista sea pública para todos los miembros del proyecto. Esto no afecta a la visibilidad de los paquetes de trabajo, que sigue dependiendo de los permisos de cada usuario. - - ' + action: + delete: Eliminar + favorite: Añadir a favoritos + make_private: Marcar como privado + make_public: Marcar como público + unfavorite: Eliminar de favoritos + blankslate: + desc: Cree un planificador de recursos para empezar a planificar la capacidad de este proyecto. + title: Aún no hay planificadores de recursos + configure_view_dialog: + delete_confirmation: "¿Seguro que deseas eliminar esta vista? Esta acción no se puede deshacer." + filter_mode: + automatic: + caption: Una lista generada automáticamente que muestra los elementos que cumplen los criterios que tú definas. + label: Filtrado automático + label: Selección de elementos + manual: + caption: Una lista personalizada de elementos que puedes añadir y eliminar manualmente. No se puede filtrar los resultados. + label: Selección manual + title: Configurar vista favorite_caption: 'Convierta esta vista en favorita para añadirla a la sección superior del menú de la barra lateral. ' - view_types: - UserCardView: Tarjetas de usuario - action: - favorite: Añadir a favoritos - unfavorite: Eliminar de favoritos - make_public: Marcar como público - make_private: Marcar como privado - delete: Eliminar - sidebar: - public: Público - private: Privado - blankslate: - title: Aún no hay planificadores de recursos - desc: Cree un planificador de recursos para empezar a planificar la capacidad de este proyecto. + label_new_resource_planner: Nuevo planificador de recursos + label_resource_planner: Planificador de recursos + label_resource_planner_plural: Planificadores de recursos + new_view_dialog: + title: Añadir vista + public_caption: 'Haga que esta vista sea pública para todos los miembros del proyecto. Esto no afecta a la visibilidad de los paquetes de trabajo, que sigue dependiendo de los permisos de cada usuario. + + ' show: placeholder: La vista detallada de este planificador de recursos estará disponible en breve. + sidebar: + private: Privado + public: Público + sub_views: Vistas en este planificador de recursos + view_types: + resource_work_package_list: + caption: Crea una vista basada en los paquetes de trabajo y consulta sus detalles y su asignación en una lista + label: Lista de paquetes de trabajo + user_card: + caption: Crea una vista basada en los usuarios y consulta sus datos y su asignación en una lista de fichas de usuario + label: Lista de tarjetas de usuario + work_package_list: + add_work_package_dialog: + title: Añadir paquete de trabajo + allocation_placeholder: "—" + blank: + description: Todavía no hay paquetes de trabajo que se ajusten a los filtros de esta vista. + title: No hay paquetes de trabajo para mostrar + columns: + allocated_members: Miembros asignados + allocation: Asignación + dates: Fechas + context_menu: + add_filter_criteria: Añadir criterios de filtrado + add_user_group: Añadir grupo de usuarios + edit_total_work: Editar el trabajo total + label: Más acciones + move: Mover + move_down: Mover hacia abajo + move_to_bottom: Mover al final + move_to_top: Mover al principio + move_up: Mover hacia arriba + remove: Eliminar + remove_confirmation: "¿Eliminar este paquete de trabajo de la vista?" + see_allocation: Ver asignación + mobile_title: Paquetes de trabajo + query_name: 'Paquetes de trabajo de gestión de recursos: %{name}' + subheader: + add: Añadir + add_work_package: Añadir paquete de trabajo + allocate: Asignar + settings: Configurar vista diff --git a/modules/resource_management/config/locales/crowdin/et.yml b/modules/resource_management/config/locales/crowdin/et.yml index 8832dbf1b29..e79a63d4d11 100644 --- a/modules/resource_management/config/locales/crowdin/et.yml +++ b/modules/resource_management/config/locales/crowdin/et.yml @@ -2,72 +2,131 @@ et: activerecord: attributes: - resource_planner: - name: Name - start_date: Start date - end_date: Finish date - default_view_class_name: Default view - public: Public - favorite: Favorite resource_allocation: + allocated_time: Allocated time + end_date: Finish date entity: Entity principal: Assignee - state: State start_date: Start date - end_date: Finish date - allocated_time: Allocated time + state: State user_filter: User filter + resource_planner: + default_view_class_name: Default view + end_date: Finish date + favorite: Favorite + name: Name + public: Public + start_date: Start date errors: models: - resource_planner: - attributes: - end_date: - greater_than_start_date: must be after the start date. resource_allocation: attributes: end_date: greater_than_start_date: must be after the start date. - plugin_openproject_resource_management: - name: OpenProject Resource Management - description: Provides resource management and capacity planning. - project_module_resource_management: Resource management - permission_view_resource_planners: View resource planners - permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. + resource_planner: + attributes: + end_date: + greater_than_start_date: must be after the start date. + resource_work_package_list: + attributes: + query: + must_be_work_package_query: must be a work package query. + models: + resource_allocation: Resource Allocation + resource_planner: Resource Planner + resource_work_package_list: Work packages list + user_card: User cards + button_next: Next + label_resource_management: Resource planning + permission_allocate_user_resources: Allocate user resources + permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. ' permission_manage_public_resource_planners: Manage public resource planners permission_manage_public_resource_planners_explanation: 'Allows users to create and manage public resource planners. It allows them to view, create, manage and publish their own resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - permission_allocate_user_resources: Allocate user resources - permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. + permission_view_resource_planners: View resource planners + permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - label_resource_management: Resource planning - button_next: Save + plugin_openproject_resource_management: + description: Provides resource management and capacity planning. + name: OpenProject Resource Management + project_module_resource_management: Resource management resource_management: - label_resource_planner: Resource planner - label_resource_planner_plural: Resource planners - label_new_resource_planner: New resource planner - public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. - - ' + action: + delete: Delete + favorite: Add to favorites + make_private: Make private + make_public: Make public + unfavorite: Remove from favorites + blankslate: + desc: Create a resource planner to start planning capacity for this project. + title: No resource planners yet + configure_view_dialog: + delete_confirmation: Are you sure you want to delete this view? This cannot be undone. + filter_mode: + automatic: + caption: An automatically-generated list that displays items that meet criteria you define. + label: Automatically filtered + label: Item selection + manual: + caption: A custom list of items you manually add and remove. Filtering is not possible. + label: Manually hand-picked + title: Configure view favorite_caption: 'Make this view a favorite to add it on the top section of the sidebar menu. ' - view_types: - UserCardView: Users cards - action: - favorite: Add to favorites - unfavorite: Remove from favorites - make_public: Make public - make_private: Make private - delete: Delete - sidebar: - public: Public - private: Private - blankslate: - title: No resource planners yet - desc: Create a resource planner to start planning capacity for this project. + label_new_resource_planner: New resource planner + label_resource_planner: Resource planner + label_resource_planner_plural: Resource planners + new_view_dialog: + title: Add View + public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. + + ' show: placeholder: The detailed view for this resource planner is coming soon. + sidebar: + private: Private + public: Public + sub_views: Views in this resource planner + view_types: + resource_work_package_list: + caption: Create a view based on work packages and see its details and allocation in a list + label: Work packages list + user_card: + caption: Create a view based on users and see their details and allocation in a list of user cards + label: Users card list + work_package_list: + add_work_package_dialog: + title: Add work package + allocation_placeholder: "—" + blank: + description: There are no work packages matching this view's filters yet. + title: No work packages to display + columns: + allocated_members: Allocated members + allocation: Allocation + dates: Dates + context_menu: + add_filter_criteria: Add filter criteria + add_user_group: Add user group + edit_total_work: Edit total work + label: More actions + move: Move + move_down: Move down + move_to_bottom: Move to bottom + move_to_top: Move to top + move_up: Move up + remove: Remove + remove_confirmation: Remove this work package from the view? + see_allocation: See allocation + mobile_title: Work packages + query_name: 'Resource management work packages: %{name}' + subheader: + add: Add + add_work_package: Add work package + allocate: Allocate + settings: Configure view diff --git a/modules/resource_management/config/locales/crowdin/eu.yml b/modules/resource_management/config/locales/crowdin/eu.yml index ab94920401f..4fadd022196 100644 --- a/modules/resource_management/config/locales/crowdin/eu.yml +++ b/modules/resource_management/config/locales/crowdin/eu.yml @@ -2,72 +2,131 @@ eu: activerecord: attributes: - resource_planner: - name: Name - start_date: Start date - end_date: Finish date - default_view_class_name: Default view - public: Public - favorite: Favorite resource_allocation: + allocated_time: Allocated time + end_date: Finish date entity: Entity principal: Assignee - state: State start_date: Start date - end_date: Finish date - allocated_time: Allocated time + state: State user_filter: User filter + resource_planner: + default_view_class_name: Default view + end_date: Finish date + favorite: Favorite + name: Name + public: Public + start_date: Start date errors: models: - resource_planner: - attributes: - end_date: - greater_than_start_date: must be after the start date. resource_allocation: attributes: end_date: greater_than_start_date: must be after the start date. - plugin_openproject_resource_management: - name: OpenProject Resource Management - description: Provides resource management and capacity planning. - project_module_resource_management: Resource management - permission_view_resource_planners: View resource planners - permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. + resource_planner: + attributes: + end_date: + greater_than_start_date: must be after the start date. + resource_work_package_list: + attributes: + query: + must_be_work_package_query: must be a work package query. + models: + resource_allocation: Resource Allocation + resource_planner: Resource Planner + resource_work_package_list: Work packages list + user_card: User cards + button_next: Next + label_resource_management: Resource planning + permission_allocate_user_resources: Allocate user resources + permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. ' permission_manage_public_resource_planners: Manage public resource planners permission_manage_public_resource_planners_explanation: 'Allows users to create and manage public resource planners. It allows them to view, create, manage and publish their own resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - permission_allocate_user_resources: Allocate user resources - permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. + permission_view_resource_planners: View resource planners + permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - label_resource_management: Resource planning - button_next: Save + plugin_openproject_resource_management: + description: Provides resource management and capacity planning. + name: OpenProject Resource Management + project_module_resource_management: Resource management resource_management: - label_resource_planner: Resource planner - label_resource_planner_plural: Resource planners - label_new_resource_planner: New resource planner - public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. - - ' + action: + delete: Delete + favorite: Add to favorites + make_private: Make private + make_public: Make public + unfavorite: Remove from favorites + blankslate: + desc: Create a resource planner to start planning capacity for this project. + title: No resource planners yet + configure_view_dialog: + delete_confirmation: Are you sure you want to delete this view? This cannot be undone. + filter_mode: + automatic: + caption: An automatically-generated list that displays items that meet criteria you define. + label: Automatically filtered + label: Item selection + manual: + caption: A custom list of items you manually add and remove. Filtering is not possible. + label: Manually hand-picked + title: Configure view favorite_caption: 'Make this view a favorite to add it on the top section of the sidebar menu. ' - view_types: - UserCardView: Users cards - action: - favorite: Add to favorites - unfavorite: Remove from favorites - make_public: Make public - make_private: Make private - delete: Delete - sidebar: - public: Public - private: Private - blankslate: - title: No resource planners yet - desc: Create a resource planner to start planning capacity for this project. + label_new_resource_planner: New resource planner + label_resource_planner: Resource planner + label_resource_planner_plural: Resource planners + new_view_dialog: + title: Add View + public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. + + ' show: placeholder: The detailed view for this resource planner is coming soon. + sidebar: + private: Private + public: Public + sub_views: Views in this resource planner + view_types: + resource_work_package_list: + caption: Create a view based on work packages and see its details and allocation in a list + label: Work packages list + user_card: + caption: Create a view based on users and see their details and allocation in a list of user cards + label: Users card list + work_package_list: + add_work_package_dialog: + title: Add work package + allocation_placeholder: "—" + blank: + description: There are no work packages matching this view's filters yet. + title: No work packages to display + columns: + allocated_members: Allocated members + allocation: Allocation + dates: Dates + context_menu: + add_filter_criteria: Add filter criteria + add_user_group: Add user group + edit_total_work: Edit total work + label: More actions + move: Move + move_down: Move down + move_to_bottom: Move to bottom + move_to_top: Move to top + move_up: Move up + remove: Remove + remove_confirmation: Remove this work package from the view? + see_allocation: See allocation + mobile_title: Work packages + query_name: 'Resource management work packages: %{name}' + subheader: + add: Add + add_work_package: Add work package + allocate: Allocate + settings: Configure view diff --git a/modules/resource_management/config/locales/crowdin/fa.yml b/modules/resource_management/config/locales/crowdin/fa.yml index 7c0ff80c832..58906941095 100644 --- a/modules/resource_management/config/locales/crowdin/fa.yml +++ b/modules/resource_management/config/locales/crowdin/fa.yml @@ -2,72 +2,131 @@ fa: activerecord: attributes: - resource_planner: - name: Name - start_date: Start date - end_date: Finish date - default_view_class_name: Default view - public: Public - favorite: Favorite resource_allocation: + allocated_time: Allocated time + end_date: Finish date entity: Entity principal: Assignee - state: State start_date: Start date - end_date: Finish date - allocated_time: Allocated time + state: State user_filter: User filter + resource_planner: + default_view_class_name: Default view + end_date: Finish date + favorite: Favorite + name: Name + public: Public + start_date: Start date errors: models: - resource_planner: - attributes: - end_date: - greater_than_start_date: must be after the start date. resource_allocation: attributes: end_date: greater_than_start_date: must be after the start date. - plugin_openproject_resource_management: - name: OpenProject Resource Management - description: Provides resource management and capacity planning. - project_module_resource_management: Resource management - permission_view_resource_planners: View resource planners - permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. + resource_planner: + attributes: + end_date: + greater_than_start_date: must be after the start date. + resource_work_package_list: + attributes: + query: + must_be_work_package_query: must be a work package query. + models: + resource_allocation: Resource Allocation + resource_planner: Resource Planner + resource_work_package_list: Work packages list + user_card: User cards + button_next: Next + label_resource_management: Resource planning + permission_allocate_user_resources: Allocate user resources + permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. ' permission_manage_public_resource_planners: Manage public resource planners permission_manage_public_resource_planners_explanation: 'Allows users to create and manage public resource planners. It allows them to view, create, manage and publish their own resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - permission_allocate_user_resources: Allocate user resources - permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. + permission_view_resource_planners: View resource planners + permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - label_resource_management: Resource planning - button_next: Save + plugin_openproject_resource_management: + description: Provides resource management and capacity planning. + name: OpenProject Resource Management + project_module_resource_management: Resource management resource_management: - label_resource_planner: Resource planner - label_resource_planner_plural: Resource planners - label_new_resource_planner: New resource planner - public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. - - ' + action: + delete: Delete + favorite: Add to favorites + make_private: Make private + make_public: Make public + unfavorite: Remove from favorites + blankslate: + desc: Create a resource planner to start planning capacity for this project. + title: No resource planners yet + configure_view_dialog: + delete_confirmation: Are you sure you want to delete this view? This cannot be undone. + filter_mode: + automatic: + caption: An automatically-generated list that displays items that meet criteria you define. + label: Automatically filtered + label: Item selection + manual: + caption: A custom list of items you manually add and remove. Filtering is not possible. + label: Manually hand-picked + title: Configure view favorite_caption: 'Make this view a favorite to add it on the top section of the sidebar menu. ' - view_types: - UserCardView: Users cards - action: - favorite: Add to favorites - unfavorite: Remove from favorites - make_public: Make public - make_private: Make private - delete: Delete - sidebar: - public: Public - private: Private - blankslate: - title: No resource planners yet - desc: Create a resource planner to start planning capacity for this project. + label_new_resource_planner: New resource planner + label_resource_planner: Resource planner + label_resource_planner_plural: Resource planners + new_view_dialog: + title: Add View + public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. + + ' show: placeholder: The detailed view for this resource planner is coming soon. + sidebar: + private: Private + public: Public + sub_views: Views in this resource planner + view_types: + resource_work_package_list: + caption: Create a view based on work packages and see its details and allocation in a list + label: Work packages list + user_card: + caption: Create a view based on users and see their details and allocation in a list of user cards + label: Users card list + work_package_list: + add_work_package_dialog: + title: Add work package + allocation_placeholder: "—" + blank: + description: There are no work packages matching this view's filters yet. + title: No work packages to display + columns: + allocated_members: Allocated members + allocation: Allocation + dates: Dates + context_menu: + add_filter_criteria: Add filter criteria + add_user_group: Add user group + edit_total_work: Edit total work + label: More actions + move: Move + move_down: Move down + move_to_bottom: Move to bottom + move_to_top: Move to top + move_up: Move up + remove: Remove + remove_confirmation: Remove this work package from the view? + see_allocation: See allocation + mobile_title: Work packages + query_name: 'Resource management work packages: %{name}' + subheader: + add: Add + add_work_package: Add work package + allocate: Allocate + settings: Configure view diff --git a/modules/resource_management/config/locales/crowdin/fi.yml b/modules/resource_management/config/locales/crowdin/fi.yml index 27b3a902729..9e8a0e119d9 100644 --- a/modules/resource_management/config/locales/crowdin/fi.yml +++ b/modules/resource_management/config/locales/crowdin/fi.yml @@ -2,72 +2,131 @@ fi: activerecord: attributes: - resource_planner: - name: Name - start_date: Start date - end_date: Finish date - default_view_class_name: Default view - public: Public - favorite: Favorite resource_allocation: + allocated_time: Allocated time + end_date: Finish date entity: Entity principal: Assignee - state: State start_date: Start date - end_date: Finish date - allocated_time: Allocated time + state: State user_filter: User filter + resource_planner: + default_view_class_name: Default view + end_date: Finish date + favorite: Favorite + name: Name + public: Public + start_date: Start date errors: models: - resource_planner: - attributes: - end_date: - greater_than_start_date: must be after the start date. resource_allocation: attributes: end_date: greater_than_start_date: must be after the start date. - plugin_openproject_resource_management: - name: OpenProject Resource Management - description: Provides resource management and capacity planning. - project_module_resource_management: Resource management - permission_view_resource_planners: View resource planners - permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. + resource_planner: + attributes: + end_date: + greater_than_start_date: must be after the start date. + resource_work_package_list: + attributes: + query: + must_be_work_package_query: must be a work package query. + models: + resource_allocation: Resource Allocation + resource_planner: Resource Planner + resource_work_package_list: Work packages list + user_card: User cards + button_next: Next + label_resource_management: Resource planning + permission_allocate_user_resources: Allocate user resources + permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. ' permission_manage_public_resource_planners: Manage public resource planners permission_manage_public_resource_planners_explanation: 'Allows users to create and manage public resource planners. It allows them to view, create, manage and publish their own resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - permission_allocate_user_resources: Allocate user resources - permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. + permission_view_resource_planners: View resource planners + permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - label_resource_management: Resource planning - button_next: Save + plugin_openproject_resource_management: + description: Provides resource management and capacity planning. + name: OpenProject Resource Management + project_module_resource_management: Resource management resource_management: - label_resource_planner: Resource planner - label_resource_planner_plural: Resource planners - label_new_resource_planner: New resource planner - public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. - - ' + action: + delete: Delete + favorite: Add to favorites + make_private: Make private + make_public: Make public + unfavorite: Remove from favorites + blankslate: + desc: Create a resource planner to start planning capacity for this project. + title: No resource planners yet + configure_view_dialog: + delete_confirmation: Are you sure you want to delete this view? This cannot be undone. + filter_mode: + automatic: + caption: An automatically-generated list that displays items that meet criteria you define. + label: Automatically filtered + label: Item selection + manual: + caption: A custom list of items you manually add and remove. Filtering is not possible. + label: Manually hand-picked + title: Configure view favorite_caption: 'Make this view a favorite to add it on the top section of the sidebar menu. ' - view_types: - UserCardView: Users cards - action: - favorite: Add to favorites - unfavorite: Remove from favorites - make_public: Make public - make_private: Make private - delete: Delete - sidebar: - public: Public - private: Private - blankslate: - title: No resource planners yet - desc: Create a resource planner to start planning capacity for this project. + label_new_resource_planner: New resource planner + label_resource_planner: Resource planner + label_resource_planner_plural: Resource planners + new_view_dialog: + title: Add View + public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. + + ' show: placeholder: The detailed view for this resource planner is coming soon. + sidebar: + private: Private + public: Public + sub_views: Views in this resource planner + view_types: + resource_work_package_list: + caption: Create a view based on work packages and see its details and allocation in a list + label: Work packages list + user_card: + caption: Create a view based on users and see their details and allocation in a list of user cards + label: Users card list + work_package_list: + add_work_package_dialog: + title: Add work package + allocation_placeholder: "—" + blank: + description: There are no work packages matching this view's filters yet. + title: No work packages to display + columns: + allocated_members: Allocated members + allocation: Allocation + dates: Dates + context_menu: + add_filter_criteria: Add filter criteria + add_user_group: Add user group + edit_total_work: Edit total work + label: More actions + move: Move + move_down: Move down + move_to_bottom: Move to bottom + move_to_top: Move to top + move_up: Move up + remove: Remove + remove_confirmation: Remove this work package from the view? + see_allocation: See allocation + mobile_title: Work packages + query_name: 'Resource management work packages: %{name}' + subheader: + add: Add + add_work_package: Add work package + allocate: Allocate + settings: Configure view diff --git a/modules/resource_management/config/locales/crowdin/fil.yml b/modules/resource_management/config/locales/crowdin/fil.yml index 0d8d3263f10..97adbe8ec76 100644 --- a/modules/resource_management/config/locales/crowdin/fil.yml +++ b/modules/resource_management/config/locales/crowdin/fil.yml @@ -2,72 +2,131 @@ fil: activerecord: attributes: - resource_planner: - name: Name - start_date: Start date - end_date: Finish date - default_view_class_name: Default view - public: Public - favorite: Favorite resource_allocation: + allocated_time: Allocated time + end_date: Finish date entity: Entity principal: Assignee - state: State start_date: Start date - end_date: Finish date - allocated_time: Allocated time + state: State user_filter: User filter + resource_planner: + default_view_class_name: Default view + end_date: Finish date + favorite: Favorite + name: Name + public: Public + start_date: Start date errors: models: - resource_planner: - attributes: - end_date: - greater_than_start_date: must be after the start date. resource_allocation: attributes: end_date: greater_than_start_date: must be after the start date. - plugin_openproject_resource_management: - name: OpenProject Resource Management - description: Provides resource management and capacity planning. - project_module_resource_management: Resource management - permission_view_resource_planners: View resource planners - permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. + resource_planner: + attributes: + end_date: + greater_than_start_date: must be after the start date. + resource_work_package_list: + attributes: + query: + must_be_work_package_query: must be a work package query. + models: + resource_allocation: Resource Allocation + resource_planner: Resource Planner + resource_work_package_list: Work packages list + user_card: User cards + button_next: Next + label_resource_management: Resource planning + permission_allocate_user_resources: Allocate user resources + permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. ' permission_manage_public_resource_planners: Manage public resource planners permission_manage_public_resource_planners_explanation: 'Allows users to create and manage public resource planners. It allows them to view, create, manage and publish their own resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - permission_allocate_user_resources: Allocate user resources - permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. + permission_view_resource_planners: View resource planners + permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - label_resource_management: Resource planning - button_next: Save + plugin_openproject_resource_management: + description: Provides resource management and capacity planning. + name: OpenProject Resource Management + project_module_resource_management: Resource management resource_management: - label_resource_planner: Resource planner - label_resource_planner_plural: Resource planners - label_new_resource_planner: New resource planner - public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. - - ' + action: + delete: Delete + favorite: Add to favorites + make_private: Make private + make_public: Make public + unfavorite: Remove from favorites + blankslate: + desc: Create a resource planner to start planning capacity for this project. + title: No resource planners yet + configure_view_dialog: + delete_confirmation: Are you sure you want to delete this view? This cannot be undone. + filter_mode: + automatic: + caption: An automatically-generated list that displays items that meet criteria you define. + label: Automatically filtered + label: Item selection + manual: + caption: A custom list of items you manually add and remove. Filtering is not possible. + label: Manually hand-picked + title: Configure view favorite_caption: 'Make this view a favorite to add it on the top section of the sidebar menu. ' - view_types: - UserCardView: Users cards - action: - favorite: Add to favorites - unfavorite: Remove from favorites - make_public: Make public - make_private: Make private - delete: Delete - sidebar: - public: Public - private: Private - blankslate: - title: No resource planners yet - desc: Create a resource planner to start planning capacity for this project. + label_new_resource_planner: New resource planner + label_resource_planner: Resource planner + label_resource_planner_plural: Resource planners + new_view_dialog: + title: Add View + public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. + + ' show: placeholder: The detailed view for this resource planner is coming soon. + sidebar: + private: Private + public: Public + sub_views: Views in this resource planner + view_types: + resource_work_package_list: + caption: Create a view based on work packages and see its details and allocation in a list + label: Work packages list + user_card: + caption: Create a view based on users and see their details and allocation in a list of user cards + label: Users card list + work_package_list: + add_work_package_dialog: + title: Add work package + allocation_placeholder: "—" + blank: + description: There are no work packages matching this view's filters yet. + title: No work packages to display + columns: + allocated_members: Allocated members + allocation: Allocation + dates: Dates + context_menu: + add_filter_criteria: Add filter criteria + add_user_group: Add user group + edit_total_work: Edit total work + label: More actions + move: Move + move_down: Move down + move_to_bottom: Move to bottom + move_to_top: Move to top + move_up: Move up + remove: Remove + remove_confirmation: Remove this work package from the view? + see_allocation: See allocation + mobile_title: Work packages + query_name: 'Resource management work packages: %{name}' + subheader: + add: Add + add_work_package: Add work package + allocate: Allocate + settings: Configure view diff --git a/modules/resource_management/config/locales/crowdin/fr.yml b/modules/resource_management/config/locales/crowdin/fr.yml index fd8c2fcf912..298bb9341ca 100644 --- a/modules/resource_management/config/locales/crowdin/fr.yml +++ b/modules/resource_management/config/locales/crowdin/fr.yml @@ -2,72 +2,131 @@ fr: activerecord: attributes: - resource_planner: - name: Nom - start_date: Date de début - end_date: Date de fin - default_view_class_name: Vue par défaut - public: Public - favorite: Favori resource_allocation: + allocated_time: Temps alloué + end_date: Date de fin entity: Entité principal: Assigné à - state: État start_date: Date de début - end_date: Date de fin - allocated_time: Temps alloué + state: État user_filter: Filtre utilisateur + resource_planner: + default_view_class_name: Vue par défaut + end_date: Date de fin + favorite: Favori + name: Nom + public: Public + start_date: Date de début errors: models: - resource_planner: - attributes: - end_date: - greater_than_start_date: doit être postérieure à la date de début. resource_allocation: attributes: end_date: greater_than_start_date: doit être postérieure à la date de début. - plugin_openproject_resource_management: - name: Gestion des ressources d'OpenProject - description: Assure la gestion des ressources et la planification des capacités. - project_module_resource_management: Gestion des ressources - permission_view_resource_planners: Voir les planificateurs de ressources - permission_view_resource_planners_explanation: 'Permet aux utilisateurs d''accéder aux planificateurs de ressources. Cela leur permet de créer et de gérer leurs propres planificateurs de ressources et de consulter les planificateurs de ressources publics. Cela ne leur permet pas de consulter les planificateurs de ressources qui ont été créés par d''autres utilisateurs et qui ne sont pas partagés publiquement. + resource_planner: + attributes: + end_date: + greater_than_start_date: doit être postérieure à la date de début. + resource_work_package_list: + attributes: + query: + must_be_work_package_query: doit être une requête de lot de travaux. + models: + resource_allocation: Affectation des ressources + resource_planner: Planificateur de ressources + resource_work_package_list: Liste des lots de travaux + user_card: Fiches des utilisateurs + button_next: Suivant + label_resource_management: Planification des ressources + permission_allocate_user_resources: Attribuer des ressources aux utilisateurs + permission_allocate_user_resources_explanation: 'Permet aux utilisateurs de créer, mettre à jour et supprimer les allocations de ressources dans un planificateur de ressources. Cela inclut l''assignation d''utilisateurs (ou des filtres d''utilisateurs) à un planificateur et l''ajustement de la plage de temps et de dates allouées. ' permission_manage_public_resource_planners: Gérer les planificateurs de ressources publiques permission_manage_public_resource_planners_explanation: 'Permet aux utilisateurs de créer et de gérer des planificateurs de ressources publics. Cela leur permet de visualiser, de créer, de gérer et de publier leurs propres planificateurs de ressources. Cela ne leur permet pas de visualiser les planificateurs de ressources qui ont été créés par d''autres utilisateurs et qui ne sont pas partagés publiquement. ' - permission_allocate_user_resources: Attribuer des ressources aux utilisateurs - permission_allocate_user_resources_explanation: 'Permet aux utilisateurs de créer, mettre à jour et supprimer les allocations de ressources dans un planificateur de ressources. Cela inclut l''assignation d''utilisateurs (ou des filtres d''utilisateurs) à un planificateur et l''ajustement de la plage de temps et de dates allouées. + permission_view_resource_planners: Voir les planificateurs de ressources + permission_view_resource_planners_explanation: 'Permet aux utilisateurs d''accéder aux planificateurs de ressources. Cela leur permet de créer et de gérer leurs propres planificateurs de ressources et de consulter les planificateurs de ressources publics. Cela ne leur permet pas de consulter les planificateurs de ressources qui ont été créés par d''autres utilisateurs et qui ne sont pas partagés publiquement. ' - label_resource_management: Planification des ressources - button_next: Enregistrer + plugin_openproject_resource_management: + description: Assure la gestion des ressources et la planification des capacités. + name: Gestion des ressources d'OpenProject + project_module_resource_management: Gestion des ressources resource_management: - label_resource_planner: Planificateur de ressources - label_resource_planner_plural: Planificateurs de ressources - label_new_resource_planner: Nouveau planificateur de ressources - public_caption: 'Rendez cette vue publique pour tous les membres du projet. Cela n''affecte pas la visibilité des lots de travaux, qui dépend toujours de l''autorisation de chaque utilisateur. - - ' + action: + delete: Supprimer + favorite: Ajouter aux favoris + make_private: Rendre privé + make_public: Rendre public + unfavorite: Supprimer des favoris + blankslate: + desc: Créez un planificateur de ressources pour commencer à planifier la capacité de ce projet. + title: Aucun planificateur de ressources pour le moment + configure_view_dialog: + delete_confirmation: Voulez-vous vraiment supprimer cette vue ? Cette action est irréversible. + filter_mode: + automatic: + caption: Une liste générée automatiquement qui affiche les éléments correspondant aux critères que vous définissez. + label: Filtré automatiquement + label: Sélection d'éléments + manual: + caption: Une liste personnalisée d'éléments que vous ajoutez et supprimez manuellement. Le filtrage n'est pas possible. + label: Sélection manuelle + title: Configurer la vue favorite_caption: 'Faites de cette vue un favori pour l''ajouter à la section supérieure du menu de la barre latérale. ' - view_types: - UserCardView: Cartes des utilisateurs - action: - favorite: Ajouter aux favoris - unfavorite: Supprimer des favoris - make_public: Rendre public - make_private: Rendre privé - delete: Supprimer - sidebar: - public: Public - private: Privé - blankslate: - title: Aucun planificateur de ressources pour le moment - desc: Créez un planificateur de ressources pour commencer à planifier la capacité de ce projet. + label_new_resource_planner: Nouveau planificateur de ressources + label_resource_planner: Planificateur de ressources + label_resource_planner_plural: Planificateurs de ressources + new_view_dialog: + title: Ajouter une vue + public_caption: 'Rendez cette vue publique pour tous les membres du projet. Cela n''affecte pas la visibilité des lots de travaux, qui dépend toujours de l''autorisation de chaque utilisateur. + + ' show: placeholder: La vue détaillée de ce planificateur de ressources sera bientôt disponible. + sidebar: + private: Privé + public: Public + sub_views: Vues de ce planificateur de ressources + view_types: + resource_work_package_list: + caption: Créez une vue basée sur des lots de travaux et affichez leurs informations et leur affectation dans une liste + label: Liste des lots de travaux + user_card: + caption: Créez une vue basée sur des utilisateurs et affichez leurs informations et leur affectation dans une liste de fiches des utilisateurs + label: Liste des fiches des utilisateurs + work_package_list: + add_work_package_dialog: + title: Ajouter un lot de travaux + allocation_placeholder: "—" + blank: + description: Aucun lot de travaux ne correspond encore aux filtres de cette vue. + title: Aucun lot de travaux à afficher + columns: + allocated_members: Membres attribués + allocation: Attribution + dates: Dates + context_menu: + add_filter_criteria: Ajouter des critères de filtre + add_user_group: Ajouter un groupe d'utilisateurs + edit_total_work: Modifier le travail total + label: Plus d'actions + move: Déplacer + move_down: Déplacer vers le bas + move_to_bottom: Déplacer en bas + move_to_top: Déplacer en haut + move_up: Déplacer vers le haut + remove: Retirer + remove_confirmation: Retirer ce lot de travaux de la vue ? + see_allocation: Voir l'attribution + mobile_title: Lots de travaux + query_name: 'Lots de travaux de gestion des ressources : %{name}' + subheader: + add: Ajouter + add_work_package: Ajouter un lot de travaux + allocate: Attribuer + settings: Configurer la vue diff --git a/modules/resource_management/config/locales/crowdin/he.yml b/modules/resource_management/config/locales/crowdin/he.yml index bf55ee92c99..6a9a7d3872b 100644 --- a/modules/resource_management/config/locales/crowdin/he.yml +++ b/modules/resource_management/config/locales/crowdin/he.yml @@ -2,72 +2,131 @@ he: activerecord: attributes: - resource_planner: - name: Name - start_date: Start date - end_date: Finish date - default_view_class_name: Default view - public: Public - favorite: Favorite resource_allocation: + allocated_time: Allocated time + end_date: Finish date entity: Entity principal: Assignee - state: State start_date: Start date - end_date: Finish date - allocated_time: Allocated time + state: State user_filter: User filter + resource_planner: + default_view_class_name: Default view + end_date: Finish date + favorite: Favorite + name: Name + public: Public + start_date: Start date errors: models: - resource_planner: - attributes: - end_date: - greater_than_start_date: must be after the start date. resource_allocation: attributes: end_date: greater_than_start_date: must be after the start date. - plugin_openproject_resource_management: - name: OpenProject Resource Management - description: Provides resource management and capacity planning. - project_module_resource_management: Resource management - permission_view_resource_planners: View resource planners - permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. + resource_planner: + attributes: + end_date: + greater_than_start_date: must be after the start date. + resource_work_package_list: + attributes: + query: + must_be_work_package_query: must be a work package query. + models: + resource_allocation: Resource Allocation + resource_planner: Resource Planner + resource_work_package_list: Work packages list + user_card: User cards + button_next: Next + label_resource_management: Resource planning + permission_allocate_user_resources: Allocate user resources + permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. ' permission_manage_public_resource_planners: Manage public resource planners permission_manage_public_resource_planners_explanation: 'Allows users to create and manage public resource planners. It allows them to view, create, manage and publish their own resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - permission_allocate_user_resources: Allocate user resources - permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. + permission_view_resource_planners: View resource planners + permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - label_resource_management: Resource planning - button_next: Save + plugin_openproject_resource_management: + description: Provides resource management and capacity planning. + name: OpenProject Resource Management + project_module_resource_management: Resource management resource_management: - label_resource_planner: Resource planner - label_resource_planner_plural: Resource planners - label_new_resource_planner: New resource planner - public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. - - ' + action: + delete: Delete + favorite: Add to favorites + make_private: Make private + make_public: Make public + unfavorite: Remove from favorites + blankslate: + desc: Create a resource planner to start planning capacity for this project. + title: No resource planners yet + configure_view_dialog: + delete_confirmation: Are you sure you want to delete this view? This cannot be undone. + filter_mode: + automatic: + caption: An automatically-generated list that displays items that meet criteria you define. + label: Automatically filtered + label: Item selection + manual: + caption: A custom list of items you manually add and remove. Filtering is not possible. + label: Manually hand-picked + title: Configure view favorite_caption: 'Make this view a favorite to add it on the top section of the sidebar menu. ' - view_types: - UserCardView: Users cards - action: - favorite: Add to favorites - unfavorite: Remove from favorites - make_public: Make public - make_private: Make private - delete: Delete - sidebar: - public: Public - private: Private - blankslate: - title: No resource planners yet - desc: Create a resource planner to start planning capacity for this project. + label_new_resource_planner: New resource planner + label_resource_planner: Resource planner + label_resource_planner_plural: Resource planners + new_view_dialog: + title: Add View + public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. + + ' show: placeholder: The detailed view for this resource planner is coming soon. + sidebar: + private: Private + public: Public + sub_views: Views in this resource planner + view_types: + resource_work_package_list: + caption: Create a view based on work packages and see its details and allocation in a list + label: Work packages list + user_card: + caption: Create a view based on users and see their details and allocation in a list of user cards + label: Users card list + work_package_list: + add_work_package_dialog: + title: Add work package + allocation_placeholder: "—" + blank: + description: There are no work packages matching this view's filters yet. + title: No work packages to display + columns: + allocated_members: Allocated members + allocation: Allocation + dates: Dates + context_menu: + add_filter_criteria: Add filter criteria + add_user_group: Add user group + edit_total_work: Edit total work + label: More actions + move: Move + move_down: Move down + move_to_bottom: Move to bottom + move_to_top: Move to top + move_up: Move up + remove: Remove + remove_confirmation: Remove this work package from the view? + see_allocation: See allocation + mobile_title: Work packages + query_name: 'Resource management work packages: %{name}' + subheader: + add: Add + add_work_package: Add work package + allocate: Allocate + settings: Configure view diff --git a/modules/resource_management/config/locales/crowdin/hi.yml b/modules/resource_management/config/locales/crowdin/hi.yml index 90b74d33fad..09881a9f004 100644 --- a/modules/resource_management/config/locales/crowdin/hi.yml +++ b/modules/resource_management/config/locales/crowdin/hi.yml @@ -2,72 +2,131 @@ hi: activerecord: attributes: - resource_planner: - name: Name - start_date: Start date - end_date: Finish date - default_view_class_name: Default view - public: Public - favorite: Favorite resource_allocation: + allocated_time: Allocated time + end_date: Finish date entity: Entity principal: Assignee - state: State start_date: Start date - end_date: Finish date - allocated_time: Allocated time + state: State user_filter: User filter + resource_planner: + default_view_class_name: Default view + end_date: Finish date + favorite: Favorite + name: Name + public: Public + start_date: Start date errors: models: - resource_planner: - attributes: - end_date: - greater_than_start_date: must be after the start date. resource_allocation: attributes: end_date: greater_than_start_date: must be after the start date. - plugin_openproject_resource_management: - name: OpenProject Resource Management - description: Provides resource management and capacity planning. - project_module_resource_management: Resource management - permission_view_resource_planners: View resource planners - permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. + resource_planner: + attributes: + end_date: + greater_than_start_date: must be after the start date. + resource_work_package_list: + attributes: + query: + must_be_work_package_query: must be a work package query. + models: + resource_allocation: Resource Allocation + resource_planner: Resource Planner + resource_work_package_list: Work packages list + user_card: User cards + button_next: Next + label_resource_management: Resource planning + permission_allocate_user_resources: Allocate user resources + permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. ' permission_manage_public_resource_planners: Manage public resource planners permission_manage_public_resource_planners_explanation: 'Allows users to create and manage public resource planners. It allows them to view, create, manage and publish their own resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - permission_allocate_user_resources: Allocate user resources - permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. + permission_view_resource_planners: View resource planners + permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - label_resource_management: Resource planning - button_next: Save + plugin_openproject_resource_management: + description: Provides resource management and capacity planning. + name: OpenProject Resource Management + project_module_resource_management: Resource management resource_management: - label_resource_planner: Resource planner - label_resource_planner_plural: Resource planners - label_new_resource_planner: New resource planner - public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. - - ' + action: + delete: Delete + favorite: Add to favorites + make_private: Make private + make_public: Make public + unfavorite: Remove from favorites + blankslate: + desc: Create a resource planner to start planning capacity for this project. + title: No resource planners yet + configure_view_dialog: + delete_confirmation: Are you sure you want to delete this view? This cannot be undone. + filter_mode: + automatic: + caption: An automatically-generated list that displays items that meet criteria you define. + label: Automatically filtered + label: Item selection + manual: + caption: A custom list of items you manually add and remove. Filtering is not possible. + label: Manually hand-picked + title: Configure view favorite_caption: 'Make this view a favorite to add it on the top section of the sidebar menu. ' - view_types: - UserCardView: Users cards - action: - favorite: Add to favorites - unfavorite: Remove from favorites - make_public: Make public - make_private: Make private - delete: Delete - sidebar: - public: Public - private: Private - blankslate: - title: No resource planners yet - desc: Create a resource planner to start planning capacity for this project. + label_new_resource_planner: New resource planner + label_resource_planner: Resource planner + label_resource_planner_plural: Resource planners + new_view_dialog: + title: Add View + public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. + + ' show: placeholder: The detailed view for this resource planner is coming soon. + sidebar: + private: Private + public: Public + sub_views: Views in this resource planner + view_types: + resource_work_package_list: + caption: Create a view based on work packages and see its details and allocation in a list + label: Work packages list + user_card: + caption: Create a view based on users and see their details and allocation in a list of user cards + label: Users card list + work_package_list: + add_work_package_dialog: + title: Add work package + allocation_placeholder: "—" + blank: + description: There are no work packages matching this view's filters yet. + title: No work packages to display + columns: + allocated_members: Allocated members + allocation: Allocation + dates: Dates + context_menu: + add_filter_criteria: Add filter criteria + add_user_group: Add user group + edit_total_work: Edit total work + label: More actions + move: Move + move_down: Move down + move_to_bottom: Move to bottom + move_to_top: Move to top + move_up: Move up + remove: Remove + remove_confirmation: Remove this work package from the view? + see_allocation: See allocation + mobile_title: Work packages + query_name: 'Resource management work packages: %{name}' + subheader: + add: Add + add_work_package: Add work package + allocate: Allocate + settings: Configure view diff --git a/modules/resource_management/config/locales/crowdin/hr.yml b/modules/resource_management/config/locales/crowdin/hr.yml index a4b62f628ea..61470fd9180 100644 --- a/modules/resource_management/config/locales/crowdin/hr.yml +++ b/modules/resource_management/config/locales/crowdin/hr.yml @@ -2,72 +2,131 @@ hr: activerecord: attributes: - resource_planner: - name: Name - start_date: Start date - end_date: Finish date - default_view_class_name: Default view - public: Public - favorite: Favorite resource_allocation: + allocated_time: Allocated time + end_date: Finish date entity: Entity principal: Assignee - state: State start_date: Start date - end_date: Finish date - allocated_time: Allocated time + state: State user_filter: User filter + resource_planner: + default_view_class_name: Default view + end_date: Finish date + favorite: Favorite + name: Name + public: Public + start_date: Start date errors: models: - resource_planner: - attributes: - end_date: - greater_than_start_date: must be after the start date. resource_allocation: attributes: end_date: greater_than_start_date: must be after the start date. - plugin_openproject_resource_management: - name: OpenProject Resource Management - description: Provides resource management and capacity planning. - project_module_resource_management: Resource management - permission_view_resource_planners: View resource planners - permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. + resource_planner: + attributes: + end_date: + greater_than_start_date: must be after the start date. + resource_work_package_list: + attributes: + query: + must_be_work_package_query: must be a work package query. + models: + resource_allocation: Resource Allocation + resource_planner: Resource Planner + resource_work_package_list: Work packages list + user_card: User cards + button_next: Next + label_resource_management: Resource planning + permission_allocate_user_resources: Allocate user resources + permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. ' permission_manage_public_resource_planners: Manage public resource planners permission_manage_public_resource_planners_explanation: 'Allows users to create and manage public resource planners. It allows them to view, create, manage and publish their own resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - permission_allocate_user_resources: Allocate user resources - permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. + permission_view_resource_planners: View resource planners + permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - label_resource_management: Resource planning - button_next: Save + plugin_openproject_resource_management: + description: Provides resource management and capacity planning. + name: OpenProject Resource Management + project_module_resource_management: Resource management resource_management: - label_resource_planner: Resource planner - label_resource_planner_plural: Resource planners - label_new_resource_planner: New resource planner - public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. - - ' + action: + delete: Delete + favorite: Add to favorites + make_private: Make private + make_public: Make public + unfavorite: Remove from favorites + blankslate: + desc: Create a resource planner to start planning capacity for this project. + title: No resource planners yet + configure_view_dialog: + delete_confirmation: Are you sure you want to delete this view? This cannot be undone. + filter_mode: + automatic: + caption: An automatically-generated list that displays items that meet criteria you define. + label: Automatically filtered + label: Item selection + manual: + caption: A custom list of items you manually add and remove. Filtering is not possible. + label: Manually hand-picked + title: Configure view favorite_caption: 'Make this view a favorite to add it on the top section of the sidebar menu. ' - view_types: - UserCardView: Users cards - action: - favorite: Add to favorites - unfavorite: Remove from favorites - make_public: Make public - make_private: Make private - delete: Delete - sidebar: - public: Public - private: Private - blankslate: - title: No resource planners yet - desc: Create a resource planner to start planning capacity for this project. + label_new_resource_planner: New resource planner + label_resource_planner: Resource planner + label_resource_planner_plural: Resource planners + new_view_dialog: + title: Add View + public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. + + ' show: placeholder: The detailed view for this resource planner is coming soon. + sidebar: + private: Private + public: Public + sub_views: Views in this resource planner + view_types: + resource_work_package_list: + caption: Create a view based on work packages and see its details and allocation in a list + label: Work packages list + user_card: + caption: Create a view based on users and see their details and allocation in a list of user cards + label: Users card list + work_package_list: + add_work_package_dialog: + title: Add work package + allocation_placeholder: "—" + blank: + description: There are no work packages matching this view's filters yet. + title: No work packages to display + columns: + allocated_members: Allocated members + allocation: Allocation + dates: Dates + context_menu: + add_filter_criteria: Add filter criteria + add_user_group: Add user group + edit_total_work: Edit total work + label: More actions + move: Move + move_down: Move down + move_to_bottom: Move to bottom + move_to_top: Move to top + move_up: Move up + remove: Remove + remove_confirmation: Remove this work package from the view? + see_allocation: See allocation + mobile_title: Work packages + query_name: 'Resource management work packages: %{name}' + subheader: + add: Add + add_work_package: Add work package + allocate: Allocate + settings: Configure view diff --git a/modules/resource_management/config/locales/crowdin/hu.yml b/modules/resource_management/config/locales/crowdin/hu.yml index f1c5d91068f..dd133e72dd7 100644 --- a/modules/resource_management/config/locales/crowdin/hu.yml +++ b/modules/resource_management/config/locales/crowdin/hu.yml @@ -2,72 +2,131 @@ hu: activerecord: attributes: - resource_planner: - name: Name - start_date: Start date - end_date: Finish date - default_view_class_name: Default view - public: Public - favorite: Favorite resource_allocation: + allocated_time: Allocated time + end_date: Finish date entity: Entity principal: Assignee - state: State start_date: Start date - end_date: Finish date - allocated_time: Allocated time + state: State user_filter: User filter + resource_planner: + default_view_class_name: Default view + end_date: Finish date + favorite: Favorite + name: Name + public: Public + start_date: Start date errors: models: - resource_planner: - attributes: - end_date: - greater_than_start_date: must be after the start date. resource_allocation: attributes: end_date: greater_than_start_date: must be after the start date. - plugin_openproject_resource_management: - name: OpenProject Resource Management - description: Provides resource management and capacity planning. - project_module_resource_management: Resource management - permission_view_resource_planners: View resource planners - permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. + resource_planner: + attributes: + end_date: + greater_than_start_date: must be after the start date. + resource_work_package_list: + attributes: + query: + must_be_work_package_query: must be a work package query. + models: + resource_allocation: Resource Allocation + resource_planner: Resource Planner + resource_work_package_list: Work packages list + user_card: User cards + button_next: Next + label_resource_management: Resource planning + permission_allocate_user_resources: Allocate user resources + permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. ' permission_manage_public_resource_planners: Manage public resource planners permission_manage_public_resource_planners_explanation: 'Allows users to create and manage public resource planners. It allows them to view, create, manage and publish their own resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - permission_allocate_user_resources: Allocate user resources - permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. + permission_view_resource_planners: View resource planners + permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - label_resource_management: Resource planning - button_next: Save + plugin_openproject_resource_management: + description: Provides resource management and capacity planning. + name: OpenProject Resource Management + project_module_resource_management: Resource management resource_management: - label_resource_planner: Resource planner - label_resource_planner_plural: Resource planners - label_new_resource_planner: New resource planner - public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. - - ' + action: + delete: Delete + favorite: Add to favorites + make_private: Make private + make_public: Make public + unfavorite: Remove from favorites + blankslate: + desc: Create a resource planner to start planning capacity for this project. + title: No resource planners yet + configure_view_dialog: + delete_confirmation: Are you sure you want to delete this view? This cannot be undone. + filter_mode: + automatic: + caption: An automatically-generated list that displays items that meet criteria you define. + label: Automatically filtered + label: Item selection + manual: + caption: A custom list of items you manually add and remove. Filtering is not possible. + label: Manually hand-picked + title: Configure view favorite_caption: 'Make this view a favorite to add it on the top section of the sidebar menu. ' - view_types: - UserCardView: Users cards - action: - favorite: Add to favorites - unfavorite: Remove from favorites - make_public: Make public - make_private: Make private - delete: Delete - sidebar: - public: Public - private: Private - blankslate: - title: No resource planners yet - desc: Create a resource planner to start planning capacity for this project. + label_new_resource_planner: New resource planner + label_resource_planner: Resource planner + label_resource_planner_plural: Resource planners + new_view_dialog: + title: Add View + public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. + + ' show: placeholder: The detailed view for this resource planner is coming soon. + sidebar: + private: Private + public: Public + sub_views: Views in this resource planner + view_types: + resource_work_package_list: + caption: Create a view based on work packages and see its details and allocation in a list + label: Work packages list + user_card: + caption: Create a view based on users and see their details and allocation in a list of user cards + label: Users card list + work_package_list: + add_work_package_dialog: + title: Add work package + allocation_placeholder: "—" + blank: + description: There are no work packages matching this view's filters yet. + title: No work packages to display + columns: + allocated_members: Allocated members + allocation: Allocation + dates: Dates + context_menu: + add_filter_criteria: Add filter criteria + add_user_group: Add user group + edit_total_work: Edit total work + label: More actions + move: Move + move_down: Move down + move_to_bottom: Move to bottom + move_to_top: Move to top + move_up: Move up + remove: Remove + remove_confirmation: Remove this work package from the view? + see_allocation: See allocation + mobile_title: Work packages + query_name: 'Resource management work packages: %{name}' + subheader: + add: Add + add_work_package: Add work package + allocate: Allocate + settings: Configure view diff --git a/modules/resource_management/config/locales/crowdin/hy.yml b/modules/resource_management/config/locales/crowdin/hy.yml index 760cb599496..04efa539149 100644 --- a/modules/resource_management/config/locales/crowdin/hy.yml +++ b/modules/resource_management/config/locales/crowdin/hy.yml @@ -2,72 +2,131 @@ hy: activerecord: attributes: - resource_planner: - name: Name - start_date: Start date - end_date: Finish date - default_view_class_name: Default view - public: Public - favorite: Favorite resource_allocation: + allocated_time: Allocated time + end_date: Finish date entity: Entity principal: Assignee - state: State start_date: Start date - end_date: Finish date - allocated_time: Allocated time + state: State user_filter: User filter + resource_planner: + default_view_class_name: Default view + end_date: Finish date + favorite: Favorite + name: Name + public: Public + start_date: Start date errors: models: - resource_planner: - attributes: - end_date: - greater_than_start_date: must be after the start date. resource_allocation: attributes: end_date: greater_than_start_date: must be after the start date. - plugin_openproject_resource_management: - name: OpenProject Resource Management - description: Provides resource management and capacity planning. - project_module_resource_management: Resource management - permission_view_resource_planners: View resource planners - permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. + resource_planner: + attributes: + end_date: + greater_than_start_date: must be after the start date. + resource_work_package_list: + attributes: + query: + must_be_work_package_query: must be a work package query. + models: + resource_allocation: Resource Allocation + resource_planner: Resource Planner + resource_work_package_list: Work packages list + user_card: User cards + button_next: Next + label_resource_management: Resource planning + permission_allocate_user_resources: Allocate user resources + permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. ' permission_manage_public_resource_planners: Manage public resource planners permission_manage_public_resource_planners_explanation: 'Allows users to create and manage public resource planners. It allows them to view, create, manage and publish their own resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - permission_allocate_user_resources: Allocate user resources - permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. + permission_view_resource_planners: View resource planners + permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - label_resource_management: Resource planning - button_next: Save + plugin_openproject_resource_management: + description: Provides resource management and capacity planning. + name: OpenProject Resource Management + project_module_resource_management: Resource management resource_management: - label_resource_planner: Resource planner - label_resource_planner_plural: Resource planners - label_new_resource_planner: New resource planner - public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. - - ' + action: + delete: Delete + favorite: Add to favorites + make_private: Make private + make_public: Make public + unfavorite: Remove from favorites + blankslate: + desc: Create a resource planner to start planning capacity for this project. + title: No resource planners yet + configure_view_dialog: + delete_confirmation: Are you sure you want to delete this view? This cannot be undone. + filter_mode: + automatic: + caption: An automatically-generated list that displays items that meet criteria you define. + label: Automatically filtered + label: Item selection + manual: + caption: A custom list of items you manually add and remove. Filtering is not possible. + label: Manually hand-picked + title: Configure view favorite_caption: 'Make this view a favorite to add it on the top section of the sidebar menu. ' - view_types: - UserCardView: Users cards - action: - favorite: Add to favorites - unfavorite: Remove from favorites - make_public: Make public - make_private: Make private - delete: Delete - sidebar: - public: Public - private: Private - blankslate: - title: No resource planners yet - desc: Create a resource planner to start planning capacity for this project. + label_new_resource_planner: New resource planner + label_resource_planner: Resource planner + label_resource_planner_plural: Resource planners + new_view_dialog: + title: Add View + public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. + + ' show: placeholder: The detailed view for this resource planner is coming soon. + sidebar: + private: Private + public: Public + sub_views: Views in this resource planner + view_types: + resource_work_package_list: + caption: Create a view based on work packages and see its details and allocation in a list + label: Work packages list + user_card: + caption: Create a view based on users and see their details and allocation in a list of user cards + label: Users card list + work_package_list: + add_work_package_dialog: + title: Add work package + allocation_placeholder: "—" + blank: + description: There are no work packages matching this view's filters yet. + title: No work packages to display + columns: + allocated_members: Allocated members + allocation: Allocation + dates: Dates + context_menu: + add_filter_criteria: Add filter criteria + add_user_group: Add user group + edit_total_work: Edit total work + label: More actions + move: Move + move_down: Move down + move_to_bottom: Move to bottom + move_to_top: Move to top + move_up: Move up + remove: Remove + remove_confirmation: Remove this work package from the view? + see_allocation: See allocation + mobile_title: Work packages + query_name: 'Resource management work packages: %{name}' + subheader: + add: Add + add_work_package: Add work package + allocate: Allocate + settings: Configure view diff --git a/modules/resource_management/config/locales/crowdin/id.yml b/modules/resource_management/config/locales/crowdin/id.yml index fd099276097..b7fd1abe0a7 100644 --- a/modules/resource_management/config/locales/crowdin/id.yml +++ b/modules/resource_management/config/locales/crowdin/id.yml @@ -2,72 +2,131 @@ id: activerecord: attributes: - resource_planner: - name: Name - start_date: Start date - end_date: Finish date - default_view_class_name: Default view - public: Public - favorite: Favorite resource_allocation: + allocated_time: Allocated time + end_date: Finish date entity: Entity principal: Assignee - state: State start_date: Start date - end_date: Finish date - allocated_time: Allocated time + state: State user_filter: User filter + resource_planner: + default_view_class_name: Default view + end_date: Finish date + favorite: Favorite + name: Name + public: Public + start_date: Start date errors: models: - resource_planner: - attributes: - end_date: - greater_than_start_date: must be after the start date. resource_allocation: attributes: end_date: greater_than_start_date: must be after the start date. - plugin_openproject_resource_management: - name: OpenProject Resource Management - description: Provides resource management and capacity planning. - project_module_resource_management: Resource management - permission_view_resource_planners: View resource planners - permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. + resource_planner: + attributes: + end_date: + greater_than_start_date: must be after the start date. + resource_work_package_list: + attributes: + query: + must_be_work_package_query: must be a work package query. + models: + resource_allocation: Resource Allocation + resource_planner: Resource Planner + resource_work_package_list: Work packages list + user_card: User cards + button_next: Next + label_resource_management: Resource planning + permission_allocate_user_resources: Allocate user resources + permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. ' permission_manage_public_resource_planners: Manage public resource planners permission_manage_public_resource_planners_explanation: 'Allows users to create and manage public resource planners. It allows them to view, create, manage and publish their own resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - permission_allocate_user_resources: Allocate user resources - permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. + permission_view_resource_planners: View resource planners + permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - label_resource_management: Resource planning - button_next: Save + plugin_openproject_resource_management: + description: Provides resource management and capacity planning. + name: OpenProject Resource Management + project_module_resource_management: Resource management resource_management: - label_resource_planner: Resource planner - label_resource_planner_plural: Resource planners - label_new_resource_planner: New resource planner - public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. - - ' + action: + delete: Delete + favorite: Add to favorites + make_private: Make private + make_public: Make public + unfavorite: Remove from favorites + blankslate: + desc: Create a resource planner to start planning capacity for this project. + title: No resource planners yet + configure_view_dialog: + delete_confirmation: Are you sure you want to delete this view? This cannot be undone. + filter_mode: + automatic: + caption: An automatically-generated list that displays items that meet criteria you define. + label: Automatically filtered + label: Item selection + manual: + caption: A custom list of items you manually add and remove. Filtering is not possible. + label: Manually hand-picked + title: Configure view favorite_caption: 'Make this view a favorite to add it on the top section of the sidebar menu. ' - view_types: - UserCardView: Users cards - action: - favorite: Add to favorites - unfavorite: Remove from favorites - make_public: Make public - make_private: Make private - delete: Delete - sidebar: - public: Public - private: Private - blankslate: - title: No resource planners yet - desc: Create a resource planner to start planning capacity for this project. + label_new_resource_planner: New resource planner + label_resource_planner: Resource planner + label_resource_planner_plural: Resource planners + new_view_dialog: + title: Add View + public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. + + ' show: placeholder: The detailed view for this resource planner is coming soon. + sidebar: + private: Private + public: Public + sub_views: Views in this resource planner + view_types: + resource_work_package_list: + caption: Create a view based on work packages and see its details and allocation in a list + label: Work packages list + user_card: + caption: Create a view based on users and see their details and allocation in a list of user cards + label: Users card list + work_package_list: + add_work_package_dialog: + title: Add work package + allocation_placeholder: "—" + blank: + description: There are no work packages matching this view's filters yet. + title: No work packages to display + columns: + allocated_members: Allocated members + allocation: Allocation + dates: Dates + context_menu: + add_filter_criteria: Add filter criteria + add_user_group: Add user group + edit_total_work: Edit total work + label: More actions + move: Move + move_down: Move down + move_to_bottom: Move to bottom + move_to_top: Move to top + move_up: Move up + remove: Remove + remove_confirmation: Remove this work package from the view? + see_allocation: See allocation + mobile_title: Work packages + query_name: 'Resource management work packages: %{name}' + subheader: + add: Add + add_work_package: Add work package + allocate: Allocate + settings: Configure view diff --git a/modules/resource_management/config/locales/crowdin/it.yml b/modules/resource_management/config/locales/crowdin/it.yml index b23d2af85ff..3eb076fb19b 100644 --- a/modules/resource_management/config/locales/crowdin/it.yml +++ b/modules/resource_management/config/locales/crowdin/it.yml @@ -2,72 +2,131 @@ it: activerecord: attributes: - resource_planner: - name: Nome - start_date: Data di inizio - end_date: Data di fine - default_view_class_name: Vista predefinita - public: Pubblico - favorite: Preferito resource_allocation: + allocated_time: Tempo assegnato + end_date: Data di fine entity: Entità principal: Assegnatario - state: Stato start_date: Data di inizio - end_date: Data di fine - allocated_time: Tempo assegnato + state: Stato user_filter: Filtro utente + resource_planner: + default_view_class_name: Vista predefinita + end_date: Data di fine + favorite: Preferito + name: Nome + public: Pubblico + start_date: Data di inizio errors: models: - resource_planner: - attributes: - end_date: - greater_than_start_date: deve essere successiva alla data di inizio. resource_allocation: attributes: end_date: greater_than_start_date: deve essere successiva alla data di inizio. - plugin_openproject_resource_management: - name: Gestione delle risorse di OpenProject - description: Fornisce funzionalità di gestione delle risorse e pianificazione della capacità. - project_module_resource_management: Gestione risorse - permission_view_resource_planners: Visualizza i pianificatori di risorse - permission_view_resource_planners_explanation: 'Consente agli utenti di accedere ai pianificatori delle risorse. Permette loro di creare e gestire i propri pianificatori delle risorse e di visualizzare quelli pubblici. Non consente di visualizzare i pianificatori delle risorse creati da altri utenti che non sono condivisi pubblicamente. + resource_planner: + attributes: + end_date: + greater_than_start_date: deve essere successiva alla data di inizio. + resource_work_package_list: + attributes: + query: + must_be_work_package_query: deve essere una query di macro-attività. + models: + resource_allocation: Allocazione delle risorse + resource_planner: Pianificatore di risorse + resource_work_package_list: Elenco macro-attività + user_card: Schede utente + button_next: Avanti + label_resource_management: Pianificazione delle risorse + permission_allocate_user_resources: Assegnazione delle risorse utente + permission_allocate_user_resources_explanation: 'Consente di creare, aggiornare ed eliminare allocazioni delle risorse all''interno di un pianificatore risorse. Ciò include l''assegnazione di utenti o filtri utente a un pianificatore e la regolazione del tempo allocato e dell''intervallo di date. ' permission_manage_public_resource_planners: Gestire i pianificatori di risorse pubbliche permission_manage_public_resource_planners_explanation: 'Consente agli utenti di creare e gestire pianificatori delle risorse pubblici. Permette loro di visualizzare, creare, gestire e pubblicare i propri pianificatori delle risorse. Non consente di visualizzare i pianificatori delle risorse creati da altri utenti che non sono condivisi pubblicamente. ' - permission_allocate_user_resources: Assegnazione delle risorse utente - permission_allocate_user_resources_explanation: 'Consente di creare, aggiornare ed eliminare allocazioni delle risorse all''interno di un pianificatore risorse. Ciò include l''assegnazione di utenti o filtri utente a un pianificatore e la regolazione del tempo allocato e dell''intervallo di date. + permission_view_resource_planners: Visualizza i pianificatori di risorse + permission_view_resource_planners_explanation: 'Consente agli utenti di accedere ai pianificatori delle risorse. Permette loro di creare e gestire i propri pianificatori delle risorse e di visualizzare quelli pubblici. Non consente di visualizzare i pianificatori delle risorse creati da altri utenti che non sono condivisi pubblicamente. ' - label_resource_management: Pianificazione delle risorse - button_next: Salva + plugin_openproject_resource_management: + description: Fornisce funzionalità di gestione delle risorse e pianificazione della capacità. + name: Gestione delle risorse di OpenProject + project_module_resource_management: Gestione risorse resource_management: - label_resource_planner: Pianificatore di risorse - label_resource_planner_plural: Pianificatori di risorse - label_new_resource_planner: Nuovo pianificatore di risorse - public_caption: 'Rendi questa vista pubblica per tutti i membri del progetto. Questo non influisce sulla visibilità delle macro-attività, che continua a dipendere dalle autorizzazioni di ciascun utente. - - ' + action: + delete: Elimina + favorite: Aggiungi ai preferiti + make_private: Rendi privato + make_public: Rendi pubblico + unfavorite: Rimuovi dai preferiti + blankslate: + desc: Crea un pianificatore di risorse per iniziare a pianificare la capacità di questo progetto. + title: Ancora nessun pianificatore di risorse + configure_view_dialog: + delete_confirmation: Vuoi davvero eliminare questa vista? Questa azione è irreversibile. + filter_mode: + automatic: + caption: Un elenco generato automaticamente che mostra gli elementi che soddisfano i criteri definiti. + label: Filtrato automaticamente + label: Selezione elementi + manual: + caption: Un elenco personalizzato di elementi che puoi aggiungere e rimuovere manualmente. Il filtraggio non è disponibile. + label: Selezionato manualmente + title: Configura vista favorite_caption: 'Aggiungi questa vista ai preferiti per mostrarla nella sezione superiore del menu laterale. ' - view_types: - UserCardView: Schede utente - action: - favorite: Aggiungi ai preferiti - unfavorite: Rimuovi dai preferiti - make_public: Rendi pubblico - make_private: Rendi privato - delete: Elimina - sidebar: - public: Pubblico - private: Privato - blankslate: - title: Ancora nessun pianificatore di risorse - desc: Crea un pianificatore di risorse per iniziare a pianificare la capacità di questo progetto. + label_new_resource_planner: Nuovo pianificatore di risorse + label_resource_planner: Pianificatore di risorse + label_resource_planner_plural: Pianificatori di risorse + new_view_dialog: + title: Aggiungi vista + public_caption: 'Rendi questa vista pubblica per tutti i membri del progetto. Questo non influisce sulla visibilità delle macro-attività, che continua a dipendere dalle autorizzazioni di ciascun utente. + + ' show: placeholder: La vista dettagliata per questo pianificatore delle risorse sarà disponibile a breve. + sidebar: + private: Privato + public: Pubblico + sub_views: Viste in questo pianificatore di risorse + view_types: + resource_work_package_list: + caption: Crea una vista basata su macro-attività e visualizza i dettagli e l'allocazione in un elenco + label: Elenco macro-attività + user_card: + caption: Crea una vista basata sugli utenti per consultare i loro dettagli e le allocazioni in un elenco di schede utente + label: Elenco di schede utenti + work_package_list: + add_work_package_dialog: + title: Aggiungi macro-attività + allocation_placeholder: "—" + blank: + description: Non ci sono ancora macro-attività che corrispondono ai filtri di questa vista. + title: Nessuna macro-attività da visualizzare + columns: + allocated_members: Membri assegnati + allocation: Allocazione + dates: Date + context_menu: + add_filter_criteria: Aggiungi criteri di filtro + add_user_group: Aggiungi gruppo utente + edit_total_work: Modifica lavoro totale + label: Altre azioni + move: Sposta + move_down: Sposta giu + move_to_bottom: Sposta in fondo + move_to_top: Sposta in cima + move_up: Sposta in alto + remove: Rimuovi + remove_confirmation: Rimuovere questa macro-attività dalla vista? + see_allocation: Vedi l'assegnazione + mobile_title: Macro-attività + query_name: 'Pacchetti di lavoro per la gestione delle risorse: %{name}' + subheader: + add: Aggiungi + add_work_package: Aggiungi macro-attività + allocate: Alloca + settings: Configura vista diff --git a/modules/resource_management/config/locales/crowdin/ja.yml b/modules/resource_management/config/locales/crowdin/ja.yml index 6884f3a2c79..095fe6b5f52 100644 --- a/modules/resource_management/config/locales/crowdin/ja.yml +++ b/modules/resource_management/config/locales/crowdin/ja.yml @@ -2,72 +2,131 @@ ja: activerecord: attributes: - resource_planner: - name: Name - start_date: Start date - end_date: Finish date - default_view_class_name: Default view - public: Public - favorite: Favorite resource_allocation: + allocated_time: Allocated time + end_date: Finish date entity: Entity principal: Assignee - state: State start_date: Start date - end_date: Finish date - allocated_time: Allocated time + state: State user_filter: User filter + resource_planner: + default_view_class_name: Default view + end_date: Finish date + favorite: Favorite + name: Name + public: Public + start_date: Start date errors: models: - resource_planner: - attributes: - end_date: - greater_than_start_date: must be after the start date. resource_allocation: attributes: end_date: greater_than_start_date: must be after the start date. - plugin_openproject_resource_management: - name: OpenProject Resource Management - description: Provides resource management and capacity planning. - project_module_resource_management: Resource management - permission_view_resource_planners: View resource planners - permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. + resource_planner: + attributes: + end_date: + greater_than_start_date: must be after the start date. + resource_work_package_list: + attributes: + query: + must_be_work_package_query: must be a work package query. + models: + resource_allocation: Resource Allocation + resource_planner: Resource Planner + resource_work_package_list: Work packages list + user_card: User cards + button_next: Next + label_resource_management: Resource planning + permission_allocate_user_resources: Allocate user resources + permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. ' permission_manage_public_resource_planners: Manage public resource planners permission_manage_public_resource_planners_explanation: 'Allows users to create and manage public resource planners. It allows them to view, create, manage and publish their own resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - permission_allocate_user_resources: Allocate user resources - permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. + permission_view_resource_planners: View resource planners + permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - label_resource_management: Resource planning - button_next: Save + plugin_openproject_resource_management: + description: Provides resource management and capacity planning. + name: OpenProject Resource Management + project_module_resource_management: Resource management resource_management: - label_resource_planner: Resource planner - label_resource_planner_plural: Resource planners - label_new_resource_planner: New resource planner - public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. - - ' + action: + delete: Delete + favorite: Add to favorites + make_private: Make private + make_public: Make public + unfavorite: Remove from favorites + blankslate: + desc: Create a resource planner to start planning capacity for this project. + title: No resource planners yet + configure_view_dialog: + delete_confirmation: Are you sure you want to delete this view? This cannot be undone. + filter_mode: + automatic: + caption: An automatically-generated list that displays items that meet criteria you define. + label: Automatically filtered + label: Item selection + manual: + caption: A custom list of items you manually add and remove. Filtering is not possible. + label: Manually hand-picked + title: Configure view favorite_caption: 'Make this view a favorite to add it on the top section of the sidebar menu. ' - view_types: - UserCardView: Users cards - action: - favorite: Add to favorites - unfavorite: Remove from favorites - make_public: Make public - make_private: Make private - delete: Delete - sidebar: - public: Public - private: Private - blankslate: - title: No resource planners yet - desc: Create a resource planner to start planning capacity for this project. + label_new_resource_planner: New resource planner + label_resource_planner: Resource planner + label_resource_planner_plural: Resource planners + new_view_dialog: + title: Add View + public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. + + ' show: placeholder: The detailed view for this resource planner is coming soon. + sidebar: + private: Private + public: Public + sub_views: Views in this resource planner + view_types: + resource_work_package_list: + caption: Create a view based on work packages and see its details and allocation in a list + label: Work packages list + user_card: + caption: Create a view based on users and see their details and allocation in a list of user cards + label: Users card list + work_package_list: + add_work_package_dialog: + title: Add work package + allocation_placeholder: "—" + blank: + description: There are no work packages matching this view's filters yet. + title: No work packages to display + columns: + allocated_members: Allocated members + allocation: Allocation + dates: Dates + context_menu: + add_filter_criteria: Add filter criteria + add_user_group: Add user group + edit_total_work: Edit total work + label: More actions + move: Move + move_down: Move down + move_to_bottom: Move to bottom + move_to_top: Move to top + move_up: Move up + remove: Remove + remove_confirmation: Remove this work package from the view? + see_allocation: See allocation + mobile_title: Work packages + query_name: 'Resource management work packages: %{name}' + subheader: + add: Add + add_work_package: Add work package + allocate: Allocate + settings: Configure view diff --git a/modules/resource_management/config/locales/crowdin/ka.yml b/modules/resource_management/config/locales/crowdin/ka.yml index ab8317bc4d9..d1a30e99f5f 100644 --- a/modules/resource_management/config/locales/crowdin/ka.yml +++ b/modules/resource_management/config/locales/crowdin/ka.yml @@ -2,72 +2,131 @@ ka: activerecord: attributes: - resource_planner: - name: Name - start_date: Start date - end_date: Finish date - default_view_class_name: Default view - public: Public - favorite: Favorite resource_allocation: + allocated_time: Allocated time + end_date: Finish date entity: Entity principal: Assignee - state: State start_date: Start date - end_date: Finish date - allocated_time: Allocated time + state: State user_filter: User filter + resource_planner: + default_view_class_name: Default view + end_date: Finish date + favorite: Favorite + name: Name + public: Public + start_date: Start date errors: models: - resource_planner: - attributes: - end_date: - greater_than_start_date: must be after the start date. resource_allocation: attributes: end_date: greater_than_start_date: must be after the start date. - plugin_openproject_resource_management: - name: OpenProject Resource Management - description: Provides resource management and capacity planning. - project_module_resource_management: Resource management - permission_view_resource_planners: View resource planners - permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. + resource_planner: + attributes: + end_date: + greater_than_start_date: must be after the start date. + resource_work_package_list: + attributes: + query: + must_be_work_package_query: must be a work package query. + models: + resource_allocation: Resource Allocation + resource_planner: Resource Planner + resource_work_package_list: Work packages list + user_card: User cards + button_next: Next + label_resource_management: Resource planning + permission_allocate_user_resources: Allocate user resources + permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. ' permission_manage_public_resource_planners: Manage public resource planners permission_manage_public_resource_planners_explanation: 'Allows users to create and manage public resource planners. It allows them to view, create, manage and publish their own resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - permission_allocate_user_resources: Allocate user resources - permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. + permission_view_resource_planners: View resource planners + permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - label_resource_management: Resource planning - button_next: Save + plugin_openproject_resource_management: + description: Provides resource management and capacity planning. + name: OpenProject Resource Management + project_module_resource_management: Resource management resource_management: - label_resource_planner: Resource planner - label_resource_planner_plural: Resource planners - label_new_resource_planner: New resource planner - public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. - - ' + action: + delete: Delete + favorite: Add to favorites + make_private: Make private + make_public: Make public + unfavorite: Remove from favorites + blankslate: + desc: Create a resource planner to start planning capacity for this project. + title: No resource planners yet + configure_view_dialog: + delete_confirmation: Are you sure you want to delete this view? This cannot be undone. + filter_mode: + automatic: + caption: An automatically-generated list that displays items that meet criteria you define. + label: Automatically filtered + label: Item selection + manual: + caption: A custom list of items you manually add and remove. Filtering is not possible. + label: Manually hand-picked + title: Configure view favorite_caption: 'Make this view a favorite to add it on the top section of the sidebar menu. ' - view_types: - UserCardView: Users cards - action: - favorite: Add to favorites - unfavorite: Remove from favorites - make_public: Make public - make_private: Make private - delete: Delete - sidebar: - public: Public - private: Private - blankslate: - title: No resource planners yet - desc: Create a resource planner to start planning capacity for this project. + label_new_resource_planner: New resource planner + label_resource_planner: Resource planner + label_resource_planner_plural: Resource planners + new_view_dialog: + title: Add View + public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. + + ' show: placeholder: The detailed view for this resource planner is coming soon. + sidebar: + private: Private + public: Public + sub_views: Views in this resource planner + view_types: + resource_work_package_list: + caption: Create a view based on work packages and see its details and allocation in a list + label: Work packages list + user_card: + caption: Create a view based on users and see their details and allocation in a list of user cards + label: Users card list + work_package_list: + add_work_package_dialog: + title: Add work package + allocation_placeholder: "—" + blank: + description: There are no work packages matching this view's filters yet. + title: No work packages to display + columns: + allocated_members: Allocated members + allocation: Allocation + dates: Dates + context_menu: + add_filter_criteria: Add filter criteria + add_user_group: Add user group + edit_total_work: Edit total work + label: More actions + move: Move + move_down: Move down + move_to_bottom: Move to bottom + move_to_top: Move to top + move_up: Move up + remove: Remove + remove_confirmation: Remove this work package from the view? + see_allocation: See allocation + mobile_title: Work packages + query_name: 'Resource management work packages: %{name}' + subheader: + add: Add + add_work_package: Add work package + allocate: Allocate + settings: Configure view diff --git a/modules/resource_management/config/locales/crowdin/kk.yml b/modules/resource_management/config/locales/crowdin/kk.yml index 00dddbc2724..18ec00f5b83 100644 --- a/modules/resource_management/config/locales/crowdin/kk.yml +++ b/modules/resource_management/config/locales/crowdin/kk.yml @@ -2,72 +2,131 @@ kk: activerecord: attributes: - resource_planner: - name: Name - start_date: Start date - end_date: Finish date - default_view_class_name: Default view - public: Public - favorite: Favorite resource_allocation: + allocated_time: Allocated time + end_date: Finish date entity: Entity principal: Assignee - state: State start_date: Start date - end_date: Finish date - allocated_time: Allocated time + state: State user_filter: User filter + resource_planner: + default_view_class_name: Default view + end_date: Finish date + favorite: Favorite + name: Name + public: Public + start_date: Start date errors: models: - resource_planner: - attributes: - end_date: - greater_than_start_date: must be after the start date. resource_allocation: attributes: end_date: greater_than_start_date: must be after the start date. - plugin_openproject_resource_management: - name: OpenProject Resource Management - description: Provides resource management and capacity planning. - project_module_resource_management: Resource management - permission_view_resource_planners: View resource planners - permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. + resource_planner: + attributes: + end_date: + greater_than_start_date: must be after the start date. + resource_work_package_list: + attributes: + query: + must_be_work_package_query: must be a work package query. + models: + resource_allocation: Resource Allocation + resource_planner: Resource Planner + resource_work_package_list: Work packages list + user_card: User cards + button_next: Next + label_resource_management: Resource planning + permission_allocate_user_resources: Allocate user resources + permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. ' permission_manage_public_resource_planners: Manage public resource planners permission_manage_public_resource_planners_explanation: 'Allows users to create and manage public resource planners. It allows them to view, create, manage and publish their own resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - permission_allocate_user_resources: Allocate user resources - permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. + permission_view_resource_planners: View resource planners + permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - label_resource_management: Resource planning - button_next: Save + plugin_openproject_resource_management: + description: Provides resource management and capacity planning. + name: OpenProject Resource Management + project_module_resource_management: Resource management resource_management: - label_resource_planner: Resource planner - label_resource_planner_plural: Resource planners - label_new_resource_planner: New resource planner - public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. - - ' + action: + delete: Delete + favorite: Add to favorites + make_private: Make private + make_public: Make public + unfavorite: Remove from favorites + blankslate: + desc: Create a resource planner to start planning capacity for this project. + title: No resource planners yet + configure_view_dialog: + delete_confirmation: Are you sure you want to delete this view? This cannot be undone. + filter_mode: + automatic: + caption: An automatically-generated list that displays items that meet criteria you define. + label: Automatically filtered + label: Item selection + manual: + caption: A custom list of items you manually add and remove. Filtering is not possible. + label: Manually hand-picked + title: Configure view favorite_caption: 'Make this view a favorite to add it on the top section of the sidebar menu. ' - view_types: - UserCardView: Users cards - action: - favorite: Add to favorites - unfavorite: Remove from favorites - make_public: Make public - make_private: Make private - delete: Delete - sidebar: - public: Public - private: Private - blankslate: - title: No resource planners yet - desc: Create a resource planner to start planning capacity for this project. + label_new_resource_planner: New resource planner + label_resource_planner: Resource planner + label_resource_planner_plural: Resource planners + new_view_dialog: + title: Add View + public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. + + ' show: placeholder: The detailed view for this resource planner is coming soon. + sidebar: + private: Private + public: Public + sub_views: Views in this resource planner + view_types: + resource_work_package_list: + caption: Create a view based on work packages and see its details and allocation in a list + label: Work packages list + user_card: + caption: Create a view based on users and see their details and allocation in a list of user cards + label: Users card list + work_package_list: + add_work_package_dialog: + title: Add work package + allocation_placeholder: "—" + blank: + description: There are no work packages matching this view's filters yet. + title: No work packages to display + columns: + allocated_members: Allocated members + allocation: Allocation + dates: Dates + context_menu: + add_filter_criteria: Add filter criteria + add_user_group: Add user group + edit_total_work: Edit total work + label: More actions + move: Move + move_down: Move down + move_to_bottom: Move to bottom + move_to_top: Move to top + move_up: Move up + remove: Remove + remove_confirmation: Remove this work package from the view? + see_allocation: See allocation + mobile_title: Work packages + query_name: 'Resource management work packages: %{name}' + subheader: + add: Add + add_work_package: Add work package + allocate: Allocate + settings: Configure view diff --git a/modules/resource_management/config/locales/crowdin/ko.yml b/modules/resource_management/config/locales/crowdin/ko.yml index 5da929b4b20..f0a6864e8dc 100644 --- a/modules/resource_management/config/locales/crowdin/ko.yml +++ b/modules/resource_management/config/locales/crowdin/ko.yml @@ -2,72 +2,131 @@ ko: activerecord: attributes: - resource_planner: - name: 이름 - start_date: 시작 날짜 - end_date: 완료 날짜 - default_view_class_name: 기본 보기 - public: 공개 - favorite: 즐겨찾기 resource_allocation: + allocated_time: 할당된 시간 + end_date: 완료 날짜 entity: 엔티티 principal: 담당자 - state: 상태 start_date: 시작 날짜 - end_date: 완료 날짜 - allocated_time: 할당된 시간 + state: 상태 user_filter: 사용자 필터 + resource_planner: + default_view_class_name: 기본 보기 + end_date: 완료 날짜 + favorite: 즐겨찾기 + name: 이름 + public: 공개 + start_date: 시작 날짜 errors: models: - resource_planner: - attributes: - end_date: - greater_than_start_date: "- 시작 날짜 후여야 합니다." resource_allocation: attributes: end_date: greater_than_start_date: "- 시작 날짜 후여야 합니다." - plugin_openproject_resource_management: - name: OpenProject 리소스 관리 - description: 리소스 관리 및 용량 계획을 제공합니다. - project_module_resource_management: 리소스 관리 - permission_view_resource_planners: 리소스 플래너 보기 - permission_view_resource_planners_explanation: '사용자가 리소스 플래너에 액세스하도록 허용합니다. 사용자는 고유한 리소스 플래너를 만들고 관리하며 공개 리소스 플래너를 볼 수 있습니다. 다른 사용자가 만든 공개적으로 공유되지 않은 리소스 플래너는 볼 수 없습니다. + resource_planner: + attributes: + end_date: + greater_than_start_date: "- 시작 날짜 후여야 합니다." + resource_work_package_list: + attributes: + query: + must_be_work_package_query: "- 작업 패키지 쿼리여야 합니다." + models: + resource_allocation: 리소스 할당 + resource_planner: 리소스 플래너 + resource_work_package_list: 작업 패키지 목록 + user_card: 사용자 카드 + button_next: 다음 + label_resource_management: 리소스 계획 + permission_allocate_user_resources: 사용자 리소스 할당 + permission_allocate_user_resources_explanation: '사용자가 리소스 플래너 내에서 리소스 할당을 만들고, 업데이트하고, 삭제할 수 있습니다. 여기에는 플래너에 사용자(또는 사용자 필터)를 할당하고 할당된 시간 및 날짜 범위를 조정하는 것이 포함됩니다. ' permission_manage_public_resource_planners: 공개 리소스 플래너 관리 permission_manage_public_resource_planners_explanation: '사용자가 리소스 플래너를 만들고 관리하도록 허용합니다. 사용자는 고유한 리소스 플래너를 보고 만들고 관리하며 게시할 수 있습니다. 다른 사용자가 만든 공개적으로 공유되지 않은 리소스 플래너는 볼 수 없습니다. ' - permission_allocate_user_resources: 사용자 리소스 할당 - permission_allocate_user_resources_explanation: '사용자가 리소스 플래너 내에서 리소스 할당을 만들고, 업데이트하고, 삭제할 수 있습니다. 여기에는 플래너에 사용자(또는 사용자 필터)를 할당하고 할당된 시간 및 날짜 범위를 조정하는 것이 포함됩니다. + permission_view_resource_planners: 리소스 플래너 보기 + permission_view_resource_planners_explanation: '사용자가 리소스 플래너에 액세스하도록 허용합니다. 사용자는 고유한 리소스 플래너를 만들고 관리하며 공개 리소스 플래너를 볼 수 있습니다. 다른 사용자가 만든 공개적으로 공유되지 않은 리소스 플래너는 볼 수 없습니다. ' - label_resource_management: 리소스 계획 - button_next: 저장 + plugin_openproject_resource_management: + description: 리소스 관리 및 용량 계획을 제공합니다. + name: OpenProject 리소스 관리 + project_module_resource_management: 리소스 관리 resource_management: - label_resource_planner: 리소스 플래너 - label_resource_planner_plural: 리소스 플래너 - label_new_resource_planner: 새로운 리소스 플래너 - public_caption: '이 보기를 프로젝트의 모든 멤버에게 공개로 설정합니다. 이렇게 해도 여전히 각 사용자 권한에 따라 달라지는 작업 패키지의 표시 여부에는 영향을 미치지 않습니다. - - ' + action: + delete: 삭제 + favorite: 즐겨찾기에 추가 + make_private: 비공개로 설정 + make_public: 공개로 설정 + unfavorite: 즐겨찾기에서 제거 + blankslate: + desc: 리소스 플래너를 만들어 이 프로젝트의 용량 계획을 시작하세요. + title: 아직 리소스 플래너 없음 + configure_view_dialog: + delete_confirmation: 이 보기를 삭제하시겠습니까? 이 작업은 취소할 수 없습니다. + filter_mode: + automatic: + caption: 정의한 기준을 충족하는 항목이 표시되는 자동 생성 목록입니다. + label: 자동으로 필터링됨 + label: 항목 선택 + manual: + caption: 수동으로 추가 및 제거하는 항목의 사용자 지정 목록입니다. 필터링은 불가능합니다. + label: 수동으로 직접 선택함 + title: 보기 구성 favorite_caption: '이 보기를 즐겨찾기로 지정하여 사이드바 메뉴의 상단 섹션에 추가합니다. ' - view_types: - UserCardView: 사용자 카드 - action: - favorite: 즐겨찾기에 추가 - unfavorite: 즐겨찾기에서 제거 - make_public: 공개로 설정 - make_private: 비공개로 설정 - delete: 삭제 - sidebar: - public: 공개 - private: 비공개 - blankslate: - title: 아직 리소스 플래너 없음 - desc: 리소스 플래너를 만들어 이 프로젝트의 용량 계획을 시작하세요. + label_new_resource_planner: 새로운 리소스 플래너 + label_resource_planner: 리소스 플래너 + label_resource_planner_plural: 리소스 플래너 + new_view_dialog: + title: 보기 추가 + public_caption: '이 보기를 프로젝트의 모든 멤버에게 공개로 설정합니다. 이렇게 해도 여전히 각 사용자 권한에 따라 달라지는 작업 패키지의 표시 여부에는 영향을 미치지 않습니다. + + ' show: placeholder: 이 리소스 플래너에 대한 자세한 보기가 곧 제공될 예정입니다. + sidebar: + private: 비공개 + public: 공개 + sub_views: 이 리소스 플래너의 보기 + view_types: + resource_work_package_list: + caption: 작업 패키지를 기반으로 보기를 만들고 목록에서 해당 세부 정보 및 할당을 확인하세요 + label: 작업 패키지 목록 + user_card: + caption: 사용자에 기반한 보기를 만들고 사용자 카드 목록에서 해당 세부 정보 및 할당을 확인하세요 + label: 사용자 카드 목록 + work_package_list: + add_work_package_dialog: + title: 작업 패키지 추가 + allocation_placeholder: "—" + blank: + description: 아직 이 보기의 필터와 일치하는 작업 패키지가 없습니다. + title: 표시할 작업 패키지 없음 + columns: + allocated_members: 할당된 멤버 + allocation: 할당 + dates: 날짜 + context_menu: + add_filter_criteria: 필터 기준 추가 + add_user_group: 사용자 그룹 추가 + edit_total_work: 총 작업 편집 + label: 추가 작업 + move: 이동 + move_down: 아래로 이동 + move_to_bottom: 맨 아래로 이동 + move_to_top: 맨 위로 이동 + move_up: 위로 이동 + remove: 제거 + remove_confirmation: 보기에서 이 작업 패키지를 제거하시겠습니까? + see_allocation: 할당 보기 + mobile_title: 작업 패키지 + query_name: '리소스 관리 작업 패키지: %{name}' + subheader: + add: 추가 + add_work_package: 작업 패키지 추가 + allocate: 할당 + settings: 보기 구성 diff --git a/modules/resource_management/config/locales/crowdin/lt.yml b/modules/resource_management/config/locales/crowdin/lt.yml index 49d17398dbd..040f4828d83 100644 --- a/modules/resource_management/config/locales/crowdin/lt.yml +++ b/modules/resource_management/config/locales/crowdin/lt.yml @@ -2,72 +2,131 @@ lt: activerecord: attributes: - resource_planner: - name: Name - start_date: Start date - end_date: Finish date - default_view_class_name: Default view - public: Public - favorite: Favorite resource_allocation: + allocated_time: Allocated time + end_date: Finish date entity: Entity principal: Assignee - state: State start_date: Start date - end_date: Finish date - allocated_time: Allocated time + state: State user_filter: User filter + resource_planner: + default_view_class_name: Default view + end_date: Finish date + favorite: Favorite + name: Name + public: Public + start_date: Start date errors: models: - resource_planner: - attributes: - end_date: - greater_than_start_date: must be after the start date. resource_allocation: attributes: end_date: greater_than_start_date: must be after the start date. - plugin_openproject_resource_management: - name: OpenProject Resource Management - description: Provides resource management and capacity planning. - project_module_resource_management: Resource management - permission_view_resource_planners: View resource planners - permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. + resource_planner: + attributes: + end_date: + greater_than_start_date: must be after the start date. + resource_work_package_list: + attributes: + query: + must_be_work_package_query: must be a work package query. + models: + resource_allocation: Resource Allocation + resource_planner: Resource Planner + resource_work_package_list: Work packages list + user_card: User cards + button_next: Next + label_resource_management: Resource planning + permission_allocate_user_resources: Allocate user resources + permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. ' permission_manage_public_resource_planners: Manage public resource planners permission_manage_public_resource_planners_explanation: 'Allows users to create and manage public resource planners. It allows them to view, create, manage and publish their own resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - permission_allocate_user_resources: Allocate user resources - permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. + permission_view_resource_planners: View resource planners + permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - label_resource_management: Resource planning - button_next: Save + plugin_openproject_resource_management: + description: Provides resource management and capacity planning. + name: OpenProject Resource Management + project_module_resource_management: Resource management resource_management: - label_resource_planner: Resource planner - label_resource_planner_plural: Resource planners - label_new_resource_planner: New resource planner - public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. - - ' + action: + delete: Delete + favorite: Add to favorites + make_private: Make private + make_public: Make public + unfavorite: Remove from favorites + blankslate: + desc: Create a resource planner to start planning capacity for this project. + title: No resource planners yet + configure_view_dialog: + delete_confirmation: Are you sure you want to delete this view? This cannot be undone. + filter_mode: + automatic: + caption: An automatically-generated list that displays items that meet criteria you define. + label: Automatically filtered + label: Item selection + manual: + caption: A custom list of items you manually add and remove. Filtering is not possible. + label: Manually hand-picked + title: Configure view favorite_caption: 'Make this view a favorite to add it on the top section of the sidebar menu. ' - view_types: - UserCardView: Users cards - action: - favorite: Add to favorites - unfavorite: Remove from favorites - make_public: Make public - make_private: Make private - delete: Delete - sidebar: - public: Public - private: Private - blankslate: - title: No resource planners yet - desc: Create a resource planner to start planning capacity for this project. + label_new_resource_planner: New resource planner + label_resource_planner: Resource planner + label_resource_planner_plural: Resource planners + new_view_dialog: + title: Add View + public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. + + ' show: placeholder: The detailed view for this resource planner is coming soon. + sidebar: + private: Private + public: Public + sub_views: Views in this resource planner + view_types: + resource_work_package_list: + caption: Create a view based on work packages and see its details and allocation in a list + label: Work packages list + user_card: + caption: Create a view based on users and see their details and allocation in a list of user cards + label: Users card list + work_package_list: + add_work_package_dialog: + title: Add work package + allocation_placeholder: "—" + blank: + description: There are no work packages matching this view's filters yet. + title: No work packages to display + columns: + allocated_members: Allocated members + allocation: Allocation + dates: Dates + context_menu: + add_filter_criteria: Add filter criteria + add_user_group: Add user group + edit_total_work: Edit total work + label: More actions + move: Move + move_down: Move down + move_to_bottom: Move to bottom + move_to_top: Move to top + move_up: Move up + remove: Remove + remove_confirmation: Remove this work package from the view? + see_allocation: See allocation + mobile_title: Work packages + query_name: 'Resource management work packages: %{name}' + subheader: + add: Add + add_work_package: Add work package + allocate: Allocate + settings: Configure view diff --git a/modules/resource_management/config/locales/crowdin/lv.yml b/modules/resource_management/config/locales/crowdin/lv.yml index 4746f888db5..54bccea6c4b 100644 --- a/modules/resource_management/config/locales/crowdin/lv.yml +++ b/modules/resource_management/config/locales/crowdin/lv.yml @@ -2,72 +2,131 @@ lv: activerecord: attributes: - resource_planner: - name: Name - start_date: Start date - end_date: Finish date - default_view_class_name: Default view - public: Public - favorite: Favorite resource_allocation: + allocated_time: Allocated time + end_date: Finish date entity: Entity principal: Assignee - state: State start_date: Start date - end_date: Finish date - allocated_time: Allocated time + state: State user_filter: User filter + resource_planner: + default_view_class_name: Default view + end_date: Finish date + favorite: Favorite + name: Name + public: Public + start_date: Start date errors: models: - resource_planner: - attributes: - end_date: - greater_than_start_date: must be after the start date. resource_allocation: attributes: end_date: greater_than_start_date: must be after the start date. - plugin_openproject_resource_management: - name: OpenProject Resource Management - description: Provides resource management and capacity planning. - project_module_resource_management: Resource management - permission_view_resource_planners: View resource planners - permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. + resource_planner: + attributes: + end_date: + greater_than_start_date: must be after the start date. + resource_work_package_list: + attributes: + query: + must_be_work_package_query: must be a work package query. + models: + resource_allocation: Resource Allocation + resource_planner: Resource Planner + resource_work_package_list: Work packages list + user_card: User cards + button_next: Next + label_resource_management: Resource planning + permission_allocate_user_resources: Allocate user resources + permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. ' permission_manage_public_resource_planners: Manage public resource planners permission_manage_public_resource_planners_explanation: 'Allows users to create and manage public resource planners. It allows them to view, create, manage and publish their own resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - permission_allocate_user_resources: Allocate user resources - permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. + permission_view_resource_planners: View resource planners + permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - label_resource_management: Resource planning - button_next: Save + plugin_openproject_resource_management: + description: Provides resource management and capacity planning. + name: OpenProject Resource Management + project_module_resource_management: Resource management resource_management: - label_resource_planner: Resource planner - label_resource_planner_plural: Resource planners - label_new_resource_planner: New resource planner - public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. - - ' + action: + delete: Delete + favorite: Add to favorites + make_private: Make private + make_public: Make public + unfavorite: Remove from favorites + blankslate: + desc: Create a resource planner to start planning capacity for this project. + title: No resource planners yet + configure_view_dialog: + delete_confirmation: Are you sure you want to delete this view? This cannot be undone. + filter_mode: + automatic: + caption: An automatically-generated list that displays items that meet criteria you define. + label: Automatically filtered + label: Item selection + manual: + caption: A custom list of items you manually add and remove. Filtering is not possible. + label: Manually hand-picked + title: Configure view favorite_caption: 'Make this view a favorite to add it on the top section of the sidebar menu. ' - view_types: - UserCardView: Users cards - action: - favorite: Add to favorites - unfavorite: Remove from favorites - make_public: Make public - make_private: Make private - delete: Delete - sidebar: - public: Public - private: Private - blankslate: - title: No resource planners yet - desc: Create a resource planner to start planning capacity for this project. + label_new_resource_planner: New resource planner + label_resource_planner: Resource planner + label_resource_planner_plural: Resource planners + new_view_dialog: + title: Add View + public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. + + ' show: placeholder: The detailed view for this resource planner is coming soon. + sidebar: + private: Private + public: Public + sub_views: Views in this resource planner + view_types: + resource_work_package_list: + caption: Create a view based on work packages and see its details and allocation in a list + label: Work packages list + user_card: + caption: Create a view based on users and see their details and allocation in a list of user cards + label: Users card list + work_package_list: + add_work_package_dialog: + title: Add work package + allocation_placeholder: "—" + blank: + description: There are no work packages matching this view's filters yet. + title: No work packages to display + columns: + allocated_members: Allocated members + allocation: Allocation + dates: Dates + context_menu: + add_filter_criteria: Add filter criteria + add_user_group: Add user group + edit_total_work: Edit total work + label: More actions + move: Move + move_down: Move down + move_to_bottom: Move to bottom + move_to_top: Move to top + move_up: Move up + remove: Remove + remove_confirmation: Remove this work package from the view? + see_allocation: See allocation + mobile_title: Work packages + query_name: 'Resource management work packages: %{name}' + subheader: + add: Add + add_work_package: Add work package + allocate: Allocate + settings: Configure view diff --git a/modules/resource_management/config/locales/crowdin/mn.yml b/modules/resource_management/config/locales/crowdin/mn.yml index 07b2b83422e..0eec064451a 100644 --- a/modules/resource_management/config/locales/crowdin/mn.yml +++ b/modules/resource_management/config/locales/crowdin/mn.yml @@ -2,72 +2,131 @@ mn: activerecord: attributes: - resource_planner: - name: Name - start_date: Start date - end_date: Finish date - default_view_class_name: Default view - public: Public - favorite: Favorite resource_allocation: + allocated_time: Allocated time + end_date: Finish date entity: Entity principal: Assignee - state: State start_date: Start date - end_date: Finish date - allocated_time: Allocated time + state: State user_filter: User filter + resource_planner: + default_view_class_name: Default view + end_date: Finish date + favorite: Favorite + name: Name + public: Public + start_date: Start date errors: models: - resource_planner: - attributes: - end_date: - greater_than_start_date: must be after the start date. resource_allocation: attributes: end_date: greater_than_start_date: must be after the start date. - plugin_openproject_resource_management: - name: OpenProject Resource Management - description: Provides resource management and capacity planning. - project_module_resource_management: Resource management - permission_view_resource_planners: View resource planners - permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. + resource_planner: + attributes: + end_date: + greater_than_start_date: must be after the start date. + resource_work_package_list: + attributes: + query: + must_be_work_package_query: must be a work package query. + models: + resource_allocation: Resource Allocation + resource_planner: Resource Planner + resource_work_package_list: Work packages list + user_card: User cards + button_next: Next + label_resource_management: Resource planning + permission_allocate_user_resources: Allocate user resources + permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. ' permission_manage_public_resource_planners: Manage public resource planners permission_manage_public_resource_planners_explanation: 'Allows users to create and manage public resource planners. It allows them to view, create, manage and publish their own resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - permission_allocate_user_resources: Allocate user resources - permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. + permission_view_resource_planners: View resource planners + permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - label_resource_management: Resource planning - button_next: Save + plugin_openproject_resource_management: + description: Provides resource management and capacity planning. + name: OpenProject Resource Management + project_module_resource_management: Resource management resource_management: - label_resource_planner: Resource planner - label_resource_planner_plural: Resource planners - label_new_resource_planner: New resource planner - public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. - - ' + action: + delete: Delete + favorite: Add to favorites + make_private: Make private + make_public: Make public + unfavorite: Remove from favorites + blankslate: + desc: Create a resource planner to start planning capacity for this project. + title: No resource planners yet + configure_view_dialog: + delete_confirmation: Are you sure you want to delete this view? This cannot be undone. + filter_mode: + automatic: + caption: An automatically-generated list that displays items that meet criteria you define. + label: Automatically filtered + label: Item selection + manual: + caption: A custom list of items you manually add and remove. Filtering is not possible. + label: Manually hand-picked + title: Configure view favorite_caption: 'Make this view a favorite to add it on the top section of the sidebar menu. ' - view_types: - UserCardView: Users cards - action: - favorite: Add to favorites - unfavorite: Remove from favorites - make_public: Make public - make_private: Make private - delete: Delete - sidebar: - public: Public - private: Private - blankslate: - title: No resource planners yet - desc: Create a resource planner to start planning capacity for this project. + label_new_resource_planner: New resource planner + label_resource_planner: Resource planner + label_resource_planner_plural: Resource planners + new_view_dialog: + title: Add View + public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. + + ' show: placeholder: The detailed view for this resource planner is coming soon. + sidebar: + private: Private + public: Public + sub_views: Views in this resource planner + view_types: + resource_work_package_list: + caption: Create a view based on work packages and see its details and allocation in a list + label: Work packages list + user_card: + caption: Create a view based on users and see their details and allocation in a list of user cards + label: Users card list + work_package_list: + add_work_package_dialog: + title: Add work package + allocation_placeholder: "—" + blank: + description: There are no work packages matching this view's filters yet. + title: No work packages to display + columns: + allocated_members: Allocated members + allocation: Allocation + dates: Dates + context_menu: + add_filter_criteria: Add filter criteria + add_user_group: Add user group + edit_total_work: Edit total work + label: More actions + move: Move + move_down: Move down + move_to_bottom: Move to bottom + move_to_top: Move to top + move_up: Move up + remove: Remove + remove_confirmation: Remove this work package from the view? + see_allocation: See allocation + mobile_title: Work packages + query_name: 'Resource management work packages: %{name}' + subheader: + add: Add + add_work_package: Add work package + allocate: Allocate + settings: Configure view diff --git a/modules/resource_management/config/locales/crowdin/ms.yml b/modules/resource_management/config/locales/crowdin/ms.yml index 35bc81cb0b2..03de121cea1 100644 --- a/modules/resource_management/config/locales/crowdin/ms.yml +++ b/modules/resource_management/config/locales/crowdin/ms.yml @@ -2,72 +2,131 @@ ms: activerecord: attributes: - resource_planner: - name: Name - start_date: Start date - end_date: Finish date - default_view_class_name: Default view - public: Public - favorite: Favorite resource_allocation: + allocated_time: Allocated time + end_date: Finish date entity: Entity principal: Assignee - state: State start_date: Start date - end_date: Finish date - allocated_time: Allocated time + state: State user_filter: User filter + resource_planner: + default_view_class_name: Default view + end_date: Finish date + favorite: Favorite + name: Name + public: Public + start_date: Start date errors: models: - resource_planner: - attributes: - end_date: - greater_than_start_date: must be after the start date. resource_allocation: attributes: end_date: greater_than_start_date: must be after the start date. - plugin_openproject_resource_management: - name: OpenProject Resource Management - description: Provides resource management and capacity planning. - project_module_resource_management: Resource management - permission_view_resource_planners: View resource planners - permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. + resource_planner: + attributes: + end_date: + greater_than_start_date: must be after the start date. + resource_work_package_list: + attributes: + query: + must_be_work_package_query: must be a work package query. + models: + resource_allocation: Resource Allocation + resource_planner: Resource Planner + resource_work_package_list: Work packages list + user_card: User cards + button_next: Next + label_resource_management: Resource planning + permission_allocate_user_resources: Allocate user resources + permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. ' permission_manage_public_resource_planners: Manage public resource planners permission_manage_public_resource_planners_explanation: 'Allows users to create and manage public resource planners. It allows them to view, create, manage and publish their own resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - permission_allocate_user_resources: Allocate user resources - permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. + permission_view_resource_planners: View resource planners + permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - label_resource_management: Resource planning - button_next: Save + plugin_openproject_resource_management: + description: Provides resource management and capacity planning. + name: OpenProject Resource Management + project_module_resource_management: Resource management resource_management: - label_resource_planner: Resource planner - label_resource_planner_plural: Resource planners - label_new_resource_planner: New resource planner - public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. - - ' + action: + delete: Delete + favorite: Add to favorites + make_private: Make private + make_public: Make public + unfavorite: Remove from favorites + blankslate: + desc: Create a resource planner to start planning capacity for this project. + title: No resource planners yet + configure_view_dialog: + delete_confirmation: Are you sure you want to delete this view? This cannot be undone. + filter_mode: + automatic: + caption: An automatically-generated list that displays items that meet criteria you define. + label: Automatically filtered + label: Item selection + manual: + caption: A custom list of items you manually add and remove. Filtering is not possible. + label: Manually hand-picked + title: Configure view favorite_caption: 'Make this view a favorite to add it on the top section of the sidebar menu. ' - view_types: - UserCardView: Users cards - action: - favorite: Add to favorites - unfavorite: Remove from favorites - make_public: Make public - make_private: Make private - delete: Delete - sidebar: - public: Public - private: Private - blankslate: - title: No resource planners yet - desc: Create a resource planner to start planning capacity for this project. + label_new_resource_planner: New resource planner + label_resource_planner: Resource planner + label_resource_planner_plural: Resource planners + new_view_dialog: + title: Add View + public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. + + ' show: placeholder: The detailed view for this resource planner is coming soon. + sidebar: + private: Private + public: Public + sub_views: Views in this resource planner + view_types: + resource_work_package_list: + caption: Create a view based on work packages and see its details and allocation in a list + label: Work packages list + user_card: + caption: Create a view based on users and see their details and allocation in a list of user cards + label: Users card list + work_package_list: + add_work_package_dialog: + title: Add work package + allocation_placeholder: "—" + blank: + description: There are no work packages matching this view's filters yet. + title: No work packages to display + columns: + allocated_members: Allocated members + allocation: Allocation + dates: Dates + context_menu: + add_filter_criteria: Add filter criteria + add_user_group: Add user group + edit_total_work: Edit total work + label: More actions + move: Move + move_down: Move down + move_to_bottom: Move to bottom + move_to_top: Move to top + move_up: Move up + remove: Remove + remove_confirmation: Remove this work package from the view? + see_allocation: See allocation + mobile_title: Work packages + query_name: 'Resource management work packages: %{name}' + subheader: + add: Add + add_work_package: Add work package + allocate: Allocate + settings: Configure view diff --git a/modules/resource_management/config/locales/crowdin/ne.yml b/modules/resource_management/config/locales/crowdin/ne.yml index 2c45b23e61a..72e0e598c41 100644 --- a/modules/resource_management/config/locales/crowdin/ne.yml +++ b/modules/resource_management/config/locales/crowdin/ne.yml @@ -2,72 +2,131 @@ ne: activerecord: attributes: - resource_planner: - name: Name - start_date: Start date - end_date: Finish date - default_view_class_name: Default view - public: Public - favorite: Favorite resource_allocation: + allocated_time: Allocated time + end_date: Finish date entity: Entity principal: Assignee - state: State start_date: Start date - end_date: Finish date - allocated_time: Allocated time + state: State user_filter: User filter + resource_planner: + default_view_class_name: Default view + end_date: Finish date + favorite: Favorite + name: Name + public: Public + start_date: Start date errors: models: - resource_planner: - attributes: - end_date: - greater_than_start_date: must be after the start date. resource_allocation: attributes: end_date: greater_than_start_date: must be after the start date. - plugin_openproject_resource_management: - name: OpenProject Resource Management - description: Provides resource management and capacity planning. - project_module_resource_management: Resource management - permission_view_resource_planners: View resource planners - permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. + resource_planner: + attributes: + end_date: + greater_than_start_date: must be after the start date. + resource_work_package_list: + attributes: + query: + must_be_work_package_query: must be a work package query. + models: + resource_allocation: Resource Allocation + resource_planner: Resource Planner + resource_work_package_list: Work packages list + user_card: User cards + button_next: Next + label_resource_management: Resource planning + permission_allocate_user_resources: Allocate user resources + permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. ' permission_manage_public_resource_planners: Manage public resource planners permission_manage_public_resource_planners_explanation: 'Allows users to create and manage public resource planners. It allows them to view, create, manage and publish their own resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - permission_allocate_user_resources: Allocate user resources - permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. + permission_view_resource_planners: View resource planners + permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - label_resource_management: Resource planning - button_next: Save + plugin_openproject_resource_management: + description: Provides resource management and capacity planning. + name: OpenProject Resource Management + project_module_resource_management: Resource management resource_management: - label_resource_planner: Resource planner - label_resource_planner_plural: Resource planners - label_new_resource_planner: New resource planner - public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. - - ' + action: + delete: Delete + favorite: Add to favorites + make_private: Make private + make_public: Make public + unfavorite: Remove from favorites + blankslate: + desc: Create a resource planner to start planning capacity for this project. + title: No resource planners yet + configure_view_dialog: + delete_confirmation: Are you sure you want to delete this view? This cannot be undone. + filter_mode: + automatic: + caption: An automatically-generated list that displays items that meet criteria you define. + label: Automatically filtered + label: Item selection + manual: + caption: A custom list of items you manually add and remove. Filtering is not possible. + label: Manually hand-picked + title: Configure view favorite_caption: 'Make this view a favorite to add it on the top section of the sidebar menu. ' - view_types: - UserCardView: Users cards - action: - favorite: Add to favorites - unfavorite: Remove from favorites - make_public: Make public - make_private: Make private - delete: Delete - sidebar: - public: Public - private: Private - blankslate: - title: No resource planners yet - desc: Create a resource planner to start planning capacity for this project. + label_new_resource_planner: New resource planner + label_resource_planner: Resource planner + label_resource_planner_plural: Resource planners + new_view_dialog: + title: Add View + public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. + + ' show: placeholder: The detailed view for this resource planner is coming soon. + sidebar: + private: Private + public: Public + sub_views: Views in this resource planner + view_types: + resource_work_package_list: + caption: Create a view based on work packages and see its details and allocation in a list + label: Work packages list + user_card: + caption: Create a view based on users and see their details and allocation in a list of user cards + label: Users card list + work_package_list: + add_work_package_dialog: + title: Add work package + allocation_placeholder: "—" + blank: + description: There are no work packages matching this view's filters yet. + title: No work packages to display + columns: + allocated_members: Allocated members + allocation: Allocation + dates: Dates + context_menu: + add_filter_criteria: Add filter criteria + add_user_group: Add user group + edit_total_work: Edit total work + label: More actions + move: Move + move_down: Move down + move_to_bottom: Move to bottom + move_to_top: Move to top + move_up: Move up + remove: Remove + remove_confirmation: Remove this work package from the view? + see_allocation: See allocation + mobile_title: Work packages + query_name: 'Resource management work packages: %{name}' + subheader: + add: Add + add_work_package: Add work package + allocate: Allocate + settings: Configure view diff --git a/modules/resource_management/config/locales/crowdin/nl.yml b/modules/resource_management/config/locales/crowdin/nl.yml index 2504af0d5b5..60d1e65f46a 100644 --- a/modules/resource_management/config/locales/crowdin/nl.yml +++ b/modules/resource_management/config/locales/crowdin/nl.yml @@ -2,72 +2,131 @@ nl: activerecord: attributes: - resource_planner: - name: Name - start_date: Start date - end_date: Finish date - default_view_class_name: Default view - public: Public - favorite: Favorite resource_allocation: + allocated_time: Allocated time + end_date: Finish date entity: Entity principal: Assignee - state: State start_date: Start date - end_date: Finish date - allocated_time: Allocated time + state: State user_filter: User filter + resource_planner: + default_view_class_name: Default view + end_date: Finish date + favorite: Favorite + name: Name + public: Public + start_date: Start date errors: models: - resource_planner: - attributes: - end_date: - greater_than_start_date: must be after the start date. resource_allocation: attributes: end_date: greater_than_start_date: must be after the start date. - plugin_openproject_resource_management: - name: OpenProject Resource Management - description: Provides resource management and capacity planning. - project_module_resource_management: Resource management - permission_view_resource_planners: View resource planners - permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. + resource_planner: + attributes: + end_date: + greater_than_start_date: must be after the start date. + resource_work_package_list: + attributes: + query: + must_be_work_package_query: must be a work package query. + models: + resource_allocation: Resource Allocation + resource_planner: Resource Planner + resource_work_package_list: Work packages list + user_card: User cards + button_next: Next + label_resource_management: Resource planning + permission_allocate_user_resources: Allocate user resources + permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. ' permission_manage_public_resource_planners: Manage public resource planners permission_manage_public_resource_planners_explanation: 'Allows users to create and manage public resource planners. It allows them to view, create, manage and publish their own resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - permission_allocate_user_resources: Allocate user resources - permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. + permission_view_resource_planners: View resource planners + permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - label_resource_management: Resource planning - button_next: Save + plugin_openproject_resource_management: + description: Provides resource management and capacity planning. + name: OpenProject Resource Management + project_module_resource_management: Resource management resource_management: - label_resource_planner: Resource planner - label_resource_planner_plural: Resource planners - label_new_resource_planner: New resource planner - public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. - - ' + action: + delete: Delete + favorite: Add to favorites + make_private: Make private + make_public: Make public + unfavorite: Remove from favorites + blankslate: + desc: Create a resource planner to start planning capacity for this project. + title: No resource planners yet + configure_view_dialog: + delete_confirmation: Are you sure you want to delete this view? This cannot be undone. + filter_mode: + automatic: + caption: An automatically-generated list that displays items that meet criteria you define. + label: Automatically filtered + label: Item selection + manual: + caption: A custom list of items you manually add and remove. Filtering is not possible. + label: Manually hand-picked + title: Configure view favorite_caption: 'Make this view a favorite to add it on the top section of the sidebar menu. ' - view_types: - UserCardView: Users cards - action: - favorite: Add to favorites - unfavorite: Remove from favorites - make_public: Make public - make_private: Make private - delete: Delete - sidebar: - public: Public - private: Private - blankslate: - title: No resource planners yet - desc: Create a resource planner to start planning capacity for this project. + label_new_resource_planner: New resource planner + label_resource_planner: Resource planner + label_resource_planner_plural: Resource planners + new_view_dialog: + title: Add View + public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. + + ' show: placeholder: The detailed view for this resource planner is coming soon. + sidebar: + private: Private + public: Public + sub_views: Views in this resource planner + view_types: + resource_work_package_list: + caption: Create a view based on work packages and see its details and allocation in a list + label: Work packages list + user_card: + caption: Create a view based on users and see their details and allocation in a list of user cards + label: Users card list + work_package_list: + add_work_package_dialog: + title: Add work package + allocation_placeholder: "—" + blank: + description: There are no work packages matching this view's filters yet. + title: No work packages to display + columns: + allocated_members: Allocated members + allocation: Allocation + dates: Dates + context_menu: + add_filter_criteria: Add filter criteria + add_user_group: Add user group + edit_total_work: Edit total work + label: More actions + move: Move + move_down: Move down + move_to_bottom: Move to bottom + move_to_top: Move to top + move_up: Move up + remove: Remove + remove_confirmation: Remove this work package from the view? + see_allocation: See allocation + mobile_title: Work packages + query_name: 'Resource management work packages: %{name}' + subheader: + add: Add + add_work_package: Add work package + allocate: Allocate + settings: Configure view diff --git a/modules/resource_management/config/locales/crowdin/no.yml b/modules/resource_management/config/locales/crowdin/no.yml index f61aebe7dd7..aad174e18b5 100644 --- a/modules/resource_management/config/locales/crowdin/no.yml +++ b/modules/resource_management/config/locales/crowdin/no.yml @@ -2,72 +2,131 @@ 'no': activerecord: attributes: - resource_planner: - name: Name - start_date: Start date - end_date: Finish date - default_view_class_name: Default view - public: Public - favorite: Favorite resource_allocation: + allocated_time: Allocated time + end_date: Finish date entity: Entity principal: Assignee - state: State start_date: Start date - end_date: Finish date - allocated_time: Allocated time + state: State user_filter: User filter + resource_planner: + default_view_class_name: Default view + end_date: Finish date + favorite: Favorite + name: Name + public: Public + start_date: Start date errors: models: - resource_planner: - attributes: - end_date: - greater_than_start_date: must be after the start date. resource_allocation: attributes: end_date: greater_than_start_date: must be after the start date. - plugin_openproject_resource_management: - name: OpenProject Resource Management - description: Provides resource management and capacity planning. - project_module_resource_management: Resource management - permission_view_resource_planners: View resource planners - permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. + resource_planner: + attributes: + end_date: + greater_than_start_date: must be after the start date. + resource_work_package_list: + attributes: + query: + must_be_work_package_query: must be a work package query. + models: + resource_allocation: Resource Allocation + resource_planner: Resource Planner + resource_work_package_list: Work packages list + user_card: User cards + button_next: Next + label_resource_management: Resource planning + permission_allocate_user_resources: Allocate user resources + permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. ' permission_manage_public_resource_planners: Manage public resource planners permission_manage_public_resource_planners_explanation: 'Allows users to create and manage public resource planners. It allows them to view, create, manage and publish their own resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - permission_allocate_user_resources: Allocate user resources - permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. + permission_view_resource_planners: View resource planners + permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - label_resource_management: Resource planning - button_next: Save + plugin_openproject_resource_management: + description: Provides resource management and capacity planning. + name: OpenProject Resource Management + project_module_resource_management: Resource management resource_management: - label_resource_planner: Resource planner - label_resource_planner_plural: Resource planners - label_new_resource_planner: New resource planner - public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. - - ' + action: + delete: Delete + favorite: Add to favorites + make_private: Make private + make_public: Make public + unfavorite: Remove from favorites + blankslate: + desc: Create a resource planner to start planning capacity for this project. + title: No resource planners yet + configure_view_dialog: + delete_confirmation: Are you sure you want to delete this view? This cannot be undone. + filter_mode: + automatic: + caption: An automatically-generated list that displays items that meet criteria you define. + label: Automatically filtered + label: Item selection + manual: + caption: A custom list of items you manually add and remove. Filtering is not possible. + label: Manually hand-picked + title: Configure view favorite_caption: 'Make this view a favorite to add it on the top section of the sidebar menu. ' - view_types: - UserCardView: Users cards - action: - favorite: Add to favorites - unfavorite: Remove from favorites - make_public: Make public - make_private: Make private - delete: Delete - sidebar: - public: Public - private: Private - blankslate: - title: No resource planners yet - desc: Create a resource planner to start planning capacity for this project. + label_new_resource_planner: New resource planner + label_resource_planner: Resource planner + label_resource_planner_plural: Resource planners + new_view_dialog: + title: Add View + public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. + + ' show: placeholder: The detailed view for this resource planner is coming soon. + sidebar: + private: Private + public: Public + sub_views: Views in this resource planner + view_types: + resource_work_package_list: + caption: Create a view based on work packages and see its details and allocation in a list + label: Work packages list + user_card: + caption: Create a view based on users and see their details and allocation in a list of user cards + label: Users card list + work_package_list: + add_work_package_dialog: + title: Add work package + allocation_placeholder: "—" + blank: + description: There are no work packages matching this view's filters yet. + title: No work packages to display + columns: + allocated_members: Allocated members + allocation: Allocation + dates: Dates + context_menu: + add_filter_criteria: Add filter criteria + add_user_group: Add user group + edit_total_work: Edit total work + label: More actions + move: Move + move_down: Move down + move_to_bottom: Move to bottom + move_to_top: Move to top + move_up: Move up + remove: Remove + remove_confirmation: Remove this work package from the view? + see_allocation: See allocation + mobile_title: Work packages + query_name: 'Resource management work packages: %{name}' + subheader: + add: Add + add_work_package: Add work package + allocate: Allocate + settings: Configure view diff --git a/modules/resource_management/config/locales/crowdin/pl.yml b/modules/resource_management/config/locales/crowdin/pl.yml index bbe07be6c09..cdf04448010 100644 --- a/modules/resource_management/config/locales/crowdin/pl.yml +++ b/modules/resource_management/config/locales/crowdin/pl.yml @@ -2,72 +2,131 @@ pl: activerecord: attributes: - resource_planner: - name: Nazwa - start_date: Data rozpoczęcia - end_date: Data zakończenia - default_view_class_name: Widok domyślny - public: Publiczny - favorite: Ulubione resource_allocation: + allocated_time: Przydzielony czas + end_date: Data zakończenia entity: Pole principal: Przypisana osoba - state: Stan start_date: Data rozpoczęcia - end_date: Data zakończenia - allocated_time: Przydzielony czas + state: Stan user_filter: Filtr użytkownika + resource_planner: + default_view_class_name: Widok domyślny + end_date: Data zakończenia + favorite: Ulubione + name: Nazwa + public: Publiczny + start_date: Data rozpoczęcia errors: models: - resource_planner: - attributes: - end_date: - greater_than_start_date: musi być późniejsza niż data rozpoczęcia. resource_allocation: attributes: end_date: greater_than_start_date: musi być późniejsza niż data rozpoczęcia. - plugin_openproject_resource_management: - name: Zarządzanie zasobami OpenProject - description: Zapewnia zarządzanie zasobami i planowanie obciążeń. - project_module_resource_management: Zarządzanie zasobami - permission_view_resource_planners: Wyświetl planistów zasobów - permission_view_resource_planners_explanation: 'Umożliwia użytkownikom dostęp do planistów zasobów. Pozwala im tworzyć własnych planistów zasobów i zarządzać nimi oraz wyświetlać publicznych planistów zasobów. Nie pozwala użytkownikom na przeglądanie nieudostępnionych publicznie planistów zasobów utworzonych przez innych użytkowników. + resource_planner: + attributes: + end_date: + greater_than_start_date: musi być późniejsza niż data rozpoczęcia. + resource_work_package_list: + attributes: + query: + must_be_work_package_query: musi być zapytaniem pakietu roboczego. + models: + resource_allocation: Przydział zasobów + resource_planner: Planista zasobów + resource_work_package_list: Lista pakietów roboczych + user_card: Karty użytkowników + button_next: Dalej + label_resource_management: Planowanie zasobów + permission_allocate_user_resources: Przydziel zasoby użytkownika + permission_allocate_user_resources_explanation: 'Umożliwia użytkownikom tworzenie, aktualizowanie i usuwanie przydziałów zasobów w planiście zasobów. Obejmuje to przypisywanie użytkowników (lub filtrów użytkowników) do planisty oraz dostosowywanie przydzielonego czasu i zakresu dat. ' permission_manage_public_resource_planners: Zarządzaj publicznymi planistami zasobów permission_manage_public_resource_planners_explanation: 'Umożliwia użytkownikom tworzenie planistów zasobów oraz zarządzanie nimi. Pozwala im na przeglądanie, tworzenie, zarządzanie i publikowanie własnych planistów zasobów. Nie pozwala użytkownikom przeglądać nieudostępnionych publicznie planistów zasobów utworzonych przez innych użytkowników. ' - permission_allocate_user_resources: Przydziel zasoby użytkownika - permission_allocate_user_resources_explanation: 'Umożliwia użytkownikom tworzenie, aktualizowanie i usuwanie przydziałów zasobów w planiście zasobów. Obejmuje to przypisywanie użytkowników (lub filtrów użytkowników) do planisty oraz dostosowywanie przydzielonego czasu i zakresu dat. + permission_view_resource_planners: Wyświetl planistów zasobów + permission_view_resource_planners_explanation: 'Umożliwia użytkownikom dostęp do planistów zasobów. Pozwala im tworzyć własnych planistów zasobów i zarządzać nimi oraz wyświetlać publicznych planistów zasobów. Nie pozwala użytkownikom na przeglądanie nieudostępnionych publicznie planistów zasobów utworzonych przez innych użytkowników. ' - label_resource_management: Planowanie zasobów - button_next: Zapisz + plugin_openproject_resource_management: + description: Zapewnia zarządzanie zasobami i planowanie obciążeń. + name: Zarządzanie zasobami OpenProject + project_module_resource_management: Zarządzanie zasobami resource_management: - label_resource_planner: Planista zasobów - label_resource_planner_plural: Planiści zasobów - label_new_resource_planner: Nowy planista zasobów - public_caption: 'Ustaw ten widok jako publiczny dla wszystkich członków projektu. Nie ma to wpływu na widoczność pakietów roboczych, która nadal zależy od uprawnień poszczególnych użytkowników. - - ' + action: + delete: Usuń + favorite: Dodaj do ulubionych + make_private: Ustaw jako prywatny + make_public: Ustaw jako publiczny + unfavorite: Usuń z ulubionych + blankslate: + desc: Utwórz planistę zasobów, aby rozpocząć planowanie obciążeń dla tego projektu. + title: Nie ma jeszcze planistów zasobów + configure_view_dialog: + delete_confirmation: Czy na pewno chcesz usunąć ten widok? Nie można tego cofnąć. + filter_mode: + automatic: + caption: Automatycznie generowana lista wyświetlająca elementy spełniające zdefiniowane przez Ciebie kryteria. + label: Automatyczne filtrowanie + label: Wybór elementów + manual: + caption: Niestandardowa lista elementów dodawanych i usuwanych ręcznie. Filtrowanie nie jest możliwe. + label: Ręczny wybór + title: Konfiguruj widok favorite_caption: 'Ustaw ten widok jako ulubiony, aby dodać go do górnej części menu paska bocznego. ' - view_types: - UserCardView: Karty użytkowników - action: - favorite: Dodaj do ulubionych - unfavorite: Usuń z ulubionych - make_public: Ustaw jako publiczny - make_private: Ustaw jako prywatny - delete: Usuń - sidebar: - public: Publiczny - private: Prywatny - blankslate: - title: Nie ma jeszcze planistów zasobów - desc: Utwórz planistę zasobów, aby rozpocząć planowanie obciążeń dla tego projektu. + label_new_resource_planner: Nowy planista zasobów + label_resource_planner: Planista zasobów + label_resource_planner_plural: Planiści zasobów + new_view_dialog: + title: Dodaj widok + public_caption: 'Ustaw ten widok jako publiczny dla wszystkich członków projektu. Nie ma to wpływu na widoczność pakietów roboczych, która nadal zależy od uprawnień poszczególnych użytkowników. + + ' show: placeholder: Szczegółowy widok tego planisty zasobów będzie dostępny wkrótce. + sidebar: + private: Prywatny + public: Publiczny + sub_views: Widoki w tym planiście zasobów + view_types: + resource_work_package_list: + caption: Utwórz widok oparty na pakietach roboczych i zobacz jego szczegóły i przydział na liście + label: Lista pakietów roboczych + user_card: + caption: Utwórz widok w oparciu o użytkowników i zobacz ich szczegóły i przydział na liście kart użytkowników + label: Lista kart użytkowników + work_package_list: + add_work_package_dialog: + title: Dodaj pakiet roboczy + allocation_placeholder: "—" + blank: + description: Nie ma jeszcze pakietów roboczych pasujących do filtrów tego widoku. + title: Brak pakietów roboczych do wyświetlenia + columns: + allocated_members: Przydzieleni członkowie + allocation: Przydział + dates: Daty + context_menu: + add_filter_criteria: Dodaj kryteria filtrowania + add_user_group: Dodaj grupę użytkowników + edit_total_work: Edytuj całkowitą pracę + label: Więcej działań + move: Przenieś + move_down: Przenieś w dół + move_to_bottom: Przenieś na sam dół + move_to_top: Przenieś na samą górę + move_up: Przenieś w górę + remove: Usuń + remove_confirmation: Usunąć ten pakiet roboczy z widoku? + see_allocation: Zobacz przydział + mobile_title: Pakiety robocze + query_name: 'Pakiety robocze zarządzania zasobami: %{name}' + subheader: + add: Dodaj + add_work_package: Dodaj pakiet roboczy + allocate: Przydziel + settings: Konfiguruj widok diff --git a/modules/resource_management/config/locales/crowdin/pt-BR.yml b/modules/resource_management/config/locales/crowdin/pt-BR.yml index 610423d93cd..a9c09ab510d 100644 --- a/modules/resource_management/config/locales/crowdin/pt-BR.yml +++ b/modules/resource_management/config/locales/crowdin/pt-BR.yml @@ -2,72 +2,131 @@ pt-BR: activerecord: attributes: - resource_planner: - name: Nome - start_date: Data de início - end_date: Data de término - default_view_class_name: Visualização padrão - public: Público - favorite: Favorito resource_allocation: + allocated_time: Tempo alocado + end_date: Data de término entity: Entidade principal: Atribuição - state: Estado start_date: Data de início - end_date: Data de término - allocated_time: Tempo alocado + state: Estado user_filter: Filtro de usuários + resource_planner: + default_view_class_name: Visualização padrão + end_date: Data de término + favorite: Favorito + name: Nome + public: Público + start_date: Data de início errors: models: - resource_planner: - attributes: - end_date: - greater_than_start_date: deve ser após a data de início. resource_allocation: attributes: end_date: greater_than_start_date: deve ser após a data de início. - plugin_openproject_resource_management: - name: Gerenciamento de recursos do OpenProject - description: Fornece gerenciamento de recursos e planejamento de capacidade. - project_module_resource_management: Gerenciamento de recursos - permission_view_resource_planners: Ver planejadores de recursos - permission_view_resource_planners_explanation: 'Permite que os usuários acessem planejadores de recursos. Permite criar e gerenciar seus próprios planejadores de recursos e visualizar planejadores de recursos públicos. Não permite visualizar planejadores de recursos criados por outros usuários que não estejam compartilhados publicamente. + resource_planner: + attributes: + end_date: + greater_than_start_date: deve ser após a data de início. + resource_work_package_list: + attributes: + query: + must_be_work_package_query: deve ser uma consulta de pacote de trabalho. + models: + resource_allocation: Alocação de recursos + resource_planner: Planejador de recursos + resource_work_package_list: Lista de Pacotes de trabalho + user_card: Cartões de usuário + button_next: Próximo + label_resource_management: Planejamento de recursos + permission_allocate_user_resources: Alocar recursos do usuário + permission_allocate_user_resources_explanation: 'Permite aos usuários criar, atualizar e excluir alocações de recursos dentro de um planejador de recursos. Isto inclui atribuir usuários (ou filtros de usuários) a um planejador e ajustar o tempo e intervalo de datas alocados. ' permission_manage_public_resource_planners: Gerenciar planejadores de recursos públicos permission_manage_public_resource_planners_explanation: 'Permite que os usuários criem e gerenciem planejadores de recursos públicos. Permite visualizar, criar, gerenciar e publicar seus próprios planejadores de recursos. Não permite visualizar planejadores de recursos criados por outros usuários que não estejam compartilhados publicamente. ' - permission_allocate_user_resources: Alocar recursos do usuário - permission_allocate_user_resources_explanation: 'Permite aos usuários criar, atualizar e excluir alocações de recursos dentro de um planejador de recursos. Isto inclui atribuir usuários (ou filtros de usuários) a um planejador e ajustar o tempo e intervalo de datas alocados. + permission_view_resource_planners: Ver planejadores de recursos + permission_view_resource_planners_explanation: 'Permite que os usuários acessem planejadores de recursos. Permite criar e gerenciar seus próprios planejadores de recursos e visualizar planejadores de recursos públicos. Não permite visualizar planejadores de recursos criados por outros usuários que não estejam compartilhados publicamente. ' - label_resource_management: Planejamento de recursos - button_next: Salvar + plugin_openproject_resource_management: + description: Fornece gerenciamento de recursos e planejamento de capacidade. + name: Gerenciamento de recursos do OpenProject + project_module_resource_management: Gerenciamento de recursos resource_management: - label_resource_planner: Planejador de recursos - label_resource_planner_plural: Planejadores de recursos - label_new_resource_planner: Novo planejador de recursos - public_caption: 'Tornar esta visualização pública para todos os membros do projeto. Isso não afeta a visibilidade dos pacotes de trabalho, que ainda depende das permissões de cada usuário. - - ' + action: + delete: Excluir + favorite: Adicionar aos favoritos + make_private: Tornar privado + make_public: Tornar público + unfavorite: Remover dos favoritos + blankslate: + desc: Criar um planejador de recursos para iniciar o planejamento de capacidade deste projeto. + title: Ainda não há planejadores de recursos + configure_view_dialog: + delete_confirmation: Tem certeza que quer excluir esta visualização? Esta ação é irreversível. + filter_mode: + automatic: + caption: Uma lista gerada automaticamente que exibe itens que atendem aos critérios que você define. + label: Filtrado automaticamente + label: Seleção do item + manual: + caption: Uma lista personalizada de itens que você adiciona e remove manualmente. Não é possível aplicar filtros. + label: Selecionado manualmente + title: Configurar exibição favorite_caption: 'Adicionar esta visualização aos favoritos para exibi-la na seção superior do menu lateral. ' - view_types: - UserCardView: Cartões de usuários - action: - favorite: Adicionar aos favoritos - unfavorite: Remover dos favoritos - make_public: Tornar público - make_private: Tornar privado - delete: Excluir - sidebar: - public: Público - private: Privado - blankslate: - title: Ainda não há planejadores de recursos - desc: Criar um planejador de recursos para iniciar o planejamento de capacidade deste projeto. + label_new_resource_planner: Novo planejador de recursos + label_resource_planner: Planejador de recursos + label_resource_planner_plural: Planejadores de recursos + new_view_dialog: + title: Adicionar Visualização + public_caption: 'Tornar esta visualização pública para todos os membros do projeto. Isso não afeta a visibilidade dos pacotes de trabalho, que ainda depende das permissões de cada usuário. + + ' show: placeholder: A visualização detalhada deste planejador de recursos estará disponível em breve. + sidebar: + private: Privado + public: Público + sub_views: Visualizações neste planejador de recursos + view_types: + resource_work_package_list: + caption: Criar uma visualização baseada em pacotes de trabalho e ver os seus detalhes e alocação numa lista + label: Lista de pacotes de trabalho + user_card: + caption: Criar uma visualização baseada em utilizadores e ver os seus detalhes e alocação numa lista de cartões de utilizador + label: Lista de cartões de utilizadores + work_package_list: + add_work_package_dialog: + title: Adicionar pacote de trabalho + allocation_placeholder: "—" + blank: + description: Ainda não existem pacotes de trabalho que correspondam aos filtros desta visualização. + title: Não há pacotes de trabalho para exibir + columns: + allocated_members: Membros alocados + allocation: Alocação + dates: Datas + context_menu: + add_filter_criteria: Adicionar critérios de filtro + add_user_group: Adicionar grupo de usuários + edit_total_work: Editar trabalho total + label: Mais ações + move: Mover + move_down: Mover para baixo + move_to_bottom: Mover para o final + move_to_top: Mover para o topo + move_up: Mover para cima + remove: Remover + remove_confirmation: Remover este pacote de trabalho da visualização? + see_allocation: Ver alocação + mobile_title: Pacotes de trabalho + query_name: 'Pacotes de trabalho de gestão de recursos: %{name}' + subheader: + add: Adicionar + add_work_package: Adicionar pacote de trabalho + allocate: Alocar + settings: Configurar exibição diff --git a/modules/resource_management/config/locales/crowdin/pt-PT.yml b/modules/resource_management/config/locales/crowdin/pt-PT.yml index 50777135596..43359ed7820 100644 --- a/modules/resource_management/config/locales/crowdin/pt-PT.yml +++ b/modules/resource_management/config/locales/crowdin/pt-PT.yml @@ -2,72 +2,131 @@ pt-PT: activerecord: attributes: - resource_planner: - name: Nome - start_date: Data de início - end_date: Data de término - default_view_class_name: Vista padrão - public: Público - favorite: Favorito resource_allocation: + allocated_time: Tempo atribuído + end_date: Data de término entity: Entidade principal: Encarregado - state: Estado start_date: Data de início - end_date: Data de término - allocated_time: Tempo atribuído + state: Estado user_filter: Filtro de utilizador + resource_planner: + default_view_class_name: Vista padrão + end_date: Data de término + favorite: Favorito + name: Nome + public: Público + start_date: Data de início errors: models: - resource_planner: - attributes: - end_date: - greater_than_start_date: deve ser após a data de início. resource_allocation: attributes: end_date: greater_than_start_date: deve ser posterior à data de início. - plugin_openproject_resource_management: - name: Gestão de recursos do OpenProject - description: Fornece gestão de recursos e planeamento de capacidades. - project_module_resource_management: Gestão de recursos - permission_view_resource_planners: Ver planeadores de recursos - permission_view_resource_planners_explanation: 'Permite que os utilizadores acedam aos planeadores de recursos. Permite criar e gerir os seus próprios planeadores de recursos e ver planeadores de recursos públicos. Não permite que os utilizadores vejam os planeadores de recursos criados por outros utilizadores que não estejam partilhados publicamente. + resource_planner: + attributes: + end_date: + greater_than_start_date: deve ser após a data de início. + resource_work_package_list: + attributes: + query: + must_be_work_package_query: deve ser uma consulta sobre um pacote de trabalho. + models: + resource_allocation: Alocação de recursos + resource_planner: Planeador de recursos + resource_work_package_list: Lista de pacotes de trabalho + user_card: Cartões de utilizador + button_next: Seguinte + label_resource_management: Planeamento de recursos + permission_allocate_user_resources: Alocar recursos do utilizador + permission_allocate_user_resources_explanation: 'Permite aos utilizadores criar, atualizar e eliminar atribuições de recursos dentro de um planeador de recursos. Isto inclui atribuir utilizadores (ou filtros de utilizadores) a um planeador e ajustar o tempo e o intervalo de datas alocados. ' permission_manage_public_resource_planners: Gerir os planeadores de recursos públicos permission_manage_public_resource_planners_explanation: 'Permite aos utilizadores criar e gerir planeadores de recursos públicos. Permite ver, criar, gerir e publicar os seus próprios planeadores de recursos. Não permite que os utilizadores vejam os planeadores de recursos criados por outros utilizadores que não estejam partilhados publicamente. ' - permission_allocate_user_resources: Alocar recursos do utilizador - permission_allocate_user_resources_explanation: 'Permite aos utilizadores criar, atualizar e eliminar atribuições de recursos dentro de um planeador de recursos. Isto inclui atribuir utilizadores (ou filtros de utilizadores) a um planeador e ajustar o tempo e o intervalo de datas alocados. + permission_view_resource_planners: Ver planeadores de recursos + permission_view_resource_planners_explanation: 'Permite que os utilizadores acedam aos planeadores de recursos. Permite criar e gerir os seus próprios planeadores de recursos e ver planeadores de recursos públicos. Não permite que os utilizadores vejam os planeadores de recursos criados por outros utilizadores que não estejam partilhados publicamente. ' - label_resource_management: Planeamento de recursos - button_next: Guardar + plugin_openproject_resource_management: + description: Fornece gestão de recursos e planeamento de capacidades. + name: Gestão de recursos do OpenProject + project_module_resource_management: Gestão de recursos resource_management: - label_resource_planner: Planeador de recursos - label_resource_planner_plural: Planeadores de recursos - label_new_resource_planner: Novo planeador de recursos - public_caption: 'Torne esta vista pública para todos os membros do projeto. Não afeta a visibilidade dos pacotes de trabalho, que continua a depender da permissão de cada utilizador. - - ' + action: + delete: Eliminar + favorite: Adicionar aos favoritos + make_private: Tornar privado + make_public: Tornar público + unfavorite: Remover dos favoritos + blankslate: + desc: Crie um planeador de recursos para começar a planear a capacidade para este projeto. + title: Ainda não há planeadores de recursos + configure_view_dialog: + delete_confirmation: Tem a certeza de que quer eliminar esta vista? Esta ação não pode ser anulada. + filter_mode: + automatic: + caption: Uma lista gerada automaticamente que apresenta os elementos correspondentes aos critérios que definir. + label: Filtrado automaticamente + label: Seleção de elemento + manual: + caption: Uma lista personalizada de elementos que pode adicionar e remover manualmente. Não é possível filtrar. + label: Seleção manual + title: Configurar vista favorite_caption: 'Torne esta vista num favorito para a adicionar à secção superior do menu da barra lateral. ' - view_types: - UserCardView: Cartões de utilizador - action: - favorite: Adicionar aos favoritos - unfavorite: Remover dos favoritos - make_public: Tornar público - make_private: Tornar privado - delete: Eliminar - sidebar: - public: Público - private: Privado - blankslate: - title: Ainda não há planeadores de recursos - desc: Crie um planeador de recursos para começar a planear a capacidade para este projeto. + label_new_resource_planner: Novo planeador de recursos + label_resource_planner: Planeador de recursos + label_resource_planner_plural: Planeadores de recursos + new_view_dialog: + title: Adicionar vista + public_caption: 'Torne esta vista pública para todos os membros do projeto. Não afeta a visibilidade dos pacotes de trabalho, que continua a depender da permissão de cada utilizador. + + ' show: placeholder: A vista detalhada deste planeador de recursos fica disponível em breve. + sidebar: + private: Privado + public: Público + sub_views: Vistas neste planeador de recursos + view_types: + resource_work_package_list: + caption: Crie uma vista com base nos pacotes de trabalho e veja os seus detalhes e a sua atribuição numa lista + label: Lista de pacotes de trabalho + user_card: + caption: Crie uma vista baseada nos utilizadores e veja os seus detalhes e atribuição numa lista de cartões de utilizador + label: Lista de cartões de utilizadores + work_package_list: + add_work_package_dialog: + title: Adicionar pacote de trabalho + allocation_placeholder: "—" + blank: + description: Ainda não existem pacotes de trabalho correspondentes aos filtros desta vista. + title: Não há pacotes de trabalho a apresentar + columns: + allocated_members: Membros alocados + allocation: Alocação + dates: Datas + context_menu: + add_filter_criteria: Adicionar critérios de filtragem + add_user_group: Adicionar grupo de utilizador + edit_total_work: Editar trabalho total + label: Mais ações + move: Mover + move_down: Mover para baixo + move_to_bottom: Mover para a base + move_to_top: Mover para o topo + move_up: Mover para cima + remove: Remover + remove_confirmation: Remover este pacote de trabalho da vista? + see_allocation: Ver alocação + mobile_title: Pacotes de trabalho + query_name: 'Pacotes de trabalho de gestão de recursos: %{name}' + subheader: + add: Adicionar + add_work_package: Adicionar pacote de trabalho + allocate: Alocar + settings: Configurar vista diff --git a/modules/resource_management/config/locales/crowdin/ro.yml b/modules/resource_management/config/locales/crowdin/ro.yml index 23b74f3b3e4..2d5ecb52558 100644 --- a/modules/resource_management/config/locales/crowdin/ro.yml +++ b/modules/resource_management/config/locales/crowdin/ro.yml @@ -2,72 +2,131 @@ ro: activerecord: attributes: - resource_planner: - name: Name - start_date: Start date - end_date: Finish date - default_view_class_name: Default view - public: Public - favorite: Favorite resource_allocation: + allocated_time: Allocated time + end_date: Finish date entity: Entity principal: Assignee - state: State start_date: Start date - end_date: Finish date - allocated_time: Allocated time + state: State user_filter: User filter + resource_planner: + default_view_class_name: Default view + end_date: Finish date + favorite: Favorite + name: Name + public: Public + start_date: Start date errors: models: - resource_planner: - attributes: - end_date: - greater_than_start_date: must be after the start date. resource_allocation: attributes: end_date: greater_than_start_date: must be after the start date. - plugin_openproject_resource_management: - name: OpenProject Resource Management - description: Provides resource management and capacity planning. - project_module_resource_management: Resource management - permission_view_resource_planners: View resource planners - permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. + resource_planner: + attributes: + end_date: + greater_than_start_date: must be after the start date. + resource_work_package_list: + attributes: + query: + must_be_work_package_query: must be a work package query. + models: + resource_allocation: Resource Allocation + resource_planner: Resource Planner + resource_work_package_list: Work packages list + user_card: User cards + button_next: Next + label_resource_management: Resource planning + permission_allocate_user_resources: Allocate user resources + permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. ' permission_manage_public_resource_planners: Manage public resource planners permission_manage_public_resource_planners_explanation: 'Allows users to create and manage public resource planners. It allows them to view, create, manage and publish their own resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - permission_allocate_user_resources: Allocate user resources - permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. + permission_view_resource_planners: View resource planners + permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - label_resource_management: Resource planning - button_next: Save + plugin_openproject_resource_management: + description: Provides resource management and capacity planning. + name: OpenProject Resource Management + project_module_resource_management: Resource management resource_management: - label_resource_planner: Resource planner - label_resource_planner_plural: Resource planners - label_new_resource_planner: New resource planner - public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. - - ' + action: + delete: Delete + favorite: Add to favorites + make_private: Make private + make_public: Make public + unfavorite: Remove from favorites + blankslate: + desc: Create a resource planner to start planning capacity for this project. + title: No resource planners yet + configure_view_dialog: + delete_confirmation: Are you sure you want to delete this view? This cannot be undone. + filter_mode: + automatic: + caption: An automatically-generated list that displays items that meet criteria you define. + label: Automatically filtered + label: Item selection + manual: + caption: A custom list of items you manually add and remove. Filtering is not possible. + label: Manually hand-picked + title: Configure view favorite_caption: 'Make this view a favorite to add it on the top section of the sidebar menu. ' - view_types: - UserCardView: Users cards - action: - favorite: Add to favorites - unfavorite: Remove from favorites - make_public: Make public - make_private: Make private - delete: Delete - sidebar: - public: Public - private: Private - blankslate: - title: No resource planners yet - desc: Create a resource planner to start planning capacity for this project. + label_new_resource_planner: New resource planner + label_resource_planner: Resource planner + label_resource_planner_plural: Resource planners + new_view_dialog: + title: Add View + public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. + + ' show: placeholder: The detailed view for this resource planner is coming soon. + sidebar: + private: Private + public: Public + sub_views: Views in this resource planner + view_types: + resource_work_package_list: + caption: Create a view based on work packages and see its details and allocation in a list + label: Work packages list + user_card: + caption: Create a view based on users and see their details and allocation in a list of user cards + label: Users card list + work_package_list: + add_work_package_dialog: + title: Add work package + allocation_placeholder: "—" + blank: + description: There are no work packages matching this view's filters yet. + title: No work packages to display + columns: + allocated_members: Allocated members + allocation: Allocation + dates: Dates + context_menu: + add_filter_criteria: Add filter criteria + add_user_group: Add user group + edit_total_work: Edit total work + label: More actions + move: Move + move_down: Move down + move_to_bottom: Move to bottom + move_to_top: Move to top + move_up: Move up + remove: Remove + remove_confirmation: Remove this work package from the view? + see_allocation: See allocation + mobile_title: Work packages + query_name: 'Resource management work packages: %{name}' + subheader: + add: Add + add_work_package: Add work package + allocate: Allocate + settings: Configure view diff --git a/modules/resource_management/config/locales/crowdin/ru.yml b/modules/resource_management/config/locales/crowdin/ru.yml index 0de57047b9c..e978df2f7b9 100644 --- a/modules/resource_management/config/locales/crowdin/ru.yml +++ b/modules/resource_management/config/locales/crowdin/ru.yml @@ -2,72 +2,131 @@ ru: activerecord: attributes: - resource_planner: - name: Название - start_date: Дата начала - end_date: Дата окончания - default_view_class_name: Представление по умолчанию - public: Публичный - favorite: Избранное resource_allocation: + allocated_time: Распределенное время + end_date: Дата окончания entity: Сущность principal: Исполнитель - state: Состояние start_date: Дата начала - end_date: Дата окончания - allocated_time: Распределенное время + state: Состояние user_filter: Фильтры пользователей + resource_planner: + default_view_class_name: Представление по умолчанию + end_date: Дата окончания + favorite: Избранное + name: Название + public: Публичный + start_date: Дата начала errors: models: - resource_planner: - attributes: - end_date: - greater_than_start_date: должно быть после даты начала. resource_allocation: attributes: end_date: greater_than_start_date: должно быть после даты начала. - plugin_openproject_resource_management: - name: Управление ресурсами OpenProject - description: Обеспечивает управление ресурсами и планирование возможностей. - project_module_resource_management: Управление ресурсами - permission_view_resource_planners: Просмотр планировщиков ресурсов - permission_view_resource_planners_explanation: 'Позволяет пользователям получить доступ к планировщику ресурсов. Это позволяет создавать и управлять своими собственными планировщиками ресурсов и просматривать общедоступные планировщики ресурсов. Он не позволяет пользователям просматривать планировщики ресурсов, созданные другими пользователями, которые не являются общедоступными. + resource_planner: + attributes: + end_date: + greater_than_start_date: должно быть после даты начала. + resource_work_package_list: + attributes: + query: + must_be_work_package_query: must be a work package query. + models: + resource_allocation: Resource Allocation + resource_planner: Resource Planner + resource_work_package_list: Work packages list + user_card: User cards + button_next: Next + label_resource_management: Планирование ресурсов + permission_allocate_user_resources: Распределение пользовательских ресурсов + permission_allocate_user_resources_explanation: 'Позволяет пользователям создавать, обновлять и удалять распределение ресурсов в планировщике ресурсов. Сюда входит назначение пользователей (или фильтров) на планировщик и корректировка выделенного времени и диапазона дат. ' permission_manage_public_resource_planners: Управление общедоступными планировщиками ресурсов permission_manage_public_resource_planners_explanation: 'Позволяет пользователям создавать и управлять общедоступными планировщиками ресурсов. Это позволяет просматривать, создавать, управлять и публиковать свои собственные планировщики ресурсов. Он не позволяет пользователям просматривать планировщики ресурсов, созданные другими пользователями, которые не являются общедоступными. ' - permission_allocate_user_resources: Распределение пользовательских ресурсов - permission_allocate_user_resources_explanation: 'Позволяет пользователям создавать, обновлять и удалять распределение ресурсов в планировщике ресурсов. Сюда входит назначение пользователей (или фильтров) на планировщик и корректировка выделенного времени и диапазона дат. + permission_view_resource_planners: Просмотр планировщиков ресурсов + permission_view_resource_planners_explanation: 'Позволяет пользователям получить доступ к планировщику ресурсов. Это позволяет создавать и управлять своими собственными планировщиками ресурсов и просматривать общедоступные планировщики ресурсов. Он не позволяет пользователям просматривать планировщики ресурсов, созданные другими пользователями, которые не являются общедоступными. ' - label_resource_management: Планирование ресурсов - button_next: Сохранить + plugin_openproject_resource_management: + description: Обеспечивает управление ресурсами и планирование возможностей. + name: Управление ресурсами OpenProject + project_module_resource_management: Управление ресурсами resource_management: - label_resource_planner: Планировщик ресурсов - label_resource_planner_plural: Планировщики ресурсов - label_new_resource_planner: Новый планировщик ресурсов - public_caption: 'Сделать публичным для всех участников проекта. Это не влияет на видимость пакетов работ, которые все еще зависят от разрешения каждого пользователя. - - ' + action: + delete: Удалить + favorite: Добавить в избранное + make_private: Сделать личным + make_public: Сделать общедоступным + unfavorite: Удалить из избранного + blankslate: + desc: Создать планировщик ресурсов, чтобы начать планировать этот проект. + title: Нет планировщиков ресурсов + configure_view_dialog: + delete_confirmation: Are you sure you want to delete this view? This cannot be undone. + filter_mode: + automatic: + caption: An automatically-generated list that displays items that meet criteria you define. + label: Automatically filtered + label: Item selection + manual: + caption: A custom list of items you manually add and remove. Filtering is not possible. + label: Manually hand-picked + title: Configure view favorite_caption: 'Сделайте это представление избранным, чтобы добавить его в верхний раздел меню боковой панели. ' - view_types: - UserCardView: Карточки пользователей - action: - favorite: Добавить в избранное - unfavorite: Удалить из избранного - make_public: Сделать общедоступным - make_private: Сделать личным - delete: Удалить - sidebar: - public: Общий - private: Личный - blankslate: - title: Нет планировщиков ресурсов - desc: Создать планировщик ресурсов, чтобы начать планировать этот проект. + label_new_resource_planner: Новый планировщик ресурсов + label_resource_planner: Планировщик ресурсов + label_resource_planner_plural: Планировщики ресурсов + new_view_dialog: + title: Add View + public_caption: 'Сделать публичным для всех участников проекта. Это не влияет на видимость пакетов работ, которые все еще зависят от разрешения каждого пользователя. + + ' show: placeholder: Подробный обзор для этого планировщика ресурсов скоро будет доступен. + sidebar: + private: Личный + public: Общий + sub_views: Views in this resource planner + view_types: + resource_work_package_list: + caption: Create a view based on work packages and see its details and allocation in a list + label: Work packages list + user_card: + caption: Create a view based on users and see their details and allocation in a list of user cards + label: Users card list + work_package_list: + add_work_package_dialog: + title: Add work package + allocation_placeholder: "—" + blank: + description: There are no work packages matching this view's filters yet. + title: No work packages to display + columns: + allocated_members: Allocated members + allocation: Allocation + dates: Dates + context_menu: + add_filter_criteria: Add filter criteria + add_user_group: Add user group + edit_total_work: Edit total work + label: More actions + move: Move + move_down: Move down + move_to_bottom: Move to bottom + move_to_top: Move to top + move_up: Move up + remove: Remove + remove_confirmation: Remove this work package from the view? + see_allocation: See allocation + mobile_title: Work packages + query_name: 'Resource management work packages: %{name}' + subheader: + add: Add + add_work_package: Add work package + allocate: Allocate + settings: Configure view diff --git a/modules/resource_management/config/locales/crowdin/rw.yml b/modules/resource_management/config/locales/crowdin/rw.yml index 541b47d180b..f7b65ae5bde 100644 --- a/modules/resource_management/config/locales/crowdin/rw.yml +++ b/modules/resource_management/config/locales/crowdin/rw.yml @@ -2,72 +2,131 @@ rw: activerecord: attributes: - resource_planner: - name: Name - start_date: Start date - end_date: Finish date - default_view_class_name: Default view - public: Public - favorite: Favorite resource_allocation: + allocated_time: Allocated time + end_date: Finish date entity: Entity principal: Assignee - state: State start_date: Start date - end_date: Finish date - allocated_time: Allocated time + state: State user_filter: User filter + resource_planner: + default_view_class_name: Default view + end_date: Finish date + favorite: Favorite + name: Name + public: Public + start_date: Start date errors: models: - resource_planner: - attributes: - end_date: - greater_than_start_date: must be after the start date. resource_allocation: attributes: end_date: greater_than_start_date: must be after the start date. - plugin_openproject_resource_management: - name: OpenProject Resource Management - description: Provides resource management and capacity planning. - project_module_resource_management: Resource management - permission_view_resource_planners: View resource planners - permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. + resource_planner: + attributes: + end_date: + greater_than_start_date: must be after the start date. + resource_work_package_list: + attributes: + query: + must_be_work_package_query: must be a work package query. + models: + resource_allocation: Resource Allocation + resource_planner: Resource Planner + resource_work_package_list: Work packages list + user_card: User cards + button_next: Next + label_resource_management: Resource planning + permission_allocate_user_resources: Allocate user resources + permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. ' permission_manage_public_resource_planners: Manage public resource planners permission_manage_public_resource_planners_explanation: 'Allows users to create and manage public resource planners. It allows them to view, create, manage and publish their own resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - permission_allocate_user_resources: Allocate user resources - permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. + permission_view_resource_planners: View resource planners + permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - label_resource_management: Resource planning - button_next: Save + plugin_openproject_resource_management: + description: Provides resource management and capacity planning. + name: OpenProject Resource Management + project_module_resource_management: Resource management resource_management: - label_resource_planner: Resource planner - label_resource_planner_plural: Resource planners - label_new_resource_planner: New resource planner - public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. - - ' + action: + delete: Delete + favorite: Add to favorites + make_private: Make private + make_public: Make public + unfavorite: Remove from favorites + blankslate: + desc: Create a resource planner to start planning capacity for this project. + title: No resource planners yet + configure_view_dialog: + delete_confirmation: Are you sure you want to delete this view? This cannot be undone. + filter_mode: + automatic: + caption: An automatically-generated list that displays items that meet criteria you define. + label: Automatically filtered + label: Item selection + manual: + caption: A custom list of items you manually add and remove. Filtering is not possible. + label: Manually hand-picked + title: Configure view favorite_caption: 'Make this view a favorite to add it on the top section of the sidebar menu. ' - view_types: - UserCardView: Users cards - action: - favorite: Add to favorites - unfavorite: Remove from favorites - make_public: Make public - make_private: Make private - delete: Delete - sidebar: - public: Public - private: Private - blankslate: - title: No resource planners yet - desc: Create a resource planner to start planning capacity for this project. + label_new_resource_planner: New resource planner + label_resource_planner: Resource planner + label_resource_planner_plural: Resource planners + new_view_dialog: + title: Add View + public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. + + ' show: placeholder: The detailed view for this resource planner is coming soon. + sidebar: + private: Private + public: Public + sub_views: Views in this resource planner + view_types: + resource_work_package_list: + caption: Create a view based on work packages and see its details and allocation in a list + label: Work packages list + user_card: + caption: Create a view based on users and see their details and allocation in a list of user cards + label: Users card list + work_package_list: + add_work_package_dialog: + title: Add work package + allocation_placeholder: "—" + blank: + description: There are no work packages matching this view's filters yet. + title: No work packages to display + columns: + allocated_members: Allocated members + allocation: Allocation + dates: Dates + context_menu: + add_filter_criteria: Add filter criteria + add_user_group: Add user group + edit_total_work: Edit total work + label: More actions + move: Move + move_down: Move down + move_to_bottom: Move to bottom + move_to_top: Move to top + move_up: Move up + remove: Remove + remove_confirmation: Remove this work package from the view? + see_allocation: See allocation + mobile_title: Work packages + query_name: 'Resource management work packages: %{name}' + subheader: + add: Add + add_work_package: Add work package + allocate: Allocate + settings: Configure view diff --git a/modules/resource_management/config/locales/crowdin/si.yml b/modules/resource_management/config/locales/crowdin/si.yml index 3a38dd899c5..f2abd50c26c 100644 --- a/modules/resource_management/config/locales/crowdin/si.yml +++ b/modules/resource_management/config/locales/crowdin/si.yml @@ -2,72 +2,131 @@ si: activerecord: attributes: - resource_planner: - name: Name - start_date: Start date - end_date: Finish date - default_view_class_name: Default view - public: Public - favorite: Favorite resource_allocation: + allocated_time: Allocated time + end_date: Finish date entity: Entity principal: Assignee - state: State start_date: Start date - end_date: Finish date - allocated_time: Allocated time + state: State user_filter: User filter + resource_planner: + default_view_class_name: Default view + end_date: Finish date + favorite: Favorite + name: Name + public: Public + start_date: Start date errors: models: - resource_planner: - attributes: - end_date: - greater_than_start_date: must be after the start date. resource_allocation: attributes: end_date: greater_than_start_date: must be after the start date. - plugin_openproject_resource_management: - name: OpenProject Resource Management - description: Provides resource management and capacity planning. - project_module_resource_management: Resource management - permission_view_resource_planners: View resource planners - permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. + resource_planner: + attributes: + end_date: + greater_than_start_date: must be after the start date. + resource_work_package_list: + attributes: + query: + must_be_work_package_query: must be a work package query. + models: + resource_allocation: Resource Allocation + resource_planner: Resource Planner + resource_work_package_list: Work packages list + user_card: User cards + button_next: Next + label_resource_management: Resource planning + permission_allocate_user_resources: Allocate user resources + permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. ' permission_manage_public_resource_planners: Manage public resource planners permission_manage_public_resource_planners_explanation: 'Allows users to create and manage public resource planners. It allows them to view, create, manage and publish their own resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - permission_allocate_user_resources: Allocate user resources - permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. + permission_view_resource_planners: View resource planners + permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - label_resource_management: Resource planning - button_next: Save + plugin_openproject_resource_management: + description: Provides resource management and capacity planning. + name: OpenProject Resource Management + project_module_resource_management: Resource management resource_management: - label_resource_planner: Resource planner - label_resource_planner_plural: Resource planners - label_new_resource_planner: New resource planner - public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. - - ' + action: + delete: Delete + favorite: Add to favorites + make_private: Make private + make_public: Make public + unfavorite: Remove from favorites + blankslate: + desc: Create a resource planner to start planning capacity for this project. + title: No resource planners yet + configure_view_dialog: + delete_confirmation: Are you sure you want to delete this view? This cannot be undone. + filter_mode: + automatic: + caption: An automatically-generated list that displays items that meet criteria you define. + label: Automatically filtered + label: Item selection + manual: + caption: A custom list of items you manually add and remove. Filtering is not possible. + label: Manually hand-picked + title: Configure view favorite_caption: 'Make this view a favorite to add it on the top section of the sidebar menu. ' - view_types: - UserCardView: Users cards - action: - favorite: Add to favorites - unfavorite: Remove from favorites - make_public: Make public - make_private: Make private - delete: Delete - sidebar: - public: Public - private: Private - blankslate: - title: No resource planners yet - desc: Create a resource planner to start planning capacity for this project. + label_new_resource_planner: New resource planner + label_resource_planner: Resource planner + label_resource_planner_plural: Resource planners + new_view_dialog: + title: Add View + public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. + + ' show: placeholder: The detailed view for this resource planner is coming soon. + sidebar: + private: Private + public: Public + sub_views: Views in this resource planner + view_types: + resource_work_package_list: + caption: Create a view based on work packages and see its details and allocation in a list + label: Work packages list + user_card: + caption: Create a view based on users and see their details and allocation in a list of user cards + label: Users card list + work_package_list: + add_work_package_dialog: + title: Add work package + allocation_placeholder: "—" + blank: + description: There are no work packages matching this view's filters yet. + title: No work packages to display + columns: + allocated_members: Allocated members + allocation: Allocation + dates: Dates + context_menu: + add_filter_criteria: Add filter criteria + add_user_group: Add user group + edit_total_work: Edit total work + label: More actions + move: Move + move_down: Move down + move_to_bottom: Move to bottom + move_to_top: Move to top + move_up: Move up + remove: Remove + remove_confirmation: Remove this work package from the view? + see_allocation: See allocation + mobile_title: Work packages + query_name: 'Resource management work packages: %{name}' + subheader: + add: Add + add_work_package: Add work package + allocate: Allocate + settings: Configure view diff --git a/modules/resource_management/config/locales/crowdin/sk.yml b/modules/resource_management/config/locales/crowdin/sk.yml index 624ce9967bc..b94e3158c2e 100644 --- a/modules/resource_management/config/locales/crowdin/sk.yml +++ b/modules/resource_management/config/locales/crowdin/sk.yml @@ -2,72 +2,131 @@ sk: activerecord: attributes: - resource_planner: - name: Name - start_date: Start date - end_date: Finish date - default_view_class_name: Default view - public: Public - favorite: Favorite resource_allocation: + allocated_time: Allocated time + end_date: Finish date entity: Entity principal: Assignee - state: State start_date: Start date - end_date: Finish date - allocated_time: Allocated time + state: State user_filter: User filter + resource_planner: + default_view_class_name: Default view + end_date: Finish date + favorite: Favorite + name: Name + public: Public + start_date: Start date errors: models: - resource_planner: - attributes: - end_date: - greater_than_start_date: must be after the start date. resource_allocation: attributes: end_date: greater_than_start_date: must be after the start date. - plugin_openproject_resource_management: - name: OpenProject Resource Management - description: Provides resource management and capacity planning. - project_module_resource_management: Resource management - permission_view_resource_planners: View resource planners - permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. + resource_planner: + attributes: + end_date: + greater_than_start_date: must be after the start date. + resource_work_package_list: + attributes: + query: + must_be_work_package_query: must be a work package query. + models: + resource_allocation: Resource Allocation + resource_planner: Resource Planner + resource_work_package_list: Work packages list + user_card: User cards + button_next: Next + label_resource_management: Resource planning + permission_allocate_user_resources: Allocate user resources + permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. ' permission_manage_public_resource_planners: Manage public resource planners permission_manage_public_resource_planners_explanation: 'Allows users to create and manage public resource planners. It allows them to view, create, manage and publish their own resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - permission_allocate_user_resources: Allocate user resources - permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. + permission_view_resource_planners: View resource planners + permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - label_resource_management: Resource planning - button_next: Save + plugin_openproject_resource_management: + description: Provides resource management and capacity planning. + name: OpenProject Resource Management + project_module_resource_management: Resource management resource_management: - label_resource_planner: Resource planner - label_resource_planner_plural: Resource planners - label_new_resource_planner: New resource planner - public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. - - ' + action: + delete: Delete + favorite: Add to favorites + make_private: Make private + make_public: Make public + unfavorite: Remove from favorites + blankslate: + desc: Create a resource planner to start planning capacity for this project. + title: No resource planners yet + configure_view_dialog: + delete_confirmation: Are you sure you want to delete this view? This cannot be undone. + filter_mode: + automatic: + caption: An automatically-generated list that displays items that meet criteria you define. + label: Automatically filtered + label: Item selection + manual: + caption: A custom list of items you manually add and remove. Filtering is not possible. + label: Manually hand-picked + title: Configure view favorite_caption: 'Make this view a favorite to add it on the top section of the sidebar menu. ' - view_types: - UserCardView: Users cards - action: - favorite: Add to favorites - unfavorite: Remove from favorites - make_public: Make public - make_private: Make private - delete: Delete - sidebar: - public: Public - private: Private - blankslate: - title: No resource planners yet - desc: Create a resource planner to start planning capacity for this project. + label_new_resource_planner: New resource planner + label_resource_planner: Resource planner + label_resource_planner_plural: Resource planners + new_view_dialog: + title: Add View + public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. + + ' show: placeholder: The detailed view for this resource planner is coming soon. + sidebar: + private: Private + public: Public + sub_views: Views in this resource planner + view_types: + resource_work_package_list: + caption: Create a view based on work packages and see its details and allocation in a list + label: Work packages list + user_card: + caption: Create a view based on users and see their details and allocation in a list of user cards + label: Users card list + work_package_list: + add_work_package_dialog: + title: Add work package + allocation_placeholder: "—" + blank: + description: There are no work packages matching this view's filters yet. + title: No work packages to display + columns: + allocated_members: Allocated members + allocation: Allocation + dates: Dates + context_menu: + add_filter_criteria: Add filter criteria + add_user_group: Add user group + edit_total_work: Edit total work + label: More actions + move: Move + move_down: Move down + move_to_bottom: Move to bottom + move_to_top: Move to top + move_up: Move up + remove: Remove + remove_confirmation: Remove this work package from the view? + see_allocation: See allocation + mobile_title: Work packages + query_name: 'Resource management work packages: %{name}' + subheader: + add: Add + add_work_package: Add work package + allocate: Allocate + settings: Configure view diff --git a/modules/resource_management/config/locales/crowdin/sl.yml b/modules/resource_management/config/locales/crowdin/sl.yml index eb52beac050..066620df5d9 100644 --- a/modules/resource_management/config/locales/crowdin/sl.yml +++ b/modules/resource_management/config/locales/crowdin/sl.yml @@ -2,72 +2,131 @@ sl: activerecord: attributes: - resource_planner: - name: Name - start_date: Start date - end_date: Finish date - default_view_class_name: Default view - public: Public - favorite: Favorite resource_allocation: + allocated_time: Allocated time + end_date: Finish date entity: Entity principal: Assignee - state: State start_date: Start date - end_date: Finish date - allocated_time: Allocated time + state: State user_filter: User filter + resource_planner: + default_view_class_name: Default view + end_date: Finish date + favorite: Favorite + name: Name + public: Public + start_date: Start date errors: models: - resource_planner: - attributes: - end_date: - greater_than_start_date: must be after the start date. resource_allocation: attributes: end_date: greater_than_start_date: must be after the start date. - plugin_openproject_resource_management: - name: OpenProject Resource Management - description: Provides resource management and capacity planning. - project_module_resource_management: Resource management - permission_view_resource_planners: View resource planners - permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. + resource_planner: + attributes: + end_date: + greater_than_start_date: must be after the start date. + resource_work_package_list: + attributes: + query: + must_be_work_package_query: must be a work package query. + models: + resource_allocation: Resource Allocation + resource_planner: Resource Planner + resource_work_package_list: Work packages list + user_card: User cards + button_next: Next + label_resource_management: Resource planning + permission_allocate_user_resources: Allocate user resources + permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. ' permission_manage_public_resource_planners: Manage public resource planners permission_manage_public_resource_planners_explanation: 'Allows users to create and manage public resource planners. It allows them to view, create, manage and publish their own resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - permission_allocate_user_resources: Allocate user resources - permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. + permission_view_resource_planners: View resource planners + permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - label_resource_management: Resource planning - button_next: Save + plugin_openproject_resource_management: + description: Provides resource management and capacity planning. + name: OpenProject Resource Management + project_module_resource_management: Resource management resource_management: - label_resource_planner: Resource planner - label_resource_planner_plural: Resource planners - label_new_resource_planner: New resource planner - public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. - - ' + action: + delete: Delete + favorite: Add to favorites + make_private: Make private + make_public: Make public + unfavorite: Remove from favorites + blankslate: + desc: Create a resource planner to start planning capacity for this project. + title: No resource planners yet + configure_view_dialog: + delete_confirmation: Are you sure you want to delete this view? This cannot be undone. + filter_mode: + automatic: + caption: An automatically-generated list that displays items that meet criteria you define. + label: Automatically filtered + label: Item selection + manual: + caption: A custom list of items you manually add and remove. Filtering is not possible. + label: Manually hand-picked + title: Configure view favorite_caption: 'Make this view a favorite to add it on the top section of the sidebar menu. ' - view_types: - UserCardView: Users cards - action: - favorite: Add to favorites - unfavorite: Remove from favorites - make_public: Make public - make_private: Make private - delete: Delete - sidebar: - public: Public - private: Private - blankslate: - title: No resource planners yet - desc: Create a resource planner to start planning capacity for this project. + label_new_resource_planner: New resource planner + label_resource_planner: Resource planner + label_resource_planner_plural: Resource planners + new_view_dialog: + title: Add View + public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. + + ' show: placeholder: The detailed view for this resource planner is coming soon. + sidebar: + private: Private + public: Public + sub_views: Views in this resource planner + view_types: + resource_work_package_list: + caption: Create a view based on work packages and see its details and allocation in a list + label: Work packages list + user_card: + caption: Create a view based on users and see their details and allocation in a list of user cards + label: Users card list + work_package_list: + add_work_package_dialog: + title: Add work package + allocation_placeholder: "—" + blank: + description: There are no work packages matching this view's filters yet. + title: No work packages to display + columns: + allocated_members: Allocated members + allocation: Allocation + dates: Dates + context_menu: + add_filter_criteria: Add filter criteria + add_user_group: Add user group + edit_total_work: Edit total work + label: More actions + move: Move + move_down: Move down + move_to_bottom: Move to bottom + move_to_top: Move to top + move_up: Move up + remove: Remove + remove_confirmation: Remove this work package from the view? + see_allocation: See allocation + mobile_title: Work packages + query_name: 'Resource management work packages: %{name}' + subheader: + add: Add + add_work_package: Add work package + allocate: Allocate + settings: Configure view diff --git a/modules/resource_management/config/locales/crowdin/sr.yml b/modules/resource_management/config/locales/crowdin/sr.yml index 30744ae0982..96dbcff6868 100644 --- a/modules/resource_management/config/locales/crowdin/sr.yml +++ b/modules/resource_management/config/locales/crowdin/sr.yml @@ -2,72 +2,131 @@ sr: activerecord: attributes: - resource_planner: - name: Name - start_date: Start date - end_date: Finish date - default_view_class_name: Default view - public: Public - favorite: Favorite resource_allocation: + allocated_time: Allocated time + end_date: Finish date entity: Entity principal: Assignee - state: State start_date: Start date - end_date: Finish date - allocated_time: Allocated time + state: State user_filter: User filter + resource_planner: + default_view_class_name: Default view + end_date: Finish date + favorite: Favorite + name: Name + public: Public + start_date: Start date errors: models: - resource_planner: - attributes: - end_date: - greater_than_start_date: must be after the start date. resource_allocation: attributes: end_date: greater_than_start_date: must be after the start date. - plugin_openproject_resource_management: - name: OpenProject Resource Management - description: Provides resource management and capacity planning. - project_module_resource_management: Resource management - permission_view_resource_planners: View resource planners - permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. + resource_planner: + attributes: + end_date: + greater_than_start_date: must be after the start date. + resource_work_package_list: + attributes: + query: + must_be_work_package_query: must be a work package query. + models: + resource_allocation: Resource Allocation + resource_planner: Resource Planner + resource_work_package_list: Work packages list + user_card: User cards + button_next: Next + label_resource_management: Resource planning + permission_allocate_user_resources: Allocate user resources + permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. ' permission_manage_public_resource_planners: Manage public resource planners permission_manage_public_resource_planners_explanation: 'Allows users to create and manage public resource planners. It allows them to view, create, manage and publish their own resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - permission_allocate_user_resources: Allocate user resources - permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. + permission_view_resource_planners: View resource planners + permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - label_resource_management: Resource planning - button_next: Save + plugin_openproject_resource_management: + description: Provides resource management and capacity planning. + name: OpenProject Resource Management + project_module_resource_management: Resource management resource_management: - label_resource_planner: Resource planner - label_resource_planner_plural: Resource planners - label_new_resource_planner: New resource planner - public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. - - ' + action: + delete: Delete + favorite: Add to favorites + make_private: Make private + make_public: Make public + unfavorite: Remove from favorites + blankslate: + desc: Create a resource planner to start planning capacity for this project. + title: No resource planners yet + configure_view_dialog: + delete_confirmation: Are you sure you want to delete this view? This cannot be undone. + filter_mode: + automatic: + caption: An automatically-generated list that displays items that meet criteria you define. + label: Automatically filtered + label: Item selection + manual: + caption: A custom list of items you manually add and remove. Filtering is not possible. + label: Manually hand-picked + title: Configure view favorite_caption: 'Make this view a favorite to add it on the top section of the sidebar menu. ' - view_types: - UserCardView: Users cards - action: - favorite: Add to favorites - unfavorite: Remove from favorites - make_public: Make public - make_private: Make private - delete: Delete - sidebar: - public: Public - private: Private - blankslate: - title: No resource planners yet - desc: Create a resource planner to start planning capacity for this project. + label_new_resource_planner: New resource planner + label_resource_planner: Resource planner + label_resource_planner_plural: Resource planners + new_view_dialog: + title: Add View + public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. + + ' show: placeholder: The detailed view for this resource planner is coming soon. + sidebar: + private: Private + public: Public + sub_views: Views in this resource planner + view_types: + resource_work_package_list: + caption: Create a view based on work packages and see its details and allocation in a list + label: Work packages list + user_card: + caption: Create a view based on users and see their details and allocation in a list of user cards + label: Users card list + work_package_list: + add_work_package_dialog: + title: Add work package + allocation_placeholder: "—" + blank: + description: There are no work packages matching this view's filters yet. + title: No work packages to display + columns: + allocated_members: Allocated members + allocation: Allocation + dates: Dates + context_menu: + add_filter_criteria: Add filter criteria + add_user_group: Add user group + edit_total_work: Edit total work + label: More actions + move: Move + move_down: Move down + move_to_bottom: Move to bottom + move_to_top: Move to top + move_up: Move up + remove: Remove + remove_confirmation: Remove this work package from the view? + see_allocation: See allocation + mobile_title: Work packages + query_name: 'Resource management work packages: %{name}' + subheader: + add: Add + add_work_package: Add work package + allocate: Allocate + settings: Configure view diff --git a/modules/resource_management/config/locales/crowdin/sv.yml b/modules/resource_management/config/locales/crowdin/sv.yml index 626749d3a50..27f06b9dd84 100644 --- a/modules/resource_management/config/locales/crowdin/sv.yml +++ b/modules/resource_management/config/locales/crowdin/sv.yml @@ -2,72 +2,131 @@ sv: activerecord: attributes: - resource_planner: - name: Name - start_date: Start date - end_date: Finish date - default_view_class_name: Default view - public: Public - favorite: Favorite resource_allocation: + allocated_time: Allocated time + end_date: Finish date entity: Entity principal: Assignee - state: State start_date: Start date - end_date: Finish date - allocated_time: Allocated time + state: State user_filter: User filter + resource_planner: + default_view_class_name: Default view + end_date: Finish date + favorite: Favorite + name: Name + public: Public + start_date: Start date errors: models: - resource_planner: - attributes: - end_date: - greater_than_start_date: must be after the start date. resource_allocation: attributes: end_date: greater_than_start_date: must be after the start date. - plugin_openproject_resource_management: - name: OpenProject Resource Management - description: Provides resource management and capacity planning. - project_module_resource_management: Resource management - permission_view_resource_planners: View resource planners - permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. + resource_planner: + attributes: + end_date: + greater_than_start_date: must be after the start date. + resource_work_package_list: + attributes: + query: + must_be_work_package_query: must be a work package query. + models: + resource_allocation: Resource Allocation + resource_planner: Resource Planner + resource_work_package_list: Work packages list + user_card: User cards + button_next: Next + label_resource_management: Resource planning + permission_allocate_user_resources: Allocate user resources + permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. ' permission_manage_public_resource_planners: Manage public resource planners permission_manage_public_resource_planners_explanation: 'Allows users to create and manage public resource planners. It allows them to view, create, manage and publish their own resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - permission_allocate_user_resources: Allocate user resources - permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. + permission_view_resource_planners: View resource planners + permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - label_resource_management: Resource planning - button_next: Save + plugin_openproject_resource_management: + description: Provides resource management and capacity planning. + name: OpenProject Resource Management + project_module_resource_management: Resource management resource_management: - label_resource_planner: Resource planner - label_resource_planner_plural: Resource planners - label_new_resource_planner: New resource planner - public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. - - ' + action: + delete: Delete + favorite: Add to favorites + make_private: Make private + make_public: Make public + unfavorite: Remove from favorites + blankslate: + desc: Create a resource planner to start planning capacity for this project. + title: No resource planners yet + configure_view_dialog: + delete_confirmation: Are you sure you want to delete this view? This cannot be undone. + filter_mode: + automatic: + caption: An automatically-generated list that displays items that meet criteria you define. + label: Automatically filtered + label: Item selection + manual: + caption: A custom list of items you manually add and remove. Filtering is not possible. + label: Manually hand-picked + title: Configure view favorite_caption: 'Make this view a favorite to add it on the top section of the sidebar menu. ' - view_types: - UserCardView: Users cards - action: - favorite: Add to favorites - unfavorite: Remove from favorites - make_public: Make public - make_private: Make private - delete: Delete - sidebar: - public: Public - private: Private - blankslate: - title: No resource planners yet - desc: Create a resource planner to start planning capacity for this project. + label_new_resource_planner: New resource planner + label_resource_planner: Resource planner + label_resource_planner_plural: Resource planners + new_view_dialog: + title: Add View + public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. + + ' show: placeholder: The detailed view for this resource planner is coming soon. + sidebar: + private: Private + public: Public + sub_views: Views in this resource planner + view_types: + resource_work_package_list: + caption: Create a view based on work packages and see its details and allocation in a list + label: Work packages list + user_card: + caption: Create a view based on users and see their details and allocation in a list of user cards + label: Users card list + work_package_list: + add_work_package_dialog: + title: Add work package + allocation_placeholder: "—" + blank: + description: There are no work packages matching this view's filters yet. + title: No work packages to display + columns: + allocated_members: Allocated members + allocation: Allocation + dates: Dates + context_menu: + add_filter_criteria: Add filter criteria + add_user_group: Add user group + edit_total_work: Edit total work + label: More actions + move: Move + move_down: Move down + move_to_bottom: Move to bottom + move_to_top: Move to top + move_up: Move up + remove: Remove + remove_confirmation: Remove this work package from the view? + see_allocation: See allocation + mobile_title: Work packages + query_name: 'Resource management work packages: %{name}' + subheader: + add: Add + add_work_package: Add work package + allocate: Allocate + settings: Configure view diff --git a/modules/resource_management/config/locales/crowdin/th.yml b/modules/resource_management/config/locales/crowdin/th.yml index 5fdc99d8e55..9201a1fa07d 100644 --- a/modules/resource_management/config/locales/crowdin/th.yml +++ b/modules/resource_management/config/locales/crowdin/th.yml @@ -2,72 +2,131 @@ th: activerecord: attributes: - resource_planner: - name: Name - start_date: Start date - end_date: Finish date - default_view_class_name: Default view - public: Public - favorite: Favorite resource_allocation: + allocated_time: Allocated time + end_date: Finish date entity: Entity principal: Assignee - state: State start_date: Start date - end_date: Finish date - allocated_time: Allocated time + state: State user_filter: User filter + resource_planner: + default_view_class_name: Default view + end_date: Finish date + favorite: Favorite + name: Name + public: Public + start_date: Start date errors: models: - resource_planner: - attributes: - end_date: - greater_than_start_date: must be after the start date. resource_allocation: attributes: end_date: greater_than_start_date: must be after the start date. - plugin_openproject_resource_management: - name: OpenProject Resource Management - description: Provides resource management and capacity planning. - project_module_resource_management: Resource management - permission_view_resource_planners: View resource planners - permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. + resource_planner: + attributes: + end_date: + greater_than_start_date: must be after the start date. + resource_work_package_list: + attributes: + query: + must_be_work_package_query: must be a work package query. + models: + resource_allocation: Resource Allocation + resource_planner: Resource Planner + resource_work_package_list: Work packages list + user_card: User cards + button_next: Next + label_resource_management: Resource planning + permission_allocate_user_resources: Allocate user resources + permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. ' permission_manage_public_resource_planners: Manage public resource planners permission_manage_public_resource_planners_explanation: 'Allows users to create and manage public resource planners. It allows them to view, create, manage and publish their own resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - permission_allocate_user_resources: Allocate user resources - permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. + permission_view_resource_planners: View resource planners + permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - label_resource_management: Resource planning - button_next: Save + plugin_openproject_resource_management: + description: Provides resource management and capacity planning. + name: OpenProject Resource Management + project_module_resource_management: Resource management resource_management: - label_resource_planner: Resource planner - label_resource_planner_plural: Resource planners - label_new_resource_planner: New resource planner - public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. - - ' + action: + delete: Delete + favorite: Add to favorites + make_private: Make private + make_public: Make public + unfavorite: Remove from favorites + blankslate: + desc: Create a resource planner to start planning capacity for this project. + title: No resource planners yet + configure_view_dialog: + delete_confirmation: Are you sure you want to delete this view? This cannot be undone. + filter_mode: + automatic: + caption: An automatically-generated list that displays items that meet criteria you define. + label: Automatically filtered + label: Item selection + manual: + caption: A custom list of items you manually add and remove. Filtering is not possible. + label: Manually hand-picked + title: Configure view favorite_caption: 'Make this view a favorite to add it on the top section of the sidebar menu. ' - view_types: - UserCardView: Users cards - action: - favorite: Add to favorites - unfavorite: Remove from favorites - make_public: Make public - make_private: Make private - delete: Delete - sidebar: - public: Public - private: Private - blankslate: - title: No resource planners yet - desc: Create a resource planner to start planning capacity for this project. + label_new_resource_planner: New resource planner + label_resource_planner: Resource planner + label_resource_planner_plural: Resource planners + new_view_dialog: + title: Add View + public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. + + ' show: placeholder: The detailed view for this resource planner is coming soon. + sidebar: + private: Private + public: Public + sub_views: Views in this resource planner + view_types: + resource_work_package_list: + caption: Create a view based on work packages and see its details and allocation in a list + label: Work packages list + user_card: + caption: Create a view based on users and see their details and allocation in a list of user cards + label: Users card list + work_package_list: + add_work_package_dialog: + title: Add work package + allocation_placeholder: "—" + blank: + description: There are no work packages matching this view's filters yet. + title: No work packages to display + columns: + allocated_members: Allocated members + allocation: Allocation + dates: Dates + context_menu: + add_filter_criteria: Add filter criteria + add_user_group: Add user group + edit_total_work: Edit total work + label: More actions + move: Move + move_down: Move down + move_to_bottom: Move to bottom + move_to_top: Move to top + move_up: Move up + remove: Remove + remove_confirmation: Remove this work package from the view? + see_allocation: See allocation + mobile_title: Work packages + query_name: 'Resource management work packages: %{name}' + subheader: + add: Add + add_work_package: Add work package + allocate: Allocate + settings: Configure view diff --git a/modules/resource_management/config/locales/crowdin/tr.yml b/modules/resource_management/config/locales/crowdin/tr.yml index 57fb3686449..1b54a1edf23 100644 --- a/modules/resource_management/config/locales/crowdin/tr.yml +++ b/modules/resource_management/config/locales/crowdin/tr.yml @@ -2,72 +2,131 @@ tr: activerecord: attributes: - resource_planner: - name: Name - start_date: Start date - end_date: Finish date - default_view_class_name: Default view - public: Public - favorite: Favorite resource_allocation: + allocated_time: Allocated time + end_date: Finish date entity: Entity principal: Assignee - state: State start_date: Start date - end_date: Finish date - allocated_time: Allocated time + state: State user_filter: User filter + resource_planner: + default_view_class_name: Default view + end_date: Finish date + favorite: Favorite + name: Name + public: Public + start_date: Start date errors: models: - resource_planner: - attributes: - end_date: - greater_than_start_date: must be after the start date. resource_allocation: attributes: end_date: greater_than_start_date: must be after the start date. - plugin_openproject_resource_management: - name: OpenProject Resource Management - description: Provides resource management and capacity planning. - project_module_resource_management: Resource management - permission_view_resource_planners: View resource planners - permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. + resource_planner: + attributes: + end_date: + greater_than_start_date: must be after the start date. + resource_work_package_list: + attributes: + query: + must_be_work_package_query: must be a work package query. + models: + resource_allocation: Resource Allocation + resource_planner: Resource Planner + resource_work_package_list: Work packages list + user_card: User cards + button_next: Next + label_resource_management: Resource planning + permission_allocate_user_resources: Allocate user resources + permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. ' permission_manage_public_resource_planners: Manage public resource planners permission_manage_public_resource_planners_explanation: 'Allows users to create and manage public resource planners. It allows them to view, create, manage and publish their own resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - permission_allocate_user_resources: Allocate user resources - permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. + permission_view_resource_planners: View resource planners + permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - label_resource_management: Resource planning - button_next: Save + plugin_openproject_resource_management: + description: Provides resource management and capacity planning. + name: OpenProject Resource Management + project_module_resource_management: Resource management resource_management: - label_resource_planner: Resource planner - label_resource_planner_plural: Resource planners - label_new_resource_planner: New resource planner - public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. - - ' + action: + delete: Delete + favorite: Add to favorites + make_private: Make private + make_public: Make public + unfavorite: Remove from favorites + blankslate: + desc: Create a resource planner to start planning capacity for this project. + title: No resource planners yet + configure_view_dialog: + delete_confirmation: Are you sure you want to delete this view? This cannot be undone. + filter_mode: + automatic: + caption: An automatically-generated list that displays items that meet criteria you define. + label: Automatically filtered + label: Item selection + manual: + caption: A custom list of items you manually add and remove. Filtering is not possible. + label: Manually hand-picked + title: Configure view favorite_caption: 'Make this view a favorite to add it on the top section of the sidebar menu. ' - view_types: - UserCardView: Users cards - action: - favorite: Add to favorites - unfavorite: Remove from favorites - make_public: Make public - make_private: Make private - delete: Delete - sidebar: - public: Public - private: Private - blankslate: - title: No resource planners yet - desc: Create a resource planner to start planning capacity for this project. + label_new_resource_planner: New resource planner + label_resource_planner: Resource planner + label_resource_planner_plural: Resource planners + new_view_dialog: + title: Add View + public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. + + ' show: placeholder: The detailed view for this resource planner is coming soon. + sidebar: + private: Private + public: Public + sub_views: Views in this resource planner + view_types: + resource_work_package_list: + caption: Create a view based on work packages and see its details and allocation in a list + label: Work packages list + user_card: + caption: Create a view based on users and see their details and allocation in a list of user cards + label: Users card list + work_package_list: + add_work_package_dialog: + title: Add work package + allocation_placeholder: "—" + blank: + description: There are no work packages matching this view's filters yet. + title: No work packages to display + columns: + allocated_members: Allocated members + allocation: Allocation + dates: Dates + context_menu: + add_filter_criteria: Add filter criteria + add_user_group: Add user group + edit_total_work: Edit total work + label: More actions + move: Move + move_down: Move down + move_to_bottom: Move to bottom + move_to_top: Move to top + move_up: Move up + remove: Remove + remove_confirmation: Remove this work package from the view? + see_allocation: See allocation + mobile_title: Work packages + query_name: 'Resource management work packages: %{name}' + subheader: + add: Add + add_work_package: Add work package + allocate: Allocate + settings: Configure view diff --git a/modules/resource_management/config/locales/crowdin/uk.yml b/modules/resource_management/config/locales/crowdin/uk.yml index 2511d6d0a3d..49df1fa7699 100644 --- a/modules/resource_management/config/locales/crowdin/uk.yml +++ b/modules/resource_management/config/locales/crowdin/uk.yml @@ -2,72 +2,131 @@ uk: activerecord: attributes: - resource_planner: - name: Назва - start_date: Дата початку - end_date: Дата завершення - default_view_class_name: Типове подання - public: Загальнодоступне - favorite: Вибране resource_allocation: + allocated_time: Виділений час + end_date: Дата завершення entity: Сутність principal: Виконавець - state: Стан start_date: Дата початку - end_date: Дата завершення - allocated_time: Виділений час + state: Стан user_filter: Фільтр користувачів + resource_planner: + default_view_class_name: Типове подання + end_date: Дата завершення + favorite: Вибране + name: Назва + public: Загальнодоступне + start_date: Дата початку errors: models: - resource_planner: - attributes: - end_date: - greater_than_start_date: не має передувати даті початку. resource_allocation: attributes: end_date: greater_than_start_date: не має передувати даті початку. - plugin_openproject_resource_management: - name: Керування ресурсами OpenProject - description: Забезпечує керування ресурсами й планування завантаження. - project_module_resource_management: Керування ресурсами - permission_view_resource_planners: Переглядати планувальники ресурсів - permission_view_resource_planners_explanation: 'Дає змогу користувачам отримувати доступ до планувальників ресурсів. Дозволяє їм створювати власні планувальники ресурсів і керувати ними, а також переглядати загальнодоступні. Не дозволяє переглядати планувальники ресурсів інших користувачів, які не є загальнодоступними. + resource_planner: + attributes: + end_date: + greater_than_start_date: не має передувати даті початку. + resource_work_package_list: + attributes: + query: + must_be_work_package_query: має бути запитом до робочого пакету. + models: + resource_allocation: Призначення ресурсів + resource_planner: Планувальник ресурсів + resource_work_package_list: Список пакетів робіт + user_card: Картки користувачів + button_next: Далі + label_resource_management: Планування ресурсів + permission_allocate_user_resources: Призначати ресурси користувачів + permission_allocate_user_resources_explanation: 'Дозволяє користувачам створювати, оновлювати й видаляти призначення ресурсів у планувальнику ресурсів. Це, зокрема, стосується призначення користувачів (або фільтрів користувачів) планувальнику й коригування виділеного часу й діапазону дат. ' permission_manage_public_resource_planners: Керувати загальнодоступними планувальниками ресурсів permission_manage_public_resource_planners_explanation: 'Дає змогу користувачам створювати загальнодоступні планувальники ресурсів і керувати ними. Дозволяє їм переглядати, створювати й публікувати власні планувальники ресурсів, а також керувати ними. Не дозволяє переглядати планувальники ресурсів інших користувачів, які не є загальнодоступними. ' - permission_allocate_user_resources: Призначати ресурси користувачів - permission_allocate_user_resources_explanation: 'Дозволяє користувачам створювати, оновлювати й видаляти призначення ресурсів у планувальнику ресурсів. Це, зокрема, стосується призначення користувачів (або фільтрів користувачів) планувальнику й коригування виділеного часу й діапазону дат. + permission_view_resource_planners: Переглядати планувальники ресурсів + permission_view_resource_planners_explanation: 'Дає змогу користувачам отримувати доступ до планувальників ресурсів. Дозволяє їм створювати власні планувальники ресурсів і керувати ними, а також переглядати загальнодоступні. Не дозволяє переглядати планувальники ресурсів інших користувачів, які не є загальнодоступними. ' - label_resource_management: Планування ресурсів - button_next: Зберегти + plugin_openproject_resource_management: + description: Забезпечує керування ресурсами й планування завантаження. + name: Керування ресурсами OpenProject + project_module_resource_management: Керування ресурсами resource_management: - label_resource_planner: Планувальник ресурсів - label_resource_planner_plural: Планувальники ресурсів - label_new_resource_planner: Новий планувальник ресурсів - public_caption: 'Якщо зробити це подання загальнодоступним, доступ до нього отримають усі учасники проєкту. Це не вплине на видимість пакетів робіт, яка все ще залежить від того, чи є в користувача відповідний дозвіл. - - ' + action: + delete: Видалити + favorite: Додати у вибране + make_private: Зробити приватним + make_public: Зробити загальнодоступним + unfavorite: Вилучити з вибраного + blankslate: + desc: Створіть планувальник ресурсів, щоб почати планувати завантаження для цього проєкту. + title: Ще немає планувальників ресурсів + configure_view_dialog: + delete_confirmation: Справді видалити подання? Цю дію неможливо скасувати. + filter_mode: + automatic: + caption: Автоматично згенерований список елементів, що відповідають визначеним вами критеріям. + label: Автоматична фільтрація + label: Вибір елементів + manual: + caption: Користувацький список елементів, які потрібно додавати й видаляти вручну. Фільтрація неможлива. + label: Вибране вручну + title: Налаштувати подання favorite_caption: 'Якщо додати це подання у вибране, воно з’явиться у верхній частині меню бічної панелі. ' - view_types: - UserCardView: Картки користувачів - action: - favorite: Додати у вибране - unfavorite: Вилучити з вибраного - make_public: Зробити загальнодоступним - make_private: Зробити приватним - delete: Видалити - sidebar: - public: Загальнодоступні - private: Приватні - blankslate: - title: Ще немає планувальників ресурсів - desc: Створіть планувальник ресурсів, щоб почати планувати завантаження для цього проєкту. + label_new_resource_planner: Новий планувальник ресурсів + label_resource_planner: Планувальник ресурсів + label_resource_planner_plural: Планувальники ресурсів + new_view_dialog: + title: Додати подання + public_caption: 'Якщо зробити це подання загальнодоступним, доступ до нього отримають усі учасники проєкту. Це не вплине на видимість пакетів робіт, яка все ще залежить від того, чи є в користувача відповідний дозвіл. + + ' show: placeholder: Детальний огляд цього планувальника ресурсів з’явиться незабаром. + sidebar: + private: Приватні + public: Загальнодоступні + sub_views: Подання в цьому планувальнику ресурсів + view_types: + resource_work_package_list: + caption: Створіть подання на основі пакетів робіт, щоб переглядати інформацію про них і дані про призначення в списку + label: Список пакетів робіт + user_card: + caption: Створіть подання на основі користувачів, щоб переглядати інформацію про них і дані про призначення в списку карток користувачів + label: Список карток користувачів + work_package_list: + add_work_package_dialog: + title: Додати пакет робіт + allocation_placeholder: "—" + blank: + description: Ще немає пакетів робіт, які відповідають фільтрам цього подання. + title: Немає пакетів робіт для відображення + columns: + allocated_members: Призначені учасники + allocation: Призначення + dates: Дати + context_menu: + add_filter_criteria: Додати критерії фільтрації + add_user_group: Додати групу користувачів + edit_total_work: Змінити загальну роботу + label: Інші дії + move: Перемістити + move_down: Перемістити вниз + move_to_bottom: Перемістити в кінець + move_to_top: Перемістити на верх + move_up: Перемістити вгору + remove: Вилучити + remove_confirmation: Вилучити цей пакет робіт із подання? + see_allocation: Переглянути призначення + mobile_title: Пакети робіт + query_name: 'Пакети робіт з управління ресурсами: %{name}' + subheader: + add: Додати + add_work_package: Додати пакет робіт + allocate: Призначити + settings: Налаштувати подання diff --git a/modules/resource_management/config/locales/crowdin/uz.yml b/modules/resource_management/config/locales/crowdin/uz.yml index a338609a31f..1cede0fe147 100644 --- a/modules/resource_management/config/locales/crowdin/uz.yml +++ b/modules/resource_management/config/locales/crowdin/uz.yml @@ -2,72 +2,131 @@ uz: activerecord: attributes: - resource_planner: - name: Name - start_date: Start date - end_date: Finish date - default_view_class_name: Default view - public: Public - favorite: Favorite resource_allocation: + allocated_time: Allocated time + end_date: Finish date entity: Entity principal: Assignee - state: State start_date: Start date - end_date: Finish date - allocated_time: Allocated time + state: State user_filter: User filter + resource_planner: + default_view_class_name: Default view + end_date: Finish date + favorite: Favorite + name: Name + public: Public + start_date: Start date errors: models: - resource_planner: - attributes: - end_date: - greater_than_start_date: must be after the start date. resource_allocation: attributes: end_date: greater_than_start_date: must be after the start date. - plugin_openproject_resource_management: - name: OpenProject Resource Management - description: Provides resource management and capacity planning. - project_module_resource_management: Resource management - permission_view_resource_planners: View resource planners - permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. + resource_planner: + attributes: + end_date: + greater_than_start_date: must be after the start date. + resource_work_package_list: + attributes: + query: + must_be_work_package_query: must be a work package query. + models: + resource_allocation: Resource Allocation + resource_planner: Resource Planner + resource_work_package_list: Work packages list + user_card: User cards + button_next: Next + label_resource_management: Resource planning + permission_allocate_user_resources: Allocate user resources + permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. ' permission_manage_public_resource_planners: Manage public resource planners permission_manage_public_resource_planners_explanation: 'Allows users to create and manage public resource planners. It allows them to view, create, manage and publish their own resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - permission_allocate_user_resources: Allocate user resources - permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. + permission_view_resource_planners: View resource planners + permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - label_resource_management: Resource planning - button_next: Save + plugin_openproject_resource_management: + description: Provides resource management and capacity planning. + name: OpenProject Resource Management + project_module_resource_management: Resource management resource_management: - label_resource_planner: Resource planner - label_resource_planner_plural: Resource planners - label_new_resource_planner: New resource planner - public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. - - ' + action: + delete: Delete + favorite: Add to favorites + make_private: Make private + make_public: Make public + unfavorite: Remove from favorites + blankslate: + desc: Create a resource planner to start planning capacity for this project. + title: No resource planners yet + configure_view_dialog: + delete_confirmation: Are you sure you want to delete this view? This cannot be undone. + filter_mode: + automatic: + caption: An automatically-generated list that displays items that meet criteria you define. + label: Automatically filtered + label: Item selection + manual: + caption: A custom list of items you manually add and remove. Filtering is not possible. + label: Manually hand-picked + title: Configure view favorite_caption: 'Make this view a favorite to add it on the top section of the sidebar menu. ' - view_types: - UserCardView: Users cards - action: - favorite: Add to favorites - unfavorite: Remove from favorites - make_public: Make public - make_private: Make private - delete: Delete - sidebar: - public: Public - private: Private - blankslate: - title: No resource planners yet - desc: Create a resource planner to start planning capacity for this project. + label_new_resource_planner: New resource planner + label_resource_planner: Resource planner + label_resource_planner_plural: Resource planners + new_view_dialog: + title: Add View + public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. + + ' show: placeholder: The detailed view for this resource planner is coming soon. + sidebar: + private: Private + public: Public + sub_views: Views in this resource planner + view_types: + resource_work_package_list: + caption: Create a view based on work packages and see its details and allocation in a list + label: Work packages list + user_card: + caption: Create a view based on users and see their details and allocation in a list of user cards + label: Users card list + work_package_list: + add_work_package_dialog: + title: Add work package + allocation_placeholder: "—" + blank: + description: There are no work packages matching this view's filters yet. + title: No work packages to display + columns: + allocated_members: Allocated members + allocation: Allocation + dates: Dates + context_menu: + add_filter_criteria: Add filter criteria + add_user_group: Add user group + edit_total_work: Edit total work + label: More actions + move: Move + move_down: Move down + move_to_bottom: Move to bottom + move_to_top: Move to top + move_up: Move up + remove: Remove + remove_confirmation: Remove this work package from the view? + see_allocation: See allocation + mobile_title: Work packages + query_name: 'Resource management work packages: %{name}' + subheader: + add: Add + add_work_package: Add work package + allocate: Allocate + settings: Configure view diff --git a/modules/resource_management/config/locales/crowdin/vi.yml b/modules/resource_management/config/locales/crowdin/vi.yml index 5e6ee20cafe..2e3398e767e 100644 --- a/modules/resource_management/config/locales/crowdin/vi.yml +++ b/modules/resource_management/config/locales/crowdin/vi.yml @@ -2,72 +2,131 @@ vi: activerecord: attributes: - resource_planner: - name: Name - start_date: Start date - end_date: Ngày kết thúc - default_view_class_name: Default view - public: Public - favorite: Favorite resource_allocation: + allocated_time: Allocated time + end_date: Ngày kết thúc entity: Entity principal: Assignee - state: State start_date: Start date - end_date: Ngày kết thúc - allocated_time: Allocated time + state: State user_filter: User filter + resource_planner: + default_view_class_name: Default view + end_date: Ngày kết thúc + favorite: Favorite + name: Name + public: Public + start_date: Start date errors: models: - resource_planner: - attributes: - end_date: - greater_than_start_date: must be after the start date. resource_allocation: attributes: end_date: greater_than_start_date: must be after the start date. - plugin_openproject_resource_management: - name: OpenProject Resource Management - description: Provides quản lý tài nguyên (resource management) and capacity planning. - project_module_resource_management: Quản lý tài nguyên (Resource Management) - permission_view_resource_planners: View resource planners - permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. + resource_planner: + attributes: + end_date: + greater_than_start_date: must be after the start date. + resource_work_package_list: + attributes: + query: + must_be_work_package_query: must be a work package query. + models: + resource_allocation: Resource Allocation + resource_planner: Resource Planner + resource_work_package_list: Work packages list + user_card: User cards + button_next: Next + label_resource_management: Resource planning + permission_allocate_user_resources: Allocate user resources + permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. ' permission_manage_public_resource_planners: Manage public resource planners permission_manage_public_resource_planners_explanation: 'Allows users to create and manage public resource planners. It allows them to view, create, manage and publish their own resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - permission_allocate_user_resources: Allocate user resources - permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. + permission_view_resource_planners: View resource planners + permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - label_resource_management: Resource planning - button_next: Save + plugin_openproject_resource_management: + description: Provides quản lý tài nguyên (resource management) and capacity planning. + name: OpenProject Resource Management + project_module_resource_management: Quản lý tài nguyên (Resource Management) resource_management: - label_resource_planner: Resource Planner - label_resource_planner_plural: Resource Planners - label_new_resource_planner: New resource planner - public_caption: 'Make this view public to all members of the project. This does not affect the visibility of gói công việc (work package)s which still depends on each user permission. - - ' + action: + delete: Delete + favorite: Add to favorites + make_private: Make private + make_public: Make public + unfavorite: Remove from favorites + blankslate: + desc: Tạo một Resource Planner để bắt đầu lập kế hoạch năng suất cho dự án này. + title: Chưa có kế hoạch tài nguyên (Resource Planner) nào + configure_view_dialog: + delete_confirmation: Are you sure you want to delete this view? This cannot be undone. + filter_mode: + automatic: + caption: An automatically-generated list that displays items that meet criteria you define. + label: Automatically filtered + label: Item selection + manual: + caption: A custom list of items you manually add and remove. Filtering is not possible. + label: Manually hand-picked + title: Configure view favorite_caption: 'Make this view a favorite to add it on the top section of the sidebar menu. ' - view_types: - UserCardView: Users cards - action: - favorite: Add to favorites - unfavorite: Remove from favorites - make_public: Make public - make_private: Make private - delete: Delete - sidebar: - public: Public - private: Private - blankslate: - title: Chưa có kế hoạch tài nguyên (Resource Planner) nào - desc: Tạo một Resource Planner để bắt đầu lập kế hoạch năng suất cho dự án này. + label_new_resource_planner: New resource planner + label_resource_planner: Resource Planner + label_resource_planner_plural: Resource Planners + new_view_dialog: + title: Add View + public_caption: 'Make this view public to all members of the project. This does not affect the visibility of gói công việc (work package)s which still depends on each user permission. + + ' show: placeholder: Chế độ xem chi tiết cho Resource Planner này sẽ sớm ra mắt. + sidebar: + private: Private + public: Public + sub_views: Views in this resource planner + view_types: + resource_work_package_list: + caption: Create a view based on work packages and see its details and allocation in a list + label: Work packages list + user_card: + caption: Create a view based on users and see their details and allocation in a list of user cards + label: Users card list + work_package_list: + add_work_package_dialog: + title: Add work package + allocation_placeholder: "—" + blank: + description: There are no work packages matching this view's filters yet. + title: No work packages to display + columns: + allocated_members: Allocated members + allocation: Allocation + dates: Dates + context_menu: + add_filter_criteria: Add filter criteria + add_user_group: Add user group + edit_total_work: Edit total work + label: More actions + move: Move + move_down: Move down + move_to_bottom: Move to bottom + move_to_top: Move to top + move_up: Move up + remove: Remove + remove_confirmation: Remove this work package from the view? + see_allocation: See allocation + mobile_title: Work packages + query_name: 'Resource management work packages: %{name}' + subheader: + add: Add + add_work_package: Add work package + allocate: Allocate + settings: Configure view diff --git a/modules/resource_management/config/locales/crowdin/zh-CN.yml b/modules/resource_management/config/locales/crowdin/zh-CN.yml index cca9da5be2e..942eeee2c9f 100644 --- a/modules/resource_management/config/locales/crowdin/zh-CN.yml +++ b/modules/resource_management/config/locales/crowdin/zh-CN.yml @@ -2,72 +2,131 @@ zh-CN: activerecord: attributes: - resource_planner: - name: 名称 - start_date: 开始日期 - end_date: 结束日期 - default_view_class_name: 默认视图 - public: 公开 - favorite: 收藏夹 resource_allocation: + allocated_time: 分配时间 + end_date: 结束日期 entity: 实体 principal: 受理人 - state: 地区 start_date: 开始日期 - end_date: 结束日期 - allocated_time: 分配时间 + state: 地区 user_filter: 用户筛选器 + resource_planner: + default_view_class_name: 默认视图 + end_date: 结束日期 + favorite: 收藏夹 + name: 名称 + public: 公开 + start_date: 开始日期 errors: models: - resource_planner: - attributes: - end_date: - greater_than_start_date: 必须在开始日期之后。 resource_allocation: attributes: end_date: greater_than_start_date: 必须在开始日期之后。 - plugin_openproject_resource_management: - name: OpenProject 资源管理 - description: 提供资源管理和能力规划。 - project_module_resource_management: 资源管理 - permission_view_resource_planners: 查看资源规划工具 - permission_view_resource_planners_explanation: '允许用户访问资源规划工具。用户可以创建和管理自己的资源规划工具,并查看公开的资源规划工具,但不可以查看其他用户创建的未公开共享的资源规划工具。 + resource_planner: + attributes: + end_date: + greater_than_start_date: 必须在开始日期之后。 + resource_work_package_list: + attributes: + query: + must_be_work_package_query: 必须是工作包查询。 + models: + resource_allocation: 资源分配 + resource_planner: 资源规划工具 + resource_work_package_list: 工作包列表 + user_card: 用户卡 + button_next: 下一步 + label_resource_management: 资源规划 + permission_allocate_user_resources: 分配用户资源 + permission_allocate_user_resources_explanation: '允许用户在资源规划工具中创建、更新和删除资源分配。这包括为规划工具分配用户(或用户筛选器),以及调整分配的时间和日期范围。 ' permission_manage_public_resource_planners: 管理公开的资源规划工具 permission_manage_public_resource_planners_explanation: '允许用户创建和管理公开的资源规划工具。用户可以查看、创建、管理和发布自己的资源规划工具,但不可以查看其他用户创建的未公开共享的资源规划工具。 ' - permission_allocate_user_resources: 分配用户资源 - permission_allocate_user_resources_explanation: '允许用户在资源规划工具中创建、更新和删除资源分配。这包括为规划工具分配用户(或用户筛选器),以及调整分配的时间和日期范围。 + permission_view_resource_planners: 查看资源规划工具 + permission_view_resource_planners_explanation: '允许用户访问资源规划工具。用户可以创建和管理自己的资源规划工具,并查看公开的资源规划工具,但不可以查看其他用户创建的未公开共享的资源规划工具。 ' - label_resource_management: 资源规划 - button_next: 保存 + plugin_openproject_resource_management: + description: 提供资源管理和能力规划。 + name: OpenProject 资源管理 + project_module_resource_management: 资源管理 resource_management: - label_resource_planner: 资源规划工具 - label_resource_planner_plural: 资源规划工具 - label_new_resource_planner: 新建资源规划工具 - public_caption: '向该项目的所有成员公开此视图。这不会影响工作包的可见性,工作包的可见性仍然取决于每位用户的权限。 - - ' + action: + delete: 删除 + favorite: 添加至收藏夹 + make_private: 设为私有 + make_public: 设为公开 + unfavorite: 取消收藏 + blankslate: + desc: 创建资源规划工具以开始规划此项目的容量。 + title: 暂无资源规划工具 + configure_view_dialog: + delete_confirmation: 确定要删除此视图吗?此操作无法撤消。 + filter_mode: + automatic: + caption: 自动生成的列表,显示符合您所定义条件的项目。 + label: 已自动筛选 + label: 项目选择 + manual: + caption: 您手动添加和移除的自定义项目列表。无法进行筛选。 + label: 人工挑选 + title: 配置视图 favorite_caption: '将此视图标记为收藏项,并添加到边栏菜单的顶部。 ' - view_types: - UserCardView: 用户卡 - action: - favorite: 添加至收藏夹 - unfavorite: 取消收藏 - make_public: 设为公开 - make_private: 设为私有 - delete: 删除 - sidebar: - public: 公开 - private: 私用 - blankslate: - title: 暂无资源规划工具 - desc: 创建资源规划工具以开始规划此项目的容量。 + label_new_resource_planner: 新建资源规划工具 + label_resource_planner: 资源规划工具 + label_resource_planner_plural: 资源规划工具 + new_view_dialog: + title: 添加视图 + public_caption: '向该项目的所有成员公开此视图。这不会影响工作包的可见性,工作包的可见性仍然取决于每位用户的权限。 + + ' show: placeholder: 此资源规划工具的详细视图即将发布。 + sidebar: + private: 私用 + public: 公开 + sub_views: 此资源规划工具中的视图 + view_types: + resource_work_package_list: + caption: 基于工作包创建视图,并在列表中查看其详细信息和分配情况 + label: 工作包列表 + user_card: + caption: 基于用户创建视图,并在用户卡列表中查看其详细信息和分配情况 + label: 用户卡列表 + work_package_list: + add_work_package_dialog: + title: 添加工作包 + allocation_placeholder: "—" + blank: + description: 还没有与此视图的筛选条件相符的工作包。 + title: 没有要显示的工作包 + columns: + allocated_members: 分配的成员 + allocation: 分配 + dates: 日期 + context_menu: + add_filter_criteria: 添加筛选条件 + add_user_group: 添加用户群组 + edit_total_work: 编辑总工时 + label: 更多操作 + move: 移动 + move_down: 向下移动 + move_to_bottom: 移至底部 + move_to_top: 移至顶部 + move_up: 向上移动 + remove: 移除 + remove_confirmation: 是否将此工作包从视图中移除? + see_allocation: 查看分配 + mobile_title: 工作包 + query_name: 资源管理工作包:%{name} + subheader: + add: 添加 + add_work_package: 添加工作包 + allocate: 分配 + settings: 配置视图 diff --git a/modules/resource_management/config/locales/crowdin/zh-TW.yml b/modules/resource_management/config/locales/crowdin/zh-TW.yml index 0eb51e9ae56..238239975d2 100644 --- a/modules/resource_management/config/locales/crowdin/zh-TW.yml +++ b/modules/resource_management/config/locales/crowdin/zh-TW.yml @@ -2,72 +2,131 @@ zh-TW: activerecord: attributes: - resource_planner: - name: Name - start_date: Start date - end_date: Finish date - default_view_class_name: Default view - public: Public - favorite: Favorite resource_allocation: + allocated_time: Allocated time + end_date: Finish date entity: Entity principal: Assignee - state: State start_date: Start date - end_date: Finish date - allocated_time: Allocated time + state: State user_filter: User filter + resource_planner: + default_view_class_name: Default view + end_date: Finish date + favorite: Favorite + name: Name + public: Public + start_date: Start date errors: models: - resource_planner: - attributes: - end_date: - greater_than_start_date: must be after the start date. resource_allocation: attributes: end_date: greater_than_start_date: must be after the start date. - plugin_openproject_resource_management: - name: OpenProject Resource Management - description: Provides resource management and capacity planning. - project_module_resource_management: Resource management - permission_view_resource_planners: View resource planners - permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. + resource_planner: + attributes: + end_date: + greater_than_start_date: must be after the start date. + resource_work_package_list: + attributes: + query: + must_be_work_package_query: must be a work package query. + models: + resource_allocation: Resource Allocation + resource_planner: Resource Planner + resource_work_package_list: Work packages list + user_card: User cards + button_next: Next + label_resource_management: Resource planning + permission_allocate_user_resources: Allocate user resources + permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. ' permission_manage_public_resource_planners: Manage public resource planners permission_manage_public_resource_planners_explanation: 'Allows users to create and manage public resource planners. It allows them to view, create, manage and publish their own resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - permission_allocate_user_resources: Allocate user resources - permission_allocate_user_resources_explanation: 'Allows users to create, update, and delete resource allocations within a resource planner. This includes assigning users (or user filters) to a planner and adjusting the allocated time and date range. + permission_view_resource_planners: View resource planners + permission_view_resource_planners_explanation: 'Allows users to access resource planners. It allows them to create and manage their own resource planners and view public resource planners. It does not allow users to view resource planners created by other users that are not shared publicly. ' - label_resource_management: Resource planning - button_next: Save + plugin_openproject_resource_management: + description: Provides resource management and capacity planning. + name: OpenProject Resource Management + project_module_resource_management: Resource management resource_management: - label_resource_planner: Resource planner - label_resource_planner_plural: Resource planners - label_new_resource_planner: New resource planner - public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. - - ' + action: + delete: Delete + favorite: Add to favorites + make_private: Make private + make_public: Make public + unfavorite: Remove from favorites + blankslate: + desc: Create a resource planner to start planning capacity for this project. + title: No resource planners yet + configure_view_dialog: + delete_confirmation: Are you sure you want to delete this view? This cannot be undone. + filter_mode: + automatic: + caption: An automatically-generated list that displays items that meet criteria you define. + label: Automatically filtered + label: Item selection + manual: + caption: A custom list of items you manually add and remove. Filtering is not possible. + label: Manually hand-picked + title: Configure view favorite_caption: 'Make this view a favorite to add it on the top section of the sidebar menu. ' - view_types: - UserCardView: Users cards - action: - favorite: Add to favorites - unfavorite: Remove from favorites - make_public: Make public - make_private: Make private - delete: Delete - sidebar: - public: Public - private: Private - blankslate: - title: No resource planners yet - desc: Create a resource planner to start planning capacity for this project. + label_new_resource_planner: New resource planner + label_resource_planner: Resource planner + label_resource_planner_plural: Resource planners + new_view_dialog: + title: Add View + public_caption: 'Make this view public to all members of the project. This does not affect the visibility of work packages which still depends on each user permission. + + ' show: placeholder: The detailed view for this resource planner is coming soon. + sidebar: + private: Private + public: Public + sub_views: Views in this resource planner + view_types: + resource_work_package_list: + caption: Create a view based on work packages and see its details and allocation in a list + label: Work packages list + user_card: + caption: Create a view based on users and see their details and allocation in a list of user cards + label: Users card list + work_package_list: + add_work_package_dialog: + title: Add work package + allocation_placeholder: "—" + blank: + description: There are no work packages matching this view's filters yet. + title: No work packages to display + columns: + allocated_members: Allocated members + allocation: Allocation + dates: Dates + context_menu: + add_filter_criteria: Add filter criteria + add_user_group: Add user group + edit_total_work: Edit total work + label: More actions + move: Move + move_down: Move down + move_to_bottom: Move to bottom + move_to_top: Move to top + move_up: Move up + remove: Remove + remove_confirmation: Remove this work package from the view? + see_allocation: See allocation + mobile_title: Work packages + query_name: 'Resource management work packages: %{name}' + subheader: + add: Add + add_work_package: Add work package + allocate: Allocate + settings: Configure view diff --git a/modules/storages/config/locales/crowdin/af.yml b/modules/storages/config/locales/crowdin/af.yml index 5009c5b53fd..4dc2253aea4 100644 --- a/modules/storages/config/locales/crowdin/af.yml +++ b/modules/storages/config/locales/crowdin/af.yml @@ -31,10 +31,15 @@ af: authentication_method: Authentication Method creator: Creator drive: Drive ID + file_link_origin: File link origin ID host: Gasheer + linkable_to_storage: Linkable to storage + linkable_to_storage_url: Linkable to storage URL name: Naam password: Application password provider_type: Provider type + storage: Storage + storage_url: Storage URL tenant: Directory (tenant) ID errors: messages: diff --git a/modules/storages/config/locales/crowdin/ar.yml b/modules/storages/config/locales/crowdin/ar.yml index 03d49b058c2..b330cfd6af1 100644 --- a/modules/storages/config/locales/crowdin/ar.yml +++ b/modules/storages/config/locales/crowdin/ar.yml @@ -31,10 +31,15 @@ ar: authentication_method: Authentication Method creator: Creator drive: Drive ID + file_link_origin: File link origin ID host: المضيف + linkable_to_storage: Linkable to storage + linkable_to_storage_url: Linkable to storage URL name: الاسم password: Application password provider_type: Provider type + storage: Storage + storage_url: Storage URL tenant: Directory (tenant) ID errors: messages: diff --git a/modules/storages/config/locales/crowdin/az.yml b/modules/storages/config/locales/crowdin/az.yml index ef81671bd78..84809a830d3 100644 --- a/modules/storages/config/locales/crowdin/az.yml +++ b/modules/storages/config/locales/crowdin/az.yml @@ -31,10 +31,15 @@ az: authentication_method: Authentication Method creator: Creator drive: Drive ID + file_link_origin: File link origin ID host: Host + linkable_to_storage: Linkable to storage + linkable_to_storage_url: Linkable to storage URL name: Name password: Application password provider_type: Provider type + storage: Storage + storage_url: Storage URL tenant: Directory (tenant) ID errors: messages: diff --git a/modules/storages/config/locales/crowdin/be.yml b/modules/storages/config/locales/crowdin/be.yml index 7bbfdf33fd6..2dc4165bb83 100644 --- a/modules/storages/config/locales/crowdin/be.yml +++ b/modules/storages/config/locales/crowdin/be.yml @@ -31,10 +31,15 @@ be: authentication_method: Authentication Method creator: Стваральнік drive: Drive ID + file_link_origin: File link origin ID host: Host + linkable_to_storage: Linkable to storage + linkable_to_storage_url: Linkable to storage URL name: Імя password: Application password provider_type: Provider type + storage: Storage + storage_url: Storage URL tenant: Directory (tenant) ID errors: messages: diff --git a/modules/storages/config/locales/crowdin/bg.yml b/modules/storages/config/locales/crowdin/bg.yml index a794536a7da..e210a2bb517 100644 --- a/modules/storages/config/locales/crowdin/bg.yml +++ b/modules/storages/config/locales/crowdin/bg.yml @@ -31,10 +31,15 @@ bg: authentication_method: Authentication Method creator: Създател drive: Drive ID + file_link_origin: File link origin ID host: Хост + linkable_to_storage: Linkable to storage + linkable_to_storage_url: Linkable to storage URL name: Име password: Application password provider_type: Provider type + storage: Storage + storage_url: Storage URL tenant: Directory (tenant) ID errors: messages: diff --git a/modules/storages/config/locales/crowdin/ca.yml b/modules/storages/config/locales/crowdin/ca.yml index 7e71127102f..f7f5a1e0fd2 100644 --- a/modules/storages/config/locales/crowdin/ca.yml +++ b/modules/storages/config/locales/crowdin/ca.yml @@ -31,10 +31,15 @@ ca: authentication_method: Authentication Method creator: Autor drive: Drive ID + file_link_origin: File link origin ID host: Servidor + linkable_to_storage: Linkable to storage + linkable_to_storage_url: Linkable to storage URL name: Nom password: Application password provider_type: Tipus de proveïdor + storage: Storage + storage_url: Storage URL tenant: Directory (tenant) ID errors: messages: diff --git a/modules/storages/config/locales/crowdin/ckb-IR.yml b/modules/storages/config/locales/crowdin/ckb-IR.yml index 8e16ad5fdbe..009aa285301 100644 --- a/modules/storages/config/locales/crowdin/ckb-IR.yml +++ b/modules/storages/config/locales/crowdin/ckb-IR.yml @@ -31,10 +31,15 @@ ckb-IR: authentication_method: Authentication Method creator: Creator drive: Drive ID + file_link_origin: File link origin ID host: Host + linkable_to_storage: Linkable to storage + linkable_to_storage_url: Linkable to storage URL name: Name password: Application password provider_type: Provider type + storage: Storage + storage_url: Storage URL tenant: Directory (tenant) ID errors: messages: diff --git a/modules/storages/config/locales/crowdin/cs.yml b/modules/storages/config/locales/crowdin/cs.yml index 3403d49a257..416de343a02 100644 --- a/modules/storages/config/locales/crowdin/cs.yml +++ b/modules/storages/config/locales/crowdin/cs.yml @@ -31,10 +31,15 @@ cs: authentication_method: Authentication Method creator: Autor drive: ID disku + file_link_origin: File link origin ID host: Hostitel + linkable_to_storage: Linkable to storage + linkable_to_storage_url: Linkable to storage URL name: Název password: Heslo aplikace provider_type: Typ poskytovatele + storage: Storage + storage_url: Storage URL tenant: ID adresáře (tenant) errors: messages: diff --git a/modules/storages/config/locales/crowdin/da.yml b/modules/storages/config/locales/crowdin/da.yml index e74042afc1b..c995b806f6f 100644 --- a/modules/storages/config/locales/crowdin/da.yml +++ b/modules/storages/config/locales/crowdin/da.yml @@ -31,10 +31,15 @@ da: authentication_method: Authentication Method creator: Creator drive: Drive ID + file_link_origin: File link origin ID host: Vært + linkable_to_storage: Linkable to storage + linkable_to_storage_url: Linkable to storage URL name: Navn password: Application password provider_type: Provider type + storage: Storage + storage_url: Storage URL tenant: Directory (tenant) ID errors: messages: diff --git a/modules/storages/config/locales/crowdin/de.yml b/modules/storages/config/locales/crowdin/de.yml index 978bdb8fa37..d4597d779c5 100644 --- a/modules/storages/config/locales/crowdin/de.yml +++ b/modules/storages/config/locales/crowdin/de.yml @@ -31,10 +31,15 @@ de: authentication_method: Authentifizierungsmethode creator: Ersteller drive: Laufwerk ID + file_link_origin: Externe ID des Datei-Links host: Host + linkable_to_storage: Verlinkbar mit Dateispeicher + linkable_to_storage_url: Verlinkbar mit Dateispeicher-URL name: Name password: Anwendungspasswort provider_type: Anbieter-Typ + storage: Dateispeicher + storage_url: Dateispeicher-URL tenant: Verzeichnis (Tenant) ID errors: messages: @@ -108,25 +113,25 @@ de: remote_folders: 'Inhalt des Teamordners lesen:' remove_user_from_group: 'Benutzer aus Gruppe entfernen:' rename_project_folder: 'Verwalteten Projektordner umbenennen:' - set_folder_permission: 'Set managed project Folder permissions:' + set_folder_permission: 'Berechtigungen für verwaltete Projektordner festlegen:' one_drive_sync_service: create_folder: 'Verwaltete Projekt-Ordnererstellung:' ensure_root_folder_permissions: 'Basisordner-Berechtigungen festlegen:' hide_inactive_folders: 'Verstecke Inaktive Ordner:' remote_folders: 'Inhalt des Root-Ordners des Laufwerks lesen:' rename_project_folder: 'Verwalteten Projektordner umbenennen:' - set_folder_permission: 'Set managed project Folder permissions:' + set_folder_permission: 'Berechtigungen für verwaltete Projektordner festlegen:' sharepoint_sync_service: create_folder: 'Verwaltete Projekt-Ordnererstellung:' ensure_root_folder_permissions: 'Basisordner-Berechtigungen festlegen:' hide_inactive_folders: 'Verstecke Inaktive Ordner:' remote_folders: 'Inhalt des Root-Ordners des Laufwerks lesen:' rename_project_folder: 'Verwalteten Projektordner umbenennen:' - set_folder_permission: 'Set managed project Folder permissions:' + set_folder_permission: 'Berechtigungen für verwaltete Projektordner festlegen:' errors: messages: error: Ein unerwarteter Fehler ist aufgetreten. Bitte überprüfen Sie die OpenProject Logdateien für weitere Informationen oder kontaktieren Sie einen Administrator - folder_id_collision: Multiple project storages try to manage the project folder %{folder}. Its synchronization was skipped. + folder_id_collision: Mehrere Projektspeicher versuchen, den Projektordner %{folder} zu verwalten. Seine Synchronisierung wurde übersprungen. forbidden: OpenProject konnte nicht auf die angefragte Ressource zugreifen. Bitte überprüfen Sie Ihre Berechtigungskonfiguration auf dem Speicheranbieter. unauthorized: OpenProject konnte sich nicht mit dem Speicheranbieter authentifizieren. Bitte überprüfen Sie Ihre Speicherkonfiguration und dessen Zugang. models: diff --git a/modules/storages/config/locales/crowdin/el.yml b/modules/storages/config/locales/crowdin/el.yml index f8b5f3dd0a5..e75848becbb 100644 --- a/modules/storages/config/locales/crowdin/el.yml +++ b/modules/storages/config/locales/crowdin/el.yml @@ -31,10 +31,15 @@ el: authentication_method: Authentication Method creator: Δημιουργός drive: Drive ID + file_link_origin: File link origin ID host: Διακομιστής + linkable_to_storage: Linkable to storage + linkable_to_storage_url: Linkable to storage URL name: Όνομα password: Application password provider_type: Τύπος παρόχου + storage: Storage + storage_url: Storage URL tenant: Directory (tenant) ID errors: messages: diff --git a/modules/storages/config/locales/crowdin/eo.yml b/modules/storages/config/locales/crowdin/eo.yml index 20a7702570b..9cd9590574c 100644 --- a/modules/storages/config/locales/crowdin/eo.yml +++ b/modules/storages/config/locales/crowdin/eo.yml @@ -31,10 +31,15 @@ eo: authentication_method: Authentication Method creator: Creator drive: Drive ID + file_link_origin: File link origin ID host: Gastiganto + linkable_to_storage: Linkable to storage + linkable_to_storage_url: Linkable to storage URL name: Nomo password: Application password provider_type: Provider type + storage: Storage + storage_url: Storage URL tenant: Directory (tenant) ID errors: messages: diff --git a/modules/storages/config/locales/crowdin/es.yml b/modules/storages/config/locales/crowdin/es.yml index f66626965dc..cd056f86f6a 100644 --- a/modules/storages/config/locales/crowdin/es.yml +++ b/modules/storages/config/locales/crowdin/es.yml @@ -31,10 +31,15 @@ es: authentication_method: Método de autenticación creator: Autor drive: ID de unidad + file_link_origin: ID de origen del enlace del archivo host: Host + linkable_to_storage: Se puede vincular a un almacenamiento + linkable_to_storage_url: Se puede vincular a una URL de almacenamiento name: Nombre password: Contraseña de aplicación provider_type: Tipo de proveedor + storage: Almacenamiento + storage_url: URL de almacenamiento tenant: Directory (tenant) ID errors: messages: diff --git a/modules/storages/config/locales/crowdin/et.yml b/modules/storages/config/locales/crowdin/et.yml index c5674a32ae2..1eef40ff02f 100644 --- a/modules/storages/config/locales/crowdin/et.yml +++ b/modules/storages/config/locales/crowdin/et.yml @@ -31,10 +31,15 @@ et: authentication_method: Authentication Method creator: Creator drive: Drive ID + file_link_origin: File link origin ID host: Host + linkable_to_storage: Linkable to storage + linkable_to_storage_url: Linkable to storage URL name: Nimi password: Application password provider_type: Provider type + storage: Storage + storage_url: Storage URL tenant: Directory (tenant) ID errors: messages: diff --git a/modules/storages/config/locales/crowdin/eu.yml b/modules/storages/config/locales/crowdin/eu.yml index f387295ecb4..008aad48e36 100644 --- a/modules/storages/config/locales/crowdin/eu.yml +++ b/modules/storages/config/locales/crowdin/eu.yml @@ -31,10 +31,15 @@ eu: authentication_method: Authentication Method creator: Creator drive: Drive ID + file_link_origin: File link origin ID host: Host + linkable_to_storage: Linkable to storage + linkable_to_storage_url: Linkable to storage URL name: Name password: Application password provider_type: Provider type + storage: Storage + storage_url: Storage URL tenant: Directory (tenant) ID errors: messages: diff --git a/modules/storages/config/locales/crowdin/fa.yml b/modules/storages/config/locales/crowdin/fa.yml index 96d886e496e..667ca422bdf 100644 --- a/modules/storages/config/locales/crowdin/fa.yml +++ b/modules/storages/config/locales/crowdin/fa.yml @@ -31,10 +31,15 @@ fa: authentication_method: Authentication Method creator: Creator drive: Drive ID + file_link_origin: File link origin ID host: میزبان + linkable_to_storage: Linkable to storage + linkable_to_storage_url: Linkable to storage URL name: نام password: Application password provider_type: Provider type + storage: Storage + storage_url: Storage URL tenant: Directory (tenant) ID errors: messages: diff --git a/modules/storages/config/locales/crowdin/fi.yml b/modules/storages/config/locales/crowdin/fi.yml index 265a3e55b77..1b686c7b1a9 100644 --- a/modules/storages/config/locales/crowdin/fi.yml +++ b/modules/storages/config/locales/crowdin/fi.yml @@ -31,10 +31,15 @@ fi: authentication_method: Authentication Method creator: Creator drive: Drive ID + file_link_origin: File link origin ID host: Isäntä + linkable_to_storage: Linkable to storage + linkable_to_storage_url: Linkable to storage URL name: Nimi password: Application password provider_type: Provider type + storage: Storage + storage_url: Storage URL tenant: Directory (tenant) ID errors: messages: diff --git a/modules/storages/config/locales/crowdin/fil.yml b/modules/storages/config/locales/crowdin/fil.yml index b1694a9842b..5d955558c89 100644 --- a/modules/storages/config/locales/crowdin/fil.yml +++ b/modules/storages/config/locales/crowdin/fil.yml @@ -31,10 +31,15 @@ fil: authentication_method: Authentication Method creator: Creator drive: Drive ID + file_link_origin: File link origin ID host: Host + linkable_to_storage: Linkable to storage + linkable_to_storage_url: Linkable to storage URL name: Pangalan password: Application password provider_type: Provider type + storage: Storage + storage_url: Storage URL tenant: Directory (tenant) ID errors: messages: diff --git a/modules/storages/config/locales/crowdin/fr.yml b/modules/storages/config/locales/crowdin/fr.yml index 5f8822d6e9a..3493e45d31c 100644 --- a/modules/storages/config/locales/crowdin/fr.yml +++ b/modules/storages/config/locales/crowdin/fr.yml @@ -31,10 +31,15 @@ fr: authentication_method: Méthode d'authentification creator: Créateur drive: ID du lecteur + file_link_origin: ID d'origine du lien de fichier host: Hôte + linkable_to_storage: Élément pouvant être lié à un espace de stockage + linkable_to_storage_url: URL de l'élément pouvant être lié à un espace de stockage name: Nom password: Mot de passe de l'application provider_type: Type de fournisseur + storage: Espace de stockage + storage_url: URL de l'espace de stockage tenant: ID du répertoire (locataire) errors: messages: diff --git a/modules/storages/config/locales/crowdin/he.yml b/modules/storages/config/locales/crowdin/he.yml index 954c77b41ec..109caebf967 100644 --- a/modules/storages/config/locales/crowdin/he.yml +++ b/modules/storages/config/locales/crowdin/he.yml @@ -31,10 +31,15 @@ he: authentication_method: Authentication Method creator: Creator drive: Drive ID + file_link_origin: File link origin ID host: שרת + linkable_to_storage: Linkable to storage + linkable_to_storage_url: Linkable to storage URL name: שם password: Application password provider_type: Provider type + storage: Storage + storage_url: Storage URL tenant: Directory (tenant) ID errors: messages: diff --git a/modules/storages/config/locales/crowdin/hi.yml b/modules/storages/config/locales/crowdin/hi.yml index a124d9515fa..47e91969e9e 100644 --- a/modules/storages/config/locales/crowdin/hi.yml +++ b/modules/storages/config/locales/crowdin/hi.yml @@ -31,10 +31,15 @@ hi: authentication_method: Authentication Method creator: Creator drive: Drive ID + file_link_origin: File link origin ID host: होस्ट + linkable_to_storage: Linkable to storage + linkable_to_storage_url: Linkable to storage URL name: नाम password: Application password provider_type: Provider type + storage: Storage + storage_url: Storage URL tenant: Directory (tenant) ID errors: messages: diff --git a/modules/storages/config/locales/crowdin/hr.yml b/modules/storages/config/locales/crowdin/hr.yml index 6f2b0a241d2..dab956fc675 100644 --- a/modules/storages/config/locales/crowdin/hr.yml +++ b/modules/storages/config/locales/crowdin/hr.yml @@ -31,10 +31,15 @@ hr: authentication_method: Authentication Method creator: Creator drive: Drive ID + file_link_origin: File link origin ID host: Host + linkable_to_storage: Linkable to storage + linkable_to_storage_url: Linkable to storage URL name: Naziv password: Application password provider_type: Provider type + storage: Storage + storage_url: Storage URL tenant: Directory (tenant) ID errors: messages: diff --git a/modules/storages/config/locales/crowdin/hu.yml b/modules/storages/config/locales/crowdin/hu.yml index 3a657ef3e1e..4a78f6337e4 100644 --- a/modules/storages/config/locales/crowdin/hu.yml +++ b/modules/storages/config/locales/crowdin/hu.yml @@ -31,10 +31,15 @@ hu: authentication_method: Authentication Method creator: Készítő drive: Drive ID + file_link_origin: File link origin ID host: Host + linkable_to_storage: Linkable to storage + linkable_to_storage_url: Linkable to storage URL name: Név password: Application password provider_type: Szolgáltató típusa + storage: Storage + storage_url: Storage URL tenant: Directory (tenant) ID errors: messages: diff --git a/modules/storages/config/locales/crowdin/hy.yml b/modules/storages/config/locales/crowdin/hy.yml index e428b4ea062..c63a9e6cff0 100644 --- a/modules/storages/config/locales/crowdin/hy.yml +++ b/modules/storages/config/locales/crowdin/hy.yml @@ -31,10 +31,15 @@ hy: authentication_method: Authentication Method creator: Creator drive: Drive ID + file_link_origin: File link origin ID host: Host + linkable_to_storage: Linkable to storage + linkable_to_storage_url: Linkable to storage URL name: Name password: Application password provider_type: Provider type + storage: Storage + storage_url: Storage URL tenant: Directory (tenant) ID errors: messages: diff --git a/modules/storages/config/locales/crowdin/id.yml b/modules/storages/config/locales/crowdin/id.yml index ce63d45545c..690cc459703 100644 --- a/modules/storages/config/locales/crowdin/id.yml +++ b/modules/storages/config/locales/crowdin/id.yml @@ -31,10 +31,15 @@ id: authentication_method: Authentication Method creator: Pembuat drive: Drive ID + file_link_origin: File link origin ID host: Host + linkable_to_storage: Linkable to storage + linkable_to_storage_url: Linkable to storage URL name: Nama password: Application password provider_type: Tipe penyedia + storage: Storage + storage_url: Storage URL tenant: Directory (tenant) ID errors: messages: diff --git a/modules/storages/config/locales/crowdin/it.yml b/modules/storages/config/locales/crowdin/it.yml index adec845d0c3..c4c607b94c2 100644 --- a/modules/storages/config/locales/crowdin/it.yml +++ b/modules/storages/config/locales/crowdin/it.yml @@ -31,10 +31,15 @@ it: authentication_method: Metodo di autenticazione creator: Autore drive: ID Drive + file_link_origin: ID origine del link al file host: Host + linkable_to_storage: Collegabile all'archiviazione + linkable_to_storage_url: Collegabile all'URL di archiviazione name: Nome password: Password applicazione provider_type: Tipo di fonte + storage: Archiviazione + storage_url: URL di archiviazione tenant: ID della directory (tenant). errors: messages: diff --git a/modules/storages/config/locales/crowdin/ja.yml b/modules/storages/config/locales/crowdin/ja.yml index e1d1f10c8f2..a69b0a5ac53 100644 --- a/modules/storages/config/locales/crowdin/ja.yml +++ b/modules/storages/config/locales/crowdin/ja.yml @@ -19,7 +19,7 @@ ja: token_exchange_scope: ストレージスコープ storages/project_storage: project_folder: プロジェクトフォルダ - project_folder_mode: プロジェクトフォルダーモード + project_folder_mode: プロジェクトフォルダモード storage: ストレージ storage_url: ストレージURL storages/sharepoint_storage: @@ -30,53 +30,58 @@ ja: storages/storage: authentication_method: 認証方法 creator: 作成者 - drive: ドライブID + drive: ドライブ ID + file_link_origin: File link origin ID host: ホスト + linkable_to_storage: Linkable to storage + linkable_to_storage_url: Linkable to storage URL name: 名称 password: アプリケーションのパスワード - provider_type: プロバイダー・タイプ - tenant: ディレクトリ(テナント)ID + provider_type: プロバイダーの種類 + storage: Storage + storage_url: Storage URL + tenant: ディレクトリ (テナント) ID errors: messages: invalid_host_url: は有効な URL ではありません。 - invalid_sharepoint_url: は有効なSharePointサイト、ライブラリ、ドキュメントのURLではありません。 - not_linked_to_project: はプロジェクトにリンクされていない。 + invalid_sharepoint_url: は有効なSharePointサイト、ライブラリ、またはドキュメントのURLではありません。 + not_linked_to_project: はプロジェクトにリンクされていません。 models: storages/file_link: attributes: origin_id: - only_numeric_or_uuid: には数値かuuidしか指定できない。 + only_numeric_or_uuid: は数値またはuuidのみとなります。 storages/project_storage: attributes: project_folder_id: blank: フォルダーを選択してください。 project_folder_mode: - mode_unavailable: はこのストレージでは使用できない。 + mode_unavailable: このストレージでは使用できません。 project_ids: blank: プロジェクトを選択してください。 storages/storage: attributes: host: - authorization_header_missing: が完全にセットアップされていません。APIリクエストのベアラートークンベースの認証に必要な "Authorization "ヘッダーをNextcloudインスタンスが受け取っていません。HTTPサーバーの設定を再度ご確認ください。 - cannot_be_connected_to: に到達できませんでした。ホストに到達可能で、OpenProject 統合アプリがインストールされていることを確認してください。 - minimal_nextcloud_version_unmet: 最小バージョン要件を満たしていない(Nextcloud 23以上である必要があります。) - not_nextcloud_server: はNextcloudサーバーではありません。 - op_application_not_installed: は、アプリ「OpenProject integration」がインストールされていないようです。インストールしてからもう一度お試しください。 + authorization_header_missing: 完全には設定されていません。 Nextcloudインスタンスは、APIリクエストのベアラートークンベースの認可に必要な「Authorization」ヘッダーを受け取りません。 HTTPサーバーの設定を再確認してください。 + cannot_be_connected_to: に到達できませんでした。ホストが到達可能で、OpenProject 統合アプリがインストールされていることを確認してください。 + minimal_nextcloud_version_unmet: 最小バージョン要件を満たしていません(Nextcloud23以上でなければなりません) + not_nextcloud_server: はNextcloudサーバーではありません + op_application_not_installed: アプリ「OpenProject統合」がインストールされていません。最初にインストールしてからもう一度お試しください。 password: - invalid_password: は無効である。 + invalid_password: は無効です。 unknown_error: could not be validated with the file storage provider. Please verify that the connection is functioning properly. models: file_link: ファイル storages/storage: ストレージ api_v3: errors: - too_many_elements_created_at_once: 一度に作成される要素が多すぎる。最大でも %{max} 、 %{actual}。 + too_many_elements_created_at_once: 一度に作成された要素が多すぎます。 %{max} の期待値は %{actual} です。 external_file_storages: 外部ファイルストレージ permission_create_files: '自動的に管理されたプロジェクトフォルダ: ファイルの作成' permission_create_files_explanation: この権限はNextcloudストレージでのみ利用できます permission_delete_files: '自動的に管理されたプロジェクトフォルダ: ファイルの削除' permission_delete_files_explanation: この権限はNextcloudストレージでのみ利用できます - permission_header_for_project_module_storages: 自動的に管理されるプロジェクトフォルダ + permission_header_for_project_module_storages: 自動的に管理されたプロジェクトフォルダ permission_manage_file_links: ファイルへのリンク管理 permission_manage_files_in_project: プロジェクト内のファイル管理 permission_read_files: '自動的に管理されたプロジェクトフォルダ: ファイルの読み込み' @@ -87,16 +92,16 @@ ja: project_module_storages: ファイルを添付する project_storages: edit_project_folder: - label: プロジェクトフォルダの編集 + label: プロジェクトフォルダを編集 open: - contact_admin: このエラーを解決するには、管理者に連絡してください。 - remote_identity_error: ストレージへの接続中に予期せぬエラーが発生しました。 + contact_admin: このエラーを解決するには管理者に問い合わせてください。 + remote_identity_error: ストレージへの接続中に予期しないエラーが発生しました。 project_folder_mode: - automatic: 自動的に管理される - inactive: 特定のフォルダなし + automatic: 自動的に管理 + inactive: 特定のフォルダがありません manual: 既存のフォルダを手動で管理 remove_project: - deletion_failure_flash: ストレージからのプロジェクトの削除に失敗しました。 %{error} + deletion_failure_flash: プロジェクトをストレージから削除できませんでした。 %{error} label: プロジェクトを削除 services: attributes: @@ -112,7 +117,7 @@ ja: one_drive_sync_service: create_folder: プロジェクトフォルダの作成を管理: ensure_root_folder_permissions: ベースフォルダの権限を設定: - hide_inactive_folders: 非アクティブフォルダを隠す ステップ: + hide_inactive_folders: 非アクティブフォルダを隠す ステップ remote_folders: 'Read contents of the drive root folder:' rename_project_folder: 管理プロジェクトフォルダの名前を変更します: set_folder_permission: 'Set managed project Folder permissions:' @@ -125,17 +130,17 @@ ja: set_folder_permission: 'Set managed project Folder permissions:' errors: messages: - error: 予期しないエラーが発生しました。OpenProject のログを確認するか、管理者に連絡してください + error: 予期しないエラーが発生しました。OpenProject のログを確認するか、管理者に連絡してください。 folder_id_collision: Multiple project storages try to manage the project folder %{folder}. Its synchronization was skipped. forbidden: OpenProject could not access the requested resource. Please check your permissions configuration on the Storage Provider. unauthorized: OpenProjectはストレージプロバイダと認証できませんでした。アクセスできることを確認してください。 models: copy_project_folders_service: conflict: フォルダ %{destination_path} は既に存在する。上書きを避けるために処理を中断しています。 - error: 予期しないエラーが発生しました。OpenProject のログを確認するか、管理者に連絡してください - forbidden: OpenProject はソースフォルダにアクセスできませんでした。ストレージ・プロバイダの権限設定を確認してください + error: 予期しないエラーが発生しました。OpenProject のログを確認するか、管理者に連絡してください。 + forbidden: OpenProject はソースフォルダにアクセスできませんでした。ストレージ・プロバイダの権限設定を確認してください。 not_found: ソース・テンプレートの場所 %{source_path} が見つかりませんでした。 - unauthorized: OpenProject はストレージプロバイダと認証できませんでした。ストレージの設定を確認してください + unauthorized: OpenProject はストレージプロバイダと認証できませんでした。ストレージの設定を確認してください。 nextcloud_sync_service: attributes: add_user_to_group: @@ -156,31 +161,31 @@ ja: conflict: 以下の理由により、 %{user} のユーザーを %{group} グループから削除できませんでした: %{reason} failed_to_remove: 以下の理由により、 %{user} のユーザーを %{group} グループから削除できませんでした: %{reason} rename_project_folder: - conflict: OpenProjectは、同じ名前のフォルダが既に存在するため、プロジェクトフォルダの名前を %{current_path} に変更できませんでした - forbidden: OpenProject ユーザーは %{current_path} フォルダにアクセスできません。 - not_found: "%{current_path} は見つからなかった。" + conflict: OpenProjectは、同じ名前のフォルダが既に存在するため、プロジェクトフォルダの名前を %{current_path} に変更できませんでした。 + forbidden: OpenProjectユーザーは %{current_path} フォルダにアクセスできません。 + not_found: "%{current_path} は見つかりませんでした。" set_folders_permissions: - permission_not_set: "%{path}にパーミッションを設定できなかった。" - error: 予期しないエラーが発生しました。Nextcloud インスタンスに到達可能であることを確認し、OpenProject ワーカーのログを確認してください + permission_not_set: "%{path} に権限を設定できませんでした。" + error: 予期しないエラーが発生しました。Nextcloudインスタンスがアクセス可能であることを確認し、詳細についてはOpenProjectワーカーログを確認してください。 group_does_not_exist: "%{group} は存在しません。Nextcloudインスタンスの設定を確認してください。" - insufficient_privileges: OpenProjectには、 %{group}に %{user} を追加するのに十分な権限がありません。Nextcloudのグループ設定を確認してください。 - not_allowed: ネクストクラウドはリクエストをブロックする。 + insufficient_privileges: OpenProjectには %{user} を %{group}に追加するための十分な権限がありません。Nextcloudでグループ設定を確認してください。 + not_allowed: Nextcloudはリクエストをブロックします。 not_found: OpenProject could not find the file on the Nextcloud Storage Provider. Please check if it wasn't deleted. unauthorized: OpenProjectがNextcloudと同期できませんでした。ストレージとNextcloudの設定を確認してください。 - user_does_not_exist: "%{user} はNextcloudには存在しません。" + user_does_not_exist: Nextcloudには%{user} は存在しません。 one_drive_sync_service: attributes: create_folder: - conflict: "%{folder_name} はすでに %{parent_location}に存在している。" - not_found: "%{parent_location} は見つからなかった。" + conflict: "%{folder_name} は %{parent_location} に既に存在します。" + not_found: "%{parent_location} は見つかりませんでした。" hide_inactive_folders: - permission_not_set: "%{path}にパーミッションを設定できなかった。" + permission_not_set: "%{path} に権限を設定できませんでした。" remote_folders: - request_error: OpenProject は %{drive_id}ドライブにアクセスできませんでした。ストレージの設定が正しいかどうか確認してください。 + request_error: OpenProjectがドライブ %{drive_id}にアクセスできませんでした。ストレージの設定が正しいか確認してください。 rename_project_folder: conflict: OpenProject could not rename the folder %{current_path} to %{project_folder_name} as a folder with the same name already exists. - forbidden: OpenProject は、 %{current_path} にアクセスできず、名前を変更できません。 - not_found: "%{current_path} は見つからなかった。" + forbidden: OpenProject は名前を変更するために %{current_path} にアクセスできません。 + not_found: "%{current_path} は見つかりませんでした。" set_folders_permissions: permission_not_set: "%{path} に権限を設定できませんでした。" error: An unexpected error occurred. Please ensure that OneDrive is reachable and check OpenProject worker logs for more information. @@ -315,9 +320,9 @@ ja: drive_id_format: ドライブIDフォーマット header: 構成 host: ホスト URL - host_url_accessible: アクセス可能なホストURL + host_url_accessible: ホスト URL アクセス storage_configured: 設定完了 - tenant_id: テナントID + tenant_id: Tenant ID errors: client_id_invalid: The configured OAuth 2 client id is invalid. Please check the configuration. client_secret_invalid: The configured OAuth 2 client secret is invalid. Please check the configuration. @@ -365,51 +370,51 @@ ja: label_error: エラー label_healthy: 健康的 label_pending: 保留中 - no_report: 報告書なし - no_report_description: 今すぐチェックを実行し、このファイル・ストレージの完全な健全性ステータスをレポートする。 + no_report: 利用可能なレポートがありません + no_report_description: 今すぐこのファイルストレージの完全な健康状態レポートを確認します。 open_report: 完全な健康報告を開く project_folders: subtitle: 自動的に管理されるプロジェクトフォルダ - since: "%{datetime}より" + since: "%{datetime} 以降" synced: 'Last sync: %{datetime}' - title: 健康状態報告 + title: 健康状態レポート health_email_notifications: description_disabled: 管理者は、重要なアップデートがあった場合、メールでアップデートを受け取ることはできません。 description_enabled: 管理者は、重要なアップデートがあった場合、メールで最新情報を受け取ります。 - error_could_not_be_saved: 電子メール通知の設定を保存できませんでした。もう一度お試しください。 + error_could_not_be_saved: メール通知設定を保存できませんでした。もう一度やり直してください。 title: 管理者にメールで更新する help_texts: - project_folder: プロジェクトフォルダは、このプロジェクトのファイルアップロード用のデフォルトフォルダです。それでも、ユーザーは他の場所にファイルをアップロードすることができます。 - project_folder_bulk: プロジェクトフォルダは、選択したすべてのプロジェクトのファイルアップロード用のデフォルトフォルダです。これは、各プロジェクト設定で個別に変更できます。それでも、ユーザーは他の場所にファイルをアップロードすることができます。 + project_folder: プロジェクトフォルダは、このプロジェクトのファイルアップロードのデフォルトフォルダです。ただし、ユーザーは他の場所にファイルをアップロードすることができます。 + project_folder_bulk: プロジェクトフォルダは、選択したすべてのプロジェクトのファイルアップロードのデフォルトフォルダです。 プロジェクトごとの設定で個別に変更することができますが、ユーザーは別の場所にファイルをアップロードすることもできます。 instructions: - all_available_storages_already_added: 利用可能なすべてのストレージはすでにプロジェクトに追加されている。 - authentication_method: OpenProject とストレージ間のリクエストの認証方法。 - automatic_folder: これにより、このプロジェクトのルート・フォルダーが自動的に作成され、各プロジェクト・メンバーのアクセス権が管理されます。 - empty_project_folder_validation: 続行するには、フォルダの選択が必須です。 - existing_manual_folder: 既存のフォルダをこのプロジェクトのルートフォルダとして指定することができます。ただし、パーミッションは自動的に管理されないため、管理者は関連するユーザーがアクセスできることを手動で確認する必要があります。選択したフォルダは、複数のプロジェクトで使用できます。 - host: https:// を含むストレージのホスト・アドレスを追加してください。255文字以内にしてください。 - managed_project_folders_application_password_caption: "%{provider_type_link}からこの値をコピーして、自動管理フォルダを有効にする。" - name: ユーザーが複数のストレージを区別できるように、ストレージに名前を付ける。 + all_available_storages_already_added: 利用可能なすべてのストレージが既にプロジェクトに追加されています。 + authentication_method: OpenProjectとストレージ間のリクエストは認証されます。 + automatic_folder: これにより、このプロジェクトのルートフォルダが自動的に作成され、各プロジェクトメンバーのアクセス権限が管理されます。 + empty_project_folder_validation: フォルダの選択は必須です。 + existing_manual_folder: このプロジェクトのルートフォルダとして既存のフォルダを指定できます。 ただし、権限は自動的に管理されておらず、管理者は関連するユーザーに手動でアクセス権があることを確認する必要があります。 選択したフォルダは複数のプロジェクトで使用できます。 + host: https://を含むストレージのホストアドレスを追加してください。255文字以内にしてください。 + managed_project_folders_application_password_caption: "%{provider_type_link} からこの値をコピーすることで、自動管理フォルダを有効にします。" + name: ユーザーが複数のストレージを区別できるように、ストレージに名前を付けます。 new_storage_html: Read our documentation on [setting up a %{provider_name} file storage](docs_url) integration for more information. nextcloud: application_link_text: アプリケーション "Integration OpenProject" - integration: ネクストクラウド管理 / OpenProject + integration: Nextcloudの管理 / OpenProject oauth_configuration: "%{application_link_text} からこれらの値をコピーします。" - provider_configuration: セットアップを行う前に、Nextcloudインスタンスの管理者権限があり、 %{application_link_text} がインストールされていることを確認してください。 - storage_audience: Nextcloud インスタンスが ID プロバイダとの通信に使用するクライアント ID。 - storage_audience_placeholder: 例:ネクストクラウド - token_exchange_scope: トークン交換時に要求するスコープを、それぞれスペースで区切って指定する。 - no_specific_folder: デフォルトでは、ファイルをアップロードすると、各ユーザーは自分のホームフォルダから開始します。 - no_storage_set_up: ファイルストレージはまだ設定されていない。 - not_logged_into_storage: プロジェクトフォルダを選択するには、まずログインしてください。 + provider_configuration: Nextcloudインスタンスに管理権限があり、設定を行う前に %{application_link_text} がインストールされていることを確認してください。 + storage_audience: NextcloudインスタンスがIDプロバイダーと通信するために使用するクライアントID。 + storage_audience_placeholder: 例:nextcloud + token_exchange_scope: トークン交換中に要求されるべきスコープは、それぞれスペースで区切られています。 + no_specific_folder: デフォルトでは、各ユーザーはファイルをアップロードしたときに自分のホームフォルダから開始します。 + no_storage_set_up: まだ設定されているファイルストレージがありません。 + not_logged_into_storage: プロジェクトフォルダを選択するには、最初にログインしてください oauth_application_details_html: The client secret value will not be accessible again after you close this window. Please copy these values into the [Nextcloud OpenProject Integration settings](oauth_application_details_link). one_drive: application_link_text: Azure Portal copy_redirect_uri: リダイレクトURIをコピーする documentation_link_text: OneDriveファイルストレージのドキュメント drive_id: "%{drive_id_link_text} の手順に従って、目的のドライブからIDをコピーしてください。" - integration: ワンドライブ - missing_client_id_for_redirect_uri: OAuthの値を入力してURIを生成してください。 + integration: OneDrive + missing_client_id_for_redirect_uri: OAuthの値を入力してURIを生成してください oauth_client_redirect_uri: この値を「リダイレクト URIs」にある新しい Web リダイレクト URI にコピーしてください。 oauth_client_secret: Client 資格情報にアプリケーション クライアント シークレットがない場合は、新しいシークレットを作成してください。 oauth_configuration: "%{application_link_text}、目的のアプリケーションからこれらの値をコピーします。" @@ -481,13 +486,13 @@ ja: login_button_aria_label: "%{storage} にログイン" login_button_label: "%{provider_type} ログイン" project_settings: - description: プロジェクトフォルダにアクセスするには、 %{storage}にログインする必要があります。 + description: プロジェクトフォルダにアクセスするには、 %{storage} にログインする必要があります。 requesting_access_to: "%{storage} へのアクセスをリクエストしています" storage_admin: description: このストレージにプロジェクトを追加するには、 %{provider_type}にログインする必要があります。ログインしてもう一度やり直してください。 open_project_storage_modal: success: - subtitle: リダイレクトされます + subtitle: リダイレクトしています title: 連携のセットアップが完了しました timeout: link_text: ファイルストレージセットアップの状態の状態 @@ -506,8 +511,8 @@ ja: subtitle_short: OpenProjectにプロジェクトごとにフォルダを自動的に作成させます。 title: 自動的に管理されるプロジェクトフォルダ project_settings: - edit: このプロジェクトのファイル・ストレージを編集する - members_connection_status: メンバーの接続状況 + edit: このプロジェクトのファイルストレージを編集 + members_connection_status: 会員の接続状況 new: このプロジェクトにファイルストレージを追加する project_storage_members: subtitle_html: Check the connection status for the storage %{storage_name_link} of all project members. @@ -518,14 +523,14 @@ ja: provider_types: label: プロバイダー・タイプ nextcloud: - label_oauth_client_id: NextcloudのOAuthクライアントID - label_oauth_client_secret: NextcloudOAuthクライアントシークレット + label_oauth_client_id: Nextcloud OAuthクライアントID + label_oauth_client_secret: Nextcloud OAuth クライアントシークレット name: ネクストクラウド name_placeholder: 例:ネクストクラウド one_drive: - label_oauth_client_id: Azure OAuthアプリケーション(クライアント)ID + label_oauth_client_id: Azure OAuth アプリケーション (クライアント) ID label_oauth_client_secret: Azure OAuth クライアントの秘密値 - name: ワンドライブ + name: OneDrive name_placeholder: '例: OneDrive' sharepoint: drive_description: OpenProject access-managed document library @@ -535,18 +540,18 @@ ja: name_placeholder: 例:シェアポイント show_attachments_toggle: description: このオプションを無効にすると、ワークパッケージのファイルタブの添付ファイルリストが非表示になります。ワークパッケージの説明に添付されたファイルは、内部添付ファイルストレージにアップロードされます。 - label: ワークパッケージのファイルタブに添付ファイルを表示 + label: ワークパッケージファイルタブに添付ファイルを表示 storage_audience: - documentation_intro: 以下のオプションと ID プロバイダの設定の詳細については、当社のドキュメントをお読みください。 + documentation_intro: アイデンティティプロバイダの以下のオプションと設定については、当社のドキュメントをお読みください。 idp: - helptext: OpenProjectは、ストレージへのリクエストを認証するために、ログイン時にIDプロバイダから受け取ったアクセストークンを使用します。別のトークンを取得しようとすることはありません。 - label: ユーザーログイン時に取得したアクセストークンを使用する + helptext: OpenProjectはログイン中にIDプロバイダーが受け取ったアクセストークンを使用して、ストレージへのリクエストを認証します。 別のトークンを取得しようとしません。 + label: ログイン中に取得したアクセストークンを使用する manual: - helptext: OpenProjectは、指定されたオーディエンスのIDプロバイダとトークンを交換します。 + helptext: OpenProject は、特定のオーディエンスの ID プロバイダーとトークンを交換します。 label: Manually specify audience for which to exchange access token (Recommended) storage_list_blank_slate: - description: ストレージを追加して、ここで見ることができる。 - heading: あなたはまだ倉庫を持っていない。 + description: ここにそれらを見るためにストレージを追加します。 + heading: まだストレージがありません。 successful_storage_connection: ストレージが正常に接続されました! 使用する各プロジェクトの「プロジェクト」タブでストレージをアクティブにすることを忘れないでください。 upsell: one_drive: diff --git a/modules/storages/config/locales/crowdin/js-ja.yml b/modules/storages/config/locales/crowdin/js-ja.yml index 35975efb28f..ff94c1e0485 100644 --- a/modules/storages/config/locales/crowdin/js-ja.yml +++ b/modules/storages/config/locales/crowdin/js-ja.yml @@ -4,14 +4,14 @@ ja: js: storages: authentication_error: "%{storageType} での認証に失敗しました" - link_files_in_storage: リンクファイル %{storageType} - link_existing_files: 既存のファイルをリンク - upload_files: ファイルのアップロード + link_files_in_storage: "%{storageType}のファイルをリンクする" + link_existing_files: 既存のファイルをリンクする + upload_files: ログファイル drop_files: ここにファイルをドロップして、 %{name} にアップロードします。 drop_or_click_files: ここにファイルをドロップするか、クリックして %{name} にアップロードします。 login: "%{storageType} ログイン" login_to: "%{storageType}にログイン" - no_connection: "%{storageType} 接続がありません" + no_connection: "%{storageType} 接続なし" open_storage: "%{storageType} を開く" select_location: 場所を選択 choose_location: 場所を選ぶ @@ -24,7 +24,7 @@ ja: information: authentication_error: "%{storageType} へのリクエストを認証できませんでした。これはエラーです。" connection_error: "%{storageType} の設定が一部機能していません。 %{storageType} 管理者にお問い合わせください。\n" - live_data_error: ファイルの詳細の取得に失敗しました + live_data_error: ファイル詳細の取得エラー live_data_error_description: '一部の %{storageType} データを取得できませんでした。このページを再読み込みするか、 %{storageType} 管理者にお問い合わせください。 ' @@ -35,7 +35,7 @@ ja: suggest_logout: ログアウトしてログインし直すと、この問題が解決するかどうか試してみてください。 suggest_relink: 以下のログインボタンからアカウントを再リンクすると、この問題が解決するかどうか試してみてください。 files: - already_existing_header: このファイルはすでに存在する + already_existing_header: このファイルは既に存在します already_existing_body: 'このファイルをアップロードしようとしている場所に、"%{fileName}"という名前のファイルがすでに存在します。どうしますか? ' @@ -44,7 +44,7 @@ ja: dragging_folder: "%{storageType} へのアップロードはフォルダをサポートしていません。" empty_folder: このフォルダは空です。 empty_folder_location_hint: 下のボタンをクリックして、この場所にファイルをアップロードしてください。 - file_not_selectable_location: 場所を選択する過程でファイルを選択することはできない。 + file_not_selectable_location: ファイルを選択することは、場所を選択する過程ではできません。 project_folder_no_access: 'プロジェクトフォルダにアクセスできません。管理者に連絡してアクセス権を取得するか、別の場所にファイルをアップロードしてください。 ' @@ -90,10 +90,10 @@ ja: ' detail: - nextcloud: '最新版のNextcloudアプリ「OpenProject Integration」がインストールされていることを確認し、管理者にお問い合わせください。 + nextcloud: 'Nextcloudアプリ「OpenProject統合」の最新バージョンがインストールされていることを確認し、詳細については管理者にお問い合わせください。 ' - link_uploaded_file_error: '最近アップロードされたファイル ''%{fileName}'' をワークパッケージ %{workPackageId}にリンクするエラーが発生しました。 + link_uploaded_file_error: '最近アップロードされたファイル ''%{fileName}'' をワークパッケージ %{workPackageId} にリンクしてエラーが発生しました。 ' tooltip: diff --git a/modules/storages/config/locales/crowdin/ka.yml b/modules/storages/config/locales/crowdin/ka.yml index e9cc1390190..7836a8dd2c8 100644 --- a/modules/storages/config/locales/crowdin/ka.yml +++ b/modules/storages/config/locales/crowdin/ka.yml @@ -31,10 +31,15 @@ ka: authentication_method: Authentication Method creator: შემქმნელი drive: Drive ID + file_link_origin: File link origin ID host: ჰოსტი + linkable_to_storage: Linkable to storage + linkable_to_storage_url: Linkable to storage URL name: სახელი password: Application password provider_type: მომწოდებლის ტიპი + storage: Storage + storage_url: Storage URL tenant: Directory (tenant) ID errors: messages: diff --git a/modules/storages/config/locales/crowdin/kk.yml b/modules/storages/config/locales/crowdin/kk.yml index 4d69852592a..af8586fd7e8 100644 --- a/modules/storages/config/locales/crowdin/kk.yml +++ b/modules/storages/config/locales/crowdin/kk.yml @@ -31,10 +31,15 @@ kk: authentication_method: Authentication Method creator: Creator drive: Drive ID + file_link_origin: File link origin ID host: Host + linkable_to_storage: Linkable to storage + linkable_to_storage_url: Linkable to storage URL name: Name password: Application password provider_type: Provider type + storage: Storage + storage_url: Storage URL tenant: Directory (tenant) ID errors: messages: diff --git a/modules/storages/config/locales/crowdin/ko.yml b/modules/storages/config/locales/crowdin/ko.yml index acab5e8ccc6..a329facc9d6 100644 --- a/modules/storages/config/locales/crowdin/ko.yml +++ b/modules/storages/config/locales/crowdin/ko.yml @@ -31,10 +31,15 @@ ko: authentication_method: 인증 방법 creator: 생성자 drive: 드라이브 ID + file_link_origin: 파일 링크 원본 ID host: 호스트 + linkable_to_storage: 저장소에 링크 가능 + linkable_to_storage_url: 저장소 URL에 링크 가능 name: 이름 password: 애플리케이션 암호 provider_type: 공급자 유형 + storage: 저장소 + storage_url: 저장소 URL tenant: 디렉터리(테넌트) ID errors: messages: diff --git a/modules/storages/config/locales/crowdin/lt.yml b/modules/storages/config/locales/crowdin/lt.yml index fa27c8404c0..6f950936181 100644 --- a/modules/storages/config/locales/crowdin/lt.yml +++ b/modules/storages/config/locales/crowdin/lt.yml @@ -31,10 +31,15 @@ lt: authentication_method: Authentication Method creator: Kūrėjas drive: Disko ID + file_link_origin: File link origin ID host: Serveris + linkable_to_storage: Linkable to storage + linkable_to_storage_url: Linkable to storage URL name: Vardas password: Aplikacijos slaptažpdis provider_type: Tiekėjo tipas + storage: Storage + storage_url: Storage URL tenant: Direktorijos (savininko) ID errors: messages: diff --git a/modules/storages/config/locales/crowdin/lv.yml b/modules/storages/config/locales/crowdin/lv.yml index f2b3d95fdc3..23ab271c762 100644 --- a/modules/storages/config/locales/crowdin/lv.yml +++ b/modules/storages/config/locales/crowdin/lv.yml @@ -31,10 +31,15 @@ lv: authentication_method: Authentication Method creator: Izveidotājs drive: Drive ID + file_link_origin: File link origin ID host: Serveris + linkable_to_storage: Linkable to storage + linkable_to_storage_url: Linkable to storage URL name: Nosaukums password: Application password provider_type: Provider type + storage: Storage + storage_url: Storage URL tenant: Directory (tenant) ID errors: messages: diff --git a/modules/storages/config/locales/crowdin/mn.yml b/modules/storages/config/locales/crowdin/mn.yml index 549b93e0a51..04973c9be49 100644 --- a/modules/storages/config/locales/crowdin/mn.yml +++ b/modules/storages/config/locales/crowdin/mn.yml @@ -31,10 +31,15 @@ mn: authentication_method: Authentication Method creator: Creator drive: Drive ID + file_link_origin: File link origin ID host: Host + linkable_to_storage: Linkable to storage + linkable_to_storage_url: Linkable to storage URL name: Name password: Application password provider_type: Provider type + storage: Storage + storage_url: Storage URL tenant: Directory (tenant) ID errors: messages: diff --git a/modules/storages/config/locales/crowdin/ms.yml b/modules/storages/config/locales/crowdin/ms.yml index 4a2f26fc844..50312002081 100644 --- a/modules/storages/config/locales/crowdin/ms.yml +++ b/modules/storages/config/locales/crowdin/ms.yml @@ -31,10 +31,15 @@ ms: authentication_method: Kaedah Pengesahan creator: Pencipta drive: ID Pemacu + file_link_origin: File link origin ID host: Hos + linkable_to_storage: Linkable to storage + linkable_to_storage_url: Linkable to storage URL name: Nama password: Kata laluan aplikasi provider_type: Jenis penyedia + storage: Storage + storage_url: Storage URL tenant: ID Direktori (penyewa) errors: messages: diff --git a/modules/storages/config/locales/crowdin/ne.yml b/modules/storages/config/locales/crowdin/ne.yml index ed863f1639c..d520989cadc 100644 --- a/modules/storages/config/locales/crowdin/ne.yml +++ b/modules/storages/config/locales/crowdin/ne.yml @@ -31,10 +31,15 @@ ne: authentication_method: Authentication Method creator: Creator drive: Drive ID + file_link_origin: File link origin ID host: Host + linkable_to_storage: Linkable to storage + linkable_to_storage_url: Linkable to storage URL name: Name password: Application password provider_type: Provider type + storage: Storage + storage_url: Storage URL tenant: Directory (tenant) ID errors: messages: diff --git a/modules/storages/config/locales/crowdin/nl.yml b/modules/storages/config/locales/crowdin/nl.yml index 0e798dec9f8..c916a0fef7a 100644 --- a/modules/storages/config/locales/crowdin/nl.yml +++ b/modules/storages/config/locales/crowdin/nl.yml @@ -31,10 +31,15 @@ nl: authentication_method: Authentication Method creator: Maker drive: Drive ID + file_link_origin: File link origin ID host: Host + linkable_to_storage: Linkable to storage + linkable_to_storage_url: Linkable to storage URL name: Naam password: App wachtwoord provider_type: Type provider + storage: Storage + storage_url: Storage URL tenant: Directory (tenant) ID errors: messages: diff --git a/modules/storages/config/locales/crowdin/no.yml b/modules/storages/config/locales/crowdin/no.yml index 71a1f081f06..70ed3bfd550 100644 --- a/modules/storages/config/locales/crowdin/no.yml +++ b/modules/storages/config/locales/crowdin/no.yml @@ -31,10 +31,15 @@ authentication_method: Authentication Method creator: Skaper drive: Stasjon ID + file_link_origin: File link origin ID host: Vert + linkable_to_storage: Linkable to storage + linkable_to_storage_url: Linkable to storage URL name: Navn password: Applikasjonspassord provider_type: Tjenestetype + storage: Storage + storage_url: Storage URL tenant: Katalog (leietaker) ID errors: messages: diff --git a/modules/storages/config/locales/crowdin/pl.yml b/modules/storages/config/locales/crowdin/pl.yml index fea68eba11b..1dd69d37dc7 100644 --- a/modules/storages/config/locales/crowdin/pl.yml +++ b/modules/storages/config/locales/crowdin/pl.yml @@ -31,10 +31,15 @@ pl: authentication_method: Metoda uwierzytelniania creator: Twórca drive: Identyfikator dysku + file_link_origin: Identyfikator pochodzenia linku do pliku host: Host + linkable_to_storage: Możliwe powiązanie z magazynem + linkable_to_storage_url: Możliwe powiązanie z adresem URL magazynu name: Nazwa password: Hasło aplikacji provider_type: Typ dostawcy + storage: Magazyn danych + storage_url: Adres URL magazynu tenant: Identyfikator katalogu (dzierżawcy) errors: messages: diff --git a/modules/storages/config/locales/crowdin/pt-BR.yml b/modules/storages/config/locales/crowdin/pt-BR.yml index 51b3f3f2ff7..2a8bf72e75f 100644 --- a/modules/storages/config/locales/crowdin/pt-BR.yml +++ b/modules/storages/config/locales/crowdin/pt-BR.yml @@ -31,10 +31,15 @@ pt-BR: authentication_method: Método de Autenticação creator: Criador drive: Drive ID + file_link_origin: ID de origem do link do arquivo host: Servidor + linkable_to_storage: Vinculável ao armazenamento + linkable_to_storage_url: URL vinculável ao armazenamento name: Nome password: Senha do aplicativo provider_type: Tipo de provedor + storage: Armazenamento + storage_url: URL de armazenamento tenant: ID do diretório (cliente) errors: messages: diff --git a/modules/storages/config/locales/crowdin/pt-PT.yml b/modules/storages/config/locales/crowdin/pt-PT.yml index ed55e3f1586..7eb0db83d18 100644 --- a/modules/storages/config/locales/crowdin/pt-PT.yml +++ b/modules/storages/config/locales/crowdin/pt-PT.yml @@ -31,10 +31,15 @@ pt-PT: authentication_method: Método de autenticação creator: Criador drive: ID da unidade + file_link_origin: ID de origem da ligação de ficheiro host: Hospedeiro + linkable_to_storage: Pode ser associado a armazenamento + linkable_to_storage_url: Pode ser associado a um URL de armazenamento name: Nome password: Palavra-passe da aplicação provider_type: Tipo de fornecedor + storage: Armazenamento + storage_url: URL de armazenamento tenant: ID do Diretório (inquilino) errors: messages: diff --git a/modules/storages/config/locales/crowdin/ro.yml b/modules/storages/config/locales/crowdin/ro.yml index 47854485d41..b3f73dde602 100644 --- a/modules/storages/config/locales/crowdin/ro.yml +++ b/modules/storages/config/locales/crowdin/ro.yml @@ -31,10 +31,15 @@ ro: authentication_method: Authentication Method creator: Creator drive: Drive ID + file_link_origin: File link origin ID host: Server gazdă + linkable_to_storage: Linkable to storage + linkable_to_storage_url: Linkable to storage URL name: Nume password: Application password provider_type: Tip furnizor + storage: Storage + storage_url: Storage URL tenant: Directory (tenant) ID errors: messages: diff --git a/modules/storages/config/locales/crowdin/ru.yml b/modules/storages/config/locales/crowdin/ru.yml index 8119e3883ce..18ceb15a47e 100644 --- a/modules/storages/config/locales/crowdin/ru.yml +++ b/modules/storages/config/locales/crowdin/ru.yml @@ -31,10 +31,15 @@ ru: authentication_method: Метод аутентификации creator: Автор drive: ID диска + file_link_origin: File link origin ID host: Хост + linkable_to_storage: Linkable to storage + linkable_to_storage_url: Linkable to storage URL name: Имя password: Пароль приложения provider_type: Тип поставщика + storage: Storage + storage_url: Storage URL tenant: ID каталога (арендатора) errors: messages: diff --git a/modules/storages/config/locales/crowdin/rw.yml b/modules/storages/config/locales/crowdin/rw.yml index b8df1971f47..4ca6c75bc1f 100644 --- a/modules/storages/config/locales/crowdin/rw.yml +++ b/modules/storages/config/locales/crowdin/rw.yml @@ -31,10 +31,15 @@ rw: authentication_method: Authentication Method creator: Creator drive: Drive ID + file_link_origin: File link origin ID host: Host + linkable_to_storage: Linkable to storage + linkable_to_storage_url: Linkable to storage URL name: Name password: Application password provider_type: Provider type + storage: Storage + storage_url: Storage URL tenant: Directory (tenant) ID errors: messages: diff --git a/modules/storages/config/locales/crowdin/si.yml b/modules/storages/config/locales/crowdin/si.yml index 395f0599c9f..23668410190 100644 --- a/modules/storages/config/locales/crowdin/si.yml +++ b/modules/storages/config/locales/crowdin/si.yml @@ -31,10 +31,15 @@ si: authentication_method: Authentication Method creator: Creator drive: Drive ID + file_link_origin: File link origin ID host: සත්කාරක + linkable_to_storage: Linkable to storage + linkable_to_storage_url: Linkable to storage URL name: නම password: Application password provider_type: Provider type + storage: Storage + storage_url: Storage URL tenant: Directory (tenant) ID errors: messages: diff --git a/modules/storages/config/locales/crowdin/sk.yml b/modules/storages/config/locales/crowdin/sk.yml index 2114d8e61a7..cc753e3d6ab 100644 --- a/modules/storages/config/locales/crowdin/sk.yml +++ b/modules/storages/config/locales/crowdin/sk.yml @@ -31,10 +31,15 @@ sk: authentication_method: Authentication Method creator: Creator drive: Drive ID + file_link_origin: File link origin ID host: Host + linkable_to_storage: Linkable to storage + linkable_to_storage_url: Linkable to storage URL name: Názov password: Application password provider_type: Provider type + storage: Storage + storage_url: Storage URL tenant: Directory (tenant) ID errors: messages: diff --git a/modules/storages/config/locales/crowdin/sl.yml b/modules/storages/config/locales/crowdin/sl.yml index d9554f0e225..9c4adf7a907 100644 --- a/modules/storages/config/locales/crowdin/sl.yml +++ b/modules/storages/config/locales/crowdin/sl.yml @@ -31,10 +31,15 @@ sl: authentication_method: Authentication Method creator: Creator drive: Drive ID + file_link_origin: File link origin ID host: Gostitelj + linkable_to_storage: Linkable to storage + linkable_to_storage_url: Linkable to storage URL name: Ime password: Application password provider_type: Provider type + storage: Storage + storage_url: Storage URL tenant: Directory (tenant) ID errors: messages: diff --git a/modules/storages/config/locales/crowdin/sr.yml b/modules/storages/config/locales/crowdin/sr.yml index 0b2da73a2df..cc2dfbd7d5e 100644 --- a/modules/storages/config/locales/crowdin/sr.yml +++ b/modules/storages/config/locales/crowdin/sr.yml @@ -31,10 +31,15 @@ sr: authentication_method: Authentication Method creator: Creator drive: Drive ID + file_link_origin: File link origin ID host: Host + linkable_to_storage: Linkable to storage + linkable_to_storage_url: Linkable to storage URL name: Name password: Application password provider_type: Provider type + storage: Storage + storage_url: Storage URL tenant: Directory (tenant) ID errors: messages: diff --git a/modules/storages/config/locales/crowdin/sv.yml b/modules/storages/config/locales/crowdin/sv.yml index 1fd6c0d3c9a..b1648b29c99 100644 --- a/modules/storages/config/locales/crowdin/sv.yml +++ b/modules/storages/config/locales/crowdin/sv.yml @@ -31,10 +31,15 @@ sv: authentication_method: Autentiseringsmetod creator: Skapare drive: Drive ID + file_link_origin: File link origin ID host: Host + linkable_to_storage: Linkable to storage + linkable_to_storage_url: Linkable to storage URL name: Namn password: Applikationens lösenord provider_type: Typ av leverantör + storage: Storage + storage_url: Storage URL tenant: Katalog (hyresgäst) ID errors: messages: diff --git a/modules/storages/config/locales/crowdin/th.yml b/modules/storages/config/locales/crowdin/th.yml index 7d873f219a0..01b09864b13 100644 --- a/modules/storages/config/locales/crowdin/th.yml +++ b/modules/storages/config/locales/crowdin/th.yml @@ -31,10 +31,15 @@ th: authentication_method: Authentication Method creator: Creator drive: Drive ID + file_link_origin: File link origin ID host: โฮสต์ + linkable_to_storage: Linkable to storage + linkable_to_storage_url: Linkable to storage URL name: ชื่อ password: Application password provider_type: Provider type + storage: Storage + storage_url: Storage URL tenant: Directory (tenant) ID errors: messages: diff --git a/modules/storages/config/locales/crowdin/tr.yml b/modules/storages/config/locales/crowdin/tr.yml index 92998c0f18e..20e261bcb37 100644 --- a/modules/storages/config/locales/crowdin/tr.yml +++ b/modules/storages/config/locales/crowdin/tr.yml @@ -31,10 +31,15 @@ tr: authentication_method: Kimlik Doğrulama Metodu creator: Oluşturan drive: Sürücü Kimliği + file_link_origin: File link origin ID host: Sunucu + linkable_to_storage: Linkable to storage + linkable_to_storage_url: Linkable to storage URL name: İsim password: Uygulama şifresi provider_type: Sağlayıcı türü + storage: Storage + storage_url: Storage URL tenant: Dizin (kiracı) Kimliği errors: messages: diff --git a/modules/storages/config/locales/crowdin/uk.yml b/modules/storages/config/locales/crowdin/uk.yml index 9b47b5b06c7..895e4efbf1d 100644 --- a/modules/storages/config/locales/crowdin/uk.yml +++ b/modules/storages/config/locales/crowdin/uk.yml @@ -31,10 +31,15 @@ uk: authentication_method: Метод автентифікації creator: Автор drive: ID диска + file_link_origin: Ідентифікатор походження посилання на файл host: Хост + linkable_to_storage: Можна прив’язати до сховища + linkable_to_storage_url: Можна прив’язати до URL-адреси сховища name: Назва password: Пароль додатка provider_type: Тип постачальника + storage: Сховище + storage_url: URL-адреса сховища tenant: ID каталогу (клієнта) errors: messages: diff --git a/modules/storages/config/locales/crowdin/uz.yml b/modules/storages/config/locales/crowdin/uz.yml index 4a7d06b8082..b0a6e7494f2 100644 --- a/modules/storages/config/locales/crowdin/uz.yml +++ b/modules/storages/config/locales/crowdin/uz.yml @@ -31,10 +31,15 @@ uz: authentication_method: Authentication Method creator: Creator drive: Drive ID + file_link_origin: File link origin ID host: Host + linkable_to_storage: Linkable to storage + linkable_to_storage_url: Linkable to storage URL name: Name password: Application password provider_type: Provider type + storage: Storage + storage_url: Storage URL tenant: Directory (tenant) ID errors: messages: diff --git a/modules/storages/config/locales/crowdin/vi.yml b/modules/storages/config/locales/crowdin/vi.yml index 7f3f72f2b73..78d3eaebf7b 100644 --- a/modules/storages/config/locales/crowdin/vi.yml +++ b/modules/storages/config/locales/crowdin/vi.yml @@ -31,10 +31,15 @@ vi: authentication_method: Phương thức xác thực creator: Người sáng tạo drive: ID ổ đĩa + file_link_origin: File link origin ID host: chủ nhà + linkable_to_storage: Linkable to storage + linkable_to_storage_url: Linkable to storage URL name: tên password: Mật khẩu ứng dụng provider_type: Loại nhà cung cấp + storage: Storage + storage_url: Storage URL tenant: ID thư mục (đối tượng thuê) errors: messages: diff --git a/modules/storages/config/locales/crowdin/zh-CN.yml b/modules/storages/config/locales/crowdin/zh-CN.yml index a4c24fd0756..7f0ca6131c6 100644 --- a/modules/storages/config/locales/crowdin/zh-CN.yml +++ b/modules/storages/config/locales/crowdin/zh-CN.yml @@ -31,10 +31,15 @@ zh-CN: authentication_method: 身份验证方式 creator: 创建者 drive: 驱动器 ID + file_link_origin: 文件链接来源 ID host: 主机 + linkable_to_storage: 可链接到存储 + linkable_to_storage_url: 可链接到存储 URL name: 名称 password: 应用程序密码 provider_type: 提供商类型 + storage: 存储 + storage_url: 存储 URL tenant: 目录 (租户) ID errors: messages: diff --git a/modules/storages/config/locales/crowdin/zh-TW.yml b/modules/storages/config/locales/crowdin/zh-TW.yml index 090050e621a..15863979afe 100644 --- a/modules/storages/config/locales/crowdin/zh-TW.yml +++ b/modules/storages/config/locales/crowdin/zh-TW.yml @@ -31,10 +31,15 @@ zh-TW: authentication_method: 驗證方式 creator: 建立者 drive: Drive ID + file_link_origin: File link origin ID host: 主機 + linkable_to_storage: Linkable to storage + linkable_to_storage_url: Linkable to storage URL name: 名稱 password: 應用程式密碼 provider_type: 提供商類型 + storage: Storage + storage_url: Storage URL tenant: 目錄 (租戶) ID errors: messages: diff --git a/modules/two_factor_authentication/config/locales/crowdin/ro.yml b/modules/two_factor_authentication/config/locales/crowdin/ro.yml index 87aa2ce067e..29a5a924db5 100644 --- a/modules/two_factor_authentication/config/locales/crowdin/ro.yml +++ b/modules/two_factor_authentication/config/locales/crowdin/ro.yml @@ -170,7 +170,7 @@ ro: notice_account_otp_send_failed: Parola dvs. unică nu a putut fi trimisă. notice_account_has_no_phone: Nici un număr de telefon mobil nu este asociat contului dvs. label_confirmed: Confirmat - button_continue: Continuă + button_continue: Continuaţi button_make_default: Marcați ca implicit notice_phone_number_format: 'Te rog să introduci numărul în următorul format: +XX XXXXXXXX.' text_otp_not_receive: Alte metode de verificare diff --git a/modules/two_factor_authentication/config/locales/crowdin/ru.yml b/modules/two_factor_authentication/config/locales/crowdin/ru.yml index 3725f47949d..f65da4da418 100644 --- a/modules/two_factor_authentication/config/locales/crowdin/ru.yml +++ b/modules/two_factor_authentication/config/locales/crowdin/ru.yml @@ -170,7 +170,7 @@ ru: notice_account_otp_send_failed: Не удается отправить одноразовый пароль. notice_account_has_no_phone: К вашей учетной записи не привязан номер сотового телефона. label_confirmed: Подтвержден - button_continue: Продолжить + button_continue: Далее button_make_default: Задать по умолчанию notice_phone_number_format: 'Введите номер в следующем формате: +XX XXXXXXXX.' text_otp_not_receive: Другие способы проверки diff --git a/modules/wikis/config/locales/crowdin/af.yml b/modules/wikis/config/locales/crowdin/af.yml index c4e56566d80..44a09fa544b 100644 --- a/modules/wikis/config/locales/crowdin/af.yml +++ b/modules/wikis/config/locales/crowdin/af.yml @@ -3,15 +3,17 @@ af: activerecord: attributes: wikis/page_link: + identifier: Identifier provider: Wiki Provider + wikis/provider: + name: Name + universal_identifier: Universal identifier wikis/xwiki_provider: authentication_method: Authentication method authentication_methods: oauth2_sso: Single-Sign-On through OpenID Connect Identity Provider two_way_oauth2: Two-way OAuth 2.0 authorization code flow - name: Name token_exchange_scope: XWiki Scope - universal_identifier: Universal identifier url: Instance URL wiki_audience: XWiki Audience errors: {} @@ -29,53 +31,30 @@ af: wikis/xwiki_provider: one: XWiki provider other: XWiki providers + menus: + admin: + external_wiki_providers: Wiki providers + internal_wiki_provider: Internal wiki + wikis: Wikis permission_manage_wiki_page_links: Manage Wiki Page Links project_module_wiki_platforms: Wiki providers wikis: - buttons: - connect_account: Connect %{provider} account - done_continue: Done, continue - save_and_continue: Save and continue - wiki_page: Wiki page - health_checks: - authentication: - existing_token: User token - header: Authentication - user_bound_request: User-based request authentication - base_configuration: - header: Configuration - provider_configured: Configuration complete - errors: - not_configured: The connection could not be validated. Please finish configuration first. - xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. - xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. - xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. - xwiki_oauth_unauthorized: The user token was not recognized by XWiki. - work_package_wikis_tab_component: - inline_page_links: Inline page links - referencing_pages: Referenced in - page_link_component: - remove: Remove page link - relation_page_links_component: - empty_heading: No related pages - empty_text: Manually add links to other related wiki pages. - oauth_login_component: - heading: Not connected to %{provider} - description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. - connect_button: Connect %{provider} account admin: destroy_confirmation_dialog_component: - title: Delete wiki provider - heading: Permanently delete this wiki provider? description_html: The wiki provider %{wiki_provider} and all the related wiki page links will be deleted. In addition, every inline wiki page link will no longer be accessible. This action is irreversible. + heading: Permanently delete this wiki provider? + title: Delete wiki provider forms: general_info_form_component: - xwiki_instance_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. + provider_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. oauth_application_form_component: - application_id: Application ID - application_secret: Application secret + application_id: OpenProject OAuth Application ID + application_secret: OpenProject OAuth Application secret oauth_client_form_component: - client_id: Client ID + client_id: Wiki OAuth Client ID + client_secret: Wiki OAuth Client secret + redirect_uri: Redirect URI + redirect_uri_caption: Copy this value into the Redirect URI field of your XWiki OIDC client registration. health_status: show: actions: @@ -86,13 +65,19 @@ af: no_health_report: No report available no_health_report_description: Run the checks now for a full health status report for this wiki provider. title: Health Report + internal_provider_form: + checkbox_caption: Allow projects to use the internal OpenProject wiki along with external Wiki providers + checkbox_label: Enable the internal OpenProject wiki + internal_wiki_provider: + show: + description: Choose to enable or disable the internal OpenProject wiki oauth_application_info_component: confirm_replace_oauth_application: This action will reset the current OAuth credentials. After confirming you will have to reenter the credentials in your XWiki instance and all users will have to reauthorize. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_application: Replace OpenProject OAuth application oauth_client_info_component: confirm_replace_oauth_client: This action will reset the current XWiki OAuth credentials. All users will need to reauthorize against XWiki. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_client: Replace XWiki OAuth application side_panel: health_status_component: @@ -110,25 +95,81 @@ af: index_description: Add an external wiki service to link work packages to existing wiki pages or create new ones directly from OpenProject. label_add_new: Add new wiki provider label_edit: Edit XWiki provider - label_new_xwiki_instance: New XWiki provider + label_new_provider: New XWiki provider label_wiki_platform: Wiki provider - name_caption: Give your storage a name so that users can differentiate between multiple wiki platforms. + name_caption: Give your wiki provider a name so that users can differentiate between multiple wiki platforms. name_placeholder: XWiki knowledge base new_provider_html: Read our documentation on [setting up an XWiki integration](docs_url) for more information. oauth: openproject_oauth: OpenProject OAuth sections: - general_information: Basic details + general_information: General information oauth_configuration: OAuth configuration - url_caption: Please add the host address of your wiki platform including the https://. It should not be longer than 255 characters. - xwiki_instance: XWiki Instance + url_caption: The host address of your wiki platform including the https://. It should not be longer than 255 characters. xwiki: oauth: - openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. Copy the credentials below into your XWiki instance. - provider_oauth: XWiki OAuth - provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. A client ID is automatically generated to identify OpenProject to XWiki — no manual configuration is needed on the XWiki side. + openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. + provider_oauth: Wiki OAuth + provider_oauth_configuration: Copy these values to the [XWiki OIDC Connection client](xwiki_oidc_link). + provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth. xwiki_oauth: XWiki OAuth xwiki_oauth_description: Allow OpenProject to access XWiki data using an OAuth. - macro: - page_not_found: Linked wiki page no longer available + buttons: + connect_account: Connect %{provider} account + done_continue: Done, continue + open_wiki: Open wiki + save_and_continue: Save and continue + wiki_page: Wiki page + create_new_wiki_page_dialog: + page_title: Title + parent_help_text: Select a parent for this new wiki page. + title: Create new wiki page + delete_relation_page_link_confirmation_dialog: + heading: Delete related wiki page link? + title: Delete related wiki page link + health_checks: + authentication: + existing_token: User token + header: Authentication + user_bound_request: User-based request authentication + base_configuration: + header: Configuration + provider_configured: Configuration complete + errors: + not_configured: The connection could not be validated. Please finish configuration first. + xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. + xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. + xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. + xwiki_oauth_unauthorized: The user token was not recognized by XWiki. + instructions: + xwiki: + integration: XWiki Administration + oauth_application_details_html: The client secret value will not be accessible again after you close this window. Please copy these values into the [XWiki OpenProject Integration settings](xwiki_admin_link). + link_existing_wiki_page_dialog: + title: Add existing wiki page + link_existing_wiki_page_form: + no_results: No wiki pages found + placeholder: Search for a wiki page + oauth_login_component: + connect_button: Connect %{provider} account + description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. + heading: Not connected to %{provider} + page_link_component: + remove: Remove page link + page_links: + errors: + page_access_forbidden: You do not have permission to access this wiki page + page_not_found: Linked wiki page no longer available + unexpected: An unexpected error occurred + provider_types: + xwiki: + name: XWiki + relation_page_links_component: + empty_heading: No related pages + empty_text: Manually add links to other related wiki pages. + link_existing: Existing wiki page + link_new: New wiki page + work_package_wikis_tab_component: + inline_page_links: Inline page links + referencing_pages: Referenced in diff --git a/modules/wikis/config/locales/crowdin/ar.yml b/modules/wikis/config/locales/crowdin/ar.yml index 8ccec0ff4b3..3f88169edd0 100644 --- a/modules/wikis/config/locales/crowdin/ar.yml +++ b/modules/wikis/config/locales/crowdin/ar.yml @@ -3,15 +3,17 @@ ar: activerecord: attributes: wikis/page_link: + identifier: Identifier provider: Wiki Provider + wikis/provider: + name: Name + universal_identifier: Universal identifier wikis/xwiki_provider: authentication_method: Authentication method authentication_methods: oauth2_sso: Single-Sign-On through OpenID Connect Identity Provider two_way_oauth2: Two-way OAuth 2.0 authorization code flow - name: Name token_exchange_scope: XWiki Scope - universal_identifier: Universal identifier url: Instance URL wiki_audience: XWiki Audience errors: {} @@ -45,53 +47,30 @@ ar: few: XWiki providers many: XWiki providers other: XWiki providers + menus: + admin: + external_wiki_providers: Wiki providers + internal_wiki_provider: Internal wiki + wikis: Wikis permission_manage_wiki_page_links: Manage Wiki Page Links project_module_wiki_platforms: Wiki providers wikis: - buttons: - connect_account: Connect %{provider} account - done_continue: Done, continue - save_and_continue: Save and continue - wiki_page: Wiki page - health_checks: - authentication: - existing_token: User token - header: Authentication - user_bound_request: User-based request authentication - base_configuration: - header: Configuration - provider_configured: Configuration complete - errors: - not_configured: The connection could not be validated. Please finish configuration first. - xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. - xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. - xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. - xwiki_oauth_unauthorized: The user token was not recognized by XWiki. - work_package_wikis_tab_component: - inline_page_links: Inline page links - referencing_pages: Referenced in - page_link_component: - remove: Remove page link - relation_page_links_component: - empty_heading: No related pages - empty_text: Manually add links to other related wiki pages. - oauth_login_component: - heading: Not connected to %{provider} - description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. - connect_button: Connect %{provider} account admin: destroy_confirmation_dialog_component: - title: Delete wiki provider - heading: Permanently delete this wiki provider? description_html: The wiki provider %{wiki_provider} and all the related wiki page links will be deleted. In addition, every inline wiki page link will no longer be accessible. This action is irreversible. + heading: Permanently delete this wiki provider? + title: Delete wiki provider forms: general_info_form_component: - xwiki_instance_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. + provider_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. oauth_application_form_component: - application_id: Application ID - application_secret: Application secret + application_id: OpenProject OAuth Application ID + application_secret: OpenProject OAuth Application secret oauth_client_form_component: - client_id: Client ID + client_id: Wiki OAuth Client ID + client_secret: Wiki OAuth Client secret + redirect_uri: Redirect URI + redirect_uri_caption: Copy this value into the Redirect URI field of your XWiki OIDC client registration. health_status: show: actions: @@ -102,13 +81,19 @@ ar: no_health_report: No report available no_health_report_description: Run the checks now for a full health status report for this wiki provider. title: Health Report + internal_provider_form: + checkbox_caption: Allow projects to use the internal OpenProject wiki along with external Wiki providers + checkbox_label: Enable the internal OpenProject wiki + internal_wiki_provider: + show: + description: Choose to enable or disable the internal OpenProject wiki oauth_application_info_component: confirm_replace_oauth_application: This action will reset the current OAuth credentials. After confirming you will have to reenter the credentials in your XWiki instance and all users will have to reauthorize. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_application: Replace OpenProject OAuth application oauth_client_info_component: confirm_replace_oauth_client: This action will reset the current XWiki OAuth credentials. All users will need to reauthorize against XWiki. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_client: Replace XWiki OAuth application side_panel: health_status_component: @@ -126,25 +111,81 @@ ar: index_description: Add an external wiki service to link work packages to existing wiki pages or create new ones directly from OpenProject. label_add_new: Add new wiki provider label_edit: Edit XWiki provider - label_new_xwiki_instance: New XWiki provider + label_new_provider: New XWiki provider label_wiki_platform: Wiki provider - name_caption: Give your storage a name so that users can differentiate between multiple wiki platforms. + name_caption: Give your wiki provider a name so that users can differentiate between multiple wiki platforms. name_placeholder: XWiki knowledge base new_provider_html: Read our documentation on [setting up an XWiki integration](docs_url) for more information. oauth: openproject_oauth: OpenProject OAuth sections: - general_information: Basic details + general_information: General information oauth_configuration: OAuth configuration - url_caption: Please add the host address of your wiki platform including the https://. It should not be longer than 255 characters. - xwiki_instance: XWiki Instance + url_caption: The host address of your wiki platform including the https://. It should not be longer than 255 characters. xwiki: oauth: - openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. Copy the credentials below into your XWiki instance. - provider_oauth: XWiki OAuth - provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. A client ID is automatically generated to identify OpenProject to XWiki — no manual configuration is needed on the XWiki side. + openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. + provider_oauth: Wiki OAuth + provider_oauth_configuration: Copy these values to the [XWiki OIDC Connection client](xwiki_oidc_link). + provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth. xwiki_oauth: XWiki OAuth xwiki_oauth_description: Allow OpenProject to access XWiki data using an OAuth. - macro: - page_not_found: Linked wiki page no longer available + buttons: + connect_account: Connect %{provider} account + done_continue: Done, continue + open_wiki: Open wiki + save_and_continue: Save and continue + wiki_page: Wiki page + create_new_wiki_page_dialog: + page_title: Title + parent_help_text: Select a parent for this new wiki page. + title: Create new wiki page + delete_relation_page_link_confirmation_dialog: + heading: Delete related wiki page link? + title: Delete related wiki page link + health_checks: + authentication: + existing_token: User token + header: Authentication + user_bound_request: User-based request authentication + base_configuration: + header: Configuration + provider_configured: Configuration complete + errors: + not_configured: The connection could not be validated. Please finish configuration first. + xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. + xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. + xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. + xwiki_oauth_unauthorized: The user token was not recognized by XWiki. + instructions: + xwiki: + integration: XWiki Administration + oauth_application_details_html: The client secret value will not be accessible again after you close this window. Please copy these values into the [XWiki OpenProject Integration settings](xwiki_admin_link). + link_existing_wiki_page_dialog: + title: Add existing wiki page + link_existing_wiki_page_form: + no_results: No wiki pages found + placeholder: Search for a wiki page + oauth_login_component: + connect_button: Connect %{provider} account + description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. + heading: Not connected to %{provider} + page_link_component: + remove: Remove page link + page_links: + errors: + page_access_forbidden: You do not have permission to access this wiki page + page_not_found: Linked wiki page no longer available + unexpected: An unexpected error occurred + provider_types: + xwiki: + name: XWiki + relation_page_links_component: + empty_heading: No related pages + empty_text: Manually add links to other related wiki pages. + link_existing: Existing wiki page + link_new: New wiki page + work_package_wikis_tab_component: + inline_page_links: Inline page links + referencing_pages: Referenced in diff --git a/modules/wikis/config/locales/crowdin/az.yml b/modules/wikis/config/locales/crowdin/az.yml index 5cdeb7d624c..290da11ad2a 100644 --- a/modules/wikis/config/locales/crowdin/az.yml +++ b/modules/wikis/config/locales/crowdin/az.yml @@ -3,15 +3,17 @@ az: activerecord: attributes: wikis/page_link: + identifier: Identifier provider: Wiki Provider + wikis/provider: + name: Name + universal_identifier: Universal identifier wikis/xwiki_provider: authentication_method: Authentication method authentication_methods: oauth2_sso: Single-Sign-On through OpenID Connect Identity Provider two_way_oauth2: Two-way OAuth 2.0 authorization code flow - name: Name token_exchange_scope: XWiki Scope - universal_identifier: Universal identifier url: Instance URL wiki_audience: XWiki Audience errors: {} @@ -29,53 +31,30 @@ az: wikis/xwiki_provider: one: XWiki provider other: XWiki providers + menus: + admin: + external_wiki_providers: Wiki providers + internal_wiki_provider: Internal wiki + wikis: Wikis permission_manage_wiki_page_links: Manage Wiki Page Links project_module_wiki_platforms: Wiki providers wikis: - buttons: - connect_account: Connect %{provider} account - done_continue: Done, continue - save_and_continue: Save and continue - wiki_page: Wiki page - health_checks: - authentication: - existing_token: User token - header: Authentication - user_bound_request: User-based request authentication - base_configuration: - header: Configuration - provider_configured: Configuration complete - errors: - not_configured: The connection could not be validated. Please finish configuration first. - xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. - xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. - xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. - xwiki_oauth_unauthorized: The user token was not recognized by XWiki. - work_package_wikis_tab_component: - inline_page_links: Inline page links - referencing_pages: Referenced in - page_link_component: - remove: Remove page link - relation_page_links_component: - empty_heading: No related pages - empty_text: Manually add links to other related wiki pages. - oauth_login_component: - heading: Not connected to %{provider} - description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. - connect_button: Connect %{provider} account admin: destroy_confirmation_dialog_component: - title: Delete wiki provider - heading: Permanently delete this wiki provider? description_html: The wiki provider %{wiki_provider} and all the related wiki page links will be deleted. In addition, every inline wiki page link will no longer be accessible. This action is irreversible. + heading: Permanently delete this wiki provider? + title: Delete wiki provider forms: general_info_form_component: - xwiki_instance_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. + provider_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. oauth_application_form_component: - application_id: Application ID - application_secret: Application secret + application_id: OpenProject OAuth Application ID + application_secret: OpenProject OAuth Application secret oauth_client_form_component: - client_id: Client ID + client_id: Wiki OAuth Client ID + client_secret: Wiki OAuth Client secret + redirect_uri: Redirect URI + redirect_uri_caption: Copy this value into the Redirect URI field of your XWiki OIDC client registration. health_status: show: actions: @@ -86,13 +65,19 @@ az: no_health_report: No report available no_health_report_description: Run the checks now for a full health status report for this wiki provider. title: Health Report + internal_provider_form: + checkbox_caption: Allow projects to use the internal OpenProject wiki along with external Wiki providers + checkbox_label: Enable the internal OpenProject wiki + internal_wiki_provider: + show: + description: Choose to enable or disable the internal OpenProject wiki oauth_application_info_component: confirm_replace_oauth_application: This action will reset the current OAuth credentials. After confirming you will have to reenter the credentials in your XWiki instance and all users will have to reauthorize. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_application: Replace OpenProject OAuth application oauth_client_info_component: confirm_replace_oauth_client: This action will reset the current XWiki OAuth credentials. All users will need to reauthorize against XWiki. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_client: Replace XWiki OAuth application side_panel: health_status_component: @@ -110,25 +95,81 @@ az: index_description: Add an external wiki service to link work packages to existing wiki pages or create new ones directly from OpenProject. label_add_new: Add new wiki provider label_edit: Edit XWiki provider - label_new_xwiki_instance: New XWiki provider + label_new_provider: New XWiki provider label_wiki_platform: Wiki provider - name_caption: Give your storage a name so that users can differentiate between multiple wiki platforms. + name_caption: Give your wiki provider a name so that users can differentiate between multiple wiki platforms. name_placeholder: XWiki knowledge base new_provider_html: Read our documentation on [setting up an XWiki integration](docs_url) for more information. oauth: openproject_oauth: OpenProject OAuth sections: - general_information: Basic details + general_information: General information oauth_configuration: OAuth configuration - url_caption: Please add the host address of your wiki platform including the https://. It should not be longer than 255 characters. - xwiki_instance: XWiki Instance + url_caption: The host address of your wiki platform including the https://. It should not be longer than 255 characters. xwiki: oauth: - openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. Copy the credentials below into your XWiki instance. - provider_oauth: XWiki OAuth - provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. A client ID is automatically generated to identify OpenProject to XWiki — no manual configuration is needed on the XWiki side. + openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. + provider_oauth: Wiki OAuth + provider_oauth_configuration: Copy these values to the [XWiki OIDC Connection client](xwiki_oidc_link). + provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth. xwiki_oauth: XWiki OAuth xwiki_oauth_description: Allow OpenProject to access XWiki data using an OAuth. - macro: - page_not_found: Linked wiki page no longer available + buttons: + connect_account: Connect %{provider} account + done_continue: Done, continue + open_wiki: Open wiki + save_and_continue: Save and continue + wiki_page: Wiki page + create_new_wiki_page_dialog: + page_title: Title + parent_help_text: Select a parent for this new wiki page. + title: Create new wiki page + delete_relation_page_link_confirmation_dialog: + heading: Delete related wiki page link? + title: Delete related wiki page link + health_checks: + authentication: + existing_token: User token + header: Authentication + user_bound_request: User-based request authentication + base_configuration: + header: Configuration + provider_configured: Configuration complete + errors: + not_configured: The connection could not be validated. Please finish configuration first. + xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. + xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. + xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. + xwiki_oauth_unauthorized: The user token was not recognized by XWiki. + instructions: + xwiki: + integration: XWiki Administration + oauth_application_details_html: The client secret value will not be accessible again after you close this window. Please copy these values into the [XWiki OpenProject Integration settings](xwiki_admin_link). + link_existing_wiki_page_dialog: + title: Add existing wiki page + link_existing_wiki_page_form: + no_results: No wiki pages found + placeholder: Search for a wiki page + oauth_login_component: + connect_button: Connect %{provider} account + description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. + heading: Not connected to %{provider} + page_link_component: + remove: Remove page link + page_links: + errors: + page_access_forbidden: You do not have permission to access this wiki page + page_not_found: Linked wiki page no longer available + unexpected: An unexpected error occurred + provider_types: + xwiki: + name: XWiki + relation_page_links_component: + empty_heading: No related pages + empty_text: Manually add links to other related wiki pages. + link_existing: Existing wiki page + link_new: New wiki page + work_package_wikis_tab_component: + inline_page_links: Inline page links + referencing_pages: Referenced in diff --git a/modules/wikis/config/locales/crowdin/be.yml b/modules/wikis/config/locales/crowdin/be.yml index a31c2125d62..a25c745786d 100644 --- a/modules/wikis/config/locales/crowdin/be.yml +++ b/modules/wikis/config/locales/crowdin/be.yml @@ -3,15 +3,17 @@ be: activerecord: attributes: wikis/page_link: + identifier: Identifier provider: Wiki Provider + wikis/provider: + name: Name + universal_identifier: Universal identifier wikis/xwiki_provider: authentication_method: Authentication method authentication_methods: oauth2_sso: Single-Sign-On through OpenID Connect Identity Provider two_way_oauth2: Two-way OAuth 2.0 authorization code flow - name: Name token_exchange_scope: XWiki Scope - universal_identifier: Universal identifier url: Instance URL wiki_audience: XWiki Audience errors: {} @@ -37,53 +39,30 @@ be: few: XWiki providers many: XWiki providers other: XWiki providers + menus: + admin: + external_wiki_providers: Wiki providers + internal_wiki_provider: Internal wiki + wikis: Wikis permission_manage_wiki_page_links: Manage Wiki Page Links project_module_wiki_platforms: Wiki providers wikis: - buttons: - connect_account: Connect %{provider} account - done_continue: Done, continue - save_and_continue: Save and continue - wiki_page: Wiki page - health_checks: - authentication: - existing_token: User token - header: Authentication - user_bound_request: User-based request authentication - base_configuration: - header: Configuration - provider_configured: Configuration complete - errors: - not_configured: The connection could not be validated. Please finish configuration first. - xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. - xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. - xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. - xwiki_oauth_unauthorized: The user token was not recognized by XWiki. - work_package_wikis_tab_component: - inline_page_links: Inline page links - referencing_pages: Referenced in - page_link_component: - remove: Remove page link - relation_page_links_component: - empty_heading: No related pages - empty_text: Manually add links to other related wiki pages. - oauth_login_component: - heading: Not connected to %{provider} - description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. - connect_button: Connect %{provider} account admin: destroy_confirmation_dialog_component: - title: Delete wiki provider - heading: Permanently delete this wiki provider? description_html: The wiki provider %{wiki_provider} and all the related wiki page links will be deleted. In addition, every inline wiki page link will no longer be accessible. This action is irreversible. + heading: Permanently delete this wiki provider? + title: Delete wiki provider forms: general_info_form_component: - xwiki_instance_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. + provider_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. oauth_application_form_component: - application_id: Application ID - application_secret: Application secret + application_id: OpenProject OAuth Application ID + application_secret: OpenProject OAuth Application secret oauth_client_form_component: - client_id: Client ID + client_id: Wiki OAuth Client ID + client_secret: Wiki OAuth Client secret + redirect_uri: Redirect URI + redirect_uri_caption: Copy this value into the Redirect URI field of your XWiki OIDC client registration. health_status: show: actions: @@ -94,13 +73,19 @@ be: no_health_report: No report available no_health_report_description: Run the checks now for a full health status report for this wiki provider. title: Health Report + internal_provider_form: + checkbox_caption: Allow projects to use the internal OpenProject wiki along with external Wiki providers + checkbox_label: Enable the internal OpenProject wiki + internal_wiki_provider: + show: + description: Choose to enable or disable the internal OpenProject wiki oauth_application_info_component: confirm_replace_oauth_application: This action will reset the current OAuth credentials. After confirming you will have to reenter the credentials in your XWiki instance and all users will have to reauthorize. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_application: Replace OpenProject OAuth application oauth_client_info_component: confirm_replace_oauth_client: This action will reset the current XWiki OAuth credentials. All users will need to reauthorize against XWiki. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_client: Replace XWiki OAuth application side_panel: health_status_component: @@ -118,25 +103,81 @@ be: index_description: Add an external wiki service to link work packages to existing wiki pages or create new ones directly from OpenProject. label_add_new: Add new wiki provider label_edit: Edit XWiki provider - label_new_xwiki_instance: New XWiki provider + label_new_provider: New XWiki provider label_wiki_platform: Wiki provider - name_caption: Give your storage a name so that users can differentiate between multiple wiki platforms. + name_caption: Give your wiki provider a name so that users can differentiate between multiple wiki platforms. name_placeholder: XWiki knowledge base new_provider_html: Read our documentation on [setting up an XWiki integration](docs_url) for more information. oauth: openproject_oauth: OpenProject OAuth sections: - general_information: Basic details + general_information: General information oauth_configuration: OAuth configuration - url_caption: Please add the host address of your wiki platform including the https://. It should not be longer than 255 characters. - xwiki_instance: XWiki Instance + url_caption: The host address of your wiki platform including the https://. It should not be longer than 255 characters. xwiki: oauth: - openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. Copy the credentials below into your XWiki instance. - provider_oauth: XWiki OAuth - provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. A client ID is automatically generated to identify OpenProject to XWiki — no manual configuration is needed on the XWiki side. + openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. + provider_oauth: Wiki OAuth + provider_oauth_configuration: Copy these values to the [XWiki OIDC Connection client](xwiki_oidc_link). + provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth. xwiki_oauth: XWiki OAuth xwiki_oauth_description: Allow OpenProject to access XWiki data using an OAuth. - macro: - page_not_found: Linked wiki page no longer available + buttons: + connect_account: Connect %{provider} account + done_continue: Done, continue + open_wiki: Open wiki + save_and_continue: Save and continue + wiki_page: Wiki page + create_new_wiki_page_dialog: + page_title: Title + parent_help_text: Select a parent for this new wiki page. + title: Create new wiki page + delete_relation_page_link_confirmation_dialog: + heading: Delete related wiki page link? + title: Delete related wiki page link + health_checks: + authentication: + existing_token: User token + header: Authentication + user_bound_request: User-based request authentication + base_configuration: + header: Configuration + provider_configured: Configuration complete + errors: + not_configured: The connection could not be validated. Please finish configuration first. + xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. + xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. + xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. + xwiki_oauth_unauthorized: The user token was not recognized by XWiki. + instructions: + xwiki: + integration: XWiki Administration + oauth_application_details_html: The client secret value will not be accessible again after you close this window. Please copy these values into the [XWiki OpenProject Integration settings](xwiki_admin_link). + link_existing_wiki_page_dialog: + title: Add existing wiki page + link_existing_wiki_page_form: + no_results: No wiki pages found + placeholder: Search for a wiki page + oauth_login_component: + connect_button: Connect %{provider} account + description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. + heading: Not connected to %{provider} + page_link_component: + remove: Remove page link + page_links: + errors: + page_access_forbidden: You do not have permission to access this wiki page + page_not_found: Linked wiki page no longer available + unexpected: An unexpected error occurred + provider_types: + xwiki: + name: XWiki + relation_page_links_component: + empty_heading: No related pages + empty_text: Manually add links to other related wiki pages. + link_existing: Existing wiki page + link_new: New wiki page + work_package_wikis_tab_component: + inline_page_links: Inline page links + referencing_pages: Referenced in diff --git a/modules/wikis/config/locales/crowdin/bg.yml b/modules/wikis/config/locales/crowdin/bg.yml index 72c56f92fc0..62e83e38d2d 100644 --- a/modules/wikis/config/locales/crowdin/bg.yml +++ b/modules/wikis/config/locales/crowdin/bg.yml @@ -3,15 +3,17 @@ bg: activerecord: attributes: wikis/page_link: + identifier: Identifier provider: Wiki Provider + wikis/provider: + name: Name + universal_identifier: Universal identifier wikis/xwiki_provider: authentication_method: Authentication method authentication_methods: oauth2_sso: Single-Sign-On through OpenID Connect Identity Provider two_way_oauth2: Two-way OAuth 2.0 authorization code flow - name: Name token_exchange_scope: XWiki Scope - universal_identifier: Universal identifier url: Instance URL wiki_audience: XWiki Audience errors: {} @@ -29,53 +31,30 @@ bg: wikis/xwiki_provider: one: XWiki provider other: XWiki providers + menus: + admin: + external_wiki_providers: Wiki providers + internal_wiki_provider: Internal wiki + wikis: Wikis permission_manage_wiki_page_links: Manage Wiki Page Links project_module_wiki_platforms: Wiki providers wikis: - buttons: - connect_account: Connect %{provider} account - done_continue: Done, continue - save_and_continue: Save and continue - wiki_page: Wiki page - health_checks: - authentication: - existing_token: User token - header: Authentication - user_bound_request: User-based request authentication - base_configuration: - header: Configuration - provider_configured: Configuration complete - errors: - not_configured: The connection could not be validated. Please finish configuration first. - xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. - xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. - xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. - xwiki_oauth_unauthorized: The user token was not recognized by XWiki. - work_package_wikis_tab_component: - inline_page_links: Inline page links - referencing_pages: Referenced in - page_link_component: - remove: Remove page link - relation_page_links_component: - empty_heading: No related pages - empty_text: Manually add links to other related wiki pages. - oauth_login_component: - heading: Not connected to %{provider} - description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. - connect_button: Connect %{provider} account admin: destroy_confirmation_dialog_component: - title: Delete wiki provider - heading: Permanently delete this wiki provider? description_html: The wiki provider %{wiki_provider} and all the related wiki page links will be deleted. In addition, every inline wiki page link will no longer be accessible. This action is irreversible. + heading: Permanently delete this wiki provider? + title: Delete wiki provider forms: general_info_form_component: - xwiki_instance_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. + provider_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. oauth_application_form_component: - application_id: Application ID - application_secret: Application secret + application_id: OpenProject OAuth Application ID + application_secret: OpenProject OAuth Application secret oauth_client_form_component: - client_id: Client ID + client_id: Wiki OAuth Client ID + client_secret: Wiki OAuth Client secret + redirect_uri: Redirect URI + redirect_uri_caption: Copy this value into the Redirect URI field of your XWiki OIDC client registration. health_status: show: actions: @@ -86,13 +65,19 @@ bg: no_health_report: No report available no_health_report_description: Run the checks now for a full health status report for this wiki provider. title: Health Report + internal_provider_form: + checkbox_caption: Allow projects to use the internal OpenProject wiki along with external Wiki providers + checkbox_label: Enable the internal OpenProject wiki + internal_wiki_provider: + show: + description: Choose to enable or disable the internal OpenProject wiki oauth_application_info_component: confirm_replace_oauth_application: This action will reset the current OAuth credentials. After confirming you will have to reenter the credentials in your XWiki instance and all users will have to reauthorize. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_application: Replace OpenProject OAuth application oauth_client_info_component: confirm_replace_oauth_client: This action will reset the current XWiki OAuth credentials. All users will need to reauthorize against XWiki. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_client: Replace XWiki OAuth application side_panel: health_status_component: @@ -110,25 +95,81 @@ bg: index_description: Add an external wiki service to link work packages to existing wiki pages or create new ones directly from OpenProject. label_add_new: Add new wiki provider label_edit: Edit XWiki provider - label_new_xwiki_instance: New XWiki provider + label_new_provider: New XWiki provider label_wiki_platform: Wiki provider - name_caption: Give your storage a name so that users can differentiate between multiple wiki platforms. + name_caption: Give your wiki provider a name so that users can differentiate between multiple wiki platforms. name_placeholder: XWiki knowledge base new_provider_html: Read our documentation on [setting up an XWiki integration](docs_url) for more information. oauth: openproject_oauth: OpenProject OAuth sections: - general_information: Basic details + general_information: General information oauth_configuration: OAuth configuration - url_caption: Please add the host address of your wiki platform including the https://. It should not be longer than 255 characters. - xwiki_instance: XWiki Instance + url_caption: The host address of your wiki platform including the https://. It should not be longer than 255 characters. xwiki: oauth: - openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. Copy the credentials below into your XWiki instance. - provider_oauth: XWiki OAuth - provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. A client ID is automatically generated to identify OpenProject to XWiki — no manual configuration is needed on the XWiki side. + openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. + provider_oauth: Wiki OAuth + provider_oauth_configuration: Copy these values to the [XWiki OIDC Connection client](xwiki_oidc_link). + provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth. xwiki_oauth: XWiki OAuth xwiki_oauth_description: Allow OpenProject to access XWiki data using an OAuth. - macro: - page_not_found: Linked wiki page no longer available + buttons: + connect_account: Connect %{provider} account + done_continue: Done, continue + open_wiki: Open wiki + save_and_continue: Save and continue + wiki_page: Wiki page + create_new_wiki_page_dialog: + page_title: Title + parent_help_text: Select a parent for this new wiki page. + title: Create new wiki page + delete_relation_page_link_confirmation_dialog: + heading: Delete related wiki page link? + title: Delete related wiki page link + health_checks: + authentication: + existing_token: User token + header: Authentication + user_bound_request: User-based request authentication + base_configuration: + header: Configuration + provider_configured: Configuration complete + errors: + not_configured: The connection could not be validated. Please finish configuration first. + xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. + xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. + xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. + xwiki_oauth_unauthorized: The user token was not recognized by XWiki. + instructions: + xwiki: + integration: XWiki Administration + oauth_application_details_html: The client secret value will not be accessible again after you close this window. Please copy these values into the [XWiki OpenProject Integration settings](xwiki_admin_link). + link_existing_wiki_page_dialog: + title: Add existing wiki page + link_existing_wiki_page_form: + no_results: No wiki pages found + placeholder: Search for a wiki page + oauth_login_component: + connect_button: Connect %{provider} account + description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. + heading: Not connected to %{provider} + page_link_component: + remove: Remove page link + page_links: + errors: + page_access_forbidden: You do not have permission to access this wiki page + page_not_found: Linked wiki page no longer available + unexpected: An unexpected error occurred + provider_types: + xwiki: + name: XWiki + relation_page_links_component: + empty_heading: No related pages + empty_text: Manually add links to other related wiki pages. + link_existing: Existing wiki page + link_new: New wiki page + work_package_wikis_tab_component: + inline_page_links: Inline page links + referencing_pages: Referenced in diff --git a/modules/wikis/config/locales/crowdin/ca.yml b/modules/wikis/config/locales/crowdin/ca.yml index dbc6d23e28b..32e72f4a0f9 100644 --- a/modules/wikis/config/locales/crowdin/ca.yml +++ b/modules/wikis/config/locales/crowdin/ca.yml @@ -3,15 +3,17 @@ ca: activerecord: attributes: wikis/page_link: + identifier: Identifier provider: Wiki Provider + wikis/provider: + name: Name + universal_identifier: Universal identifier wikis/xwiki_provider: authentication_method: Authentication method authentication_methods: oauth2_sso: Single-Sign-On through OpenID Connect Identity Provider two_way_oauth2: Two-way OAuth 2.0 authorization code flow - name: Name token_exchange_scope: XWiki Scope - universal_identifier: Universal identifier url: Instance URL wiki_audience: XWiki Audience errors: {} @@ -29,53 +31,30 @@ ca: wikis/xwiki_provider: one: XWiki provider other: XWiki providers + menus: + admin: + external_wiki_providers: Wiki providers + internal_wiki_provider: Internal wiki + wikis: Wikis permission_manage_wiki_page_links: Manage Wiki Page Links project_module_wiki_platforms: Wiki providers wikis: - buttons: - connect_account: Connect %{provider} account - done_continue: Done, continue - save_and_continue: Save and continue - wiki_page: Wiki page - health_checks: - authentication: - existing_token: User token - header: Authentication - user_bound_request: User-based request authentication - base_configuration: - header: Configuration - provider_configured: Configuration complete - errors: - not_configured: The connection could not be validated. Please finish configuration first. - xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. - xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. - xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. - xwiki_oauth_unauthorized: The user token was not recognized by XWiki. - work_package_wikis_tab_component: - inline_page_links: Inline page links - referencing_pages: Referenced in - page_link_component: - remove: Remove page link - relation_page_links_component: - empty_heading: No related pages - empty_text: Manually add links to other related wiki pages. - oauth_login_component: - heading: Not connected to %{provider} - description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. - connect_button: Connect %{provider} account admin: destroy_confirmation_dialog_component: - title: Delete wiki provider - heading: Permanently delete this wiki provider? description_html: The wiki provider %{wiki_provider} and all the related wiki page links will be deleted. In addition, every inline wiki page link will no longer be accessible. This action is irreversible. + heading: Permanently delete this wiki provider? + title: Delete wiki provider forms: general_info_form_component: - xwiki_instance_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. + provider_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. oauth_application_form_component: - application_id: Application ID - application_secret: Application secret + application_id: OpenProject OAuth Application ID + application_secret: OpenProject OAuth Application secret oauth_client_form_component: - client_id: Client ID + client_id: Wiki OAuth Client ID + client_secret: Wiki OAuth Client secret + redirect_uri: Redirect URI + redirect_uri_caption: Copy this value into the Redirect URI field of your XWiki OIDC client registration. health_status: show: actions: @@ -86,13 +65,19 @@ ca: no_health_report: No report available no_health_report_description: Run the checks now for a full health status report for this wiki provider. title: Health Report + internal_provider_form: + checkbox_caption: Allow projects to use the internal OpenProject wiki along with external Wiki providers + checkbox_label: Enable the internal OpenProject wiki + internal_wiki_provider: + show: + description: Choose to enable or disable the internal OpenProject wiki oauth_application_info_component: confirm_replace_oauth_application: This action will reset the current OAuth credentials. After confirming you will have to reenter the credentials in your XWiki instance and all users will have to reauthorize. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_application: Replace OpenProject OAuth application oauth_client_info_component: confirm_replace_oauth_client: This action will reset the current XWiki OAuth credentials. All users will need to reauthorize against XWiki. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_client: Replace XWiki OAuth application side_panel: health_status_component: @@ -110,25 +95,81 @@ ca: index_description: Add an external wiki service to link work packages to existing wiki pages or create new ones directly from OpenProject. label_add_new: Add new wiki provider label_edit: Edit XWiki provider - label_new_xwiki_instance: New XWiki provider + label_new_provider: New XWiki provider label_wiki_platform: Wiki provider - name_caption: Give your storage a name so that users can differentiate between multiple wiki platforms. + name_caption: Give your wiki provider a name so that users can differentiate between multiple wiki platforms. name_placeholder: XWiki knowledge base new_provider_html: Read our documentation on [setting up an XWiki integration](docs_url) for more information. oauth: openproject_oauth: OpenProject OAuth sections: - general_information: Basic details + general_information: General information oauth_configuration: OAuth configuration - url_caption: Please add the host address of your wiki platform including the https://. It should not be longer than 255 characters. - xwiki_instance: XWiki Instance + url_caption: The host address of your wiki platform including the https://. It should not be longer than 255 characters. xwiki: oauth: - openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. Copy the credentials below into your XWiki instance. - provider_oauth: XWiki OAuth - provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. A client ID is automatically generated to identify OpenProject to XWiki — no manual configuration is needed on the XWiki side. + openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. + provider_oauth: Wiki OAuth + provider_oauth_configuration: Copy these values to the [XWiki OIDC Connection client](xwiki_oidc_link). + provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth. xwiki_oauth: XWiki OAuth xwiki_oauth_description: Allow OpenProject to access XWiki data using an OAuth. - macro: - page_not_found: Linked wiki page no longer available + buttons: + connect_account: Connect %{provider} account + done_continue: Done, continue + open_wiki: Open wiki + save_and_continue: Save and continue + wiki_page: Wiki page + create_new_wiki_page_dialog: + page_title: Title + parent_help_text: Select a parent for this new wiki page. + title: Create new wiki page + delete_relation_page_link_confirmation_dialog: + heading: Delete related wiki page link? + title: Delete related wiki page link + health_checks: + authentication: + existing_token: User token + header: Authentication + user_bound_request: User-based request authentication + base_configuration: + header: Configuration + provider_configured: Configuration complete + errors: + not_configured: The connection could not be validated. Please finish configuration first. + xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. + xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. + xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. + xwiki_oauth_unauthorized: The user token was not recognized by XWiki. + instructions: + xwiki: + integration: XWiki Administration + oauth_application_details_html: The client secret value will not be accessible again after you close this window. Please copy these values into the [XWiki OpenProject Integration settings](xwiki_admin_link). + link_existing_wiki_page_dialog: + title: Add existing wiki page + link_existing_wiki_page_form: + no_results: No wiki pages found + placeholder: Search for a wiki page + oauth_login_component: + connect_button: Connect %{provider} account + description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. + heading: Not connected to %{provider} + page_link_component: + remove: Remove page link + page_links: + errors: + page_access_forbidden: You do not have permission to access this wiki page + page_not_found: Linked wiki page no longer available + unexpected: An unexpected error occurred + provider_types: + xwiki: + name: XWiki + relation_page_links_component: + empty_heading: No related pages + empty_text: Manually add links to other related wiki pages. + link_existing: Existing wiki page + link_new: New wiki page + work_package_wikis_tab_component: + inline_page_links: Inline page links + referencing_pages: Referenced in diff --git a/modules/wikis/config/locales/crowdin/ckb-IR.yml b/modules/wikis/config/locales/crowdin/ckb-IR.yml index 01b2bf65bd0..db8d5af8500 100644 --- a/modules/wikis/config/locales/crowdin/ckb-IR.yml +++ b/modules/wikis/config/locales/crowdin/ckb-IR.yml @@ -3,15 +3,17 @@ ckb-IR: activerecord: attributes: wikis/page_link: + identifier: Identifier provider: Wiki Provider + wikis/provider: + name: Name + universal_identifier: Universal identifier wikis/xwiki_provider: authentication_method: Authentication method authentication_methods: oauth2_sso: Single-Sign-On through OpenID Connect Identity Provider two_way_oauth2: Two-way OAuth 2.0 authorization code flow - name: Name token_exchange_scope: XWiki Scope - universal_identifier: Universal identifier url: Instance URL wiki_audience: XWiki Audience errors: {} @@ -29,53 +31,30 @@ ckb-IR: wikis/xwiki_provider: one: XWiki provider other: XWiki providers + menus: + admin: + external_wiki_providers: Wiki providers + internal_wiki_provider: Internal wiki + wikis: Wikis permission_manage_wiki_page_links: Manage Wiki Page Links project_module_wiki_platforms: Wiki providers wikis: - buttons: - connect_account: Connect %{provider} account - done_continue: Done, continue - save_and_continue: Save and continue - wiki_page: Wiki page - health_checks: - authentication: - existing_token: User token - header: Authentication - user_bound_request: User-based request authentication - base_configuration: - header: Configuration - provider_configured: Configuration complete - errors: - not_configured: The connection could not be validated. Please finish configuration first. - xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. - xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. - xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. - xwiki_oauth_unauthorized: The user token was not recognized by XWiki. - work_package_wikis_tab_component: - inline_page_links: Inline page links - referencing_pages: Referenced in - page_link_component: - remove: Remove page link - relation_page_links_component: - empty_heading: No related pages - empty_text: Manually add links to other related wiki pages. - oauth_login_component: - heading: Not connected to %{provider} - description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. - connect_button: Connect %{provider} account admin: destroy_confirmation_dialog_component: - title: Delete wiki provider - heading: Permanently delete this wiki provider? description_html: The wiki provider %{wiki_provider} and all the related wiki page links will be deleted. In addition, every inline wiki page link will no longer be accessible. This action is irreversible. + heading: Permanently delete this wiki provider? + title: Delete wiki provider forms: general_info_form_component: - xwiki_instance_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. + provider_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. oauth_application_form_component: - application_id: Application ID - application_secret: Application secret + application_id: OpenProject OAuth Application ID + application_secret: OpenProject OAuth Application secret oauth_client_form_component: - client_id: Client ID + client_id: Wiki OAuth Client ID + client_secret: Wiki OAuth Client secret + redirect_uri: Redirect URI + redirect_uri_caption: Copy this value into the Redirect URI field of your XWiki OIDC client registration. health_status: show: actions: @@ -86,13 +65,19 @@ ckb-IR: no_health_report: No report available no_health_report_description: Run the checks now for a full health status report for this wiki provider. title: Health Report + internal_provider_form: + checkbox_caption: Allow projects to use the internal OpenProject wiki along with external Wiki providers + checkbox_label: Enable the internal OpenProject wiki + internal_wiki_provider: + show: + description: Choose to enable or disable the internal OpenProject wiki oauth_application_info_component: confirm_replace_oauth_application: This action will reset the current OAuth credentials. After confirming you will have to reenter the credentials in your XWiki instance and all users will have to reauthorize. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_application: Replace OpenProject OAuth application oauth_client_info_component: confirm_replace_oauth_client: This action will reset the current XWiki OAuth credentials. All users will need to reauthorize against XWiki. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_client: Replace XWiki OAuth application side_panel: health_status_component: @@ -110,25 +95,81 @@ ckb-IR: index_description: Add an external wiki service to link work packages to existing wiki pages or create new ones directly from OpenProject. label_add_new: Add new wiki provider label_edit: Edit XWiki provider - label_new_xwiki_instance: New XWiki provider + label_new_provider: New XWiki provider label_wiki_platform: Wiki provider - name_caption: Give your storage a name so that users can differentiate between multiple wiki platforms. + name_caption: Give your wiki provider a name so that users can differentiate between multiple wiki platforms. name_placeholder: XWiki knowledge base new_provider_html: Read our documentation on [setting up an XWiki integration](docs_url) for more information. oauth: openproject_oauth: OpenProject OAuth sections: - general_information: Basic details + general_information: General information oauth_configuration: OAuth configuration - url_caption: Please add the host address of your wiki platform including the https://. It should not be longer than 255 characters. - xwiki_instance: XWiki Instance + url_caption: The host address of your wiki platform including the https://. It should not be longer than 255 characters. xwiki: oauth: - openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. Copy the credentials below into your XWiki instance. - provider_oauth: XWiki OAuth - provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. A client ID is automatically generated to identify OpenProject to XWiki — no manual configuration is needed on the XWiki side. + openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. + provider_oauth: Wiki OAuth + provider_oauth_configuration: Copy these values to the [XWiki OIDC Connection client](xwiki_oidc_link). + provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth. xwiki_oauth: XWiki OAuth xwiki_oauth_description: Allow OpenProject to access XWiki data using an OAuth. - macro: - page_not_found: Linked wiki page no longer available + buttons: + connect_account: Connect %{provider} account + done_continue: Done, continue + open_wiki: Open wiki + save_and_continue: Save and continue + wiki_page: Wiki page + create_new_wiki_page_dialog: + page_title: Title + parent_help_text: Select a parent for this new wiki page. + title: Create new wiki page + delete_relation_page_link_confirmation_dialog: + heading: Delete related wiki page link? + title: Delete related wiki page link + health_checks: + authentication: + existing_token: User token + header: Authentication + user_bound_request: User-based request authentication + base_configuration: + header: Configuration + provider_configured: Configuration complete + errors: + not_configured: The connection could not be validated. Please finish configuration first. + xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. + xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. + xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. + xwiki_oauth_unauthorized: The user token was not recognized by XWiki. + instructions: + xwiki: + integration: XWiki Administration + oauth_application_details_html: The client secret value will not be accessible again after you close this window. Please copy these values into the [XWiki OpenProject Integration settings](xwiki_admin_link). + link_existing_wiki_page_dialog: + title: Add existing wiki page + link_existing_wiki_page_form: + no_results: No wiki pages found + placeholder: Search for a wiki page + oauth_login_component: + connect_button: Connect %{provider} account + description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. + heading: Not connected to %{provider} + page_link_component: + remove: Remove page link + page_links: + errors: + page_access_forbidden: You do not have permission to access this wiki page + page_not_found: Linked wiki page no longer available + unexpected: An unexpected error occurred + provider_types: + xwiki: + name: XWiki + relation_page_links_component: + empty_heading: No related pages + empty_text: Manually add links to other related wiki pages. + link_existing: Existing wiki page + link_new: New wiki page + work_package_wikis_tab_component: + inline_page_links: Inline page links + referencing_pages: Referenced in diff --git a/modules/wikis/config/locales/crowdin/cs.yml b/modules/wikis/config/locales/crowdin/cs.yml index 841c6c7365e..892187a529b 100644 --- a/modules/wikis/config/locales/crowdin/cs.yml +++ b/modules/wikis/config/locales/crowdin/cs.yml @@ -3,15 +3,17 @@ cs: activerecord: attributes: wikis/page_link: + identifier: Identifier provider: Wiki Provider + wikis/provider: + name: Name + universal_identifier: Universal identifier wikis/xwiki_provider: authentication_method: Způsob ověření authentication_methods: oauth2_sso: Single-Sign-On through OpenID Connect Identity Provider two_way_oauth2: Two-way OAuth 2.0 authorization code flow - name: Name token_exchange_scope: XWiki Scope - universal_identifier: Univerzální identifikátor url: Adresa URL instance wiki_audience: XWiki Audience errors: {} @@ -37,53 +39,30 @@ cs: few: XWiki providers many: XWiki providers other: XWiki providers + menus: + admin: + external_wiki_providers: Wiki providers + internal_wiki_provider: Internal wiki + wikis: Wikis permission_manage_wiki_page_links: Manage Wiki Page Links project_module_wiki_platforms: Wiki providers wikis: - buttons: - connect_account: Connect %{provider} account - done_continue: Done, continue - save_and_continue: Save and continue - wiki_page: Wiki page - health_checks: - authentication: - existing_token: User token - header: Authentication - user_bound_request: User-based request authentication - base_configuration: - header: Configuration - provider_configured: Configuration complete - errors: - not_configured: The connection could not be validated. Please finish configuration first. - xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. - xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. - xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. - xwiki_oauth_unauthorized: The user token was not recognized by XWiki. - work_package_wikis_tab_component: - inline_page_links: Inline page links - referencing_pages: Referenced in - page_link_component: - remove: Remove page link - relation_page_links_component: - empty_heading: No related pages - empty_text: Manually add links to other related wiki pages. - oauth_login_component: - heading: Not connected to %{provider} - description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. - connect_button: Connect %{provider} account admin: destroy_confirmation_dialog_component: - title: Delete wiki provider - heading: Permanently delete this wiki provider? description_html: The wiki provider %{wiki_provider} and all the related wiki page links will be deleted. In addition, every inline wiki page link will no longer be accessible. This action is irreversible. + heading: Permanently delete this wiki provider? + title: Delete wiki provider forms: general_info_form_component: - xwiki_instance_description: Před nastavením se ujistěte, že máte v instanci XWiki administrátorská práva. + provider_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. oauth_application_form_component: - application_id: ID aplikace - application_secret: Sdílený klíč + application_id: OpenProject OAuth Application ID + application_secret: OpenProject OAuth Application secret oauth_client_form_component: - client_id: ID klienta + client_id: Wiki OAuth Client ID + client_secret: Wiki OAuth Client secret + redirect_uri: Redirect URI + redirect_uri_caption: Copy this value into the Redirect URI field of your XWiki OIDC client registration. health_status: show: actions: @@ -94,13 +73,19 @@ cs: no_health_report: No report available no_health_report_description: Run the checks now for a full health status report for this wiki provider. title: Health Report + internal_provider_form: + checkbox_caption: Allow projects to use the internal OpenProject wiki along with external Wiki providers + checkbox_label: Enable the internal OpenProject wiki + internal_wiki_provider: + show: + description: Choose to enable or disable the internal OpenProject wiki oauth_application_info_component: confirm_replace_oauth_application: This action will reset the current OAuth credentials. After confirming you will have to reenter the credentials in your XWiki instance and all users will have to reauthorize. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_application: Replace OpenProject OAuth application oauth_client_info_component: confirm_replace_oauth_client: This action will reset the current XWiki OAuth credentials. All users will need to reauthorize against XWiki. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_client: Replace XWiki OAuth application side_panel: health_status_component: @@ -118,25 +103,81 @@ cs: index_description: Add an external wiki service to link work packages to existing wiki pages or create new ones directly from OpenProject. label_add_new: Add new wiki provider label_edit: Edit XWiki provider - label_new_xwiki_instance: Nový poskytovatel XWiki + label_new_provider: New XWiki provider label_wiki_platform: Wiki provider - name_caption: Give your storage a name so that users can differentiate between multiple wiki platforms. + name_caption: Give your wiki provider a name so that users can differentiate between multiple wiki platforms. name_placeholder: XWiki knowledge base new_provider_html: Read our documentation on [setting up an XWiki integration](docs_url) for more information. oauth: openproject_oauth: OpenProject OAuth sections: - general_information: Basic details + general_information: General information oauth_configuration: OAuth configuration - url_caption: Please add the host address of your wiki platform including the https://. It should not be longer than 255 characters. - xwiki_instance: Instance XWiki + url_caption: The host address of your wiki platform including the https://. It should not be longer than 255 characters. xwiki: oauth: - openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. Copy the credentials below into your XWiki instance. - provider_oauth: XWiki OAuth - provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. A client ID is automatically generated to identify OpenProject to XWiki — no manual configuration is needed on the XWiki side. + openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. + provider_oauth: Wiki OAuth + provider_oauth_configuration: Copy these values to the [XWiki OIDC Connection client](xwiki_oidc_link). + provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth. xwiki_oauth: XWiki OAuth xwiki_oauth_description: Allow OpenProject to access XWiki data using an OAuth. - macro: - page_not_found: Odkazovaná stránka wiki již není k dispozici + buttons: + connect_account: Connect %{provider} account + done_continue: Done, continue + open_wiki: Open wiki + save_and_continue: Save and continue + wiki_page: Wiki page + create_new_wiki_page_dialog: + page_title: Title + parent_help_text: Select a parent for this new wiki page. + title: Create new wiki page + delete_relation_page_link_confirmation_dialog: + heading: Delete related wiki page link? + title: Delete related wiki page link + health_checks: + authentication: + existing_token: User token + header: Authentication + user_bound_request: User-based request authentication + base_configuration: + header: Configuration + provider_configured: Configuration complete + errors: + not_configured: The connection could not be validated. Please finish configuration first. + xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. + xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. + xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. + xwiki_oauth_unauthorized: The user token was not recognized by XWiki. + instructions: + xwiki: + integration: XWiki Administration + oauth_application_details_html: The client secret value will not be accessible again after you close this window. Please copy these values into the [XWiki OpenProject Integration settings](xwiki_admin_link). + link_existing_wiki_page_dialog: + title: Add existing wiki page + link_existing_wiki_page_form: + no_results: No wiki pages found + placeholder: Search for a wiki page + oauth_login_component: + connect_button: Connect %{provider} account + description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. + heading: Not connected to %{provider} + page_link_component: + remove: Remove page link + page_links: + errors: + page_access_forbidden: You do not have permission to access this wiki page + page_not_found: Linked wiki page no longer available + unexpected: An unexpected error occurred + provider_types: + xwiki: + name: XWiki + relation_page_links_component: + empty_heading: No related pages + empty_text: Manually add links to other related wiki pages. + link_existing: Existing wiki page + link_new: New wiki page + work_package_wikis_tab_component: + inline_page_links: Inline page links + referencing_pages: Referenced in diff --git a/modules/wikis/config/locales/crowdin/da.yml b/modules/wikis/config/locales/crowdin/da.yml index d5c4a72fc55..caaf1308254 100644 --- a/modules/wikis/config/locales/crowdin/da.yml +++ b/modules/wikis/config/locales/crowdin/da.yml @@ -3,15 +3,17 @@ da: activerecord: attributes: wikis/page_link: + identifier: Identifier provider: Wiki Provider + wikis/provider: + name: Name + universal_identifier: Universal identifier wikis/xwiki_provider: authentication_method: Authentication method authentication_methods: oauth2_sso: Single-Sign-On through OpenID Connect Identity Provider two_way_oauth2: Two-way OAuth 2.0 authorization code flow - name: Name token_exchange_scope: XWiki Scope - universal_identifier: Universal identifier url: Instance URL wiki_audience: XWiki Audience errors: {} @@ -29,53 +31,30 @@ da: wikis/xwiki_provider: one: XWiki provider other: XWiki providers + menus: + admin: + external_wiki_providers: Wiki providers + internal_wiki_provider: Internal wiki + wikis: Wikis permission_manage_wiki_page_links: Manage Wiki Page Links project_module_wiki_platforms: Wiki providers wikis: - buttons: - connect_account: Connect %{provider} account - done_continue: Done, continue - save_and_continue: Save and continue - wiki_page: Wiki page - health_checks: - authentication: - existing_token: User token - header: Authentication - user_bound_request: User-based request authentication - base_configuration: - header: Configuration - provider_configured: Configuration complete - errors: - not_configured: The connection could not be validated. Please finish configuration first. - xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. - xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. - xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. - xwiki_oauth_unauthorized: The user token was not recognized by XWiki. - work_package_wikis_tab_component: - inline_page_links: Inline page links - referencing_pages: Referenced in - page_link_component: - remove: Remove page link - relation_page_links_component: - empty_heading: No related pages - empty_text: Manually add links to other related wiki pages. - oauth_login_component: - heading: Not connected to %{provider} - description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. - connect_button: Connect %{provider} account admin: destroy_confirmation_dialog_component: - title: Delete wiki provider - heading: Permanently delete this wiki provider? description_html: The wiki provider %{wiki_provider} and all the related wiki page links will be deleted. In addition, every inline wiki page link will no longer be accessible. This action is irreversible. + heading: Permanently delete this wiki provider? + title: Delete wiki provider forms: general_info_form_component: - xwiki_instance_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. + provider_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. oauth_application_form_component: - application_id: Application ID - application_secret: Application secret + application_id: OpenProject OAuth Application ID + application_secret: OpenProject OAuth Application secret oauth_client_form_component: - client_id: Client ID + client_id: Wiki OAuth Client ID + client_secret: Wiki OAuth Client secret + redirect_uri: Redirect URI + redirect_uri_caption: Copy this value into the Redirect URI field of your XWiki OIDC client registration. health_status: show: actions: @@ -86,13 +65,19 @@ da: no_health_report: No report available no_health_report_description: Run the checks now for a full health status report for this wiki provider. title: Health Report + internal_provider_form: + checkbox_caption: Allow projects to use the internal OpenProject wiki along with external Wiki providers + checkbox_label: Enable the internal OpenProject wiki + internal_wiki_provider: + show: + description: Choose to enable or disable the internal OpenProject wiki oauth_application_info_component: confirm_replace_oauth_application: This action will reset the current OAuth credentials. After confirming you will have to reenter the credentials in your XWiki instance and all users will have to reauthorize. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_application: Replace OpenProject OAuth application oauth_client_info_component: confirm_replace_oauth_client: This action will reset the current XWiki OAuth credentials. All users will need to reauthorize against XWiki. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_client: Replace XWiki OAuth application side_panel: health_status_component: @@ -110,25 +95,81 @@ da: index_description: Add an external wiki service to link work packages to existing wiki pages or create new ones directly from OpenProject. label_add_new: Add new wiki provider label_edit: Edit XWiki provider - label_new_xwiki_instance: New XWiki provider + label_new_provider: New XWiki provider label_wiki_platform: Wiki provider - name_caption: Give your storage a name so that users can differentiate between multiple wiki platforms. + name_caption: Give your wiki provider a name so that users can differentiate between multiple wiki platforms. name_placeholder: XWiki knowledge base new_provider_html: Read our documentation on [setting up an XWiki integration](docs_url) for more information. oauth: openproject_oauth: OpenProject OAuth sections: - general_information: Basic details + general_information: General information oauth_configuration: OAuth configuration - url_caption: Please add the host address of your wiki platform including the https://. It should not be longer than 255 characters. - xwiki_instance: XWiki Instance + url_caption: The host address of your wiki platform including the https://. It should not be longer than 255 characters. xwiki: oauth: - openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. Copy the credentials below into your XWiki instance. - provider_oauth: XWiki OAuth - provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. A client ID is automatically generated to identify OpenProject to XWiki — no manual configuration is needed on the XWiki side. + openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. + provider_oauth: Wiki OAuth + provider_oauth_configuration: Copy these values to the [XWiki OIDC Connection client](xwiki_oidc_link). + provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth. xwiki_oauth: XWiki OAuth xwiki_oauth_description: Allow OpenProject to access XWiki data using an OAuth. - macro: - page_not_found: Linked wiki page no longer available + buttons: + connect_account: Connect %{provider} account + done_continue: Done, continue + open_wiki: Open wiki + save_and_continue: Save and continue + wiki_page: Wiki page + create_new_wiki_page_dialog: + page_title: Title + parent_help_text: Select a parent for this new wiki page. + title: Create new wiki page + delete_relation_page_link_confirmation_dialog: + heading: Delete related wiki page link? + title: Delete related wiki page link + health_checks: + authentication: + existing_token: User token + header: Authentication + user_bound_request: User-based request authentication + base_configuration: + header: Configuration + provider_configured: Configuration complete + errors: + not_configured: The connection could not be validated. Please finish configuration first. + xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. + xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. + xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. + xwiki_oauth_unauthorized: The user token was not recognized by XWiki. + instructions: + xwiki: + integration: XWiki Administration + oauth_application_details_html: The client secret value will not be accessible again after you close this window. Please copy these values into the [XWiki OpenProject Integration settings](xwiki_admin_link). + link_existing_wiki_page_dialog: + title: Add existing wiki page + link_existing_wiki_page_form: + no_results: No wiki pages found + placeholder: Search for a wiki page + oauth_login_component: + connect_button: Connect %{provider} account + description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. + heading: Not connected to %{provider} + page_link_component: + remove: Remove page link + page_links: + errors: + page_access_forbidden: You do not have permission to access this wiki page + page_not_found: Linked wiki page no longer available + unexpected: An unexpected error occurred + provider_types: + xwiki: + name: XWiki + relation_page_links_component: + empty_heading: No related pages + empty_text: Manually add links to other related wiki pages. + link_existing: Existing wiki page + link_new: New wiki page + work_package_wikis_tab_component: + inline_page_links: Inline page links + referencing_pages: Referenced in diff --git a/modules/wikis/config/locales/crowdin/de.yml b/modules/wikis/config/locales/crowdin/de.yml index 061faf72edd..0b06fdafee9 100644 --- a/modules/wikis/config/locales/crowdin/de.yml +++ b/modules/wikis/config/locales/crowdin/de.yml @@ -3,15 +3,17 @@ de: activerecord: attributes: wikis/page_link: + identifier: Kennung provider: Wiki-Anbieter + wikis/provider: + name: Name + universal_identifier: Universelle Kennung wikis/xwiki_provider: authentication_method: Authentifizierungsmethode authentication_methods: oauth2_sso: Single-Sign-On über OpenID Connect Identity Provider two_way_oauth2: Zwei-Wege OAuth 2.0 Authorization-Code-Flow - name: Name token_exchange_scope: XWiki Scope - universal_identifier: Eindeutige Kennung url: Instanz-URL wiki_audience: XWiki Audience errors: {} @@ -28,54 +30,31 @@ de: other: Verwandte Seitenlinks wikis/xwiki_provider: one: XWiki-Anbieter - other: XWiki providers + other: XWiki-Anbieter + menus: + admin: + external_wiki_providers: Wiki providers + internal_wiki_provider: Internal wiki + wikis: Wikis permission_manage_wiki_page_links: Wiki-Seitenlinks verwalten project_module_wiki_platforms: Wiki-Anbieter wikis: - buttons: - connect_account: "%{provider}-Konto verbinden" - done_continue: Fertig, fortfahren - save_and_continue: Speichern und fortsetzen - wiki_page: Wiki-Seite - health_checks: - authentication: - existing_token: Benutzer Token - header: Authentifizierung - user_bound_request: Benutzerbasierte Anfrageauthentifizierung - base_configuration: - header: Konfiguration - provider_configured: Konfiguration abgeschlossen - errors: - not_configured: Die Verbindung konnte nicht validiert werden. Bitte schließen Sie zuerst die Konfiguration ab. - xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. - xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. - xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. - xwiki_oauth_unauthorized: The user token was not recognized by XWiki. - work_package_wikis_tab_component: - inline_page_links: Inline-Seitenlinks - referencing_pages: Referenziert in - page_link_component: - remove: Seitenlink entfernen - relation_page_links_component: - empty_heading: Keine verwandten Seiten - empty_text: Fügen Sie manuell Links zu anderen verwandten Wikiseiten hinzu. - oauth_login_component: - heading: Nicht verbunden mit %{provider} - description: Melden Sie sich bei %{provider} an, um verwandte Wiki-Seiten aus dieser OpenProject-Instanz anzuzeigen und zu verwalten. - connect_button: "%{provider}-Konto verbinden" admin: destroy_confirmation_dialog_component: + description_html: Der Wiki-Anbieter %{wiki_provider} und alle zugehörigen Wikiseiten-Links werden gelöscht. Zusätzlich wird jeder Inline-Wiki-Link nicht mehr zugänglich sein. Diese Aktion kann nicht rückgängig gemacht werden. + heading: Diesen Wiki-Anbieter dauerhaft löschen? title: Wiki-Anbieter löschen - heading: Permanently delete this wiki provider? - description_html: The wiki provider %{wiki_provider} and all the related wiki page links will be deleted. In addition, every inline wiki page link will no longer be accessible. This action is irreversible. forms: general_info_form_component: - xwiki_instance_description: Vergewissern Sie sich, dass Sie über Administratorrechte in Ihrer XWiki-Instanz verfügen, bevor Sie diese Einrichtung starten. + provider_description: Vergewissern Sie sich, dass Sie über Administratorrechte in Ihrer XWiki-Instanz verfügen, bevor Sie diese Einrichtung starten. oauth_application_form_component: - application_id: Anwendungs-ID - application_secret: Anwendungsgeheimnis + application_id: OpenProject OAuth Anwendungs-ID + application_secret: OpenProject OAuth-Anwendungsgeheimnis oauth_client_form_component: - client_id: Client-ID + client_id: Wiki OAuth-Client-ID + client_secret: Wiki OAuth-Client Geheimnis + redirect_uri: Umleitungs-URI + redirect_uri_caption: Kopieren Sie diesen Wert in das Redirect URI Feld Ihrer XWiki OIDC Client-Registrierung. health_status: show: actions: @@ -86,13 +65,19 @@ de: no_health_report: Kein Bericht verfügbar no_health_report_description: Führen Sie jetzt die Prüfungen für einen vollständigen Statusbericht dieses Dateispeichers durch. title: Systemstatusbericht + internal_provider_form: + checkbox_caption: Allow projects to use the internal OpenProject wiki along with external Wiki providers + checkbox_label: Enable the internal OpenProject wiki + internal_wiki_provider: + show: + description: Choose to enable or disable the internal OpenProject wiki oauth_application_info_component: confirm_replace_oauth_application: Diese Aktion setzt die aktuellen OAuth-Anmeldedaten zurück. Nach der Bestätigung müssen Sie die Anmeldedaten erneut in Ihre XWiki-Instanz eingeben und alle Konten müssen sich erneut autorisieren. Sind Sie sicher, dass Sie fortfahren möchten? - label_pending: Ausstehend + label_oauth_client_id: OAuth-Client-ID replace_oauth_application: OpenProject OAuth-Anwendung ersetzen oauth_client_info_component: confirm_replace_oauth_client: Diese Aktion setzt die aktuellen XWiki OAuth-Zugangsdaten zurück. Alle Konten müssen sich erneut gegenüber XWiki autorisieren. Sind Sie sicher, dass Sie fortfahren möchten? - label_pending: Ausstehend + label_oauth_client_id: OAuth-Client-ID replace_oauth_client: XWiki OAuth-Anwendung ersetzen side_panel: health_status_component: @@ -110,9 +95,9 @@ de: index_description: Fügen Sie einen externen Wiki-Dienst hinzu, um Arbeitspakete mit bestehenden Wiki-Seiten zu verknüpfen oder neue Seiten direkt von OpenProject aus zu erstellen. label_add_new: Neuen Wiki-Anbieter hinzufügen label_edit: XWiki-Anbieter bearbeiten - label_new_xwiki_instance: XWiki-Anbieter + label_new_provider: Neuer XWiki-Anbieter label_wiki_platform: Wiki-Anbieter - name_caption: Geben Sie Ihrem Anbieter einen Namen, damit Benutzer zwischen mehreren Speichern unterscheiden können. + name_caption: Geben Sie Ihrem Wiki-Provider einen Namen, damit Benutzer zwischen mehreren Wiki-Plattformen unterscheiden können. name_placeholder: XWiki Wissensdatenbank new_provider_html: Lesen Sie unsere Dokumentation über das [Einrichten einer XWiki-Integration](docs_url) für weitere Informationen. oauth: @@ -120,15 +105,71 @@ de: sections: general_information: Allgemeine Informationen oauth_configuration: OAuth-Konfiguration - url_caption: Bitte ergänzen Sie die Host-Adresse Ihres Wiki-Anbieters (einschließlich https://). Sie sollte nicht länger als 255 Zeichen sein. - xwiki_instance: XWiki Instanz + url_caption: Die Host-Adresse Ihrer Wiki-Plattform einschließlich der https://. Sie sollte nicht länger als 255 Zeichen sein. xwiki: oauth: - openproject_oauth_description: Erlauben Sie XWiki den Zugriff auf OpenProject-Daten über eine OAuth-Anwendung. Kopieren Sie die unten stehenden Anmeldeinformationen in Ihre XWiki-Instanz. - provider_oauth: XWiki OAuth - provider_oauth_description: Erlauben Sie OpenProject den Zugriff auf XWiki-Daten mit OAuth. Eine Client-ID wird automatisch generiert, um OpenProject bei XWiki zu identifizieren - eine manuelle Konfiguration auf der XWiki-Seite ist nicht erforderlich. + openproject_oauth_description: Erlauben Sie XWiki den Zugriff auf OpenProject Daten über OAuth. + provider_oauth: Wiki OAuth + provider_oauth_configuration: Kopieren Sie diese Werte in den [XWiki OIDC Connection Client](xwiki_oidc_link). + provider_oauth_description: Erlauben Sie OpenProject Zugriff auf XWiki Daten über OAuth. openproject_oauth_description: Erlauben Sie XWiki den Zugriff auf OpenProject Daten über OAuth. xwiki_oauth: XWiki OAuth xwiki_oauth_description: Erlauben Sie OpenProject Zugriff auf XWiki Daten über OAuth. - macro: - page_not_found: Verlinkte Wikiseite nicht mehr verfügbar + buttons: + connect_account: "%{provider}-Konto verbinden" + done_continue: Fertig, fortfahren + open_wiki: Wiki öffnen + save_and_continue: Speichern und fortsetzen + wiki_page: Wiki-Seite + create_new_wiki_page_dialog: + page_title: Title + parent_help_text: Select a parent for this new wiki page. + title: Create new wiki page + delete_relation_page_link_confirmation_dialog: + heading: Link zur verknüpften Wikiseite löschen? + title: Link zur verknüpften Wikiseite löschen + health_checks: + authentication: + existing_token: Benutzer Token + header: Authentifizierung + user_bound_request: Benutzerbasierte Anfrageauthentifizierung + base_configuration: + header: Konfiguration + provider_configured: Konfiguration abgeschlossen + errors: + not_configured: Die Verbindung konnte nicht validiert werden. Bitte schließen Sie zuerst die Konfiguration ab. + xwiki_oauth_connection_error: OpenProject konnte sich nicht mit der konfigurierten XWiki-Instanz verbinden. + xwiki_oauth_request_error: Beim Versuch, mit der XWiki-Instanz zu kommunizieren, ist ein unerwarteter Fehler aufgetreten. + xwiki_oauth_token_missing: OpenProject kann die Kommunikation auf Benutzerebene mit XWiki nicht testen, da noch kein XWiki-Konto verknüpft wurde. + xwiki_oauth_unauthorized: Das Benutzer-Token wurde von XWiki nicht erkannt. + instructions: + xwiki: + integration: XWiki Administration + oauth_application_details_html: Das Client Secret wird nach dem Schließen dieses Fensters nicht mehr zugänglich sein. Bitte kopieren Sie diese Werte in die [XWiki OpenProject Integrationseinstellungen](xwiki_admin_link). + link_existing_wiki_page_dialog: + title: Vorhandene Wikiseite hinzufügen + link_existing_wiki_page_form: + no_results: Keine Wikiseiten gefunden + placeholder: Suche nach einer Wikiseite + oauth_login_component: + connect_button: "%{provider}-Konto verbinden" + description: Melden Sie sich bei %{provider} an, um verwandte Wiki-Seiten aus dieser OpenProject-Instanz anzuzeigen und zu verwalten. + heading: Nicht verbunden mit %{provider} + page_link_component: + remove: Seitenlink entfernen + page_links: + errors: + page_access_forbidden: Sie haben keine Berechtigung, auf diese Wikiseite zuzugreifen + page_not_found: Verlinkte Wikiseite nicht mehr verfügbar + unexpected: Ein unbekannter Fehler ist aufgetreten + provider_types: + xwiki: + name: XWiki + relation_page_links_component: + empty_heading: Keine verwandten Seiten + empty_text: Fügen Sie manuell Links zu anderen verwandten Wikiseiten hinzu. + link_existing: Vorhandene Wikiseite + link_new: Neue Wikiseite + work_package_wikis_tab_component: + inline_page_links: Inline-Seitenlinks + referencing_pages: Referenziert in diff --git a/modules/wikis/config/locales/crowdin/el.yml b/modules/wikis/config/locales/crowdin/el.yml index 4a8a67f621e..3bae307fee0 100644 --- a/modules/wikis/config/locales/crowdin/el.yml +++ b/modules/wikis/config/locales/crowdin/el.yml @@ -3,15 +3,17 @@ el: activerecord: attributes: wikis/page_link: + identifier: Identifier provider: Wiki Provider + wikis/provider: + name: Name + universal_identifier: Universal identifier wikis/xwiki_provider: authentication_method: Authentication method authentication_methods: oauth2_sso: Single-Sign-On through OpenID Connect Identity Provider two_way_oauth2: Two-way OAuth 2.0 authorization code flow - name: Name token_exchange_scope: XWiki Scope - universal_identifier: Universal identifier url: Instance URL wiki_audience: XWiki Audience errors: {} @@ -29,53 +31,30 @@ el: wikis/xwiki_provider: one: XWiki provider other: XWiki providers + menus: + admin: + external_wiki_providers: Wiki providers + internal_wiki_provider: Internal wiki + wikis: Wikis permission_manage_wiki_page_links: Manage Wiki Page Links project_module_wiki_platforms: Wiki providers wikis: - buttons: - connect_account: Connect %{provider} account - done_continue: Done, continue - save_and_continue: Save and continue - wiki_page: Wiki page - health_checks: - authentication: - existing_token: User token - header: Authentication - user_bound_request: User-based request authentication - base_configuration: - header: Configuration - provider_configured: Configuration complete - errors: - not_configured: The connection could not be validated. Please finish configuration first. - xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. - xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. - xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. - xwiki_oauth_unauthorized: The user token was not recognized by XWiki. - work_package_wikis_tab_component: - inline_page_links: Inline page links - referencing_pages: Referenced in - page_link_component: - remove: Remove page link - relation_page_links_component: - empty_heading: No related pages - empty_text: Manually add links to other related wiki pages. - oauth_login_component: - heading: Not connected to %{provider} - description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. - connect_button: Connect %{provider} account admin: destroy_confirmation_dialog_component: - title: Delete wiki provider - heading: Permanently delete this wiki provider? description_html: The wiki provider %{wiki_provider} and all the related wiki page links will be deleted. In addition, every inline wiki page link will no longer be accessible. This action is irreversible. + heading: Permanently delete this wiki provider? + title: Delete wiki provider forms: general_info_form_component: - xwiki_instance_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. + provider_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. oauth_application_form_component: - application_id: Application ID - application_secret: Application secret + application_id: OpenProject OAuth Application ID + application_secret: OpenProject OAuth Application secret oauth_client_form_component: - client_id: Client ID + client_id: Wiki OAuth Client ID + client_secret: Wiki OAuth Client secret + redirect_uri: Redirect URI + redirect_uri_caption: Copy this value into the Redirect URI field of your XWiki OIDC client registration. health_status: show: actions: @@ -86,13 +65,19 @@ el: no_health_report: No report available no_health_report_description: Run the checks now for a full health status report for this wiki provider. title: Health Report + internal_provider_form: + checkbox_caption: Allow projects to use the internal OpenProject wiki along with external Wiki providers + checkbox_label: Enable the internal OpenProject wiki + internal_wiki_provider: + show: + description: Choose to enable or disable the internal OpenProject wiki oauth_application_info_component: confirm_replace_oauth_application: This action will reset the current OAuth credentials. After confirming you will have to reenter the credentials in your XWiki instance and all users will have to reauthorize. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_application: Replace OpenProject OAuth application oauth_client_info_component: confirm_replace_oauth_client: This action will reset the current XWiki OAuth credentials. All users will need to reauthorize against XWiki. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_client: Replace XWiki OAuth application side_panel: health_status_component: @@ -110,25 +95,81 @@ el: index_description: Add an external wiki service to link work packages to existing wiki pages or create new ones directly from OpenProject. label_add_new: Add new wiki provider label_edit: Edit XWiki provider - label_new_xwiki_instance: New XWiki provider + label_new_provider: New XWiki provider label_wiki_platform: Wiki provider - name_caption: Give your storage a name so that users can differentiate between multiple wiki platforms. + name_caption: Give your wiki provider a name so that users can differentiate between multiple wiki platforms. name_placeholder: XWiki knowledge base new_provider_html: Read our documentation on [setting up an XWiki integration](docs_url) for more information. oauth: openproject_oauth: OpenProject OAuth sections: - general_information: Basic details + general_information: General information oauth_configuration: OAuth configuration - url_caption: Please add the host address of your wiki platform including the https://. It should not be longer than 255 characters. - xwiki_instance: XWiki Instance + url_caption: The host address of your wiki platform including the https://. It should not be longer than 255 characters. xwiki: oauth: - openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. Copy the credentials below into your XWiki instance. - provider_oauth: XWiki OAuth - provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. A client ID is automatically generated to identify OpenProject to XWiki — no manual configuration is needed on the XWiki side. + openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. + provider_oauth: Wiki OAuth + provider_oauth_configuration: Copy these values to the [XWiki OIDC Connection client](xwiki_oidc_link). + provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth. xwiki_oauth: XWiki OAuth xwiki_oauth_description: Allow OpenProject to access XWiki data using an OAuth. - macro: - page_not_found: Linked wiki page no longer available + buttons: + connect_account: Connect %{provider} account + done_continue: Done, continue + open_wiki: Open wiki + save_and_continue: Save and continue + wiki_page: Wiki page + create_new_wiki_page_dialog: + page_title: Title + parent_help_text: Select a parent for this new wiki page. + title: Create new wiki page + delete_relation_page_link_confirmation_dialog: + heading: Delete related wiki page link? + title: Delete related wiki page link + health_checks: + authentication: + existing_token: User token + header: Authentication + user_bound_request: User-based request authentication + base_configuration: + header: Configuration + provider_configured: Configuration complete + errors: + not_configured: The connection could not be validated. Please finish configuration first. + xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. + xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. + xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. + xwiki_oauth_unauthorized: The user token was not recognized by XWiki. + instructions: + xwiki: + integration: XWiki Administration + oauth_application_details_html: The client secret value will not be accessible again after you close this window. Please copy these values into the [XWiki OpenProject Integration settings](xwiki_admin_link). + link_existing_wiki_page_dialog: + title: Add existing wiki page + link_existing_wiki_page_form: + no_results: No wiki pages found + placeholder: Search for a wiki page + oauth_login_component: + connect_button: Connect %{provider} account + description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. + heading: Not connected to %{provider} + page_link_component: + remove: Remove page link + page_links: + errors: + page_access_forbidden: You do not have permission to access this wiki page + page_not_found: Linked wiki page no longer available + unexpected: An unexpected error occurred + provider_types: + xwiki: + name: XWiki + relation_page_links_component: + empty_heading: No related pages + empty_text: Manually add links to other related wiki pages. + link_existing: Existing wiki page + link_new: New wiki page + work_package_wikis_tab_component: + inline_page_links: Inline page links + referencing_pages: Referenced in diff --git a/modules/wikis/config/locales/crowdin/eo.yml b/modules/wikis/config/locales/crowdin/eo.yml index 15c47d86fd7..6899f65da67 100644 --- a/modules/wikis/config/locales/crowdin/eo.yml +++ b/modules/wikis/config/locales/crowdin/eo.yml @@ -3,15 +3,17 @@ eo: activerecord: attributes: wikis/page_link: + identifier: Identifier provider: Wiki Provider + wikis/provider: + name: Name + universal_identifier: Universal identifier wikis/xwiki_provider: authentication_method: Authentication method authentication_methods: oauth2_sso: Single-Sign-On through OpenID Connect Identity Provider two_way_oauth2: Two-way OAuth 2.0 authorization code flow - name: Name token_exchange_scope: XWiki Scope - universal_identifier: Universal identifier url: Instance URL wiki_audience: XWiki Audience errors: {} @@ -29,53 +31,30 @@ eo: wikis/xwiki_provider: one: XWiki provider other: XWiki providers + menus: + admin: + external_wiki_providers: Wiki providers + internal_wiki_provider: Internal wiki + wikis: Wikis permission_manage_wiki_page_links: Manage Wiki Page Links project_module_wiki_platforms: Wiki providers wikis: - buttons: - connect_account: Connect %{provider} account - done_continue: Done, continue - save_and_continue: Save and continue - wiki_page: Wiki page - health_checks: - authentication: - existing_token: User token - header: Authentication - user_bound_request: User-based request authentication - base_configuration: - header: Configuration - provider_configured: Configuration complete - errors: - not_configured: The connection could not be validated. Please finish configuration first. - xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. - xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. - xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. - xwiki_oauth_unauthorized: The user token was not recognized by XWiki. - work_package_wikis_tab_component: - inline_page_links: Inline page links - referencing_pages: Referenced in - page_link_component: - remove: Remove page link - relation_page_links_component: - empty_heading: No related pages - empty_text: Manually add links to other related wiki pages. - oauth_login_component: - heading: Not connected to %{provider} - description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. - connect_button: Connect %{provider} account admin: destroy_confirmation_dialog_component: - title: Delete wiki provider - heading: Permanently delete this wiki provider? description_html: The wiki provider %{wiki_provider} and all the related wiki page links will be deleted. In addition, every inline wiki page link will no longer be accessible. This action is irreversible. + heading: Permanently delete this wiki provider? + title: Delete wiki provider forms: general_info_form_component: - xwiki_instance_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. + provider_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. oauth_application_form_component: - application_id: Application ID - application_secret: Application secret + application_id: OpenProject OAuth Application ID + application_secret: OpenProject OAuth Application secret oauth_client_form_component: - client_id: Client ID + client_id: Wiki OAuth Client ID + client_secret: Wiki OAuth Client secret + redirect_uri: Redirect URI + redirect_uri_caption: Copy this value into the Redirect URI field of your XWiki OIDC client registration. health_status: show: actions: @@ -86,13 +65,19 @@ eo: no_health_report: No report available no_health_report_description: Run the checks now for a full health status report for this wiki provider. title: Health Report + internal_provider_form: + checkbox_caption: Allow projects to use the internal OpenProject wiki along with external Wiki providers + checkbox_label: Enable the internal OpenProject wiki + internal_wiki_provider: + show: + description: Choose to enable or disable the internal OpenProject wiki oauth_application_info_component: confirm_replace_oauth_application: This action will reset the current OAuth credentials. After confirming you will have to reenter the credentials in your XWiki instance and all users will have to reauthorize. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_application: Replace OpenProject OAuth application oauth_client_info_component: confirm_replace_oauth_client: This action will reset the current XWiki OAuth credentials. All users will need to reauthorize against XWiki. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_client: Replace XWiki OAuth application side_panel: health_status_component: @@ -110,25 +95,81 @@ eo: index_description: Add an external wiki service to link work packages to existing wiki pages or create new ones directly from OpenProject. label_add_new: Add new wiki provider label_edit: Edit XWiki provider - label_new_xwiki_instance: New XWiki provider + label_new_provider: New XWiki provider label_wiki_platform: Wiki provider - name_caption: Give your storage a name so that users can differentiate between multiple wiki platforms. + name_caption: Give your wiki provider a name so that users can differentiate between multiple wiki platforms. name_placeholder: XWiki knowledge base new_provider_html: Read our documentation on [setting up an XWiki integration](docs_url) for more information. oauth: openproject_oauth: OpenProject OAuth sections: - general_information: Basic details + general_information: General information oauth_configuration: OAuth configuration - url_caption: Please add the host address of your wiki platform including the https://. It should not be longer than 255 characters. - xwiki_instance: XWiki Instance + url_caption: The host address of your wiki platform including the https://. It should not be longer than 255 characters. xwiki: oauth: - openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. Copy the credentials below into your XWiki instance. - provider_oauth: XWiki OAuth - provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. A client ID is automatically generated to identify OpenProject to XWiki — no manual configuration is needed on the XWiki side. + openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. + provider_oauth: Wiki OAuth + provider_oauth_configuration: Copy these values to the [XWiki OIDC Connection client](xwiki_oidc_link). + provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth. xwiki_oauth: XWiki OAuth xwiki_oauth_description: Allow OpenProject to access XWiki data using an OAuth. - macro: - page_not_found: Linked wiki page no longer available + buttons: + connect_account: Connect %{provider} account + done_continue: Done, continue + open_wiki: Open wiki + save_and_continue: Save and continue + wiki_page: Wiki page + create_new_wiki_page_dialog: + page_title: Title + parent_help_text: Select a parent for this new wiki page. + title: Create new wiki page + delete_relation_page_link_confirmation_dialog: + heading: Delete related wiki page link? + title: Delete related wiki page link + health_checks: + authentication: + existing_token: User token + header: Authentication + user_bound_request: User-based request authentication + base_configuration: + header: Configuration + provider_configured: Configuration complete + errors: + not_configured: The connection could not be validated. Please finish configuration first. + xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. + xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. + xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. + xwiki_oauth_unauthorized: The user token was not recognized by XWiki. + instructions: + xwiki: + integration: XWiki Administration + oauth_application_details_html: The client secret value will not be accessible again after you close this window. Please copy these values into the [XWiki OpenProject Integration settings](xwiki_admin_link). + link_existing_wiki_page_dialog: + title: Add existing wiki page + link_existing_wiki_page_form: + no_results: No wiki pages found + placeholder: Search for a wiki page + oauth_login_component: + connect_button: Connect %{provider} account + description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. + heading: Not connected to %{provider} + page_link_component: + remove: Remove page link + page_links: + errors: + page_access_forbidden: You do not have permission to access this wiki page + page_not_found: Linked wiki page no longer available + unexpected: An unexpected error occurred + provider_types: + xwiki: + name: XWiki + relation_page_links_component: + empty_heading: No related pages + empty_text: Manually add links to other related wiki pages. + link_existing: Existing wiki page + link_new: New wiki page + work_package_wikis_tab_component: + inline_page_links: Inline page links + referencing_pages: Referenced in diff --git a/modules/wikis/config/locales/crowdin/es.yml b/modules/wikis/config/locales/crowdin/es.yml index c9a136282dc..03e4d974ae6 100644 --- a/modules/wikis/config/locales/crowdin/es.yml +++ b/modules/wikis/config/locales/crowdin/es.yml @@ -3,15 +3,17 @@ es: activerecord: attributes: wikis/page_link: + identifier: Identificador provider: Proveedor Wiki + wikis/provider: + name: Nombre + universal_identifier: Identificador universal wikis/xwiki_provider: authentication_method: Método de autenticación authentication_methods: oauth2_sso: Inicio de sesión único a través del proveedor de identidad OpenID Connect two_way_oauth2: Flujo de código de autorización bidireccional OAuth 2.0 - name: Nombre token_exchange_scope: Ámbito de XWiki - universal_identifier: Identificador universal url: URL de instancia wiki_audience: Público de XWiki errors: {} @@ -29,53 +31,30 @@ es: wikis/xwiki_provider: one: Proveedor de XWiki other: Proveedores de XWiki + menus: + admin: + external_wiki_providers: Wiki providers + internal_wiki_provider: Internal wiki + wikis: Wikis permission_manage_wiki_page_links: Gestionar enlaces de páginas wiki project_module_wiki_platforms: Proveedores de Wiki wikis: - buttons: - connect_account: Conectar cuenta de %{provider} - done_continue: Hecho, continuar - save_and_continue: Guardar y continuar - wiki_page: Página wiki - health_checks: - authentication: - existing_token: Token de usuario - header: Autentificación - user_bound_request: Autenticación de solicitud basada en el usuario - base_configuration: - header: Configuración - provider_configured: Configuración completada - errors: - not_configured: No se ha podido validar la conexión. Finalice primero la configuración. - xwiki_oauth_connection_error: OpenProject no ha podido conectarse a la instancia de XWiki configurada. - xwiki_oauth_request_error: Se ha producido un error inesperado al intentar conectarse con la instancia de XWiki. - xwiki_oauth_token_missing: OpenProject no puede comprobar la comunicación a nivel de usuario con XWiki, ya que aún no has vinculado tu cuenta de XWiki. - xwiki_oauth_unauthorized: XWiki no ha reconocido el token de usuario. - work_package_wikis_tab_component: - inline_page_links: Enlaces a la página integrada - referencing_pages: Se hace referencia en - page_link_component: - remove: Eliminar enlace de página - relation_page_links_component: - empty_heading: No hay páginas relacionadas - empty_text: Añada manualmente enlaces a otras páginas wiki relacionadas. - oauth_login_component: - heading: No conectado a %{provider} - description: Inicie sesión en %{provider} para ver y gestionar las páginas wiki relacionadas desde esta instancia de OpenProject. - connect_button: Conectar cuenta de %{provider} admin: destroy_confirmation_dialog_component: - title: Eliminar proveedor wiki - heading: "¿Eliminar este proveedor de wiki de forma permanente?" description_html: Se eliminarán el proveedor de wiki %{wiki_provider} y todos los enlaces a páginas wiki relacionados. Además, ya no se podrá acceder a ningún enlace a páginas wiki incrustado. Esta acción es irreversible. + heading: "¿Eliminar este proveedor de wiki de forma permanente?" + title: Eliminar proveedor wiki forms: general_info_form_component: - xwiki_instance_description: Asegúrate de tener permisos de administrador en tu instancia de XWiki antes de realizar la configuración. + provider_description: Asegúrate de tener permisos de administrador en tu instancia de XWiki antes de realizar la configuración. oauth_application_form_component: - application_id: ID de aplicación - application_secret: Secreto de aplicación + application_id: ID de aplicación OAuth de OpenProject + application_secret: Secreto de aplicación OAuth de OpenProject oauth_client_form_component: - client_id: ID de cliente + client_id: ID de cliente OAuth de Wiki + client_secret: Secreto de cliente OAuth de Wiki + redirect_uri: Redirigir URI + redirect_uri_caption: Copia este valor en el campo «Redirect URI» de tu registro como cliente OIDC de XWiki. health_status: show: actions: @@ -86,13 +65,19 @@ es: no_health_report: No hay informes disponibles no_health_report_description: Ejecuta ahora las comprobaciones para obtener un informe completo del estado de este proveedor de wiki. title: Informe de salud + internal_provider_form: + checkbox_caption: Allow projects to use the internal OpenProject wiki along with external Wiki providers + checkbox_label: Enable the internal OpenProject wiki + internal_wiki_provider: + show: + description: Choose to enable or disable the internal OpenProject wiki oauth_application_info_component: confirm_replace_oauth_application: Esta acción restablecerá las credenciales de OAuth actuales. Una vez confirmada, deberá volver a introducir las credenciales en su instancia de XWiki y todos los usuarios deberán volver a autorizarse. ¿Seguro que desea continuar? - label_pending: Pendiente + label_oauth_client_id: ID de cliente OAuth replace_oauth_application: Sustituir la aplicación OAuth de OpenProject oauth_client_info_component: confirm_replace_oauth_client: Esta acción restablecerá las credenciales actuales de OAuth de XWiki. Todos los usuarios deberán volver a autorizarse en XWiki. ¿Seguro que desea continuar? - label_pending: Pendiente + label_oauth_client_id: ID de cliente OAuth replace_oauth_client: Sustituir la aplicación XWiki OAuth side_panel: health_status_component: @@ -110,25 +95,81 @@ es: index_description: Añade un servicio wiki externo para vincular paquetes de trabajo a páginas wiki existentes o crear otras nuevas directamente desde OpenProject. label_add_new: Añadir nuevo proveedor de wiki label_edit: Editar proveedor XWiki - label_new_xwiki_instance: Nuevo proveedor XWiki + label_new_provider: Nuevo proveedor XWiki label_wiki_platform: Proveedor Wiki - name_caption: Ponle un nombre a tu almacenamiento para que los usuarios puedan distinguir entre las distintas plataformas wiki. + name_caption: Give your wiki provider a name so that users can differentiate between multiple wiki platforms. name_placeholder: Base de conocimientos XWiki new_provider_html: Lee nuestra documentación sobre [configuración de una integración XWiki](docs_url) para obtener más información. oauth: openproject_oauth: OpenProject OAuth sections: - general_information: Detalles básicos + general_information: Información general oauth_configuration: Configuración de OAuth - url_caption: Añade la dirección host de tu plataforma wiki, incluyendo el https://. No debe superar los 255 caracteres. - xwiki_instance: Instancia XWiki + url_caption: The host address of your wiki platform including the https://. It should not be longer than 255 characters. xwiki: oauth: - openproject_oauth_description: Permita que XWiki acceda a los datos de OpenProject mediante una aplicación OAuth. Copie las credenciales que figuran a continuación en su instancia de XWiki. - provider_oauth: XWiki OAuth - provider_oauth_description: Permita que OpenProject acceda a los datos de XWiki mediante OAuth. Se genera automáticamente un ID de cliente para identificar a OpenProject ante XWiki; no es necesaria ninguna configuración manual por parte de XWiki. + openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. + provider_oauth: OAuth de wiki + provider_oauth_configuration: Copy these values to the [XWiki OIDC Connection client](xwiki_oidc_link). + provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. openproject_oauth_description: Permita que XWiki acceda a los datos de OpenProject utilizando un OAuth. xwiki_oauth: XWiki OAuth xwiki_oauth_description: Permita que OpenProject acceda a los datos de XWiki mediante OAuth. - macro: - page_not_found: La página wiki enlazada ya no está disponible + buttons: + connect_account: Conectar cuenta de %{provider} + done_continue: Hecho, continuar + open_wiki: Abrir wiki + save_and_continue: Guardar y continuar + wiki_page: Página wiki + create_new_wiki_page_dialog: + page_title: Title + parent_help_text: Select a parent for this new wiki page. + title: Create new wiki page + delete_relation_page_link_confirmation_dialog: + heading: "¿Eliminar el enlace a la página wiki relacionada?" + title: Eliminar el enlace a la página wiki relacionada + health_checks: + authentication: + existing_token: Token de usuario + header: Autentificación + user_bound_request: Autenticación de solicitud basada en el usuario + base_configuration: + header: Configuración + provider_configured: Configuración completada + errors: + not_configured: No se ha podido validar la conexión. Finalice primero la configuración. + xwiki_oauth_connection_error: OpenProject no ha podido conectarse a la instancia de XWiki configurada. + xwiki_oauth_request_error: Se ha producido un error inesperado al intentar conectarse con la instancia de XWiki. + xwiki_oauth_token_missing: OpenProject no puede comprobar la comunicación a nivel de usuario con XWiki, ya que aún no has vinculado tu cuenta de XWiki. + xwiki_oauth_unauthorized: XWiki no ha reconocido el token de usuario. + instructions: + xwiki: + integration: Administración de XWiki + oauth_application_details_html: No podrás volver a acceder al valor del secreto de cliente una vez que cierres esta ventana. Copia estos valores en la [configuración de integración de XWiki con OpenProject](xwiki_admin_link). + link_existing_wiki_page_dialog: + title: Añadir una página wiki ya existente + link_existing_wiki_page_form: + no_results: No wiki pages found + placeholder: Search for a wiki page + oauth_login_component: + connect_button: Conectar cuenta de %{provider} + description: Inicie sesión en %{provider} para ver y gestionar las páginas wiki relacionadas desde esta instancia de OpenProject. + heading: No conectado a %{provider} + page_link_component: + remove: Eliminar enlace de página + page_links: + errors: + page_access_forbidden: No tienes permiso para acceder a esta página wiki + page_not_found: La página wiki enlazada ya no está disponible + unexpected: Se ha producido un error desconocido + provider_types: + xwiki: + name: XWiki + relation_page_links_component: + empty_heading: No hay páginas relacionadas + empty_text: Añada manualmente enlaces a otras páginas wiki relacionadas. + link_existing: Página wiki ya existente + link_new: Nueva página wiki + work_package_wikis_tab_component: + inline_page_links: Enlaces a la página integrada + referencing_pages: Se hace referencia en diff --git a/modules/wikis/config/locales/crowdin/et.yml b/modules/wikis/config/locales/crowdin/et.yml index f37e7e74ba6..8a5b8623cc2 100644 --- a/modules/wikis/config/locales/crowdin/et.yml +++ b/modules/wikis/config/locales/crowdin/et.yml @@ -3,15 +3,17 @@ et: activerecord: attributes: wikis/page_link: + identifier: Identifier provider: Wiki Provider + wikis/provider: + name: Name + universal_identifier: Universal identifier wikis/xwiki_provider: authentication_method: Authentication method authentication_methods: oauth2_sso: Single-Sign-On through OpenID Connect Identity Provider two_way_oauth2: Two-way OAuth 2.0 authorization code flow - name: Name token_exchange_scope: XWiki Scope - universal_identifier: Universal identifier url: Instance URL wiki_audience: XWiki Audience errors: {} @@ -29,53 +31,30 @@ et: wikis/xwiki_provider: one: XWiki provider other: XWiki providers + menus: + admin: + external_wiki_providers: Wiki providers + internal_wiki_provider: Internal wiki + wikis: Wikis permission_manage_wiki_page_links: Manage Wiki Page Links project_module_wiki_platforms: Wiki providers wikis: - buttons: - connect_account: Connect %{provider} account - done_continue: Done, continue - save_and_continue: Save and continue - wiki_page: Wiki page - health_checks: - authentication: - existing_token: User token - header: Authentication - user_bound_request: User-based request authentication - base_configuration: - header: Configuration - provider_configured: Configuration complete - errors: - not_configured: The connection could not be validated. Please finish configuration first. - xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. - xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. - xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. - xwiki_oauth_unauthorized: The user token was not recognized by XWiki. - work_package_wikis_tab_component: - inline_page_links: Inline page links - referencing_pages: Referenced in - page_link_component: - remove: Remove page link - relation_page_links_component: - empty_heading: No related pages - empty_text: Manually add links to other related wiki pages. - oauth_login_component: - heading: Not connected to %{provider} - description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. - connect_button: Connect %{provider} account admin: destroy_confirmation_dialog_component: - title: Delete wiki provider - heading: Permanently delete this wiki provider? description_html: The wiki provider %{wiki_provider} and all the related wiki page links will be deleted. In addition, every inline wiki page link will no longer be accessible. This action is irreversible. + heading: Permanently delete this wiki provider? + title: Delete wiki provider forms: general_info_form_component: - xwiki_instance_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. + provider_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. oauth_application_form_component: - application_id: Application ID - application_secret: Application secret + application_id: OpenProject OAuth Application ID + application_secret: OpenProject OAuth Application secret oauth_client_form_component: - client_id: Client ID + client_id: Wiki OAuth Client ID + client_secret: Wiki OAuth Client secret + redirect_uri: Redirect URI + redirect_uri_caption: Copy this value into the Redirect URI field of your XWiki OIDC client registration. health_status: show: actions: @@ -86,13 +65,19 @@ et: no_health_report: No report available no_health_report_description: Run the checks now for a full health status report for this wiki provider. title: Health Report + internal_provider_form: + checkbox_caption: Allow projects to use the internal OpenProject wiki along with external Wiki providers + checkbox_label: Enable the internal OpenProject wiki + internal_wiki_provider: + show: + description: Choose to enable or disable the internal OpenProject wiki oauth_application_info_component: confirm_replace_oauth_application: This action will reset the current OAuth credentials. After confirming you will have to reenter the credentials in your XWiki instance and all users will have to reauthorize. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_application: Replace OpenProject OAuth application oauth_client_info_component: confirm_replace_oauth_client: This action will reset the current XWiki OAuth credentials. All users will need to reauthorize against XWiki. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_client: Replace XWiki OAuth application side_panel: health_status_component: @@ -110,25 +95,81 @@ et: index_description: Add an external wiki service to link work packages to existing wiki pages or create new ones directly from OpenProject. label_add_new: Add new wiki provider label_edit: Edit XWiki provider - label_new_xwiki_instance: New XWiki provider + label_new_provider: New XWiki provider label_wiki_platform: Wiki provider - name_caption: Give your storage a name so that users can differentiate between multiple wiki platforms. + name_caption: Give your wiki provider a name so that users can differentiate between multiple wiki platforms. name_placeholder: XWiki knowledge base new_provider_html: Read our documentation on [setting up an XWiki integration](docs_url) for more information. oauth: openproject_oauth: OpenProject OAuth sections: - general_information: Basic details + general_information: General information oauth_configuration: OAuth configuration - url_caption: Please add the host address of your wiki platform including the https://. It should not be longer than 255 characters. - xwiki_instance: XWiki Instance + url_caption: The host address of your wiki platform including the https://. It should not be longer than 255 characters. xwiki: oauth: - openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. Copy the credentials below into your XWiki instance. - provider_oauth: XWiki OAuth - provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. A client ID is automatically generated to identify OpenProject to XWiki — no manual configuration is needed on the XWiki side. + openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. + provider_oauth: Wiki OAuth + provider_oauth_configuration: Copy these values to the [XWiki OIDC Connection client](xwiki_oidc_link). + provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth. xwiki_oauth: XWiki OAuth xwiki_oauth_description: Allow OpenProject to access XWiki data using an OAuth. - macro: - page_not_found: Linked wiki page no longer available + buttons: + connect_account: Connect %{provider} account + done_continue: Done, continue + open_wiki: Open wiki + save_and_continue: Save and continue + wiki_page: Wiki page + create_new_wiki_page_dialog: + page_title: Title + parent_help_text: Select a parent for this new wiki page. + title: Create new wiki page + delete_relation_page_link_confirmation_dialog: + heading: Delete related wiki page link? + title: Delete related wiki page link + health_checks: + authentication: + existing_token: User token + header: Authentication + user_bound_request: User-based request authentication + base_configuration: + header: Configuration + provider_configured: Configuration complete + errors: + not_configured: The connection could not be validated. Please finish configuration first. + xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. + xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. + xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. + xwiki_oauth_unauthorized: The user token was not recognized by XWiki. + instructions: + xwiki: + integration: XWiki Administration + oauth_application_details_html: The client secret value will not be accessible again after you close this window. Please copy these values into the [XWiki OpenProject Integration settings](xwiki_admin_link). + link_existing_wiki_page_dialog: + title: Add existing wiki page + link_existing_wiki_page_form: + no_results: No wiki pages found + placeholder: Search for a wiki page + oauth_login_component: + connect_button: Connect %{provider} account + description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. + heading: Not connected to %{provider} + page_link_component: + remove: Remove page link + page_links: + errors: + page_access_forbidden: You do not have permission to access this wiki page + page_not_found: Linked wiki page no longer available + unexpected: An unexpected error occurred + provider_types: + xwiki: + name: XWiki + relation_page_links_component: + empty_heading: No related pages + empty_text: Manually add links to other related wiki pages. + link_existing: Existing wiki page + link_new: New wiki page + work_package_wikis_tab_component: + inline_page_links: Inline page links + referencing_pages: Referenced in diff --git a/modules/wikis/config/locales/crowdin/eu.yml b/modules/wikis/config/locales/crowdin/eu.yml index fed9323ad6e..e95eb573795 100644 --- a/modules/wikis/config/locales/crowdin/eu.yml +++ b/modules/wikis/config/locales/crowdin/eu.yml @@ -3,15 +3,17 @@ eu: activerecord: attributes: wikis/page_link: + identifier: Identifier provider: Wiki Provider + wikis/provider: + name: Name + universal_identifier: Universal identifier wikis/xwiki_provider: authentication_method: Authentication method authentication_methods: oauth2_sso: Single-Sign-On through OpenID Connect Identity Provider two_way_oauth2: Two-way OAuth 2.0 authorization code flow - name: Name token_exchange_scope: XWiki Scope - universal_identifier: Universal identifier url: Instance URL wiki_audience: XWiki Audience errors: {} @@ -29,53 +31,30 @@ eu: wikis/xwiki_provider: one: XWiki provider other: XWiki providers + menus: + admin: + external_wiki_providers: Wiki providers + internal_wiki_provider: Internal wiki + wikis: Wikis permission_manage_wiki_page_links: Manage Wiki Page Links project_module_wiki_platforms: Wiki providers wikis: - buttons: - connect_account: Connect %{provider} account - done_continue: Done, continue - save_and_continue: Save and continue - wiki_page: Wiki page - health_checks: - authentication: - existing_token: User token - header: Authentication - user_bound_request: User-based request authentication - base_configuration: - header: Configuration - provider_configured: Configuration complete - errors: - not_configured: The connection could not be validated. Please finish configuration first. - xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. - xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. - xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. - xwiki_oauth_unauthorized: The user token was not recognized by XWiki. - work_package_wikis_tab_component: - inline_page_links: Inline page links - referencing_pages: Referenced in - page_link_component: - remove: Remove page link - relation_page_links_component: - empty_heading: No related pages - empty_text: Manually add links to other related wiki pages. - oauth_login_component: - heading: Not connected to %{provider} - description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. - connect_button: Connect %{provider} account admin: destroy_confirmation_dialog_component: - title: Delete wiki provider - heading: Permanently delete this wiki provider? description_html: The wiki provider %{wiki_provider} and all the related wiki page links will be deleted. In addition, every inline wiki page link will no longer be accessible. This action is irreversible. + heading: Permanently delete this wiki provider? + title: Delete wiki provider forms: general_info_form_component: - xwiki_instance_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. + provider_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. oauth_application_form_component: - application_id: Application ID - application_secret: Application secret + application_id: OpenProject OAuth Application ID + application_secret: OpenProject OAuth Application secret oauth_client_form_component: - client_id: Client ID + client_id: Wiki OAuth Client ID + client_secret: Wiki OAuth Client secret + redirect_uri: Redirect URI + redirect_uri_caption: Copy this value into the Redirect URI field of your XWiki OIDC client registration. health_status: show: actions: @@ -86,13 +65,19 @@ eu: no_health_report: No report available no_health_report_description: Run the checks now for a full health status report for this wiki provider. title: Health Report + internal_provider_form: + checkbox_caption: Allow projects to use the internal OpenProject wiki along with external Wiki providers + checkbox_label: Enable the internal OpenProject wiki + internal_wiki_provider: + show: + description: Choose to enable or disable the internal OpenProject wiki oauth_application_info_component: confirm_replace_oauth_application: This action will reset the current OAuth credentials. After confirming you will have to reenter the credentials in your XWiki instance and all users will have to reauthorize. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_application: Replace OpenProject OAuth application oauth_client_info_component: confirm_replace_oauth_client: This action will reset the current XWiki OAuth credentials. All users will need to reauthorize against XWiki. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_client: Replace XWiki OAuth application side_panel: health_status_component: @@ -110,25 +95,81 @@ eu: index_description: Add an external wiki service to link work packages to existing wiki pages or create new ones directly from OpenProject. label_add_new: Add new wiki provider label_edit: Edit XWiki provider - label_new_xwiki_instance: New XWiki provider + label_new_provider: New XWiki provider label_wiki_platform: Wiki provider - name_caption: Give your storage a name so that users can differentiate between multiple wiki platforms. + name_caption: Give your wiki provider a name so that users can differentiate between multiple wiki platforms. name_placeholder: XWiki knowledge base new_provider_html: Read our documentation on [setting up an XWiki integration](docs_url) for more information. oauth: openproject_oauth: OpenProject OAuth sections: - general_information: Basic details + general_information: General information oauth_configuration: OAuth configuration - url_caption: Please add the host address of your wiki platform including the https://. It should not be longer than 255 characters. - xwiki_instance: XWiki Instance + url_caption: The host address of your wiki platform including the https://. It should not be longer than 255 characters. xwiki: oauth: - openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. Copy the credentials below into your XWiki instance. - provider_oauth: XWiki OAuth - provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. A client ID is automatically generated to identify OpenProject to XWiki — no manual configuration is needed on the XWiki side. + openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. + provider_oauth: Wiki OAuth + provider_oauth_configuration: Copy these values to the [XWiki OIDC Connection client](xwiki_oidc_link). + provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth. xwiki_oauth: XWiki OAuth xwiki_oauth_description: Allow OpenProject to access XWiki data using an OAuth. - macro: - page_not_found: Linked wiki page no longer available + buttons: + connect_account: Connect %{provider} account + done_continue: Done, continue + open_wiki: Open wiki + save_and_continue: Save and continue + wiki_page: Wiki page + create_new_wiki_page_dialog: + page_title: Title + parent_help_text: Select a parent for this new wiki page. + title: Create new wiki page + delete_relation_page_link_confirmation_dialog: + heading: Delete related wiki page link? + title: Delete related wiki page link + health_checks: + authentication: + existing_token: User token + header: Authentication + user_bound_request: User-based request authentication + base_configuration: + header: Configuration + provider_configured: Configuration complete + errors: + not_configured: The connection could not be validated. Please finish configuration first. + xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. + xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. + xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. + xwiki_oauth_unauthorized: The user token was not recognized by XWiki. + instructions: + xwiki: + integration: XWiki Administration + oauth_application_details_html: The client secret value will not be accessible again after you close this window. Please copy these values into the [XWiki OpenProject Integration settings](xwiki_admin_link). + link_existing_wiki_page_dialog: + title: Add existing wiki page + link_existing_wiki_page_form: + no_results: No wiki pages found + placeholder: Search for a wiki page + oauth_login_component: + connect_button: Connect %{provider} account + description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. + heading: Not connected to %{provider} + page_link_component: + remove: Remove page link + page_links: + errors: + page_access_forbidden: You do not have permission to access this wiki page + page_not_found: Linked wiki page no longer available + unexpected: An unexpected error occurred + provider_types: + xwiki: + name: XWiki + relation_page_links_component: + empty_heading: No related pages + empty_text: Manually add links to other related wiki pages. + link_existing: Existing wiki page + link_new: New wiki page + work_package_wikis_tab_component: + inline_page_links: Inline page links + referencing_pages: Referenced in diff --git a/modules/wikis/config/locales/crowdin/fa.yml b/modules/wikis/config/locales/crowdin/fa.yml index bbc5788bab5..e7f9bd1b24a 100644 --- a/modules/wikis/config/locales/crowdin/fa.yml +++ b/modules/wikis/config/locales/crowdin/fa.yml @@ -3,15 +3,17 @@ fa: activerecord: attributes: wikis/page_link: + identifier: Identifier provider: Wiki Provider + wikis/provider: + name: Name + universal_identifier: Universal identifier wikis/xwiki_provider: authentication_method: Authentication method authentication_methods: oauth2_sso: Single-Sign-On through OpenID Connect Identity Provider two_way_oauth2: Two-way OAuth 2.0 authorization code flow - name: Name token_exchange_scope: XWiki Scope - universal_identifier: Universal identifier url: Instance URL wiki_audience: XWiki Audience errors: {} @@ -29,53 +31,30 @@ fa: wikis/xwiki_provider: one: XWiki provider other: XWiki providers + menus: + admin: + external_wiki_providers: Wiki providers + internal_wiki_provider: Internal wiki + wikis: Wikis permission_manage_wiki_page_links: Manage Wiki Page Links project_module_wiki_platforms: Wiki providers wikis: - buttons: - connect_account: Connect %{provider} account - done_continue: Done, continue - save_and_continue: Save and continue - wiki_page: Wiki page - health_checks: - authentication: - existing_token: User token - header: Authentication - user_bound_request: User-based request authentication - base_configuration: - header: Configuration - provider_configured: Configuration complete - errors: - not_configured: The connection could not be validated. Please finish configuration first. - xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. - xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. - xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. - xwiki_oauth_unauthorized: The user token was not recognized by XWiki. - work_package_wikis_tab_component: - inline_page_links: Inline page links - referencing_pages: Referenced in - page_link_component: - remove: Remove page link - relation_page_links_component: - empty_heading: No related pages - empty_text: Manually add links to other related wiki pages. - oauth_login_component: - heading: Not connected to %{provider} - description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. - connect_button: Connect %{provider} account admin: destroy_confirmation_dialog_component: - title: Delete wiki provider - heading: Permanently delete this wiki provider? description_html: The wiki provider %{wiki_provider} and all the related wiki page links will be deleted. In addition, every inline wiki page link will no longer be accessible. This action is irreversible. + heading: Permanently delete this wiki provider? + title: Delete wiki provider forms: general_info_form_component: - xwiki_instance_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. + provider_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. oauth_application_form_component: - application_id: Application ID - application_secret: Application secret + application_id: OpenProject OAuth Application ID + application_secret: OpenProject OAuth Application secret oauth_client_form_component: - client_id: Client ID + client_id: Wiki OAuth Client ID + client_secret: Wiki OAuth Client secret + redirect_uri: Redirect URI + redirect_uri_caption: Copy this value into the Redirect URI field of your XWiki OIDC client registration. health_status: show: actions: @@ -86,13 +65,19 @@ fa: no_health_report: No report available no_health_report_description: Run the checks now for a full health status report for this wiki provider. title: Health Report + internal_provider_form: + checkbox_caption: Allow projects to use the internal OpenProject wiki along with external Wiki providers + checkbox_label: Enable the internal OpenProject wiki + internal_wiki_provider: + show: + description: Choose to enable or disable the internal OpenProject wiki oauth_application_info_component: confirm_replace_oauth_application: This action will reset the current OAuth credentials. After confirming you will have to reenter the credentials in your XWiki instance and all users will have to reauthorize. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_application: Replace OpenProject OAuth application oauth_client_info_component: confirm_replace_oauth_client: This action will reset the current XWiki OAuth credentials. All users will need to reauthorize against XWiki. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_client: Replace XWiki OAuth application side_panel: health_status_component: @@ -110,25 +95,81 @@ fa: index_description: Add an external wiki service to link work packages to existing wiki pages or create new ones directly from OpenProject. label_add_new: Add new wiki provider label_edit: Edit XWiki provider - label_new_xwiki_instance: New XWiki provider + label_new_provider: New XWiki provider label_wiki_platform: Wiki provider - name_caption: Give your storage a name so that users can differentiate between multiple wiki platforms. + name_caption: Give your wiki provider a name so that users can differentiate between multiple wiki platforms. name_placeholder: XWiki knowledge base new_provider_html: Read our documentation on [setting up an XWiki integration](docs_url) for more information. oauth: openproject_oauth: OpenProject OAuth sections: - general_information: Basic details + general_information: General information oauth_configuration: OAuth configuration - url_caption: Please add the host address of your wiki platform including the https://. It should not be longer than 255 characters. - xwiki_instance: XWiki Instance + url_caption: The host address of your wiki platform including the https://. It should not be longer than 255 characters. xwiki: oauth: - openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. Copy the credentials below into your XWiki instance. - provider_oauth: XWiki OAuth - provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. A client ID is automatically generated to identify OpenProject to XWiki — no manual configuration is needed on the XWiki side. + openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. + provider_oauth: Wiki OAuth + provider_oauth_configuration: Copy these values to the [XWiki OIDC Connection client](xwiki_oidc_link). + provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth. xwiki_oauth: XWiki OAuth xwiki_oauth_description: Allow OpenProject to access XWiki data using an OAuth. - macro: - page_not_found: Linked wiki page no longer available + buttons: + connect_account: Connect %{provider} account + done_continue: Done, continue + open_wiki: Open wiki + save_and_continue: Save and continue + wiki_page: Wiki page + create_new_wiki_page_dialog: + page_title: Title + parent_help_text: Select a parent for this new wiki page. + title: Create new wiki page + delete_relation_page_link_confirmation_dialog: + heading: Delete related wiki page link? + title: Delete related wiki page link + health_checks: + authentication: + existing_token: User token + header: Authentication + user_bound_request: User-based request authentication + base_configuration: + header: Configuration + provider_configured: Configuration complete + errors: + not_configured: The connection could not be validated. Please finish configuration first. + xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. + xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. + xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. + xwiki_oauth_unauthorized: The user token was not recognized by XWiki. + instructions: + xwiki: + integration: XWiki Administration + oauth_application_details_html: The client secret value will not be accessible again after you close this window. Please copy these values into the [XWiki OpenProject Integration settings](xwiki_admin_link). + link_existing_wiki_page_dialog: + title: Add existing wiki page + link_existing_wiki_page_form: + no_results: No wiki pages found + placeholder: Search for a wiki page + oauth_login_component: + connect_button: Connect %{provider} account + description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. + heading: Not connected to %{provider} + page_link_component: + remove: Remove page link + page_links: + errors: + page_access_forbidden: You do not have permission to access this wiki page + page_not_found: Linked wiki page no longer available + unexpected: An unexpected error occurred + provider_types: + xwiki: + name: XWiki + relation_page_links_component: + empty_heading: No related pages + empty_text: Manually add links to other related wiki pages. + link_existing: Existing wiki page + link_new: New wiki page + work_package_wikis_tab_component: + inline_page_links: Inline page links + referencing_pages: Referenced in diff --git a/modules/wikis/config/locales/crowdin/fi.yml b/modules/wikis/config/locales/crowdin/fi.yml index 649d1df9192..fd1c0c98161 100644 --- a/modules/wikis/config/locales/crowdin/fi.yml +++ b/modules/wikis/config/locales/crowdin/fi.yml @@ -3,15 +3,17 @@ fi: activerecord: attributes: wikis/page_link: + identifier: Identifier provider: Wiki Provider + wikis/provider: + name: Name + universal_identifier: Universal identifier wikis/xwiki_provider: authentication_method: Authentication method authentication_methods: oauth2_sso: Single-Sign-On through OpenID Connect Identity Provider two_way_oauth2: Two-way OAuth 2.0 authorization code flow - name: Name token_exchange_scope: XWiki Scope - universal_identifier: Universal identifier url: Instance URL wiki_audience: XWiki Audience errors: {} @@ -29,53 +31,30 @@ fi: wikis/xwiki_provider: one: XWiki provider other: XWiki providers + menus: + admin: + external_wiki_providers: Wiki providers + internal_wiki_provider: Internal wiki + wikis: Wikis permission_manage_wiki_page_links: Manage Wiki Page Links project_module_wiki_platforms: Wiki providers wikis: - buttons: - connect_account: Connect %{provider} account - done_continue: Done, continue - save_and_continue: Save and continue - wiki_page: Wiki page - health_checks: - authentication: - existing_token: User token - header: Authentication - user_bound_request: User-based request authentication - base_configuration: - header: Configuration - provider_configured: Configuration complete - errors: - not_configured: The connection could not be validated. Please finish configuration first. - xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. - xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. - xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. - xwiki_oauth_unauthorized: The user token was not recognized by XWiki. - work_package_wikis_tab_component: - inline_page_links: Inline page links - referencing_pages: Referenced in - page_link_component: - remove: Remove page link - relation_page_links_component: - empty_heading: No related pages - empty_text: Manually add links to other related wiki pages. - oauth_login_component: - heading: Not connected to %{provider} - description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. - connect_button: Connect %{provider} account admin: destroy_confirmation_dialog_component: - title: Delete wiki provider - heading: Permanently delete this wiki provider? description_html: The wiki provider %{wiki_provider} and all the related wiki page links will be deleted. In addition, every inline wiki page link will no longer be accessible. This action is irreversible. + heading: Permanently delete this wiki provider? + title: Delete wiki provider forms: general_info_form_component: - xwiki_instance_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. + provider_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. oauth_application_form_component: - application_id: Application ID - application_secret: Application secret + application_id: OpenProject OAuth Application ID + application_secret: OpenProject OAuth Application secret oauth_client_form_component: - client_id: Client ID + client_id: Wiki OAuth Client ID + client_secret: Wiki OAuth Client secret + redirect_uri: Redirect URI + redirect_uri_caption: Copy this value into the Redirect URI field of your XWiki OIDC client registration. health_status: show: actions: @@ -86,13 +65,19 @@ fi: no_health_report: No report available no_health_report_description: Run the checks now for a full health status report for this wiki provider. title: Health Report + internal_provider_form: + checkbox_caption: Allow projects to use the internal OpenProject wiki along with external Wiki providers + checkbox_label: Enable the internal OpenProject wiki + internal_wiki_provider: + show: + description: Choose to enable or disable the internal OpenProject wiki oauth_application_info_component: confirm_replace_oauth_application: This action will reset the current OAuth credentials. After confirming you will have to reenter the credentials in your XWiki instance and all users will have to reauthorize. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_application: Replace OpenProject OAuth application oauth_client_info_component: confirm_replace_oauth_client: This action will reset the current XWiki OAuth credentials. All users will need to reauthorize against XWiki. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_client: Replace XWiki OAuth application side_panel: health_status_component: @@ -110,25 +95,81 @@ fi: index_description: Add an external wiki service to link work packages to existing wiki pages or create new ones directly from OpenProject. label_add_new: Add new wiki provider label_edit: Edit XWiki provider - label_new_xwiki_instance: New XWiki provider + label_new_provider: New XWiki provider label_wiki_platform: Wiki provider - name_caption: Give your storage a name so that users can differentiate between multiple wiki platforms. + name_caption: Give your wiki provider a name so that users can differentiate between multiple wiki platforms. name_placeholder: XWiki knowledge base new_provider_html: Read our documentation on [setting up an XWiki integration](docs_url) for more information. oauth: openproject_oauth: OpenProject OAuth sections: - general_information: Basic details + general_information: General information oauth_configuration: OAuth configuration - url_caption: Please add the host address of your wiki platform including the https://. It should not be longer than 255 characters. - xwiki_instance: XWiki Instance + url_caption: The host address of your wiki platform including the https://. It should not be longer than 255 characters. xwiki: oauth: - openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. Copy the credentials below into your XWiki instance. - provider_oauth: XWiki OAuth - provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. A client ID is automatically generated to identify OpenProject to XWiki — no manual configuration is needed on the XWiki side. + openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. + provider_oauth: Wiki OAuth + provider_oauth_configuration: Copy these values to the [XWiki OIDC Connection client](xwiki_oidc_link). + provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth. xwiki_oauth: XWiki OAuth xwiki_oauth_description: Allow OpenProject to access XWiki data using an OAuth. - macro: - page_not_found: Linked wiki page no longer available + buttons: + connect_account: Connect %{provider} account + done_continue: Done, continue + open_wiki: Open wiki + save_and_continue: Save and continue + wiki_page: Wiki page + create_new_wiki_page_dialog: + page_title: Title + parent_help_text: Select a parent for this new wiki page. + title: Create new wiki page + delete_relation_page_link_confirmation_dialog: + heading: Delete related wiki page link? + title: Delete related wiki page link + health_checks: + authentication: + existing_token: User token + header: Authentication + user_bound_request: User-based request authentication + base_configuration: + header: Configuration + provider_configured: Configuration complete + errors: + not_configured: The connection could not be validated. Please finish configuration first. + xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. + xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. + xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. + xwiki_oauth_unauthorized: The user token was not recognized by XWiki. + instructions: + xwiki: + integration: XWiki Administration + oauth_application_details_html: The client secret value will not be accessible again after you close this window. Please copy these values into the [XWiki OpenProject Integration settings](xwiki_admin_link). + link_existing_wiki_page_dialog: + title: Add existing wiki page + link_existing_wiki_page_form: + no_results: No wiki pages found + placeholder: Search for a wiki page + oauth_login_component: + connect_button: Connect %{provider} account + description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. + heading: Not connected to %{provider} + page_link_component: + remove: Remove page link + page_links: + errors: + page_access_forbidden: You do not have permission to access this wiki page + page_not_found: Linked wiki page no longer available + unexpected: An unexpected error occurred + provider_types: + xwiki: + name: XWiki + relation_page_links_component: + empty_heading: No related pages + empty_text: Manually add links to other related wiki pages. + link_existing: Existing wiki page + link_new: New wiki page + work_package_wikis_tab_component: + inline_page_links: Inline page links + referencing_pages: Referenced in diff --git a/modules/wikis/config/locales/crowdin/fil.yml b/modules/wikis/config/locales/crowdin/fil.yml index fb5b3e50877..0f2f0637875 100644 --- a/modules/wikis/config/locales/crowdin/fil.yml +++ b/modules/wikis/config/locales/crowdin/fil.yml @@ -3,15 +3,17 @@ fil: activerecord: attributes: wikis/page_link: + identifier: Identifier provider: Wiki Provider + wikis/provider: + name: Name + universal_identifier: Universal identifier wikis/xwiki_provider: authentication_method: Authentication method authentication_methods: oauth2_sso: Single-Sign-On through OpenID Connect Identity Provider two_way_oauth2: Two-way OAuth 2.0 authorization code flow - name: Name token_exchange_scope: XWiki Scope - universal_identifier: Universal identifier url: Instance URL wiki_audience: XWiki Audience errors: {} @@ -29,53 +31,30 @@ fil: wikis/xwiki_provider: one: XWiki provider other: XWiki providers + menus: + admin: + external_wiki_providers: Wiki providers + internal_wiki_provider: Internal wiki + wikis: Wikis permission_manage_wiki_page_links: Manage Wiki Page Links project_module_wiki_platforms: Wiki providers wikis: - buttons: - connect_account: Connect %{provider} account - done_continue: Done, continue - save_and_continue: Save and continue - wiki_page: Wiki page - health_checks: - authentication: - existing_token: User token - header: Authentication - user_bound_request: User-based request authentication - base_configuration: - header: Configuration - provider_configured: Configuration complete - errors: - not_configured: The connection could not be validated. Please finish configuration first. - xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. - xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. - xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. - xwiki_oauth_unauthorized: The user token was not recognized by XWiki. - work_package_wikis_tab_component: - inline_page_links: Inline page links - referencing_pages: Referenced in - page_link_component: - remove: Remove page link - relation_page_links_component: - empty_heading: No related pages - empty_text: Manually add links to other related wiki pages. - oauth_login_component: - heading: Not connected to %{provider} - description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. - connect_button: Connect %{provider} account admin: destroy_confirmation_dialog_component: - title: Delete wiki provider - heading: Permanently delete this wiki provider? description_html: The wiki provider %{wiki_provider} and all the related wiki page links will be deleted. In addition, every inline wiki page link will no longer be accessible. This action is irreversible. + heading: Permanently delete this wiki provider? + title: Delete wiki provider forms: general_info_form_component: - xwiki_instance_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. + provider_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. oauth_application_form_component: - application_id: Application ID - application_secret: Application secret + application_id: OpenProject OAuth Application ID + application_secret: OpenProject OAuth Application secret oauth_client_form_component: - client_id: Client ID + client_id: Wiki OAuth Client ID + client_secret: Wiki OAuth Client secret + redirect_uri: Redirect URI + redirect_uri_caption: Copy this value into the Redirect URI field of your XWiki OIDC client registration. health_status: show: actions: @@ -86,13 +65,19 @@ fil: no_health_report: No report available no_health_report_description: Run the checks now for a full health status report for this wiki provider. title: Health Report + internal_provider_form: + checkbox_caption: Allow projects to use the internal OpenProject wiki along with external Wiki providers + checkbox_label: Enable the internal OpenProject wiki + internal_wiki_provider: + show: + description: Choose to enable or disable the internal OpenProject wiki oauth_application_info_component: confirm_replace_oauth_application: This action will reset the current OAuth credentials. After confirming you will have to reenter the credentials in your XWiki instance and all users will have to reauthorize. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_application: Replace OpenProject OAuth application oauth_client_info_component: confirm_replace_oauth_client: This action will reset the current XWiki OAuth credentials. All users will need to reauthorize against XWiki. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_client: Replace XWiki OAuth application side_panel: health_status_component: @@ -110,25 +95,81 @@ fil: index_description: Add an external wiki service to link work packages to existing wiki pages or create new ones directly from OpenProject. label_add_new: Add new wiki provider label_edit: Edit XWiki provider - label_new_xwiki_instance: New XWiki provider + label_new_provider: New XWiki provider label_wiki_platform: Wiki provider - name_caption: Give your storage a name so that users can differentiate between multiple wiki platforms. + name_caption: Give your wiki provider a name so that users can differentiate between multiple wiki platforms. name_placeholder: XWiki knowledge base new_provider_html: Read our documentation on [setting up an XWiki integration](docs_url) for more information. oauth: openproject_oauth: OpenProject OAuth sections: - general_information: Basic details + general_information: General information oauth_configuration: OAuth configuration - url_caption: Please add the host address of your wiki platform including the https://. It should not be longer than 255 characters. - xwiki_instance: XWiki Instance + url_caption: The host address of your wiki platform including the https://. It should not be longer than 255 characters. xwiki: oauth: - openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. Copy the credentials below into your XWiki instance. - provider_oauth: XWiki OAuth - provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. A client ID is automatically generated to identify OpenProject to XWiki — no manual configuration is needed on the XWiki side. + openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. + provider_oauth: Wiki OAuth + provider_oauth_configuration: Copy these values to the [XWiki OIDC Connection client](xwiki_oidc_link). + provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth. xwiki_oauth: XWiki OAuth xwiki_oauth_description: Allow OpenProject to access XWiki data using an OAuth. - macro: - page_not_found: Linked wiki page no longer available + buttons: + connect_account: Connect %{provider} account + done_continue: Done, continue + open_wiki: Open wiki + save_and_continue: Save and continue + wiki_page: Wiki page + create_new_wiki_page_dialog: + page_title: Title + parent_help_text: Select a parent for this new wiki page. + title: Create new wiki page + delete_relation_page_link_confirmation_dialog: + heading: Delete related wiki page link? + title: Delete related wiki page link + health_checks: + authentication: + existing_token: User token + header: Authentication + user_bound_request: User-based request authentication + base_configuration: + header: Configuration + provider_configured: Configuration complete + errors: + not_configured: The connection could not be validated. Please finish configuration first. + xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. + xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. + xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. + xwiki_oauth_unauthorized: The user token was not recognized by XWiki. + instructions: + xwiki: + integration: XWiki Administration + oauth_application_details_html: The client secret value will not be accessible again after you close this window. Please copy these values into the [XWiki OpenProject Integration settings](xwiki_admin_link). + link_existing_wiki_page_dialog: + title: Add existing wiki page + link_existing_wiki_page_form: + no_results: No wiki pages found + placeholder: Search for a wiki page + oauth_login_component: + connect_button: Connect %{provider} account + description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. + heading: Not connected to %{provider} + page_link_component: + remove: Remove page link + page_links: + errors: + page_access_forbidden: You do not have permission to access this wiki page + page_not_found: Linked wiki page no longer available + unexpected: An unexpected error occurred + provider_types: + xwiki: + name: XWiki + relation_page_links_component: + empty_heading: No related pages + empty_text: Manually add links to other related wiki pages. + link_existing: Existing wiki page + link_new: New wiki page + work_package_wikis_tab_component: + inline_page_links: Inline page links + referencing_pages: Referenced in diff --git a/modules/wikis/config/locales/crowdin/fr.yml b/modules/wikis/config/locales/crowdin/fr.yml index 4257bfcbe5f..48506ef37fd 100644 --- a/modules/wikis/config/locales/crowdin/fr.yml +++ b/modules/wikis/config/locales/crowdin/fr.yml @@ -3,15 +3,17 @@ fr: activerecord: attributes: wikis/page_link: + identifier: Identifiant provider: Fournisseur de wiki + wikis/provider: + name: Nom + universal_identifier: Identifiant universel wikis/xwiki_provider: authentication_method: Méthode d'authentification authentication_methods: oauth2_sso: Authentification unique via le fournisseur d'identité OpenID Connect two_way_oauth2: Flux d'autorisation OAuth 2.0 bidirectionnel par code d'autorisation - name: Nom token_exchange_scope: Portée XWiki - universal_identifier: Identifiant universel url: URL de l'instance wiki_audience: Audience de XWiki errors: {} @@ -29,53 +31,30 @@ fr: wikis/xwiki_provider: one: Fournisseur XWiki other: Fournisseur XWiki + menus: + admin: + external_wiki_providers: Wiki providers + internal_wiki_provider: Internal wiki + wikis: Wikis permission_manage_wiki_page_links: Gérer les liens de la page wiki project_module_wiki_platforms: Fournisseurs de wiki wikis: - buttons: - connect_account: Connectez votre compte %{provider} - done_continue: Terminé, continuer - save_and_continue: Enregistrer et continuer - wiki_page: Page wiki - health_checks: - authentication: - existing_token: Jeton d'utilisateur - header: Authentification - user_bound_request: Authentification des requêtes basée sur l’utilisateur - base_configuration: - header: Configuration - provider_configured: Configuration terminée - errors: - not_configured: La connexion n'a pas pu être validée. Veuillez d'abord terminer la configuration. - xwiki_oauth_connection_error: OpenProject n'a pas pu se connecter à l'instance XWiki configurée. - xwiki_oauth_request_error: Une erreur inattendue s'est produite lors de la communication avec l'instance XWiki. - xwiki_oauth_token_missing: OpenProject ne peut pas tester la communication au niveau de l'utilisateur avec XWiki car l'utilisateur n'a pas encore connecté son compte XWiki. - xwiki_oauth_unauthorized: Le jeton d'utilisateur n'a pas été reconnu par XWiki. - work_package_wikis_tab_component: - inline_page_links: Liens intégrés dans la page - referencing_pages: Référencé dans - page_link_component: - remove: Supprimer le lien de la page - relation_page_links_component: - empty_heading: Aucune page liée - empty_text: Ajoutez manuellement des liens vers d'autres pages wiki liées. - oauth_login_component: - heading: Non connecté à %{provider} - description: Connectez-vous à %{provider} pour voir et gérer les pages wiki liées à cette instance d'OpenProject. - connect_button: Connecter le compte %{provider} admin: destroy_confirmation_dialog_component: - title: Supprimer le fournisseur de wiki - heading: Supprimer définitivement ce fournisseur wiki ? description_html: Le fournisseur du wiki %{wiki_provider} et tous les liens de la page wiki correspondante seront supprimés. En outre, chaque lien de page wiki en ligne ne sera plus accessible. Cette action est irréversible. + heading: Supprimer définitivement ce fournisseur wiki ? + title: Supprimer le fournisseur de wiki forms: general_info_form_component: - xwiki_instance_description: Veuillez vous assurer que vous disposez des privilèges d'administration dans votre instance XWiki avant de procéder à l'installation. + provider_description: Veuillez vous assurer que vous disposez des privilèges d'administration dans votre instance XWiki avant de procéder à l'installation. oauth_application_form_component: - application_id: ID de l'application - application_secret: Secret de l'application + application_id: ID de l'application OAuth OpenProject + application_secret: Secret de l'application OAuth OpenProject oauth_client_form_component: - client_id: ID du client + client_id: ID du client OAuth du wiki + client_secret: Secret du client OAuth du wiki + redirect_uri: URI de redirection + redirect_uri_caption: Copiez cette valeur dans le champ URI de redirection de l'enregistrement de votre client OIDC XWiki. health_status: show: actions: @@ -86,13 +65,19 @@ fr: no_health_report: Aucun rapport disponible no_health_report_description: Lancez les contrôles maintenant pour obtenir un rapport complet sur l'état de santé de ce fournisseur wiki. title: Bilan de santé + internal_provider_form: + checkbox_caption: Allow projects to use the internal OpenProject wiki along with external Wiki providers + checkbox_label: Enable the internal OpenProject wiki + internal_wiki_provider: + show: + description: Choose to enable or disable the internal OpenProject wiki oauth_application_info_component: confirm_replace_oauth_application: Cette action réinitialisera les informations d'identification OAuth actuelles. Après confirmation, vous devrez saisir à nouveau les informations d'identification dans votre instance XWiki et tous les utilisateurs devront se réautoriser. Voulez-vous vraiment continuer ? - label_pending: En attente + label_oauth_client_id: ID client OAuth replace_oauth_application: Remplacer l'application OpenProject OAuth oauth_client_info_component: confirm_replace_oauth_client: Cette action réinitialisera les identifiants XWiki OAuth actuels. Tous les utilisateurs devront réautoriser sur XWiki. Voulez-vous vraiment continuer ? - label_pending: En attente + label_oauth_client_id: ID client OAuth replace_oauth_client: Remplacer l'application XWiki OAuth side_panel: health_status_component: @@ -110,25 +95,81 @@ fr: index_description: Ajoutez un service wiki externe pour lier les lots de travaux à des pages wiki existantes ou en créer de nouvelles directement à partir d'OpenProject. label_add_new: Ajouter un nouveau fournisseur de wiki label_edit: Modifier le fournisseur XWiki - label_new_xwiki_instance: Nouveau fournisseur XWiki + label_new_provider: Nouveau fournisseur XWiki label_wiki_platform: Fournisseur de wiki - name_caption: Donnez à votre espace de stockage un nom pour permettre aux utilisateurs de le différencier des autres plateformes de wiki. + name_caption: Give your wiki provider a name so that users can differentiate between multiple wiki platforms. name_placeholder: Base de connaissances XWiki new_provider_html: Lisez notre documentation sur [la configuration d'une intégration XWiki](docs_url) pour en savoir plus. oauth: openproject_oauth: OAuth OpenProject sections: - general_information: Informations de base + general_information: Informations générales oauth_configuration: Configuration OAuth - url_caption: Veuillez ajouter l'adresse d'hôte de votre plateforme wiki, y compris le https://. Elle ne doit pas dépasser 255 caractères. - xwiki_instance: Instance XWiki + url_caption: The host address of your wiki platform including the https://. It should not be longer than 255 characters. xwiki: oauth: - openproject_oauth_description: Permettre à XWiki d'accéder aux données d'OpenProject en utilisant une application OAuth. Copiez les informations d'identification ci-dessous dans votre instance XWiki. - provider_oauth: XWiki OAuth - provider_oauth_description: Permet à OpenProject d'accéder aux données de XWiki en utilisant OAuth. Un identifiant client est automatiquement généré pour identifier OpenProject auprès de XWiki. Aucune configuration manuelle n'est nécessaire du côté de XWiki. + openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. + provider_oauth: OAuth du wiki + provider_oauth_configuration: Copy these values to the [XWiki OIDC Connection client](xwiki_oidc_link). + provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. openproject_oauth_description: Autoriser XWiki à accéder aux données d'OpenProject via OAuth. xwiki_oauth: XWiki OAuth xwiki_oauth_description: Autoriser OpenProject à accéder aux données XWiki via OAuth. - macro: - page_not_found: La page wiki liée n'est plus disponible + buttons: + connect_account: Connectez votre compte %{provider} + done_continue: Terminé, continuer + open_wiki: Ouvrir le wiki + save_and_continue: Enregistrer et continuer + wiki_page: Page wiki + create_new_wiki_page_dialog: + page_title: Title + parent_help_text: Select a parent for this new wiki page. + title: Create new wiki page + delete_relation_page_link_confirmation_dialog: + heading: Supprimer le lien vers la page wiki associée ? + title: Supprimer le lien vers la page wiki associée + health_checks: + authentication: + existing_token: Jeton d'utilisateur + header: Authentification + user_bound_request: Authentification des requêtes basée sur l’utilisateur + base_configuration: + header: Configuration + provider_configured: Configuration terminée + errors: + not_configured: La connexion n'a pas pu être validée. Veuillez d'abord terminer la configuration. + xwiki_oauth_connection_error: OpenProject n'a pas pu se connecter à l'instance XWiki configurée. + xwiki_oauth_request_error: Une erreur inattendue s'est produite lors de la communication avec l'instance XWiki. + xwiki_oauth_token_missing: OpenProject ne peut pas tester la communication au niveau de l'utilisateur avec XWiki car l'utilisateur n'a pas encore connecté son compte XWiki. + xwiki_oauth_unauthorized: Le jeton d'utilisateur n'a pas été reconnu par XWiki. + instructions: + xwiki: + integration: Administration de XWiki + oauth_application_details_html: La valeur du secret client ne sera plus accessible après la fermeture de cette fenêtre. Veuillez copier ces valeurs dans les [paramètres de l'intégration XWiki OpenProject](xwiki_admin_link). + link_existing_wiki_page_dialog: + title: Ajouter une page wiki existante + link_existing_wiki_page_form: + no_results: No wiki pages found + placeholder: Search for a wiki page + oauth_login_component: + connect_button: Connecter le compte %{provider} + description: Connectez-vous à %{provider} pour voir et gérer les pages wiki liées à cette instance d'OpenProject. + heading: Non connecté à %{provider} + page_link_component: + remove: Supprimer le lien de la page + page_links: + errors: + page_access_forbidden: Vous n'avez pas l'autorisation d'accéder à cette page wiki + page_not_found: La page wiki liée n'est plus disponible + unexpected: Une erreur inattendue s'est produite + provider_types: + xwiki: + name: XWiki + relation_page_links_component: + empty_heading: Aucune page liée + empty_text: Ajoutez manuellement des liens vers d'autres pages wiki liées. + link_existing: Page wiki existante + link_new: Nouvelle page wiki + work_package_wikis_tab_component: + inline_page_links: Liens intégrés dans la page + referencing_pages: Référencé dans diff --git a/modules/wikis/config/locales/crowdin/he.yml b/modules/wikis/config/locales/crowdin/he.yml index 6c8fd2a6d4d..9b7920755de 100644 --- a/modules/wikis/config/locales/crowdin/he.yml +++ b/modules/wikis/config/locales/crowdin/he.yml @@ -3,15 +3,17 @@ he: activerecord: attributes: wikis/page_link: + identifier: Identifier provider: Wiki Provider + wikis/provider: + name: Name + universal_identifier: Universal identifier wikis/xwiki_provider: authentication_method: Authentication method authentication_methods: oauth2_sso: Single-Sign-On through OpenID Connect Identity Provider two_way_oauth2: Two-way OAuth 2.0 authorization code flow - name: Name token_exchange_scope: XWiki Scope - universal_identifier: Universal identifier url: Instance URL wiki_audience: XWiki Audience errors: {} @@ -37,53 +39,30 @@ he: two: XWiki providers many: XWiki providers other: XWiki providers + menus: + admin: + external_wiki_providers: Wiki providers + internal_wiki_provider: Internal wiki + wikis: Wikis permission_manage_wiki_page_links: Manage Wiki Page Links project_module_wiki_platforms: Wiki providers wikis: - buttons: - connect_account: Connect %{provider} account - done_continue: Done, continue - save_and_continue: Save and continue - wiki_page: Wiki page - health_checks: - authentication: - existing_token: User token - header: Authentication - user_bound_request: User-based request authentication - base_configuration: - header: Configuration - provider_configured: Configuration complete - errors: - not_configured: The connection could not be validated. Please finish configuration first. - xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. - xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. - xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. - xwiki_oauth_unauthorized: The user token was not recognized by XWiki. - work_package_wikis_tab_component: - inline_page_links: Inline page links - referencing_pages: Referenced in - page_link_component: - remove: Remove page link - relation_page_links_component: - empty_heading: No related pages - empty_text: Manually add links to other related wiki pages. - oauth_login_component: - heading: Not connected to %{provider} - description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. - connect_button: Connect %{provider} account admin: destroy_confirmation_dialog_component: - title: Delete wiki provider - heading: Permanently delete this wiki provider? description_html: The wiki provider %{wiki_provider} and all the related wiki page links will be deleted. In addition, every inline wiki page link will no longer be accessible. This action is irreversible. + heading: Permanently delete this wiki provider? + title: Delete wiki provider forms: general_info_form_component: - xwiki_instance_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. + provider_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. oauth_application_form_component: - application_id: Application ID - application_secret: Application secret + application_id: OpenProject OAuth Application ID + application_secret: OpenProject OAuth Application secret oauth_client_form_component: - client_id: Client ID + client_id: Wiki OAuth Client ID + client_secret: Wiki OAuth Client secret + redirect_uri: Redirect URI + redirect_uri_caption: Copy this value into the Redirect URI field of your XWiki OIDC client registration. health_status: show: actions: @@ -94,13 +73,19 @@ he: no_health_report: No report available no_health_report_description: Run the checks now for a full health status report for this wiki provider. title: Health Report + internal_provider_form: + checkbox_caption: Allow projects to use the internal OpenProject wiki along with external Wiki providers + checkbox_label: Enable the internal OpenProject wiki + internal_wiki_provider: + show: + description: Choose to enable or disable the internal OpenProject wiki oauth_application_info_component: confirm_replace_oauth_application: This action will reset the current OAuth credentials. After confirming you will have to reenter the credentials in your XWiki instance and all users will have to reauthorize. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_application: Replace OpenProject OAuth application oauth_client_info_component: confirm_replace_oauth_client: This action will reset the current XWiki OAuth credentials. All users will need to reauthorize against XWiki. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_client: Replace XWiki OAuth application side_panel: health_status_component: @@ -118,25 +103,81 @@ he: index_description: Add an external wiki service to link work packages to existing wiki pages or create new ones directly from OpenProject. label_add_new: Add new wiki provider label_edit: Edit XWiki provider - label_new_xwiki_instance: New XWiki provider + label_new_provider: New XWiki provider label_wiki_platform: Wiki provider - name_caption: Give your storage a name so that users can differentiate between multiple wiki platforms. + name_caption: Give your wiki provider a name so that users can differentiate between multiple wiki platforms. name_placeholder: XWiki knowledge base new_provider_html: Read our documentation on [setting up an XWiki integration](docs_url) for more information. oauth: openproject_oauth: OpenProject OAuth sections: - general_information: Basic details + general_information: General information oauth_configuration: OAuth configuration - url_caption: Please add the host address of your wiki platform including the https://. It should not be longer than 255 characters. - xwiki_instance: XWiki Instance + url_caption: The host address of your wiki platform including the https://. It should not be longer than 255 characters. xwiki: oauth: - openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. Copy the credentials below into your XWiki instance. - provider_oauth: XWiki OAuth - provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. A client ID is automatically generated to identify OpenProject to XWiki — no manual configuration is needed on the XWiki side. + openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. + provider_oauth: Wiki OAuth + provider_oauth_configuration: Copy these values to the [XWiki OIDC Connection client](xwiki_oidc_link). + provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth. xwiki_oauth: XWiki OAuth xwiki_oauth_description: Allow OpenProject to access XWiki data using an OAuth. - macro: - page_not_found: Linked wiki page no longer available + buttons: + connect_account: Connect %{provider} account + done_continue: Done, continue + open_wiki: Open wiki + save_and_continue: Save and continue + wiki_page: Wiki page + create_new_wiki_page_dialog: + page_title: Title + parent_help_text: Select a parent for this new wiki page. + title: Create new wiki page + delete_relation_page_link_confirmation_dialog: + heading: Delete related wiki page link? + title: Delete related wiki page link + health_checks: + authentication: + existing_token: User token + header: Authentication + user_bound_request: User-based request authentication + base_configuration: + header: Configuration + provider_configured: Configuration complete + errors: + not_configured: The connection could not be validated. Please finish configuration first. + xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. + xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. + xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. + xwiki_oauth_unauthorized: The user token was not recognized by XWiki. + instructions: + xwiki: + integration: XWiki Administration + oauth_application_details_html: The client secret value will not be accessible again after you close this window. Please copy these values into the [XWiki OpenProject Integration settings](xwiki_admin_link). + link_existing_wiki_page_dialog: + title: Add existing wiki page + link_existing_wiki_page_form: + no_results: No wiki pages found + placeholder: Search for a wiki page + oauth_login_component: + connect_button: Connect %{provider} account + description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. + heading: Not connected to %{provider} + page_link_component: + remove: Remove page link + page_links: + errors: + page_access_forbidden: You do not have permission to access this wiki page + page_not_found: Linked wiki page no longer available + unexpected: An unexpected error occurred + provider_types: + xwiki: + name: XWiki + relation_page_links_component: + empty_heading: No related pages + empty_text: Manually add links to other related wiki pages. + link_existing: Existing wiki page + link_new: New wiki page + work_package_wikis_tab_component: + inline_page_links: Inline page links + referencing_pages: Referenced in diff --git a/modules/wikis/config/locales/crowdin/hi.yml b/modules/wikis/config/locales/crowdin/hi.yml index dcc2355e6a8..0de5471a384 100644 --- a/modules/wikis/config/locales/crowdin/hi.yml +++ b/modules/wikis/config/locales/crowdin/hi.yml @@ -3,15 +3,17 @@ hi: activerecord: attributes: wikis/page_link: + identifier: Identifier provider: Wiki Provider + wikis/provider: + name: Name + universal_identifier: Universal identifier wikis/xwiki_provider: authentication_method: Authentication method authentication_methods: oauth2_sso: Single-Sign-On through OpenID Connect Identity Provider two_way_oauth2: Two-way OAuth 2.0 authorization code flow - name: Name token_exchange_scope: XWiki Scope - universal_identifier: Universal identifier url: Instance URL wiki_audience: XWiki Audience errors: {} @@ -29,53 +31,30 @@ hi: wikis/xwiki_provider: one: XWiki provider other: XWiki providers + menus: + admin: + external_wiki_providers: Wiki providers + internal_wiki_provider: Internal wiki + wikis: Wikis permission_manage_wiki_page_links: Manage Wiki Page Links project_module_wiki_platforms: Wiki providers wikis: - buttons: - connect_account: Connect %{provider} account - done_continue: Done, continue - save_and_continue: Save and continue - wiki_page: Wiki page - health_checks: - authentication: - existing_token: User token - header: Authentication - user_bound_request: User-based request authentication - base_configuration: - header: Configuration - provider_configured: Configuration complete - errors: - not_configured: The connection could not be validated. Please finish configuration first. - xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. - xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. - xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. - xwiki_oauth_unauthorized: The user token was not recognized by XWiki. - work_package_wikis_tab_component: - inline_page_links: Inline page links - referencing_pages: Referenced in - page_link_component: - remove: Remove page link - relation_page_links_component: - empty_heading: No related pages - empty_text: Manually add links to other related wiki pages. - oauth_login_component: - heading: Not connected to %{provider} - description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. - connect_button: Connect %{provider} account admin: destroy_confirmation_dialog_component: - title: Delete wiki provider - heading: Permanently delete this wiki provider? description_html: The wiki provider %{wiki_provider} and all the related wiki page links will be deleted. In addition, every inline wiki page link will no longer be accessible. This action is irreversible. + heading: Permanently delete this wiki provider? + title: Delete wiki provider forms: general_info_form_component: - xwiki_instance_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. + provider_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. oauth_application_form_component: - application_id: Application ID - application_secret: Application secret + application_id: OpenProject OAuth Application ID + application_secret: OpenProject OAuth Application secret oauth_client_form_component: - client_id: Client ID + client_id: Wiki OAuth Client ID + client_secret: Wiki OAuth Client secret + redirect_uri: Redirect URI + redirect_uri_caption: Copy this value into the Redirect URI field of your XWiki OIDC client registration. health_status: show: actions: @@ -86,13 +65,19 @@ hi: no_health_report: No report available no_health_report_description: Run the checks now for a full health status report for this wiki provider. title: Health Report + internal_provider_form: + checkbox_caption: Allow projects to use the internal OpenProject wiki along with external Wiki providers + checkbox_label: Enable the internal OpenProject wiki + internal_wiki_provider: + show: + description: Choose to enable or disable the internal OpenProject wiki oauth_application_info_component: confirm_replace_oauth_application: This action will reset the current OAuth credentials. After confirming you will have to reenter the credentials in your XWiki instance and all users will have to reauthorize. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_application: Replace OpenProject OAuth application oauth_client_info_component: confirm_replace_oauth_client: This action will reset the current XWiki OAuth credentials. All users will need to reauthorize against XWiki. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_client: Replace XWiki OAuth application side_panel: health_status_component: @@ -110,25 +95,81 @@ hi: index_description: Add an external wiki service to link work packages to existing wiki pages or create new ones directly from OpenProject. label_add_new: Add new wiki provider label_edit: Edit XWiki provider - label_new_xwiki_instance: New XWiki provider + label_new_provider: New XWiki provider label_wiki_platform: Wiki provider - name_caption: Give your storage a name so that users can differentiate between multiple wiki platforms. + name_caption: Give your wiki provider a name so that users can differentiate between multiple wiki platforms. name_placeholder: XWiki knowledge base new_provider_html: Read our documentation on [setting up an XWiki integration](docs_url) for more information. oauth: openproject_oauth: OpenProject OAuth sections: - general_information: Basic details + general_information: General information oauth_configuration: OAuth configuration - url_caption: Please add the host address of your wiki platform including the https://. It should not be longer than 255 characters. - xwiki_instance: XWiki Instance + url_caption: The host address of your wiki platform including the https://. It should not be longer than 255 characters. xwiki: oauth: - openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. Copy the credentials below into your XWiki instance. - provider_oauth: XWiki OAuth - provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. A client ID is automatically generated to identify OpenProject to XWiki — no manual configuration is needed on the XWiki side. + openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. + provider_oauth: Wiki OAuth + provider_oauth_configuration: Copy these values to the [XWiki OIDC Connection client](xwiki_oidc_link). + provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth. xwiki_oauth: XWiki OAuth xwiki_oauth_description: Allow OpenProject to access XWiki data using an OAuth. - macro: - page_not_found: Linked wiki page no longer available + buttons: + connect_account: Connect %{provider} account + done_continue: Done, continue + open_wiki: Open wiki + save_and_continue: Save and continue + wiki_page: Wiki page + create_new_wiki_page_dialog: + page_title: Title + parent_help_text: Select a parent for this new wiki page. + title: Create new wiki page + delete_relation_page_link_confirmation_dialog: + heading: Delete related wiki page link? + title: Delete related wiki page link + health_checks: + authentication: + existing_token: User token + header: Authentication + user_bound_request: User-based request authentication + base_configuration: + header: Configuration + provider_configured: Configuration complete + errors: + not_configured: The connection could not be validated. Please finish configuration first. + xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. + xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. + xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. + xwiki_oauth_unauthorized: The user token was not recognized by XWiki. + instructions: + xwiki: + integration: XWiki Administration + oauth_application_details_html: The client secret value will not be accessible again after you close this window. Please copy these values into the [XWiki OpenProject Integration settings](xwiki_admin_link). + link_existing_wiki_page_dialog: + title: Add existing wiki page + link_existing_wiki_page_form: + no_results: No wiki pages found + placeholder: Search for a wiki page + oauth_login_component: + connect_button: Connect %{provider} account + description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. + heading: Not connected to %{provider} + page_link_component: + remove: Remove page link + page_links: + errors: + page_access_forbidden: You do not have permission to access this wiki page + page_not_found: Linked wiki page no longer available + unexpected: An unexpected error occurred + provider_types: + xwiki: + name: XWiki + relation_page_links_component: + empty_heading: No related pages + empty_text: Manually add links to other related wiki pages. + link_existing: Existing wiki page + link_new: New wiki page + work_package_wikis_tab_component: + inline_page_links: Inline page links + referencing_pages: Referenced in diff --git a/modules/wikis/config/locales/crowdin/hr.yml b/modules/wikis/config/locales/crowdin/hr.yml index 2abd595109f..6599ea083bc 100644 --- a/modules/wikis/config/locales/crowdin/hr.yml +++ b/modules/wikis/config/locales/crowdin/hr.yml @@ -3,15 +3,17 @@ hr: activerecord: attributes: wikis/page_link: + identifier: Identifier provider: Wiki Provider + wikis/provider: + name: Name + universal_identifier: Universal identifier wikis/xwiki_provider: authentication_method: Authentication method authentication_methods: oauth2_sso: Single-Sign-On through OpenID Connect Identity Provider two_way_oauth2: Two-way OAuth 2.0 authorization code flow - name: Name token_exchange_scope: XWiki Scope - universal_identifier: Universal identifier url: Instance URL wiki_audience: XWiki Audience errors: {} @@ -33,53 +35,30 @@ hr: one: XWiki provider few: XWiki providers other: XWiki providers + menus: + admin: + external_wiki_providers: Wiki providers + internal_wiki_provider: Internal wiki + wikis: Wikis permission_manage_wiki_page_links: Manage Wiki Page Links project_module_wiki_platforms: Wiki providers wikis: - buttons: - connect_account: Connect %{provider} account - done_continue: Done, continue - save_and_continue: Save and continue - wiki_page: Wiki page - health_checks: - authentication: - existing_token: User token - header: Authentication - user_bound_request: User-based request authentication - base_configuration: - header: Configuration - provider_configured: Configuration complete - errors: - not_configured: The connection could not be validated. Please finish configuration first. - xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. - xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. - xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. - xwiki_oauth_unauthorized: The user token was not recognized by XWiki. - work_package_wikis_tab_component: - inline_page_links: Inline page links - referencing_pages: Referenced in - page_link_component: - remove: Remove page link - relation_page_links_component: - empty_heading: No related pages - empty_text: Manually add links to other related wiki pages. - oauth_login_component: - heading: Not connected to %{provider} - description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. - connect_button: Connect %{provider} account admin: destroy_confirmation_dialog_component: - title: Delete wiki provider - heading: Permanently delete this wiki provider? description_html: The wiki provider %{wiki_provider} and all the related wiki page links will be deleted. In addition, every inline wiki page link will no longer be accessible. This action is irreversible. + heading: Permanently delete this wiki provider? + title: Delete wiki provider forms: general_info_form_component: - xwiki_instance_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. + provider_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. oauth_application_form_component: - application_id: Application ID - application_secret: Application secret + application_id: OpenProject OAuth Application ID + application_secret: OpenProject OAuth Application secret oauth_client_form_component: - client_id: Client ID + client_id: Wiki OAuth Client ID + client_secret: Wiki OAuth Client secret + redirect_uri: Redirect URI + redirect_uri_caption: Copy this value into the Redirect URI field of your XWiki OIDC client registration. health_status: show: actions: @@ -90,13 +69,19 @@ hr: no_health_report: No report available no_health_report_description: Run the checks now for a full health status report for this wiki provider. title: Health Report + internal_provider_form: + checkbox_caption: Allow projects to use the internal OpenProject wiki along with external Wiki providers + checkbox_label: Enable the internal OpenProject wiki + internal_wiki_provider: + show: + description: Choose to enable or disable the internal OpenProject wiki oauth_application_info_component: confirm_replace_oauth_application: This action will reset the current OAuth credentials. After confirming you will have to reenter the credentials in your XWiki instance and all users will have to reauthorize. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_application: Replace OpenProject OAuth application oauth_client_info_component: confirm_replace_oauth_client: This action will reset the current XWiki OAuth credentials. All users will need to reauthorize against XWiki. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_client: Replace XWiki OAuth application side_panel: health_status_component: @@ -114,25 +99,81 @@ hr: index_description: Add an external wiki service to link work packages to existing wiki pages or create new ones directly from OpenProject. label_add_new: Add new wiki provider label_edit: Edit XWiki provider - label_new_xwiki_instance: New XWiki provider + label_new_provider: New XWiki provider label_wiki_platform: Wiki provider - name_caption: Give your storage a name so that users can differentiate between multiple wiki platforms. + name_caption: Give your wiki provider a name so that users can differentiate between multiple wiki platforms. name_placeholder: XWiki knowledge base new_provider_html: Read our documentation on [setting up an XWiki integration](docs_url) for more information. oauth: openproject_oauth: OpenProject OAuth sections: - general_information: Basic details + general_information: General information oauth_configuration: OAuth configuration - url_caption: Please add the host address of your wiki platform including the https://. It should not be longer than 255 characters. - xwiki_instance: XWiki Instance + url_caption: The host address of your wiki platform including the https://. It should not be longer than 255 characters. xwiki: oauth: - openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. Copy the credentials below into your XWiki instance. - provider_oauth: XWiki OAuth - provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. A client ID is automatically generated to identify OpenProject to XWiki — no manual configuration is needed on the XWiki side. + openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. + provider_oauth: Wiki OAuth + provider_oauth_configuration: Copy these values to the [XWiki OIDC Connection client](xwiki_oidc_link). + provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth. xwiki_oauth: XWiki OAuth xwiki_oauth_description: Allow OpenProject to access XWiki data using an OAuth. - macro: - page_not_found: Linked wiki page no longer available + buttons: + connect_account: Connect %{provider} account + done_continue: Done, continue + open_wiki: Open wiki + save_and_continue: Save and continue + wiki_page: Wiki page + create_new_wiki_page_dialog: + page_title: Title + parent_help_text: Select a parent for this new wiki page. + title: Create new wiki page + delete_relation_page_link_confirmation_dialog: + heading: Delete related wiki page link? + title: Delete related wiki page link + health_checks: + authentication: + existing_token: User token + header: Authentication + user_bound_request: User-based request authentication + base_configuration: + header: Configuration + provider_configured: Configuration complete + errors: + not_configured: The connection could not be validated. Please finish configuration first. + xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. + xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. + xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. + xwiki_oauth_unauthorized: The user token was not recognized by XWiki. + instructions: + xwiki: + integration: XWiki Administration + oauth_application_details_html: The client secret value will not be accessible again after you close this window. Please copy these values into the [XWiki OpenProject Integration settings](xwiki_admin_link). + link_existing_wiki_page_dialog: + title: Add existing wiki page + link_existing_wiki_page_form: + no_results: No wiki pages found + placeholder: Search for a wiki page + oauth_login_component: + connect_button: Connect %{provider} account + description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. + heading: Not connected to %{provider} + page_link_component: + remove: Remove page link + page_links: + errors: + page_access_forbidden: You do not have permission to access this wiki page + page_not_found: Linked wiki page no longer available + unexpected: An unexpected error occurred + provider_types: + xwiki: + name: XWiki + relation_page_links_component: + empty_heading: No related pages + empty_text: Manually add links to other related wiki pages. + link_existing: Existing wiki page + link_new: New wiki page + work_package_wikis_tab_component: + inline_page_links: Inline page links + referencing_pages: Referenced in diff --git a/modules/wikis/config/locales/crowdin/hu.yml b/modules/wikis/config/locales/crowdin/hu.yml index cbff1d5d77f..3a95e494e58 100644 --- a/modules/wikis/config/locales/crowdin/hu.yml +++ b/modules/wikis/config/locales/crowdin/hu.yml @@ -3,15 +3,17 @@ hu: activerecord: attributes: wikis/page_link: + identifier: Identifier provider: Wiki Provider + wikis/provider: + name: Name + universal_identifier: Universal identifier wikis/xwiki_provider: authentication_method: Authentication method authentication_methods: oauth2_sso: Single-Sign-On through OpenID Connect Identity Provider two_way_oauth2: Two-way OAuth 2.0 authorization code flow - name: Name token_exchange_scope: XWiki Scope - universal_identifier: Universal identifier url: Instance URL wiki_audience: XWiki Audience errors: {} @@ -29,53 +31,30 @@ hu: wikis/xwiki_provider: one: XWiki provider other: XWiki providers + menus: + admin: + external_wiki_providers: Wiki providers + internal_wiki_provider: Internal wiki + wikis: Wikis permission_manage_wiki_page_links: Manage Wiki Page Links project_module_wiki_platforms: Wiki providers wikis: - buttons: - connect_account: Connect %{provider} account - done_continue: Done, continue - save_and_continue: Save and continue - wiki_page: Wiki page - health_checks: - authentication: - existing_token: User token - header: Authentication - user_bound_request: User-based request authentication - base_configuration: - header: Configuration - provider_configured: Configuration complete - errors: - not_configured: The connection could not be validated. Please finish configuration first. - xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. - xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. - xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. - xwiki_oauth_unauthorized: The user token was not recognized by XWiki. - work_package_wikis_tab_component: - inline_page_links: Inline page links - referencing_pages: Referenced in - page_link_component: - remove: Remove page link - relation_page_links_component: - empty_heading: No related pages - empty_text: Manually add links to other related wiki pages. - oauth_login_component: - heading: Not connected to %{provider} - description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. - connect_button: Connect %{provider} account admin: destroy_confirmation_dialog_component: - title: Delete wiki provider - heading: Permanently delete this wiki provider? description_html: The wiki provider %{wiki_provider} and all the related wiki page links will be deleted. In addition, every inline wiki page link will no longer be accessible. This action is irreversible. + heading: Permanently delete this wiki provider? + title: Delete wiki provider forms: general_info_form_component: - xwiki_instance_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. + provider_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. oauth_application_form_component: - application_id: Application ID - application_secret: Application secret + application_id: OpenProject OAuth Application ID + application_secret: OpenProject OAuth Application secret oauth_client_form_component: - client_id: Client ID + client_id: Wiki OAuth Client ID + client_secret: Wiki OAuth Client secret + redirect_uri: Redirect URI + redirect_uri_caption: Copy this value into the Redirect URI field of your XWiki OIDC client registration. health_status: show: actions: @@ -86,13 +65,19 @@ hu: no_health_report: No report available no_health_report_description: Run the checks now for a full health status report for this wiki provider. title: Health Report + internal_provider_form: + checkbox_caption: Allow projects to use the internal OpenProject wiki along with external Wiki providers + checkbox_label: Enable the internal OpenProject wiki + internal_wiki_provider: + show: + description: Choose to enable or disable the internal OpenProject wiki oauth_application_info_component: confirm_replace_oauth_application: This action will reset the current OAuth credentials. After confirming you will have to reenter the credentials in your XWiki instance and all users will have to reauthorize. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_application: Replace OpenProject OAuth application oauth_client_info_component: confirm_replace_oauth_client: This action will reset the current XWiki OAuth credentials. All users will need to reauthorize against XWiki. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_client: Replace XWiki OAuth application side_panel: health_status_component: @@ -110,25 +95,81 @@ hu: index_description: Add an external wiki service to link work packages to existing wiki pages or create new ones directly from OpenProject. label_add_new: Add new wiki provider label_edit: Edit XWiki provider - label_new_xwiki_instance: New XWiki provider + label_new_provider: New XWiki provider label_wiki_platform: Wiki provider - name_caption: Give your storage a name so that users can differentiate between multiple wiki platforms. + name_caption: Give your wiki provider a name so that users can differentiate between multiple wiki platforms. name_placeholder: XWiki knowledge base new_provider_html: Read our documentation on [setting up an XWiki integration](docs_url) for more information. oauth: openproject_oauth: OpenProject OAuth sections: - general_information: Basic details + general_information: General information oauth_configuration: OAuth configuration - url_caption: Please add the host address of your wiki platform including the https://. It should not be longer than 255 characters. - xwiki_instance: XWiki Instance + url_caption: The host address of your wiki platform including the https://. It should not be longer than 255 characters. xwiki: oauth: - openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. Copy the credentials below into your XWiki instance. - provider_oauth: XWiki OAuth - provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. A client ID is automatically generated to identify OpenProject to XWiki — no manual configuration is needed on the XWiki side. + openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. + provider_oauth: Wiki OAuth + provider_oauth_configuration: Copy these values to the [XWiki OIDC Connection client](xwiki_oidc_link). + provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth. xwiki_oauth: XWiki OAuth xwiki_oauth_description: Allow OpenProject to access XWiki data using an OAuth. - macro: - page_not_found: Linked wiki page no longer available + buttons: + connect_account: Connect %{provider} account + done_continue: Done, continue + open_wiki: Open wiki + save_and_continue: Save and continue + wiki_page: Wiki page + create_new_wiki_page_dialog: + page_title: Title + parent_help_text: Select a parent for this new wiki page. + title: Create new wiki page + delete_relation_page_link_confirmation_dialog: + heading: Delete related wiki page link? + title: Delete related wiki page link + health_checks: + authentication: + existing_token: User token + header: Authentication + user_bound_request: User-based request authentication + base_configuration: + header: Configuration + provider_configured: Configuration complete + errors: + not_configured: The connection could not be validated. Please finish configuration first. + xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. + xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. + xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. + xwiki_oauth_unauthorized: The user token was not recognized by XWiki. + instructions: + xwiki: + integration: XWiki Administration + oauth_application_details_html: The client secret value will not be accessible again after you close this window. Please copy these values into the [XWiki OpenProject Integration settings](xwiki_admin_link). + link_existing_wiki_page_dialog: + title: Add existing wiki page + link_existing_wiki_page_form: + no_results: No wiki pages found + placeholder: Search for a wiki page + oauth_login_component: + connect_button: Connect %{provider} account + description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. + heading: Not connected to %{provider} + page_link_component: + remove: Remove page link + page_links: + errors: + page_access_forbidden: You do not have permission to access this wiki page + page_not_found: Linked wiki page no longer available + unexpected: An unexpected error occurred + provider_types: + xwiki: + name: XWiki + relation_page_links_component: + empty_heading: No related pages + empty_text: Manually add links to other related wiki pages. + link_existing: Existing wiki page + link_new: New wiki page + work_package_wikis_tab_component: + inline_page_links: Inline page links + referencing_pages: Referenced in diff --git a/modules/wikis/config/locales/crowdin/hy.yml b/modules/wikis/config/locales/crowdin/hy.yml index c1987b7770e..22f92c77077 100644 --- a/modules/wikis/config/locales/crowdin/hy.yml +++ b/modules/wikis/config/locales/crowdin/hy.yml @@ -3,15 +3,17 @@ hy: activerecord: attributes: wikis/page_link: + identifier: Identifier provider: Wiki Provider + wikis/provider: + name: Name + universal_identifier: Universal identifier wikis/xwiki_provider: authentication_method: Authentication method authentication_methods: oauth2_sso: Single-Sign-On through OpenID Connect Identity Provider two_way_oauth2: Two-way OAuth 2.0 authorization code flow - name: Name token_exchange_scope: XWiki Scope - universal_identifier: Universal identifier url: Instance URL wiki_audience: XWiki Audience errors: {} @@ -29,53 +31,30 @@ hy: wikis/xwiki_provider: one: XWiki provider other: XWiki providers + menus: + admin: + external_wiki_providers: Wiki providers + internal_wiki_provider: Internal wiki + wikis: Wikis permission_manage_wiki_page_links: Manage Wiki Page Links project_module_wiki_platforms: Wiki providers wikis: - buttons: - connect_account: Connect %{provider} account - done_continue: Done, continue - save_and_continue: Save and continue - wiki_page: Wiki page - health_checks: - authentication: - existing_token: User token - header: Authentication - user_bound_request: User-based request authentication - base_configuration: - header: Configuration - provider_configured: Configuration complete - errors: - not_configured: The connection could not be validated. Please finish configuration first. - xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. - xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. - xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. - xwiki_oauth_unauthorized: The user token was not recognized by XWiki. - work_package_wikis_tab_component: - inline_page_links: Inline page links - referencing_pages: Referenced in - page_link_component: - remove: Remove page link - relation_page_links_component: - empty_heading: No related pages - empty_text: Manually add links to other related wiki pages. - oauth_login_component: - heading: Not connected to %{provider} - description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. - connect_button: Connect %{provider} account admin: destroy_confirmation_dialog_component: - title: Delete wiki provider - heading: Permanently delete this wiki provider? description_html: The wiki provider %{wiki_provider} and all the related wiki page links will be deleted. In addition, every inline wiki page link will no longer be accessible. This action is irreversible. + heading: Permanently delete this wiki provider? + title: Delete wiki provider forms: general_info_form_component: - xwiki_instance_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. + provider_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. oauth_application_form_component: - application_id: Application ID - application_secret: Application secret + application_id: OpenProject OAuth Application ID + application_secret: OpenProject OAuth Application secret oauth_client_form_component: - client_id: Client ID + client_id: Wiki OAuth Client ID + client_secret: Wiki OAuth Client secret + redirect_uri: Redirect URI + redirect_uri_caption: Copy this value into the Redirect URI field of your XWiki OIDC client registration. health_status: show: actions: @@ -86,13 +65,19 @@ hy: no_health_report: No report available no_health_report_description: Run the checks now for a full health status report for this wiki provider. title: Health Report + internal_provider_form: + checkbox_caption: Allow projects to use the internal OpenProject wiki along with external Wiki providers + checkbox_label: Enable the internal OpenProject wiki + internal_wiki_provider: + show: + description: Choose to enable or disable the internal OpenProject wiki oauth_application_info_component: confirm_replace_oauth_application: This action will reset the current OAuth credentials. After confirming you will have to reenter the credentials in your XWiki instance and all users will have to reauthorize. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_application: Replace OpenProject OAuth application oauth_client_info_component: confirm_replace_oauth_client: This action will reset the current XWiki OAuth credentials. All users will need to reauthorize against XWiki. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_client: Replace XWiki OAuth application side_panel: health_status_component: @@ -110,25 +95,81 @@ hy: index_description: Add an external wiki service to link work packages to existing wiki pages or create new ones directly from OpenProject. label_add_new: Add new wiki provider label_edit: Edit XWiki provider - label_new_xwiki_instance: New XWiki provider + label_new_provider: New XWiki provider label_wiki_platform: Wiki provider - name_caption: Give your storage a name so that users can differentiate between multiple wiki platforms. + name_caption: Give your wiki provider a name so that users can differentiate between multiple wiki platforms. name_placeholder: XWiki knowledge base new_provider_html: Read our documentation on [setting up an XWiki integration](docs_url) for more information. oauth: openproject_oauth: OpenProject OAuth sections: - general_information: Basic details + general_information: General information oauth_configuration: OAuth configuration - url_caption: Please add the host address of your wiki platform including the https://. It should not be longer than 255 characters. - xwiki_instance: XWiki Instance + url_caption: The host address of your wiki platform including the https://. It should not be longer than 255 characters. xwiki: oauth: - openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. Copy the credentials below into your XWiki instance. - provider_oauth: XWiki OAuth - provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. A client ID is automatically generated to identify OpenProject to XWiki — no manual configuration is needed on the XWiki side. + openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. + provider_oauth: Wiki OAuth + provider_oauth_configuration: Copy these values to the [XWiki OIDC Connection client](xwiki_oidc_link). + provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth. xwiki_oauth: XWiki OAuth xwiki_oauth_description: Allow OpenProject to access XWiki data using an OAuth. - macro: - page_not_found: Linked wiki page no longer available + buttons: + connect_account: Connect %{provider} account + done_continue: Done, continue + open_wiki: Open wiki + save_and_continue: Save and continue + wiki_page: Wiki page + create_new_wiki_page_dialog: + page_title: Title + parent_help_text: Select a parent for this new wiki page. + title: Create new wiki page + delete_relation_page_link_confirmation_dialog: + heading: Delete related wiki page link? + title: Delete related wiki page link + health_checks: + authentication: + existing_token: User token + header: Authentication + user_bound_request: User-based request authentication + base_configuration: + header: Configuration + provider_configured: Configuration complete + errors: + not_configured: The connection could not be validated. Please finish configuration first. + xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. + xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. + xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. + xwiki_oauth_unauthorized: The user token was not recognized by XWiki. + instructions: + xwiki: + integration: XWiki Administration + oauth_application_details_html: The client secret value will not be accessible again after you close this window. Please copy these values into the [XWiki OpenProject Integration settings](xwiki_admin_link). + link_existing_wiki_page_dialog: + title: Add existing wiki page + link_existing_wiki_page_form: + no_results: No wiki pages found + placeholder: Search for a wiki page + oauth_login_component: + connect_button: Connect %{provider} account + description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. + heading: Not connected to %{provider} + page_link_component: + remove: Remove page link + page_links: + errors: + page_access_forbidden: You do not have permission to access this wiki page + page_not_found: Linked wiki page no longer available + unexpected: An unexpected error occurred + provider_types: + xwiki: + name: XWiki + relation_page_links_component: + empty_heading: No related pages + empty_text: Manually add links to other related wiki pages. + link_existing: Existing wiki page + link_new: New wiki page + work_package_wikis_tab_component: + inline_page_links: Inline page links + referencing_pages: Referenced in diff --git a/modules/wikis/config/locales/crowdin/id.yml b/modules/wikis/config/locales/crowdin/id.yml index 2f3bd33638a..b6f39942cbd 100644 --- a/modules/wikis/config/locales/crowdin/id.yml +++ b/modules/wikis/config/locales/crowdin/id.yml @@ -3,15 +3,17 @@ id: activerecord: attributes: wikis/page_link: + identifier: Identifier provider: Wiki Provider + wikis/provider: + name: Name + universal_identifier: Universal identifier wikis/xwiki_provider: authentication_method: Authentication method authentication_methods: oauth2_sso: Single-Sign-On through OpenID Connect Identity Provider two_way_oauth2: Two-way OAuth 2.0 authorization code flow - name: Name token_exchange_scope: XWiki Scope - universal_identifier: Universal identifier url: Instance URL wiki_audience: XWiki Audience errors: {} @@ -25,53 +27,30 @@ id: other: Relation page links wikis/xwiki_provider: other: XWiki providers + menus: + admin: + external_wiki_providers: Wiki providers + internal_wiki_provider: Internal wiki + wikis: Wikis permission_manage_wiki_page_links: Manage Wiki Page Links project_module_wiki_platforms: Wiki providers wikis: - buttons: - connect_account: Connect %{provider} account - done_continue: Done, continue - save_and_continue: Save and continue - wiki_page: Wiki page - health_checks: - authentication: - existing_token: User token - header: Authentication - user_bound_request: User-based request authentication - base_configuration: - header: Configuration - provider_configured: Configuration complete - errors: - not_configured: The connection could not be validated. Please finish configuration first. - xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. - xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. - xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. - xwiki_oauth_unauthorized: The user token was not recognized by XWiki. - work_package_wikis_tab_component: - inline_page_links: Inline page links - referencing_pages: Referenced in - page_link_component: - remove: Remove page link - relation_page_links_component: - empty_heading: No related pages - empty_text: Manually add links to other related wiki pages. - oauth_login_component: - heading: Not connected to %{provider} - description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. - connect_button: Connect %{provider} account admin: destroy_confirmation_dialog_component: - title: Delete wiki provider - heading: Permanently delete this wiki provider? description_html: The wiki provider %{wiki_provider} and all the related wiki page links will be deleted. In addition, every inline wiki page link will no longer be accessible. This action is irreversible. + heading: Permanently delete this wiki provider? + title: Delete wiki provider forms: general_info_form_component: - xwiki_instance_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. + provider_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. oauth_application_form_component: - application_id: Application ID - application_secret: Application secret + application_id: OpenProject OAuth Application ID + application_secret: OpenProject OAuth Application secret oauth_client_form_component: - client_id: Client ID + client_id: Wiki OAuth Client ID + client_secret: Wiki OAuth Client secret + redirect_uri: Redirect URI + redirect_uri_caption: Copy this value into the Redirect URI field of your XWiki OIDC client registration. health_status: show: actions: @@ -82,13 +61,19 @@ id: no_health_report: No report available no_health_report_description: Run the checks now for a full health status report for this wiki provider. title: Health Report + internal_provider_form: + checkbox_caption: Allow projects to use the internal OpenProject wiki along with external Wiki providers + checkbox_label: Enable the internal OpenProject wiki + internal_wiki_provider: + show: + description: Choose to enable or disable the internal OpenProject wiki oauth_application_info_component: confirm_replace_oauth_application: This action will reset the current OAuth credentials. After confirming you will have to reenter the credentials in your XWiki instance and all users will have to reauthorize. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_application: Replace OpenProject OAuth application oauth_client_info_component: confirm_replace_oauth_client: This action will reset the current XWiki OAuth credentials. All users will need to reauthorize against XWiki. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_client: Replace XWiki OAuth application side_panel: health_status_component: @@ -106,25 +91,81 @@ id: index_description: Add an external wiki service to link work packages to existing wiki pages or create new ones directly from OpenProject. label_add_new: Add new wiki provider label_edit: Edit XWiki provider - label_new_xwiki_instance: New XWiki provider + label_new_provider: New XWiki provider label_wiki_platform: Wiki provider - name_caption: Give your storage a name so that users can differentiate between multiple wiki platforms. + name_caption: Give your wiki provider a name so that users can differentiate between multiple wiki platforms. name_placeholder: XWiki knowledge base new_provider_html: Read our documentation on [setting up an XWiki integration](docs_url) for more information. oauth: openproject_oauth: OpenProject OAuth sections: - general_information: Basic details + general_information: General information oauth_configuration: OAuth configuration - url_caption: Please add the host address of your wiki platform including the https://. It should not be longer than 255 characters. - xwiki_instance: XWiki Instance + url_caption: The host address of your wiki platform including the https://. It should not be longer than 255 characters. xwiki: oauth: - openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. Copy the credentials below into your XWiki instance. - provider_oauth: XWiki OAuth - provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. A client ID is automatically generated to identify OpenProject to XWiki — no manual configuration is needed on the XWiki side. + openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. + provider_oauth: Wiki OAuth + provider_oauth_configuration: Copy these values to the [XWiki OIDC Connection client](xwiki_oidc_link). + provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth. xwiki_oauth: XWiki OAuth xwiki_oauth_description: Allow OpenProject to access XWiki data using an OAuth. - macro: - page_not_found: Linked wiki page no longer available + buttons: + connect_account: Connect %{provider} account + done_continue: Done, continue + open_wiki: Open wiki + save_and_continue: Save and continue + wiki_page: Wiki page + create_new_wiki_page_dialog: + page_title: Title + parent_help_text: Select a parent for this new wiki page. + title: Create new wiki page + delete_relation_page_link_confirmation_dialog: + heading: Delete related wiki page link? + title: Delete related wiki page link + health_checks: + authentication: + existing_token: User token + header: Authentication + user_bound_request: User-based request authentication + base_configuration: + header: Configuration + provider_configured: Configuration complete + errors: + not_configured: The connection could not be validated. Please finish configuration first. + xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. + xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. + xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. + xwiki_oauth_unauthorized: The user token was not recognized by XWiki. + instructions: + xwiki: + integration: XWiki Administration + oauth_application_details_html: The client secret value will not be accessible again after you close this window. Please copy these values into the [XWiki OpenProject Integration settings](xwiki_admin_link). + link_existing_wiki_page_dialog: + title: Add existing wiki page + link_existing_wiki_page_form: + no_results: No wiki pages found + placeholder: Search for a wiki page + oauth_login_component: + connect_button: Connect %{provider} account + description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. + heading: Not connected to %{provider} + page_link_component: + remove: Remove page link + page_links: + errors: + page_access_forbidden: You do not have permission to access this wiki page + page_not_found: Linked wiki page no longer available + unexpected: An unexpected error occurred + provider_types: + xwiki: + name: XWiki + relation_page_links_component: + empty_heading: No related pages + empty_text: Manually add links to other related wiki pages. + link_existing: Existing wiki page + link_new: New wiki page + work_package_wikis_tab_component: + inline_page_links: Inline page links + referencing_pages: Referenced in diff --git a/modules/wikis/config/locales/crowdin/it.yml b/modules/wikis/config/locales/crowdin/it.yml index 0da21b908a0..5ff50327a87 100644 --- a/modules/wikis/config/locales/crowdin/it.yml +++ b/modules/wikis/config/locales/crowdin/it.yml @@ -3,15 +3,17 @@ it: activerecord: attributes: wikis/page_link: + identifier: Identificatore provider: Fornitore Wiki + wikis/provider: + name: Nome + universal_identifier: Identificatore universale wikis/xwiki_provider: authentication_method: Metodo di autenticazione authentication_methods: oauth2_sso: Single-Sign-On tramite OpenID Connect Identity Provider two_way_oauth2: Flusso del codice di autorizzazione OAuth 2.0 bidirezionale - name: Nome token_exchange_scope: Ambito XWiki - universal_identifier: Identificatore universale url: URL istanza wiki_audience: Pubblico XWiki errors: {} @@ -29,53 +31,30 @@ it: wikis/xwiki_provider: one: Fornitore XWiki other: Fornitori XWiki + menus: + admin: + external_wiki_providers: Wiki providers + internal_wiki_provider: Internal wiki + wikis: Wikis permission_manage_wiki_page_links: Gestire i link delle pagine Wiki project_module_wiki_platforms: Fornitori Wiki wikis: - buttons: - connect_account: Connetti account %{provider} - done_continue: Fatto, continua - save_and_continue: Salva e continua - wiki_page: Pagina wiki - health_checks: - authentication: - existing_token: Token utente - header: Autenticazione - user_bound_request: Autenticazione richiesta basata sull'utente - base_configuration: - header: Configurazione - provider_configured: Configurazione completa - errors: - not_configured: Non è stato possibile verificare la connessione. Prima è necessario completare la configurazione. - xwiki_oauth_connection_error: OpenProject non è riuscito a connettersi all'istanza XWiki configurata. - xwiki_oauth_request_error: Si è verificato un errore imprevisto durante il tentativo di comunicare con l'istanza XWiki. - xwiki_oauth_token_missing: OpenProject non può testare la comunicazione a livello utente con XWiki poiché l'utente non ha ancora collegato il proprio account XWiki. - xwiki_oauth_unauthorized: Il token utente non è stato riconosciuto da XWiki. - work_package_wikis_tab_component: - inline_page_links: Collegamenti alle pagine inline - referencing_pages: Citata in - page_link_component: - remove: Rimuovi link della pagina - relation_page_links_component: - empty_heading: Nessuna pagina correlata - empty_text: Aggiunga manualmente i link ad altre pagine wiki correlate. - oauth_login_component: - heading: Non collegato a %{provider} - description: Accedi a %{provider} per visualizzare e gestire le pagine wiki correlate da questa istanza di OpenProject. - connect_button: Connetti account %{provider} admin: destroy_confirmation_dialog_component: - title: Elimina fornitore wiki - heading: Eliminare definitivamente questo fornitore wiki? description_html: Il fornitore wiki %{wiki_provider} e tutti i collegamenti alle pagine wiki associati verranno eliminati. Inoltre, tutti i collegamenti incorporati alle pagine wiki non saranno più accessibili. Questa azione è irreversibile. + heading: Eliminare definitivamente questo fornitore wiki? + title: Elimina fornitore wiki forms: general_info_form_component: - xwiki_instance_description: Assicurati di avere privilegi di amministrazione nella tua istanza XWiki prima di procedere con la configurazione. + provider_description: Assicurati di avere privilegi di amministrazione nella tua istanza XWiki prima di procedere con la configurazione. oauth_application_form_component: - application_id: ID applicazione - application_secret: Applicazione secretata + application_id: ID applicazione OAuth di OpenProject + application_secret: Secret dell'applicazione OAuth di OpenProject oauth_client_form_component: - client_id: ID Client + client_id: ID client OAuth della wiki + client_secret: Secret del client OAuth della wiki + redirect_uri: URI di reindirizzamento + redirect_uri_caption: Copia questo valore nel campo Redirect URI della registrazione del client XWiki OIDC. health_status: show: actions: @@ -86,13 +65,19 @@ it: no_health_report: Nessun report disponibile no_health_report_description: Esegui subito i controlli per ottenere un report completo sullo stato di integrità di questo fornitore wiki. title: Report sullo stato + internal_provider_form: + checkbox_caption: Allow projects to use the internal OpenProject wiki along with external Wiki providers + checkbox_label: Enable the internal OpenProject wiki + internal_wiki_provider: + show: + description: Choose to enable or disable the internal OpenProject wiki oauth_application_info_component: confirm_replace_oauth_application: Questa azione reimposterà le credenziali OAuth correnti. Dopo la conferma dovrai reinserire le credenziali nella tua istanza XWiki e tutti gli utenti dovranno autorizzare nuovamente l'accesso. Vuoi davvero procedere? - label_pending: In sospeso + label_oauth_client_id: ID client OAuth replace_oauth_application: Sostituisci l'applicazione OpenProject OAuth oauth_client_info_component: confirm_replace_oauth_client: Questa azione reimposterà le credenziali OAuth correnti di XWiki. Tutti gli utenti dovranno autorizzare nuovamente l'accesso a XWiki. Vuoi davvero procedere? - label_pending: In sospeso + label_oauth_client_id: ID client OAuth replace_oauth_client: Sostituisci l'applicazione XWiki OAuth side_panel: health_status_component: @@ -110,25 +95,81 @@ it: index_description: Aggiungi un servizio wiki esterno per collegare le macro-attività a pagine wiki esistenti o crearne di nuove direttamente da OpenProject. label_add_new: Aggiungi nuovo fornitore wiki label_edit: Modifica fornitore XWiki - label_new_xwiki_instance: Nuovo fornitore XWiki + label_new_provider: Nuovo fornitore XWiki label_wiki_platform: Fornitore Wiki - name_caption: Assegna un nome all'archivio in modo che gli utenti possano distinguere tra più piattaforme wiki. + name_caption: Give your wiki provider a name so that users can differentiate between multiple wiki platforms. name_placeholder: Base di conoscenza XWiki new_provider_html: Consulta la nostra documentazione su come [configurare un'integrazione con XWiki](docs_url) per maggiori informazioni. oauth: openproject_oauth: OpenProject OAuth sections: - general_information: Informazioni base + general_information: Informazioni generali oauth_configuration: Configurazione OAuth - url_caption: Inserisci l'indirizzo host della tua piattaforma wiki, includendo https://. Non deve superare i 255 caratteri. - xwiki_instance: Istanza XWiki + url_caption: The host address of your wiki platform including the https://. It should not be longer than 255 characters. xwiki: oauth: - openproject_oauth_description: Consenti a XWiki di accedere ai dati di OpenProject tramite un'applicazione OAuth. Copia le credenziali riportate di seguito nella tua istanza XWiki. - provider_oauth: XWiki OAuth - provider_oauth_description: Consenti a OpenProject di accedere ai dati di XWiki tramite OAuth. Un ID client viene generato automaticamente per identificare OpenProject presso XWiki, quindi non è necessaria alcuna configurazione manuale sul lato XWiki. + openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. + provider_oauth: Wiki OAuth + provider_oauth_configuration: Copy these values to the [XWiki OIDC Connection client](xwiki_oidc_link). + provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. openproject_oauth_description: Consenti a XWiki di accedere ai dati di OpenProject utilizzando un OAuth. xwiki_oauth: XWiki OAuth xwiki_oauth_description: Consenti a OpenProject di accedere ai dati XWiki utilizzando OAuth. - macro: - page_not_found: La pagina wiki collegata non è più disponibile + buttons: + connect_account: Connetti account %{provider} + done_continue: Fatto, continua + open_wiki: Apri wiki + save_and_continue: Salva e continua + wiki_page: Pagina wiki + create_new_wiki_page_dialog: + page_title: Title + parent_help_text: Select a parent for this new wiki page. + title: Create new wiki page + delete_relation_page_link_confirmation_dialog: + heading: Eliminare il link relativo alla pagina wiki? + title: Elimina il link relativo alla pagina wiki + health_checks: + authentication: + existing_token: Token utente + header: Autenticazione + user_bound_request: Autenticazione richiesta basata sull'utente + base_configuration: + header: Configurazione + provider_configured: Configurazione completa + errors: + not_configured: Non è stato possibile verificare la connessione. Prima è necessario completare la configurazione. + xwiki_oauth_connection_error: OpenProject non è riuscito a connettersi all'istanza XWiki configurata. + xwiki_oauth_request_error: Si è verificato un errore imprevisto durante il tentativo di comunicare con l'istanza XWiki. + xwiki_oauth_token_missing: OpenProject non può testare la comunicazione a livello utente con XWiki poiché l'utente non ha ancora collegato il proprio account XWiki. + xwiki_oauth_unauthorized: Il token utente non è stato riconosciuto da XWiki. + instructions: + xwiki: + integration: Amministrazione XWiki + oauth_application_details_html: Il valore del client secret non sarà più accessibile dopo la chiusura di questa finestra. Copia questi valori nelle [impostazioni di integrazione OpenProject di XWiki](xwiki_admin_link). + link_existing_wiki_page_dialog: + title: Aggiungi una pagina wiki esistente + link_existing_wiki_page_form: + no_results: No wiki pages found + placeholder: Search for a wiki page + oauth_login_component: + connect_button: Connetti account %{provider} + description: Accedi a %{provider} per visualizzare e gestire le pagine wiki correlate da questa istanza di OpenProject. + heading: Non collegato a %{provider} + page_link_component: + remove: Rimuovi link della pagina + page_links: + errors: + page_access_forbidden: Non hai i permessi per accedere a questa pagina wiki + page_not_found: La pagina wiki collegata non è più disponibile + unexpected: Si è verificato un errore inaspettato + provider_types: + xwiki: + name: XWiki + relation_page_links_component: + empty_heading: Nessuna pagina correlata + empty_text: Aggiunga manualmente i link ad altre pagine wiki correlate. + link_existing: Pagina wiki esistente + link_new: Nuova pagina wiki + work_package_wikis_tab_component: + inline_page_links: Collegamenti alle pagine inline + referencing_pages: Citata in diff --git a/modules/wikis/config/locales/crowdin/ja.yml b/modules/wikis/config/locales/crowdin/ja.yml index c7edaf18840..8d15793bd6a 100644 --- a/modules/wikis/config/locales/crowdin/ja.yml +++ b/modules/wikis/config/locales/crowdin/ja.yml @@ -3,15 +3,17 @@ ja: activerecord: attributes: wikis/page_link: + identifier: Identifier provider: Wiki Provider + wikis/provider: + name: Name + universal_identifier: Universal identifier wikis/xwiki_provider: authentication_method: Authentication method authentication_methods: oauth2_sso: Single-Sign-On through OpenID Connect Identity Provider two_way_oauth2: Two-way OAuth 2.0 authorization code flow - name: Name token_exchange_scope: XWiki Scope - universal_identifier: Universal identifier url: Instance URL wiki_audience: XWiki Audience errors: {} @@ -25,53 +27,30 @@ ja: other: Relation page links wikis/xwiki_provider: other: XWiki providers + menus: + admin: + external_wiki_providers: Wiki providers + internal_wiki_provider: Internal wiki + wikis: Wikis permission_manage_wiki_page_links: Manage Wiki Page Links project_module_wiki_platforms: Wiki providers wikis: - buttons: - connect_account: Connect %{provider} account - done_continue: Done, continue - save_and_continue: Save and continue - wiki_page: Wiki page - health_checks: - authentication: - existing_token: User token - header: Authentication - user_bound_request: User-based request authentication - base_configuration: - header: Configuration - provider_configured: Configuration complete - errors: - not_configured: The connection could not be validated. Please finish configuration first. - xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. - xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. - xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. - xwiki_oauth_unauthorized: The user token was not recognized by XWiki. - work_package_wikis_tab_component: - inline_page_links: Inline page links - referencing_pages: Referenced in - page_link_component: - remove: Remove page link - relation_page_links_component: - empty_heading: No related pages - empty_text: Manually add links to other related wiki pages. - oauth_login_component: - heading: Not connected to %{provider} - description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. - connect_button: Connect %{provider} account admin: destroy_confirmation_dialog_component: - title: Delete wiki provider - heading: Permanently delete this wiki provider? description_html: The wiki provider %{wiki_provider} and all the related wiki page links will be deleted. In addition, every inline wiki page link will no longer be accessible. This action is irreversible. + heading: Permanently delete this wiki provider? + title: Delete wiki provider forms: general_info_form_component: - xwiki_instance_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. + provider_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. oauth_application_form_component: - application_id: Application ID - application_secret: Application secret + application_id: OpenProject OAuth Application ID + application_secret: OpenProject OAuth Application secret oauth_client_form_component: - client_id: Client ID + client_id: Wiki OAuth Client ID + client_secret: Wiki OAuth Client secret + redirect_uri: Redirect URI + redirect_uri_caption: Copy this value into the Redirect URI field of your XWiki OIDC client registration. health_status: show: actions: @@ -82,13 +61,19 @@ ja: no_health_report: No report available no_health_report_description: Run the checks now for a full health status report for this wiki provider. title: Health Report + internal_provider_form: + checkbox_caption: Allow projects to use the internal OpenProject wiki along with external Wiki providers + checkbox_label: Enable the internal OpenProject wiki + internal_wiki_provider: + show: + description: Choose to enable or disable the internal OpenProject wiki oauth_application_info_component: confirm_replace_oauth_application: This action will reset the current OAuth credentials. After confirming you will have to reenter the credentials in your XWiki instance and all users will have to reauthorize. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_application: Replace OpenProject OAuth application oauth_client_info_component: confirm_replace_oauth_client: This action will reset the current XWiki OAuth credentials. All users will need to reauthorize against XWiki. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_client: Replace XWiki OAuth application side_panel: health_status_component: @@ -106,25 +91,81 @@ ja: index_description: Add an external wiki service to link work packages to existing wiki pages or create new ones directly from OpenProject. label_add_new: Add new wiki provider label_edit: Edit XWiki provider - label_new_xwiki_instance: New XWiki provider + label_new_provider: New XWiki provider label_wiki_platform: Wiki provider - name_caption: Give your storage a name so that users can differentiate between multiple wiki platforms. + name_caption: Give your wiki provider a name so that users can differentiate between multiple wiki platforms. name_placeholder: XWiki knowledge base new_provider_html: Read our documentation on [setting up an XWiki integration](docs_url) for more information. oauth: openproject_oauth: OpenProject OAuth sections: - general_information: Basic details + general_information: General information oauth_configuration: OAuth configuration - url_caption: Please add the host address of your wiki platform including the https://. It should not be longer than 255 characters. - xwiki_instance: XWiki Instance + url_caption: The host address of your wiki platform including the https://. It should not be longer than 255 characters. xwiki: oauth: - openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. Copy the credentials below into your XWiki instance. - provider_oauth: XWiki OAuth - provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. A client ID is automatically generated to identify OpenProject to XWiki — no manual configuration is needed on the XWiki side. + openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. + provider_oauth: Wiki OAuth + provider_oauth_configuration: Copy these values to the [XWiki OIDC Connection client](xwiki_oidc_link). + provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth. xwiki_oauth: XWiki OAuth xwiki_oauth_description: Allow OpenProject to access XWiki data using an OAuth. - macro: - page_not_found: Linked wiki page no longer available + buttons: + connect_account: Connect %{provider} account + done_continue: Done, continue + open_wiki: Open wiki + save_and_continue: Save and continue + wiki_page: Wiki page + create_new_wiki_page_dialog: + page_title: Title + parent_help_text: Select a parent for this new wiki page. + title: Create new wiki page + delete_relation_page_link_confirmation_dialog: + heading: Delete related wiki page link? + title: Delete related wiki page link + health_checks: + authentication: + existing_token: User token + header: Authentication + user_bound_request: User-based request authentication + base_configuration: + header: Configuration + provider_configured: Configuration complete + errors: + not_configured: The connection could not be validated. Please finish configuration first. + xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. + xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. + xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. + xwiki_oauth_unauthorized: The user token was not recognized by XWiki. + instructions: + xwiki: + integration: XWiki Administration + oauth_application_details_html: The client secret value will not be accessible again after you close this window. Please copy these values into the [XWiki OpenProject Integration settings](xwiki_admin_link). + link_existing_wiki_page_dialog: + title: Add existing wiki page + link_existing_wiki_page_form: + no_results: No wiki pages found + placeholder: Search for a wiki page + oauth_login_component: + connect_button: Connect %{provider} account + description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. + heading: Not connected to %{provider} + page_link_component: + remove: Remove page link + page_links: + errors: + page_access_forbidden: You do not have permission to access this wiki page + page_not_found: Linked wiki page no longer available + unexpected: An unexpected error occurred + provider_types: + xwiki: + name: XWiki + relation_page_links_component: + empty_heading: No related pages + empty_text: Manually add links to other related wiki pages. + link_existing: Existing wiki page + link_new: New wiki page + work_package_wikis_tab_component: + inline_page_links: Inline page links + referencing_pages: Referenced in diff --git a/modules/wikis/config/locales/crowdin/ka.yml b/modules/wikis/config/locales/crowdin/ka.yml index 30f8c5eb917..11a1a6eb2bb 100644 --- a/modules/wikis/config/locales/crowdin/ka.yml +++ b/modules/wikis/config/locales/crowdin/ka.yml @@ -3,15 +3,17 @@ ka: activerecord: attributes: wikis/page_link: + identifier: Identifier provider: Wiki Provider + wikis/provider: + name: Name + universal_identifier: Universal identifier wikis/xwiki_provider: authentication_method: Authentication method authentication_methods: oauth2_sso: Single-Sign-On through OpenID Connect Identity Provider two_way_oauth2: Two-way OAuth 2.0 authorization code flow - name: Name token_exchange_scope: XWiki Scope - universal_identifier: Universal identifier url: Instance URL wiki_audience: XWiki Audience errors: {} @@ -29,53 +31,30 @@ ka: wikis/xwiki_provider: one: XWiki provider other: XWiki providers + menus: + admin: + external_wiki_providers: Wiki providers + internal_wiki_provider: Internal wiki + wikis: Wikis permission_manage_wiki_page_links: Manage Wiki Page Links project_module_wiki_platforms: Wiki providers wikis: - buttons: - connect_account: Connect %{provider} account - done_continue: Done, continue - save_and_continue: Save and continue - wiki_page: Wiki page - health_checks: - authentication: - existing_token: User token - header: Authentication - user_bound_request: User-based request authentication - base_configuration: - header: Configuration - provider_configured: Configuration complete - errors: - not_configured: The connection could not be validated. Please finish configuration first. - xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. - xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. - xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. - xwiki_oauth_unauthorized: The user token was not recognized by XWiki. - work_package_wikis_tab_component: - inline_page_links: Inline page links - referencing_pages: Referenced in - page_link_component: - remove: Remove page link - relation_page_links_component: - empty_heading: No related pages - empty_text: Manually add links to other related wiki pages. - oauth_login_component: - heading: Not connected to %{provider} - description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. - connect_button: Connect %{provider} account admin: destroy_confirmation_dialog_component: - title: Delete wiki provider - heading: Permanently delete this wiki provider? description_html: The wiki provider %{wiki_provider} and all the related wiki page links will be deleted. In addition, every inline wiki page link will no longer be accessible. This action is irreversible. + heading: Permanently delete this wiki provider? + title: Delete wiki provider forms: general_info_form_component: - xwiki_instance_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. + provider_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. oauth_application_form_component: - application_id: Application ID - application_secret: Application secret + application_id: OpenProject OAuth Application ID + application_secret: OpenProject OAuth Application secret oauth_client_form_component: - client_id: Client ID + client_id: Wiki OAuth Client ID + client_secret: Wiki OAuth Client secret + redirect_uri: Redirect URI + redirect_uri_caption: Copy this value into the Redirect URI field of your XWiki OIDC client registration. health_status: show: actions: @@ -86,13 +65,19 @@ ka: no_health_report: No report available no_health_report_description: Run the checks now for a full health status report for this wiki provider. title: Health Report + internal_provider_form: + checkbox_caption: Allow projects to use the internal OpenProject wiki along with external Wiki providers + checkbox_label: Enable the internal OpenProject wiki + internal_wiki_provider: + show: + description: Choose to enable or disable the internal OpenProject wiki oauth_application_info_component: confirm_replace_oauth_application: This action will reset the current OAuth credentials. After confirming you will have to reenter the credentials in your XWiki instance and all users will have to reauthorize. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_application: Replace OpenProject OAuth application oauth_client_info_component: confirm_replace_oauth_client: This action will reset the current XWiki OAuth credentials. All users will need to reauthorize against XWiki. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_client: Replace XWiki OAuth application side_panel: health_status_component: @@ -110,25 +95,81 @@ ka: index_description: Add an external wiki service to link work packages to existing wiki pages or create new ones directly from OpenProject. label_add_new: Add new wiki provider label_edit: Edit XWiki provider - label_new_xwiki_instance: New XWiki provider + label_new_provider: New XWiki provider label_wiki_platform: Wiki provider - name_caption: Give your storage a name so that users can differentiate between multiple wiki platforms. + name_caption: Give your wiki provider a name so that users can differentiate between multiple wiki platforms. name_placeholder: XWiki knowledge base new_provider_html: Read our documentation on [setting up an XWiki integration](docs_url) for more information. oauth: openproject_oauth: OpenProject OAuth sections: - general_information: Basic details + general_information: General information oauth_configuration: OAuth configuration - url_caption: Please add the host address of your wiki platform including the https://. It should not be longer than 255 characters. - xwiki_instance: XWiki Instance + url_caption: The host address of your wiki platform including the https://. It should not be longer than 255 characters. xwiki: oauth: - openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. Copy the credentials below into your XWiki instance. - provider_oauth: XWiki OAuth - provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. A client ID is automatically generated to identify OpenProject to XWiki — no manual configuration is needed on the XWiki side. + openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. + provider_oauth: Wiki OAuth + provider_oauth_configuration: Copy these values to the [XWiki OIDC Connection client](xwiki_oidc_link). + provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth. xwiki_oauth: XWiki OAuth xwiki_oauth_description: Allow OpenProject to access XWiki data using an OAuth. - macro: - page_not_found: Linked wiki page no longer available + buttons: + connect_account: Connect %{provider} account + done_continue: Done, continue + open_wiki: Open wiki + save_and_continue: Save and continue + wiki_page: Wiki page + create_new_wiki_page_dialog: + page_title: Title + parent_help_text: Select a parent for this new wiki page. + title: Create new wiki page + delete_relation_page_link_confirmation_dialog: + heading: Delete related wiki page link? + title: Delete related wiki page link + health_checks: + authentication: + existing_token: User token + header: Authentication + user_bound_request: User-based request authentication + base_configuration: + header: Configuration + provider_configured: Configuration complete + errors: + not_configured: The connection could not be validated. Please finish configuration first. + xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. + xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. + xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. + xwiki_oauth_unauthorized: The user token was not recognized by XWiki. + instructions: + xwiki: + integration: XWiki Administration + oauth_application_details_html: The client secret value will not be accessible again after you close this window. Please copy these values into the [XWiki OpenProject Integration settings](xwiki_admin_link). + link_existing_wiki_page_dialog: + title: Add existing wiki page + link_existing_wiki_page_form: + no_results: No wiki pages found + placeholder: Search for a wiki page + oauth_login_component: + connect_button: Connect %{provider} account + description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. + heading: Not connected to %{provider} + page_link_component: + remove: Remove page link + page_links: + errors: + page_access_forbidden: You do not have permission to access this wiki page + page_not_found: Linked wiki page no longer available + unexpected: An unexpected error occurred + provider_types: + xwiki: + name: XWiki + relation_page_links_component: + empty_heading: No related pages + empty_text: Manually add links to other related wiki pages. + link_existing: Existing wiki page + link_new: New wiki page + work_package_wikis_tab_component: + inline_page_links: Inline page links + referencing_pages: Referenced in diff --git a/modules/wikis/config/locales/crowdin/kk.yml b/modules/wikis/config/locales/crowdin/kk.yml index 394edcd4760..8ec1b38fb80 100644 --- a/modules/wikis/config/locales/crowdin/kk.yml +++ b/modules/wikis/config/locales/crowdin/kk.yml @@ -3,15 +3,17 @@ kk: activerecord: attributes: wikis/page_link: + identifier: Identifier provider: Wiki Provider + wikis/provider: + name: Name + universal_identifier: Universal identifier wikis/xwiki_provider: authentication_method: Authentication method authentication_methods: oauth2_sso: Single-Sign-On through OpenID Connect Identity Provider two_way_oauth2: Two-way OAuth 2.0 authorization code flow - name: Name token_exchange_scope: XWiki Scope - universal_identifier: Universal identifier url: Instance URL wiki_audience: XWiki Audience errors: {} @@ -29,53 +31,30 @@ kk: wikis/xwiki_provider: one: XWiki provider other: XWiki providers + menus: + admin: + external_wiki_providers: Wiki providers + internal_wiki_provider: Internal wiki + wikis: Wikis permission_manage_wiki_page_links: Manage Wiki Page Links project_module_wiki_platforms: Wiki providers wikis: - buttons: - connect_account: Connect %{provider} account - done_continue: Done, continue - save_and_continue: Save and continue - wiki_page: Wiki page - health_checks: - authentication: - existing_token: User token - header: Authentication - user_bound_request: User-based request authentication - base_configuration: - header: Configuration - provider_configured: Configuration complete - errors: - not_configured: The connection could not be validated. Please finish configuration first. - xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. - xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. - xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. - xwiki_oauth_unauthorized: The user token was not recognized by XWiki. - work_package_wikis_tab_component: - inline_page_links: Inline page links - referencing_pages: Referenced in - page_link_component: - remove: Remove page link - relation_page_links_component: - empty_heading: No related pages - empty_text: Manually add links to other related wiki pages. - oauth_login_component: - heading: Not connected to %{provider} - description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. - connect_button: Connect %{provider} account admin: destroy_confirmation_dialog_component: - title: Delete wiki provider - heading: Permanently delete this wiki provider? description_html: The wiki provider %{wiki_provider} and all the related wiki page links will be deleted. In addition, every inline wiki page link will no longer be accessible. This action is irreversible. + heading: Permanently delete this wiki provider? + title: Delete wiki provider forms: general_info_form_component: - xwiki_instance_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. + provider_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. oauth_application_form_component: - application_id: Application ID - application_secret: Application secret + application_id: OpenProject OAuth Application ID + application_secret: OpenProject OAuth Application secret oauth_client_form_component: - client_id: Client ID + client_id: Wiki OAuth Client ID + client_secret: Wiki OAuth Client secret + redirect_uri: Redirect URI + redirect_uri_caption: Copy this value into the Redirect URI field of your XWiki OIDC client registration. health_status: show: actions: @@ -86,13 +65,19 @@ kk: no_health_report: No report available no_health_report_description: Run the checks now for a full health status report for this wiki provider. title: Health Report + internal_provider_form: + checkbox_caption: Allow projects to use the internal OpenProject wiki along with external Wiki providers + checkbox_label: Enable the internal OpenProject wiki + internal_wiki_provider: + show: + description: Choose to enable or disable the internal OpenProject wiki oauth_application_info_component: confirm_replace_oauth_application: This action will reset the current OAuth credentials. After confirming you will have to reenter the credentials in your XWiki instance and all users will have to reauthorize. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_application: Replace OpenProject OAuth application oauth_client_info_component: confirm_replace_oauth_client: This action will reset the current XWiki OAuth credentials. All users will need to reauthorize against XWiki. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_client: Replace XWiki OAuth application side_panel: health_status_component: @@ -110,25 +95,81 @@ kk: index_description: Add an external wiki service to link work packages to existing wiki pages or create new ones directly from OpenProject. label_add_new: Add new wiki provider label_edit: Edit XWiki provider - label_new_xwiki_instance: New XWiki provider + label_new_provider: New XWiki provider label_wiki_platform: Wiki provider - name_caption: Give your storage a name so that users can differentiate between multiple wiki platforms. + name_caption: Give your wiki provider a name so that users can differentiate between multiple wiki platforms. name_placeholder: XWiki knowledge base new_provider_html: Read our documentation on [setting up an XWiki integration](docs_url) for more information. oauth: openproject_oauth: OpenProject OAuth sections: - general_information: Basic details + general_information: General information oauth_configuration: OAuth configuration - url_caption: Please add the host address of your wiki platform including the https://. It should not be longer than 255 characters. - xwiki_instance: XWiki Instance + url_caption: The host address of your wiki platform including the https://. It should not be longer than 255 characters. xwiki: oauth: - openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. Copy the credentials below into your XWiki instance. - provider_oauth: XWiki OAuth - provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. A client ID is automatically generated to identify OpenProject to XWiki — no manual configuration is needed on the XWiki side. + openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. + provider_oauth: Wiki OAuth + provider_oauth_configuration: Copy these values to the [XWiki OIDC Connection client](xwiki_oidc_link). + provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth. xwiki_oauth: XWiki OAuth xwiki_oauth_description: Allow OpenProject to access XWiki data using an OAuth. - macro: - page_not_found: Linked wiki page no longer available + buttons: + connect_account: Connect %{provider} account + done_continue: Done, continue + open_wiki: Open wiki + save_and_continue: Save and continue + wiki_page: Wiki page + create_new_wiki_page_dialog: + page_title: Title + parent_help_text: Select a parent for this new wiki page. + title: Create new wiki page + delete_relation_page_link_confirmation_dialog: + heading: Delete related wiki page link? + title: Delete related wiki page link + health_checks: + authentication: + existing_token: User token + header: Authentication + user_bound_request: User-based request authentication + base_configuration: + header: Configuration + provider_configured: Configuration complete + errors: + not_configured: The connection could not be validated. Please finish configuration first. + xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. + xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. + xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. + xwiki_oauth_unauthorized: The user token was not recognized by XWiki. + instructions: + xwiki: + integration: XWiki Administration + oauth_application_details_html: The client secret value will not be accessible again after you close this window. Please copy these values into the [XWiki OpenProject Integration settings](xwiki_admin_link). + link_existing_wiki_page_dialog: + title: Add existing wiki page + link_existing_wiki_page_form: + no_results: No wiki pages found + placeholder: Search for a wiki page + oauth_login_component: + connect_button: Connect %{provider} account + description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. + heading: Not connected to %{provider} + page_link_component: + remove: Remove page link + page_links: + errors: + page_access_forbidden: You do not have permission to access this wiki page + page_not_found: Linked wiki page no longer available + unexpected: An unexpected error occurred + provider_types: + xwiki: + name: XWiki + relation_page_links_component: + empty_heading: No related pages + empty_text: Manually add links to other related wiki pages. + link_existing: Existing wiki page + link_new: New wiki page + work_package_wikis_tab_component: + inline_page_links: Inline page links + referencing_pages: Referenced in diff --git a/modules/wikis/config/locales/crowdin/ko.yml b/modules/wikis/config/locales/crowdin/ko.yml index 2b528691ff4..b3d3c7aa702 100644 --- a/modules/wikis/config/locales/crowdin/ko.yml +++ b/modules/wikis/config/locales/crowdin/ko.yml @@ -3,15 +3,17 @@ ko: activerecord: attributes: wikis/page_link: + identifier: 식별자 provider: 위키 공급자 + wikis/provider: + name: 이름 + universal_identifier: 범용 식별자 wikis/xwiki_provider: authentication_method: 인증 방법 authentication_methods: oauth2_sso: OpenID Connect ID 공급자를 통한 Single-Sign-On two_way_oauth2: 양방향 OAuth 2.0 인증 코드 흐름 - name: 이름 token_exchange_scope: XWiki 범위 - universal_identifier: 범용 식별자 url: 인스턴스 URL wiki_audience: XWiki 오디언스 errors: {} @@ -25,53 +27,30 @@ ko: other: 관련 페이지 링크 wikis/xwiki_provider: other: XWiki 공급자 + menus: + admin: + external_wiki_providers: Wiki providers + internal_wiki_provider: Internal wiki + wikis: Wikis permission_manage_wiki_page_links: 위키 페이지 링크 관리 project_module_wiki_platforms: 위키 공급자 wikis: - buttons: - connect_account: "%{provider} 계정 연결" - done_continue: 완료, 계속 - save_and_continue: 저장 및 계속 - wiki_page: 위키 페이지 - health_checks: - authentication: - existing_token: 사용자 토큰 - header: 인증 - user_bound_request: 사용자 기반 요청 인증 - base_configuration: - header: 구성 - provider_configured: 구성 완료 - errors: - not_configured: 연결에 대한 유효성 검사를 할 수 없습니다. 먼저 구성을 완료하세요. - xwiki_oauth_connection_error: 구성된 XWiki 인스턴스에 OpenProject가 연결할 수 없습니다. - xwiki_oauth_request_error: XWiki 인스턴스와 통신을 시도할 때 예기치 않은 오류가 발생했습니다. - xwiki_oauth_token_missing: 사용자가 아직 XWiki 계정을 연결하지 않았기 때문에 OpenProject가 XWiki와의 사용자 수준 통신을 테스트할 수 없습니다. - xwiki_oauth_unauthorized: 사용자 토큰이 XWiki에서 인식되지 않았습니다. - work_package_wikis_tab_component: - inline_page_links: 인라인 페이지 링크 - referencing_pages: '다음에서 참조됨:' - page_link_component: - remove: 페이지 링크 제거 - relation_page_links_component: - empty_heading: 관련 페이지 없음 - empty_text: 다른 관련 위키 페이지에 대한 링크를 수동으로 추가합니다. - oauth_login_component: - heading: "%{provider}에 연결되지 않음" - description: "%{provider}에 로그인하여 이 OpenProject 인스턴스의 관련 위키 페이지를 보고 관리합니다." - connect_button: "%{provider} 계정 연결" admin: destroy_confirmation_dialog_component: - title: 위키 공급자 삭제 - heading: 이 위키 공급자를 영구적으로 삭제하시겠습니까? description_html: 위키 공급자 %{wiki_provider} 및 모든 관련 위키 페이지 링크가 삭제됩니다. 또한 모든 인라인 위키 페이지 링크에 더 이상 액세스할 수 없습니다. 이 작업은 되돌릴 수 없습니다. + heading: 이 위키 공급자를 영구적으로 삭제하시겠습니까? + title: 위키 공급자 삭제 forms: general_info_form_component: - xwiki_instance_description: 설정을 수행하기 전에 XWiki 인스턴스에서 관리 권한이 있는지 확인하세요. + provider_description: 설정을 수행하기 전에 XWiki 인스턴스에서 관리 권한이 있는지 확인하세요. oauth_application_form_component: - application_id: 애플리케이션 ID - application_secret: 애플리케이션 비밀번호 + application_id: OpenProject OAuth 애플리케이션 ID + application_secret: OpenProject OAuth 애플리케이션 비밀번호 oauth_client_form_component: - client_id: 클라이언트 ID + client_id: 위키 OAuth 클라이언트 ID + client_secret: 위키 OAuth 클라이언트 비밀번호 + redirect_uri: 리디렉션 URI + redirect_uri_caption: 이 값을 XWiki OIDC 클라이언트 등록의 리디렉션 URI 필드에 복사하세요. health_status: show: actions: @@ -82,13 +61,19 @@ ko: no_health_report: 사용 가능한 보고서 없음 no_health_report_description: 이 위키 공급자에 대한 전체 상태 보고서를 보려면 지금 검사를 실행하세요. title: 상태 보고서 + internal_provider_form: + checkbox_caption: Allow projects to use the internal OpenProject wiki along with external Wiki providers + checkbox_label: Enable the internal OpenProject wiki + internal_wiki_provider: + show: + description: Choose to enable or disable the internal OpenProject wiki oauth_application_info_component: confirm_replace_oauth_application: 이 작업은 현재 OAuth 자격 증명을 재설정합니다. 확인 후 XWiki 인스턴스에서 자격 증명을 다시 입력해야 하며 모든 사용자가 다시 인증해야 합니다. 계속하시겠습니까? - label_pending: 대기 중 + label_oauth_client_id: OAuth 클라이언트 ID replace_oauth_application: OpenProject OAuth 애플리케이션 바꾸기 oauth_client_info_component: confirm_replace_oauth_client: 이 작업은 현재 XWiki OAuth 자격 증명을 재설정합니다. 모든 사용자는 XWiki에 대해 다시 인증해야 합니다. 계속하시겠습니까? - label_pending: 대기 중 + label_oauth_client_id: OAuth 클라이언트 ID replace_oauth_client: XWiki OAuth 애플리케이션 바꾸기 side_panel: health_status_component: @@ -106,25 +91,81 @@ ko: index_description: 외부 위키 서비스를 추가하여 작업 패키지를 기존 위키 페이지에 링크하거나 OpenProject에서 직접 새로운 위키 페이지를 만듭니다. label_add_new: 새로운 위키 공급자 추가 label_edit: XWiki 공급자 편집 - label_new_xwiki_instance: 새로운 XWiki 공급자 + label_new_provider: 새로운 XWiki 공급자 label_wiki_platform: 위키 공급자 - name_caption: 사용자가 여러 위키 플랫폼 간에 구분할 수 있도록 저장소에 이름을 지정하세요. + name_caption: Give your wiki provider a name so that users can differentiate between multiple wiki platforms. name_placeholder: XWiki 지식 베이스 new_provider_html: 자세한 내용은 [XWiki 통합 설정] 관련 문서(docs_url)를 참조하세요. oauth: openproject_oauth: OpenProject OAuth sections: - general_information: 기본 세부 정보 + general_information: 일반 정보 oauth_configuration: OAuth 구성 - url_caption: https://를 포함하여 위키 플랫폼의 호스트 주소를 추가하세요. 255자 이하여야 합니다. - xwiki_instance: XWiki 인스턴스 + url_caption: The host address of your wiki platform including the https://. It should not be longer than 255 characters. xwiki: oauth: - openproject_oauth_description: XWiki가 OAuth 애플리케이션을 사용하여 OpenProject 데이터에 액세스하도록 허용합니다. 아래 자격 증명을 XWiki 인스턴스에 복사합니다. - provider_oauth: XWiki OAuth - provider_oauth_description: OpenProject가 OAuth를 사용하여 XWiki 데이터에 액세스하도록 허용합니다. XWiki에 대해 OpenProject를 식별하기 위한 클라이언트 ID가 자동으로 생성되므로, XWiki 측에서 수동으로 구성할 필요가 없습니다. + openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. + provider_oauth: 위키 OAuth + provider_oauth_configuration: Copy these values to the [XWiki OIDC Connection client](xwiki_oidc_link). + provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. openproject_oauth_description: XWiki가 OAuth를 사용하여 OpenProject 데이터에 액세스하도록 허용합니다. xwiki_oauth: XWiki OAuth xwiki_oauth_description: OpenProject가 OAuth를 사용하여 XWiki 데이터에 액세스하도록 허용합니다. - macro: - page_not_found: 링크된 위키 페이지를 더 이상 사용할 수 없음 + buttons: + connect_account: "%{provider} 계정 연결" + done_continue: 완료, 계속 + open_wiki: 위키 열기 + save_and_continue: 저장 및 계속 + wiki_page: 위키 페이지 + create_new_wiki_page_dialog: + page_title: Title + parent_help_text: Select a parent for this new wiki page. + title: Create new wiki page + delete_relation_page_link_confirmation_dialog: + heading: 관련 위키 페이지 링크를 삭제하시겠습니까? + title: 관련 위키 페이지 링크 삭제 + health_checks: + authentication: + existing_token: 사용자 토큰 + header: 인증 + user_bound_request: 사용자 기반 요청 인증 + base_configuration: + header: 구성 + provider_configured: 구성 완료 + errors: + not_configured: 연결에 대한 유효성 검사를 할 수 없습니다. 먼저 구성을 완료하세요. + xwiki_oauth_connection_error: 구성된 XWiki 인스턴스에 OpenProject가 연결할 수 없습니다. + xwiki_oauth_request_error: XWiki 인스턴스와 통신을 시도할 때 예기치 않은 오류가 발생했습니다. + xwiki_oauth_token_missing: 사용자가 아직 XWiki 계정을 연결하지 않았기 때문에 OpenProject가 XWiki와의 사용자 수준 통신을 테스트할 수 없습니다. + xwiki_oauth_unauthorized: 사용자 토큰이 XWiki에서 인식되지 않았습니다. + instructions: + xwiki: + integration: XWiki 관리 + oauth_application_details_html: '이 창을 닫으면 클라이언트 비밀번호 값에 다시 액세스할 수 없습니다. 다음 값을 [XWiki OpenProject 통합 설정](xwiki_admin_link)에 복사하세요:' + link_existing_wiki_page_dialog: + title: 기존 위키 페이지 추가 + link_existing_wiki_page_form: + no_results: No wiki pages found + placeholder: Search for a wiki page + oauth_login_component: + connect_button: "%{provider} 계정 연결" + description: "%{provider}에 로그인하여 이 OpenProject 인스턴스의 관련 위키 페이지를 보고 관리합니다." + heading: "%{provider}에 연결되지 않음" + page_link_component: + remove: 페이지 링크 제거 + page_links: + errors: + page_access_forbidden: 이 위키 페이지에 액세스할 수 있는 권한이 없습니다 + page_not_found: 링크된 위키 페이지를 더 이상 사용할 수 없음 + unexpected: 예기치 않은 오류가 발생했습니다 + provider_types: + xwiki: + name: XWiki + relation_page_links_component: + empty_heading: 관련 페이지 없음 + empty_text: 다른 관련 위키 페이지에 대한 링크를 수동으로 추가합니다. + link_existing: 기존 위키 페이지 + link_new: 새 위키 페이지 + work_package_wikis_tab_component: + inline_page_links: 인라인 페이지 링크 + referencing_pages: '다음에서 참조됨:' diff --git a/modules/wikis/config/locales/crowdin/lt.yml b/modules/wikis/config/locales/crowdin/lt.yml index 021d9959884..b26c55a4235 100644 --- a/modules/wikis/config/locales/crowdin/lt.yml +++ b/modules/wikis/config/locales/crowdin/lt.yml @@ -3,15 +3,17 @@ lt: activerecord: attributes: wikis/page_link: + identifier: Identifier provider: Wiki Provider + wikis/provider: + name: Name + universal_identifier: Universal identifier wikis/xwiki_provider: authentication_method: Authentication method authentication_methods: oauth2_sso: Single-Sign-On through OpenID Connect Identity Provider two_way_oauth2: Two-way OAuth 2.0 authorization code flow - name: Name token_exchange_scope: XWiki Scope - universal_identifier: Universal identifier url: Instance URL wiki_audience: XWiki Audience errors: {} @@ -37,53 +39,30 @@ lt: few: XWiki providers many: XWiki providers other: XWiki providers + menus: + admin: + external_wiki_providers: Wiki providers + internal_wiki_provider: Internal wiki + wikis: Wikis permission_manage_wiki_page_links: Manage Wiki Page Links project_module_wiki_platforms: Wiki providers wikis: - buttons: - connect_account: Connect %{provider} account - done_continue: Done, continue - save_and_continue: Save and continue - wiki_page: Wiki page - health_checks: - authentication: - existing_token: User token - header: Authentication - user_bound_request: User-based request authentication - base_configuration: - header: Configuration - provider_configured: Configuration complete - errors: - not_configured: The connection could not be validated. Please finish configuration first. - xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. - xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. - xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. - xwiki_oauth_unauthorized: The user token was not recognized by XWiki. - work_package_wikis_tab_component: - inline_page_links: Inline page links - referencing_pages: Referenced in - page_link_component: - remove: Remove page link - relation_page_links_component: - empty_heading: No related pages - empty_text: Manually add links to other related wiki pages. - oauth_login_component: - heading: Not connected to %{provider} - description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. - connect_button: Connect %{provider} account admin: destroy_confirmation_dialog_component: - title: Delete wiki provider - heading: Permanently delete this wiki provider? description_html: The wiki provider %{wiki_provider} and all the related wiki page links will be deleted. In addition, every inline wiki page link will no longer be accessible. This action is irreversible. + heading: Permanently delete this wiki provider? + title: Delete wiki provider forms: general_info_form_component: - xwiki_instance_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. + provider_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. oauth_application_form_component: - application_id: Application ID - application_secret: Application secret + application_id: OpenProject OAuth Application ID + application_secret: OpenProject OAuth Application secret oauth_client_form_component: - client_id: Client ID + client_id: Wiki OAuth Client ID + client_secret: Wiki OAuth Client secret + redirect_uri: Redirect URI + redirect_uri_caption: Copy this value into the Redirect URI field of your XWiki OIDC client registration. health_status: show: actions: @@ -94,13 +73,19 @@ lt: no_health_report: No report available no_health_report_description: Run the checks now for a full health status report for this wiki provider. title: Health Report + internal_provider_form: + checkbox_caption: Allow projects to use the internal OpenProject wiki along with external Wiki providers + checkbox_label: Enable the internal OpenProject wiki + internal_wiki_provider: + show: + description: Choose to enable or disable the internal OpenProject wiki oauth_application_info_component: confirm_replace_oauth_application: This action will reset the current OAuth credentials. After confirming you will have to reenter the credentials in your XWiki instance and all users will have to reauthorize. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_application: Replace OpenProject OAuth application oauth_client_info_component: confirm_replace_oauth_client: This action will reset the current XWiki OAuth credentials. All users will need to reauthorize against XWiki. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_client: Replace XWiki OAuth application side_panel: health_status_component: @@ -118,25 +103,81 @@ lt: index_description: Add an external wiki service to link work packages to existing wiki pages or create new ones directly from OpenProject. label_add_new: Add new wiki provider label_edit: Edit XWiki provider - label_new_xwiki_instance: New XWiki provider + label_new_provider: New XWiki provider label_wiki_platform: Wiki provider - name_caption: Give your storage a name so that users can differentiate between multiple wiki platforms. + name_caption: Give your wiki provider a name so that users can differentiate between multiple wiki platforms. name_placeholder: XWiki knowledge base new_provider_html: Read our documentation on [setting up an XWiki integration](docs_url) for more information. oauth: openproject_oauth: OpenProject OAuth sections: - general_information: Basic details + general_information: General information oauth_configuration: OAuth configuration - url_caption: Please add the host address of your wiki platform including the https://. It should not be longer than 255 characters. - xwiki_instance: XWiki Instance + url_caption: The host address of your wiki platform including the https://. It should not be longer than 255 characters. xwiki: oauth: - openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. Copy the credentials below into your XWiki instance. - provider_oauth: XWiki OAuth - provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. A client ID is automatically generated to identify OpenProject to XWiki — no manual configuration is needed on the XWiki side. + openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. + provider_oauth: Wiki OAuth + provider_oauth_configuration: Copy these values to the [XWiki OIDC Connection client](xwiki_oidc_link). + provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth. xwiki_oauth: XWiki OAuth xwiki_oauth_description: Allow OpenProject to access XWiki data using an OAuth. - macro: - page_not_found: Linked wiki page no longer available + buttons: + connect_account: Connect %{provider} account + done_continue: Done, continue + open_wiki: Open wiki + save_and_continue: Save and continue + wiki_page: Wiki page + create_new_wiki_page_dialog: + page_title: Title + parent_help_text: Select a parent for this new wiki page. + title: Create new wiki page + delete_relation_page_link_confirmation_dialog: + heading: Delete related wiki page link? + title: Delete related wiki page link + health_checks: + authentication: + existing_token: User token + header: Authentication + user_bound_request: User-based request authentication + base_configuration: + header: Configuration + provider_configured: Configuration complete + errors: + not_configured: The connection could not be validated. Please finish configuration first. + xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. + xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. + xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. + xwiki_oauth_unauthorized: The user token was not recognized by XWiki. + instructions: + xwiki: + integration: XWiki Administration + oauth_application_details_html: The client secret value will not be accessible again after you close this window. Please copy these values into the [XWiki OpenProject Integration settings](xwiki_admin_link). + link_existing_wiki_page_dialog: + title: Add existing wiki page + link_existing_wiki_page_form: + no_results: No wiki pages found + placeholder: Search for a wiki page + oauth_login_component: + connect_button: Connect %{provider} account + description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. + heading: Not connected to %{provider} + page_link_component: + remove: Remove page link + page_links: + errors: + page_access_forbidden: You do not have permission to access this wiki page + page_not_found: Linked wiki page no longer available + unexpected: An unexpected error occurred + provider_types: + xwiki: + name: XWiki + relation_page_links_component: + empty_heading: No related pages + empty_text: Manually add links to other related wiki pages. + link_existing: Existing wiki page + link_new: New wiki page + work_package_wikis_tab_component: + inline_page_links: Inline page links + referencing_pages: Referenced in diff --git a/modules/wikis/config/locales/crowdin/lv.yml b/modules/wikis/config/locales/crowdin/lv.yml index da488850829..b5e655c4d3d 100644 --- a/modules/wikis/config/locales/crowdin/lv.yml +++ b/modules/wikis/config/locales/crowdin/lv.yml @@ -3,15 +3,17 @@ lv: activerecord: attributes: wikis/page_link: + identifier: Identifier provider: Wiki Provider + wikis/provider: + name: Name + universal_identifier: Universal identifier wikis/xwiki_provider: authentication_method: Authentication method authentication_methods: oauth2_sso: Single-Sign-On through OpenID Connect Identity Provider two_way_oauth2: Two-way OAuth 2.0 authorization code flow - name: Name token_exchange_scope: XWiki Scope - universal_identifier: Universal identifier url: Instance URL wiki_audience: XWiki Audience errors: {} @@ -33,53 +35,30 @@ lv: zero: XWiki providers one: XWiki provider other: XWiki providers + menus: + admin: + external_wiki_providers: Wiki providers + internal_wiki_provider: Internal wiki + wikis: Wikis permission_manage_wiki_page_links: Manage Wiki Page Links project_module_wiki_platforms: Wiki providers wikis: - buttons: - connect_account: Connect %{provider} account - done_continue: Done, continue - save_and_continue: Save and continue - wiki_page: Wiki page - health_checks: - authentication: - existing_token: User token - header: Authentication - user_bound_request: User-based request authentication - base_configuration: - header: Configuration - provider_configured: Configuration complete - errors: - not_configured: The connection could not be validated. Please finish configuration first. - xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. - xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. - xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. - xwiki_oauth_unauthorized: The user token was not recognized by XWiki. - work_package_wikis_tab_component: - inline_page_links: Inline page links - referencing_pages: Referenced in - page_link_component: - remove: Remove page link - relation_page_links_component: - empty_heading: No related pages - empty_text: Manually add links to other related wiki pages. - oauth_login_component: - heading: Not connected to %{provider} - description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. - connect_button: Connect %{provider} account admin: destroy_confirmation_dialog_component: - title: Delete wiki provider - heading: Permanently delete this wiki provider? description_html: The wiki provider %{wiki_provider} and all the related wiki page links will be deleted. In addition, every inline wiki page link will no longer be accessible. This action is irreversible. + heading: Permanently delete this wiki provider? + title: Delete wiki provider forms: general_info_form_component: - xwiki_instance_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. + provider_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. oauth_application_form_component: - application_id: Application ID - application_secret: Application secret + application_id: OpenProject OAuth Application ID + application_secret: OpenProject OAuth Application secret oauth_client_form_component: - client_id: Client ID + client_id: Wiki OAuth Client ID + client_secret: Wiki OAuth Client secret + redirect_uri: Redirect URI + redirect_uri_caption: Copy this value into the Redirect URI field of your XWiki OIDC client registration. health_status: show: actions: @@ -90,13 +69,19 @@ lv: no_health_report: No report available no_health_report_description: Run the checks now for a full health status report for this wiki provider. title: Health Report + internal_provider_form: + checkbox_caption: Allow projects to use the internal OpenProject wiki along with external Wiki providers + checkbox_label: Enable the internal OpenProject wiki + internal_wiki_provider: + show: + description: Choose to enable or disable the internal OpenProject wiki oauth_application_info_component: confirm_replace_oauth_application: This action will reset the current OAuth credentials. After confirming you will have to reenter the credentials in your XWiki instance and all users will have to reauthorize. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_application: Replace OpenProject OAuth application oauth_client_info_component: confirm_replace_oauth_client: This action will reset the current XWiki OAuth credentials. All users will need to reauthorize against XWiki. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_client: Replace XWiki OAuth application side_panel: health_status_component: @@ -114,25 +99,81 @@ lv: index_description: Add an external wiki service to link work packages to existing wiki pages or create new ones directly from OpenProject. label_add_new: Add new wiki provider label_edit: Edit XWiki provider - label_new_xwiki_instance: New XWiki provider + label_new_provider: New XWiki provider label_wiki_platform: Wiki provider - name_caption: Give your storage a name so that users can differentiate between multiple wiki platforms. + name_caption: Give your wiki provider a name so that users can differentiate between multiple wiki platforms. name_placeholder: XWiki knowledge base new_provider_html: Read our documentation on [setting up an XWiki integration](docs_url) for more information. oauth: openproject_oauth: OpenProject OAuth sections: - general_information: Basic details + general_information: General information oauth_configuration: OAuth configuration - url_caption: Please add the host address of your wiki platform including the https://. It should not be longer than 255 characters. - xwiki_instance: XWiki Instance + url_caption: The host address of your wiki platform including the https://. It should not be longer than 255 characters. xwiki: oauth: - openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. Copy the credentials below into your XWiki instance. - provider_oauth: XWiki OAuth - provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. A client ID is automatically generated to identify OpenProject to XWiki — no manual configuration is needed on the XWiki side. + openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. + provider_oauth: Wiki OAuth + provider_oauth_configuration: Copy these values to the [XWiki OIDC Connection client](xwiki_oidc_link). + provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth. xwiki_oauth: XWiki OAuth xwiki_oauth_description: Allow OpenProject to access XWiki data using an OAuth. - macro: - page_not_found: Linked wiki page no longer available + buttons: + connect_account: Connect %{provider} account + done_continue: Done, continue + open_wiki: Open wiki + save_and_continue: Save and continue + wiki_page: Wiki page + create_new_wiki_page_dialog: + page_title: Title + parent_help_text: Select a parent for this new wiki page. + title: Create new wiki page + delete_relation_page_link_confirmation_dialog: + heading: Delete related wiki page link? + title: Delete related wiki page link + health_checks: + authentication: + existing_token: User token + header: Authentication + user_bound_request: User-based request authentication + base_configuration: + header: Configuration + provider_configured: Configuration complete + errors: + not_configured: The connection could not be validated. Please finish configuration first. + xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. + xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. + xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. + xwiki_oauth_unauthorized: The user token was not recognized by XWiki. + instructions: + xwiki: + integration: XWiki Administration + oauth_application_details_html: The client secret value will not be accessible again after you close this window. Please copy these values into the [XWiki OpenProject Integration settings](xwiki_admin_link). + link_existing_wiki_page_dialog: + title: Add existing wiki page + link_existing_wiki_page_form: + no_results: No wiki pages found + placeholder: Search for a wiki page + oauth_login_component: + connect_button: Connect %{provider} account + description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. + heading: Not connected to %{provider} + page_link_component: + remove: Remove page link + page_links: + errors: + page_access_forbidden: You do not have permission to access this wiki page + page_not_found: Linked wiki page no longer available + unexpected: An unexpected error occurred + provider_types: + xwiki: + name: XWiki + relation_page_links_component: + empty_heading: No related pages + empty_text: Manually add links to other related wiki pages. + link_existing: Existing wiki page + link_new: New wiki page + work_package_wikis_tab_component: + inline_page_links: Inline page links + referencing_pages: Referenced in diff --git a/modules/wikis/config/locales/crowdin/mn.yml b/modules/wikis/config/locales/crowdin/mn.yml index 8eda83e75cd..d4d8c6ba532 100644 --- a/modules/wikis/config/locales/crowdin/mn.yml +++ b/modules/wikis/config/locales/crowdin/mn.yml @@ -3,15 +3,17 @@ mn: activerecord: attributes: wikis/page_link: + identifier: Identifier provider: Wiki Provider + wikis/provider: + name: Name + universal_identifier: Universal identifier wikis/xwiki_provider: authentication_method: Authentication method authentication_methods: oauth2_sso: Single-Sign-On through OpenID Connect Identity Provider two_way_oauth2: Two-way OAuth 2.0 authorization code flow - name: Name token_exchange_scope: XWiki Scope - universal_identifier: Universal identifier url: Instance URL wiki_audience: XWiki Audience errors: {} @@ -29,53 +31,30 @@ mn: wikis/xwiki_provider: one: XWiki provider other: XWiki providers + menus: + admin: + external_wiki_providers: Wiki providers + internal_wiki_provider: Internal wiki + wikis: Wikis permission_manage_wiki_page_links: Manage Wiki Page Links project_module_wiki_platforms: Wiki providers wikis: - buttons: - connect_account: Connect %{provider} account - done_continue: Done, continue - save_and_continue: Save and continue - wiki_page: Wiki page - health_checks: - authentication: - existing_token: User token - header: Authentication - user_bound_request: User-based request authentication - base_configuration: - header: Configuration - provider_configured: Configuration complete - errors: - not_configured: The connection could not be validated. Please finish configuration first. - xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. - xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. - xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. - xwiki_oauth_unauthorized: The user token was not recognized by XWiki. - work_package_wikis_tab_component: - inline_page_links: Inline page links - referencing_pages: Referenced in - page_link_component: - remove: Remove page link - relation_page_links_component: - empty_heading: No related pages - empty_text: Manually add links to other related wiki pages. - oauth_login_component: - heading: Not connected to %{provider} - description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. - connect_button: Connect %{provider} account admin: destroy_confirmation_dialog_component: - title: Delete wiki provider - heading: Permanently delete this wiki provider? description_html: The wiki provider %{wiki_provider} and all the related wiki page links will be deleted. In addition, every inline wiki page link will no longer be accessible. This action is irreversible. + heading: Permanently delete this wiki provider? + title: Delete wiki provider forms: general_info_form_component: - xwiki_instance_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. + provider_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. oauth_application_form_component: - application_id: Application ID - application_secret: Application secret + application_id: OpenProject OAuth Application ID + application_secret: OpenProject OAuth Application secret oauth_client_form_component: - client_id: Client ID + client_id: Wiki OAuth Client ID + client_secret: Wiki OAuth Client secret + redirect_uri: Redirect URI + redirect_uri_caption: Copy this value into the Redirect URI field of your XWiki OIDC client registration. health_status: show: actions: @@ -86,13 +65,19 @@ mn: no_health_report: No report available no_health_report_description: Run the checks now for a full health status report for this wiki provider. title: Health Report + internal_provider_form: + checkbox_caption: Allow projects to use the internal OpenProject wiki along with external Wiki providers + checkbox_label: Enable the internal OpenProject wiki + internal_wiki_provider: + show: + description: Choose to enable or disable the internal OpenProject wiki oauth_application_info_component: confirm_replace_oauth_application: This action will reset the current OAuth credentials. After confirming you will have to reenter the credentials in your XWiki instance and all users will have to reauthorize. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_application: Replace OpenProject OAuth application oauth_client_info_component: confirm_replace_oauth_client: This action will reset the current XWiki OAuth credentials. All users will need to reauthorize against XWiki. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_client: Replace XWiki OAuth application side_panel: health_status_component: @@ -110,25 +95,81 @@ mn: index_description: Add an external wiki service to link work packages to existing wiki pages or create new ones directly from OpenProject. label_add_new: Add new wiki provider label_edit: Edit XWiki provider - label_new_xwiki_instance: New XWiki provider + label_new_provider: New XWiki provider label_wiki_platform: Wiki provider - name_caption: Give your storage a name so that users can differentiate between multiple wiki platforms. + name_caption: Give your wiki provider a name so that users can differentiate between multiple wiki platforms. name_placeholder: XWiki knowledge base new_provider_html: Read our documentation on [setting up an XWiki integration](docs_url) for more information. oauth: openproject_oauth: OpenProject OAuth sections: - general_information: Basic details + general_information: General information oauth_configuration: OAuth configuration - url_caption: Please add the host address of your wiki platform including the https://. It should not be longer than 255 characters. - xwiki_instance: XWiki Instance + url_caption: The host address of your wiki platform including the https://. It should not be longer than 255 characters. xwiki: oauth: - openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. Copy the credentials below into your XWiki instance. - provider_oauth: XWiki OAuth - provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. A client ID is automatically generated to identify OpenProject to XWiki — no manual configuration is needed on the XWiki side. + openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. + provider_oauth: Wiki OAuth + provider_oauth_configuration: Copy these values to the [XWiki OIDC Connection client](xwiki_oidc_link). + provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth. xwiki_oauth: XWiki OAuth xwiki_oauth_description: Allow OpenProject to access XWiki data using an OAuth. - macro: - page_not_found: Linked wiki page no longer available + buttons: + connect_account: Connect %{provider} account + done_continue: Done, continue + open_wiki: Open wiki + save_and_continue: Save and continue + wiki_page: Wiki page + create_new_wiki_page_dialog: + page_title: Title + parent_help_text: Select a parent for this new wiki page. + title: Create new wiki page + delete_relation_page_link_confirmation_dialog: + heading: Delete related wiki page link? + title: Delete related wiki page link + health_checks: + authentication: + existing_token: User token + header: Authentication + user_bound_request: User-based request authentication + base_configuration: + header: Configuration + provider_configured: Configuration complete + errors: + not_configured: The connection could not be validated. Please finish configuration first. + xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. + xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. + xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. + xwiki_oauth_unauthorized: The user token was not recognized by XWiki. + instructions: + xwiki: + integration: XWiki Administration + oauth_application_details_html: The client secret value will not be accessible again after you close this window. Please copy these values into the [XWiki OpenProject Integration settings](xwiki_admin_link). + link_existing_wiki_page_dialog: + title: Add existing wiki page + link_existing_wiki_page_form: + no_results: No wiki pages found + placeholder: Search for a wiki page + oauth_login_component: + connect_button: Connect %{provider} account + description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. + heading: Not connected to %{provider} + page_link_component: + remove: Remove page link + page_links: + errors: + page_access_forbidden: You do not have permission to access this wiki page + page_not_found: Linked wiki page no longer available + unexpected: An unexpected error occurred + provider_types: + xwiki: + name: XWiki + relation_page_links_component: + empty_heading: No related pages + empty_text: Manually add links to other related wiki pages. + link_existing: Existing wiki page + link_new: New wiki page + work_package_wikis_tab_component: + inline_page_links: Inline page links + referencing_pages: Referenced in diff --git a/modules/wikis/config/locales/crowdin/ms.yml b/modules/wikis/config/locales/crowdin/ms.yml index a0649bcc20e..f23c1d8ef6f 100644 --- a/modules/wikis/config/locales/crowdin/ms.yml +++ b/modules/wikis/config/locales/crowdin/ms.yml @@ -3,15 +3,17 @@ ms: activerecord: attributes: wikis/page_link: + identifier: Identifier provider: Wiki Provider + wikis/provider: + name: Name + universal_identifier: Universal identifier wikis/xwiki_provider: authentication_method: Authentication method authentication_methods: oauth2_sso: Single-Sign-On through OpenID Connect Identity Provider two_way_oauth2: Two-way OAuth 2.0 authorization code flow - name: Name token_exchange_scope: XWiki Scope - universal_identifier: Universal identifier url: Instance URL wiki_audience: XWiki Audience errors: {} @@ -25,53 +27,30 @@ ms: other: Relation page links wikis/xwiki_provider: other: XWiki providers + menus: + admin: + external_wiki_providers: Wiki providers + internal_wiki_provider: Internal wiki + wikis: Wikis permission_manage_wiki_page_links: Manage Wiki Page Links project_module_wiki_platforms: Wiki providers wikis: - buttons: - connect_account: Connect %{provider} account - done_continue: Done, continue - save_and_continue: Save and continue - wiki_page: Wiki page - health_checks: - authentication: - existing_token: User token - header: Authentication - user_bound_request: User-based request authentication - base_configuration: - header: Configuration - provider_configured: Configuration complete - errors: - not_configured: The connection could not be validated. Please finish configuration first. - xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. - xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. - xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. - xwiki_oauth_unauthorized: The user token was not recognized by XWiki. - work_package_wikis_tab_component: - inline_page_links: Inline page links - referencing_pages: Referenced in - page_link_component: - remove: Remove page link - relation_page_links_component: - empty_heading: No related pages - empty_text: Manually add links to other related wiki pages. - oauth_login_component: - heading: Not connected to %{provider} - description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. - connect_button: Connect %{provider} account admin: destroy_confirmation_dialog_component: - title: Delete wiki provider - heading: Permanently delete this wiki provider? description_html: The wiki provider %{wiki_provider} and all the related wiki page links will be deleted. In addition, every inline wiki page link will no longer be accessible. This action is irreversible. + heading: Permanently delete this wiki provider? + title: Delete wiki provider forms: general_info_form_component: - xwiki_instance_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. + provider_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. oauth_application_form_component: - application_id: Application ID - application_secret: Application secret + application_id: OpenProject OAuth Application ID + application_secret: OpenProject OAuth Application secret oauth_client_form_component: - client_id: Client ID + client_id: Wiki OAuth Client ID + client_secret: Wiki OAuth Client secret + redirect_uri: Redirect URI + redirect_uri_caption: Copy this value into the Redirect URI field of your XWiki OIDC client registration. health_status: show: actions: @@ -82,13 +61,19 @@ ms: no_health_report: No report available no_health_report_description: Run the checks now for a full health status report for this wiki provider. title: Health Report + internal_provider_form: + checkbox_caption: Allow projects to use the internal OpenProject wiki along with external Wiki providers + checkbox_label: Enable the internal OpenProject wiki + internal_wiki_provider: + show: + description: Choose to enable or disable the internal OpenProject wiki oauth_application_info_component: confirm_replace_oauth_application: This action will reset the current OAuth credentials. After confirming you will have to reenter the credentials in your XWiki instance and all users will have to reauthorize. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_application: Replace OpenProject OAuth application oauth_client_info_component: confirm_replace_oauth_client: This action will reset the current XWiki OAuth credentials. All users will need to reauthorize against XWiki. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_client: Replace XWiki OAuth application side_panel: health_status_component: @@ -106,25 +91,81 @@ ms: index_description: Add an external wiki service to link work packages to existing wiki pages or create new ones directly from OpenProject. label_add_new: Add new wiki provider label_edit: Edit XWiki provider - label_new_xwiki_instance: New XWiki provider + label_new_provider: New XWiki provider label_wiki_platform: Wiki provider - name_caption: Give your storage a name so that users can differentiate between multiple wiki platforms. + name_caption: Give your wiki provider a name so that users can differentiate between multiple wiki platforms. name_placeholder: XWiki knowledge base new_provider_html: Read our documentation on [setting up an XWiki integration](docs_url) for more information. oauth: openproject_oauth: OpenProject OAuth sections: - general_information: Basic details + general_information: General information oauth_configuration: OAuth configuration - url_caption: Please add the host address of your wiki platform including the https://. It should not be longer than 255 characters. - xwiki_instance: XWiki Instance + url_caption: The host address of your wiki platform including the https://. It should not be longer than 255 characters. xwiki: oauth: - openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. Copy the credentials below into your XWiki instance. - provider_oauth: XWiki OAuth - provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. A client ID is automatically generated to identify OpenProject to XWiki — no manual configuration is needed on the XWiki side. + openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. + provider_oauth: Wiki OAuth + provider_oauth_configuration: Copy these values to the [XWiki OIDC Connection client](xwiki_oidc_link). + provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth. xwiki_oauth: XWiki OAuth xwiki_oauth_description: Allow OpenProject to access XWiki data using an OAuth. - macro: - page_not_found: Linked wiki page no longer available + buttons: + connect_account: Connect %{provider} account + done_continue: Done, continue + open_wiki: Open wiki + save_and_continue: Save and continue + wiki_page: Wiki page + create_new_wiki_page_dialog: + page_title: Title + parent_help_text: Select a parent for this new wiki page. + title: Create new wiki page + delete_relation_page_link_confirmation_dialog: + heading: Delete related wiki page link? + title: Delete related wiki page link + health_checks: + authentication: + existing_token: User token + header: Authentication + user_bound_request: User-based request authentication + base_configuration: + header: Configuration + provider_configured: Configuration complete + errors: + not_configured: The connection could not be validated. Please finish configuration first. + xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. + xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. + xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. + xwiki_oauth_unauthorized: The user token was not recognized by XWiki. + instructions: + xwiki: + integration: XWiki Administration + oauth_application_details_html: The client secret value will not be accessible again after you close this window. Please copy these values into the [XWiki OpenProject Integration settings](xwiki_admin_link). + link_existing_wiki_page_dialog: + title: Add existing wiki page + link_existing_wiki_page_form: + no_results: No wiki pages found + placeholder: Search for a wiki page + oauth_login_component: + connect_button: Connect %{provider} account + description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. + heading: Not connected to %{provider} + page_link_component: + remove: Remove page link + page_links: + errors: + page_access_forbidden: You do not have permission to access this wiki page + page_not_found: Linked wiki page no longer available + unexpected: An unexpected error occurred + provider_types: + xwiki: + name: XWiki + relation_page_links_component: + empty_heading: No related pages + empty_text: Manually add links to other related wiki pages. + link_existing: Existing wiki page + link_new: New wiki page + work_package_wikis_tab_component: + inline_page_links: Inline page links + referencing_pages: Referenced in diff --git a/modules/wikis/config/locales/crowdin/ne.yml b/modules/wikis/config/locales/crowdin/ne.yml index 48480e8335e..c54206f4c32 100644 --- a/modules/wikis/config/locales/crowdin/ne.yml +++ b/modules/wikis/config/locales/crowdin/ne.yml @@ -3,15 +3,17 @@ ne: activerecord: attributes: wikis/page_link: + identifier: Identifier provider: Wiki Provider + wikis/provider: + name: Name + universal_identifier: Universal identifier wikis/xwiki_provider: authentication_method: Authentication method authentication_methods: oauth2_sso: Single-Sign-On through OpenID Connect Identity Provider two_way_oauth2: Two-way OAuth 2.0 authorization code flow - name: Name token_exchange_scope: XWiki Scope - universal_identifier: Universal identifier url: Instance URL wiki_audience: XWiki Audience errors: {} @@ -29,53 +31,30 @@ ne: wikis/xwiki_provider: one: XWiki provider other: XWiki providers + menus: + admin: + external_wiki_providers: Wiki providers + internal_wiki_provider: Internal wiki + wikis: Wikis permission_manage_wiki_page_links: Manage Wiki Page Links project_module_wiki_platforms: Wiki providers wikis: - buttons: - connect_account: Connect %{provider} account - done_continue: Done, continue - save_and_continue: Save and continue - wiki_page: Wiki page - health_checks: - authentication: - existing_token: User token - header: Authentication - user_bound_request: User-based request authentication - base_configuration: - header: Configuration - provider_configured: Configuration complete - errors: - not_configured: The connection could not be validated. Please finish configuration first. - xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. - xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. - xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. - xwiki_oauth_unauthorized: The user token was not recognized by XWiki. - work_package_wikis_tab_component: - inline_page_links: Inline page links - referencing_pages: Referenced in - page_link_component: - remove: Remove page link - relation_page_links_component: - empty_heading: No related pages - empty_text: Manually add links to other related wiki pages. - oauth_login_component: - heading: Not connected to %{provider} - description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. - connect_button: Connect %{provider} account admin: destroy_confirmation_dialog_component: - title: Delete wiki provider - heading: Permanently delete this wiki provider? description_html: The wiki provider %{wiki_provider} and all the related wiki page links will be deleted. In addition, every inline wiki page link will no longer be accessible. This action is irreversible. + heading: Permanently delete this wiki provider? + title: Delete wiki provider forms: general_info_form_component: - xwiki_instance_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. + provider_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. oauth_application_form_component: - application_id: Application ID - application_secret: Application secret + application_id: OpenProject OAuth Application ID + application_secret: OpenProject OAuth Application secret oauth_client_form_component: - client_id: Client ID + client_id: Wiki OAuth Client ID + client_secret: Wiki OAuth Client secret + redirect_uri: Redirect URI + redirect_uri_caption: Copy this value into the Redirect URI field of your XWiki OIDC client registration. health_status: show: actions: @@ -86,13 +65,19 @@ ne: no_health_report: No report available no_health_report_description: Run the checks now for a full health status report for this wiki provider. title: Health Report + internal_provider_form: + checkbox_caption: Allow projects to use the internal OpenProject wiki along with external Wiki providers + checkbox_label: Enable the internal OpenProject wiki + internal_wiki_provider: + show: + description: Choose to enable or disable the internal OpenProject wiki oauth_application_info_component: confirm_replace_oauth_application: This action will reset the current OAuth credentials. After confirming you will have to reenter the credentials in your XWiki instance and all users will have to reauthorize. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_application: Replace OpenProject OAuth application oauth_client_info_component: confirm_replace_oauth_client: This action will reset the current XWiki OAuth credentials. All users will need to reauthorize against XWiki. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_client: Replace XWiki OAuth application side_panel: health_status_component: @@ -110,25 +95,81 @@ ne: index_description: Add an external wiki service to link work packages to existing wiki pages or create new ones directly from OpenProject. label_add_new: Add new wiki provider label_edit: Edit XWiki provider - label_new_xwiki_instance: New XWiki provider + label_new_provider: New XWiki provider label_wiki_platform: Wiki provider - name_caption: Give your storage a name so that users can differentiate between multiple wiki platforms. + name_caption: Give your wiki provider a name so that users can differentiate between multiple wiki platforms. name_placeholder: XWiki knowledge base new_provider_html: Read our documentation on [setting up an XWiki integration](docs_url) for more information. oauth: openproject_oauth: OpenProject OAuth sections: - general_information: Basic details + general_information: General information oauth_configuration: OAuth configuration - url_caption: Please add the host address of your wiki platform including the https://. It should not be longer than 255 characters. - xwiki_instance: XWiki Instance + url_caption: The host address of your wiki platform including the https://. It should not be longer than 255 characters. xwiki: oauth: - openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. Copy the credentials below into your XWiki instance. - provider_oauth: XWiki OAuth - provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. A client ID is automatically generated to identify OpenProject to XWiki — no manual configuration is needed on the XWiki side. + openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. + provider_oauth: Wiki OAuth + provider_oauth_configuration: Copy these values to the [XWiki OIDC Connection client](xwiki_oidc_link). + provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth. xwiki_oauth: XWiki OAuth xwiki_oauth_description: Allow OpenProject to access XWiki data using an OAuth. - macro: - page_not_found: Linked wiki page no longer available + buttons: + connect_account: Connect %{provider} account + done_continue: Done, continue + open_wiki: Open wiki + save_and_continue: Save and continue + wiki_page: Wiki page + create_new_wiki_page_dialog: + page_title: Title + parent_help_text: Select a parent for this new wiki page. + title: Create new wiki page + delete_relation_page_link_confirmation_dialog: + heading: Delete related wiki page link? + title: Delete related wiki page link + health_checks: + authentication: + existing_token: User token + header: Authentication + user_bound_request: User-based request authentication + base_configuration: + header: Configuration + provider_configured: Configuration complete + errors: + not_configured: The connection could not be validated. Please finish configuration first. + xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. + xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. + xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. + xwiki_oauth_unauthorized: The user token was not recognized by XWiki. + instructions: + xwiki: + integration: XWiki Administration + oauth_application_details_html: The client secret value will not be accessible again after you close this window. Please copy these values into the [XWiki OpenProject Integration settings](xwiki_admin_link). + link_existing_wiki_page_dialog: + title: Add existing wiki page + link_existing_wiki_page_form: + no_results: No wiki pages found + placeholder: Search for a wiki page + oauth_login_component: + connect_button: Connect %{provider} account + description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. + heading: Not connected to %{provider} + page_link_component: + remove: Remove page link + page_links: + errors: + page_access_forbidden: You do not have permission to access this wiki page + page_not_found: Linked wiki page no longer available + unexpected: An unexpected error occurred + provider_types: + xwiki: + name: XWiki + relation_page_links_component: + empty_heading: No related pages + empty_text: Manually add links to other related wiki pages. + link_existing: Existing wiki page + link_new: New wiki page + work_package_wikis_tab_component: + inline_page_links: Inline page links + referencing_pages: Referenced in diff --git a/modules/wikis/config/locales/crowdin/nl.yml b/modules/wikis/config/locales/crowdin/nl.yml index 70a7fa0c7b8..905040f0275 100644 --- a/modules/wikis/config/locales/crowdin/nl.yml +++ b/modules/wikis/config/locales/crowdin/nl.yml @@ -3,15 +3,17 @@ nl: activerecord: attributes: wikis/page_link: + identifier: Identifier provider: Wiki Provider + wikis/provider: + name: Name + universal_identifier: Universal identifier wikis/xwiki_provider: authentication_method: Authentication method authentication_methods: oauth2_sso: Single-Sign-On through OpenID Connect Identity Provider two_way_oauth2: Two-way OAuth 2.0 authorization code flow - name: Naam token_exchange_scope: XWiki Scope - universal_identifier: Unieke Id url: Instance URL wiki_audience: XWiki Audience errors: {} @@ -29,53 +31,30 @@ nl: wikis/xwiki_provider: one: XWiki provider other: XWiki providers + menus: + admin: + external_wiki_providers: Wiki providers + internal_wiki_provider: Internal wiki + wikis: Wikis permission_manage_wiki_page_links: Manage Wiki Page Links project_module_wiki_platforms: Wiki providers wikis: - buttons: - connect_account: Connect %{provider} account - done_continue: Done, continue - save_and_continue: Save and continue - wiki_page: Wiki page - health_checks: - authentication: - existing_token: User token - header: Authentication - user_bound_request: User-based request authentication - base_configuration: - header: Configuration - provider_configured: Configuration complete - errors: - not_configured: The connection could not be validated. Please finish configuration first. - xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. - xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. - xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. - xwiki_oauth_unauthorized: The user token was not recognized by XWiki. - work_package_wikis_tab_component: - inline_page_links: Inline page links - referencing_pages: Referenced in - page_link_component: - remove: Remove page link - relation_page_links_component: - empty_heading: No related pages - empty_text: Manually add links to other related wiki pages. - oauth_login_component: - heading: Not connected to %{provider} - description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. - connect_button: Connect %{provider} account admin: destroy_confirmation_dialog_component: - title: Delete wiki provider - heading: Permanently delete this wiki provider? description_html: The wiki provider %{wiki_provider} and all the related wiki page links will be deleted. In addition, every inline wiki page link will no longer be accessible. This action is irreversible. + heading: Permanently delete this wiki provider? + title: Delete wiki provider forms: general_info_form_component: - xwiki_instance_description: Zorg ervoor dat u beheerrechten hebt in uw XWiki-instantie voordat u de installatie uitvoert. + provider_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. oauth_application_form_component: - application_id: Applicatie-ID - application_secret: Application Secret + application_id: OpenProject OAuth Application ID + application_secret: OpenProject OAuth Application secret oauth_client_form_component: - client_id: Client ID + client_id: Wiki OAuth Client ID + client_secret: Wiki OAuth Client secret + redirect_uri: Redirect URI + redirect_uri_caption: Copy this value into the Redirect URI field of your XWiki OIDC client registration. health_status: show: actions: @@ -86,13 +65,19 @@ nl: no_health_report: No report available no_health_report_description: Run the checks now for a full health status report for this wiki provider. title: Health Report + internal_provider_form: + checkbox_caption: Allow projects to use the internal OpenProject wiki along with external Wiki providers + checkbox_label: Enable the internal OpenProject wiki + internal_wiki_provider: + show: + description: Choose to enable or disable the internal OpenProject wiki oauth_application_info_component: confirm_replace_oauth_application: This action will reset the current OAuth credentials. After confirming you will have to reenter the credentials in your XWiki instance and all users will have to reauthorize. Are you sure you want to proceed? - label_pending: In afwachting + label_oauth_client_id: OAuth Client ID replace_oauth_application: Replace OpenProject OAuth application oauth_client_info_component: confirm_replace_oauth_client: This action will reset the current XWiki OAuth credentials. All users will need to reauthorize against XWiki. Are you sure you want to proceed? - label_pending: In afwachting + label_oauth_client_id: OAuth Client ID replace_oauth_client: Replace XWiki OAuth application side_panel: health_status_component: @@ -110,25 +95,81 @@ nl: index_description: Add an external wiki service to link work packages to existing wiki pages or create new ones directly from OpenProject. label_add_new: Add new wiki provider label_edit: Edit XWiki provider - label_new_xwiki_instance: Nieuwe XWiki-provider + label_new_provider: New XWiki provider label_wiki_platform: Wiki aanbieder - name_caption: Geef de opslag een naam, zodat gebruikers verschillende wiki-platformen van elkaar kunnen onderscheiden. + name_caption: Give your wiki provider a name so that users can differentiate between multiple wiki platforms. name_placeholder: XWiki knowledge base new_provider_html: Read our documentation on [setting up an XWiki integration](docs_url) for more information. oauth: openproject_oauth: OpenProject OAuth sections: - general_information: Basisgegevens + general_information: General information oauth_configuration: OAuth configuration - url_caption: Voeg het hostadres van uw wikiplatform toe, inclusief de https://. Het mag niet langer zijn dan 255 tekens. - xwiki_instance: XWiki instantie + url_caption: The host address of your wiki platform including the https://. It should not be longer than 255 characters. xwiki: oauth: - openproject_oauth_description: Geef XWiki toestemming om OpenProject-gegevens te benaderen met behulp van een OAuth-applicatie. Kopieer de onderstaande inloggegevens naar uw XWiki-instantie. - provider_oauth: XWiki OAuth - provider_oauth_description: Geef OpenProject toestemming om XWiki-gegevens te benaderen met behulp van een OAuth-applicatie. De client-ID wordt automatisch gegenereerd om OpenProject in XWiki te identificeren — geen handmatige configuratie is vereist aan XWiki-zijde. + openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. + provider_oauth: Wiki OAuth + provider_oauth_configuration: Copy these values to the [XWiki OIDC Connection client](xwiki_oidc_link). + provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth. xwiki_oauth: XWiki OAuth xwiki_oauth_description: Allow OpenProject to access XWiki data using an OAuth. - macro: - page_not_found: De gekoppelde wiki-pagina is niet meer beschikbaar + buttons: + connect_account: Connect %{provider} account + done_continue: Done, continue + open_wiki: Open wiki + save_and_continue: Save and continue + wiki_page: Wiki page + create_new_wiki_page_dialog: + page_title: Title + parent_help_text: Select a parent for this new wiki page. + title: Create new wiki page + delete_relation_page_link_confirmation_dialog: + heading: Delete related wiki page link? + title: Delete related wiki page link + health_checks: + authentication: + existing_token: User token + header: Authentication + user_bound_request: User-based request authentication + base_configuration: + header: Configuration + provider_configured: Configuration complete + errors: + not_configured: The connection could not be validated. Please finish configuration first. + xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. + xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. + xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. + xwiki_oauth_unauthorized: The user token was not recognized by XWiki. + instructions: + xwiki: + integration: XWiki Administration + oauth_application_details_html: The client secret value will not be accessible again after you close this window. Please copy these values into the [XWiki OpenProject Integration settings](xwiki_admin_link). + link_existing_wiki_page_dialog: + title: Add existing wiki page + link_existing_wiki_page_form: + no_results: No wiki pages found + placeholder: Search for a wiki page + oauth_login_component: + connect_button: Connect %{provider} account + description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. + heading: Not connected to %{provider} + page_link_component: + remove: Remove page link + page_links: + errors: + page_access_forbidden: You do not have permission to access this wiki page + page_not_found: Linked wiki page no longer available + unexpected: An unexpected error occurred + provider_types: + xwiki: + name: XWiki + relation_page_links_component: + empty_heading: No related pages + empty_text: Manually add links to other related wiki pages. + link_existing: Existing wiki page + link_new: New wiki page + work_package_wikis_tab_component: + inline_page_links: Inline page links + referencing_pages: Referenced in diff --git a/modules/wikis/config/locales/crowdin/no.yml b/modules/wikis/config/locales/crowdin/no.yml index 1f6797494a2..38fe5c7b1d8 100644 --- a/modules/wikis/config/locales/crowdin/no.yml +++ b/modules/wikis/config/locales/crowdin/no.yml @@ -3,15 +3,17 @@ activerecord: attributes: wikis/page_link: + identifier: Identifier provider: Wiki Provider + wikis/provider: + name: Name + universal_identifier: Universal identifier wikis/xwiki_provider: authentication_method: Authentication method authentication_methods: oauth2_sso: Single-Sign-On through OpenID Connect Identity Provider two_way_oauth2: Two-way OAuth 2.0 authorization code flow - name: Name token_exchange_scope: XWiki Scope - universal_identifier: Universal identifier url: Instance URL wiki_audience: XWiki Audience errors: {} @@ -29,53 +31,30 @@ wikis/xwiki_provider: one: XWiki provider other: XWiki providers + menus: + admin: + external_wiki_providers: Wiki providers + internal_wiki_provider: Internal wiki + wikis: Wikis permission_manage_wiki_page_links: Manage Wiki Page Links project_module_wiki_platforms: Wiki providers wikis: - buttons: - connect_account: Connect %{provider} account - done_continue: Done, continue - save_and_continue: Save and continue - wiki_page: Wiki page - health_checks: - authentication: - existing_token: User token - header: Authentication - user_bound_request: User-based request authentication - base_configuration: - header: Configuration - provider_configured: Configuration complete - errors: - not_configured: The connection could not be validated. Please finish configuration first. - xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. - xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. - xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. - xwiki_oauth_unauthorized: The user token was not recognized by XWiki. - work_package_wikis_tab_component: - inline_page_links: Inline page links - referencing_pages: Referenced in - page_link_component: - remove: Remove page link - relation_page_links_component: - empty_heading: No related pages - empty_text: Manually add links to other related wiki pages. - oauth_login_component: - heading: Not connected to %{provider} - description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. - connect_button: Connect %{provider} account admin: destroy_confirmation_dialog_component: - title: Delete wiki provider - heading: Permanently delete this wiki provider? description_html: The wiki provider %{wiki_provider} and all the related wiki page links will be deleted. In addition, every inline wiki page link will no longer be accessible. This action is irreversible. + heading: Permanently delete this wiki provider? + title: Delete wiki provider forms: general_info_form_component: - xwiki_instance_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. + provider_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. oauth_application_form_component: - application_id: Application ID - application_secret: Application secret + application_id: OpenProject OAuth Application ID + application_secret: OpenProject OAuth Application secret oauth_client_form_component: - client_id: Client ID + client_id: Wiki OAuth Client ID + client_secret: Wiki OAuth Client secret + redirect_uri: Redirect URI + redirect_uri_caption: Copy this value into the Redirect URI field of your XWiki OIDC client registration. health_status: show: actions: @@ -86,13 +65,19 @@ no_health_report: No report available no_health_report_description: Run the checks now for a full health status report for this wiki provider. title: Health Report + internal_provider_form: + checkbox_caption: Allow projects to use the internal OpenProject wiki along with external Wiki providers + checkbox_label: Enable the internal OpenProject wiki + internal_wiki_provider: + show: + description: Choose to enable or disable the internal OpenProject wiki oauth_application_info_component: confirm_replace_oauth_application: This action will reset the current OAuth credentials. After confirming you will have to reenter the credentials in your XWiki instance and all users will have to reauthorize. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_application: Replace OpenProject OAuth application oauth_client_info_component: confirm_replace_oauth_client: This action will reset the current XWiki OAuth credentials. All users will need to reauthorize against XWiki. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_client: Replace XWiki OAuth application side_panel: health_status_component: @@ -110,25 +95,81 @@ index_description: Add an external wiki service to link work packages to existing wiki pages or create new ones directly from OpenProject. label_add_new: Add new wiki provider label_edit: Edit XWiki provider - label_new_xwiki_instance: New XWiki provider + label_new_provider: New XWiki provider label_wiki_platform: Wiki provider - name_caption: Give your storage a name so that users can differentiate between multiple wiki platforms. + name_caption: Give your wiki provider a name so that users can differentiate between multiple wiki platforms. name_placeholder: XWiki knowledge base new_provider_html: Read our documentation on [setting up an XWiki integration](docs_url) for more information. oauth: openproject_oauth: OpenProject OAuth sections: - general_information: Basic details + general_information: General information oauth_configuration: OAuth configuration - url_caption: Please add the host address of your wiki platform including the https://. It should not be longer than 255 characters. - xwiki_instance: XWiki Instance + url_caption: The host address of your wiki platform including the https://. It should not be longer than 255 characters. xwiki: oauth: - openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. Copy the credentials below into your XWiki instance. - provider_oauth: XWiki OAuth - provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. A client ID is automatically generated to identify OpenProject to XWiki — no manual configuration is needed on the XWiki side. + openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. + provider_oauth: Wiki OAuth + provider_oauth_configuration: Copy these values to the [XWiki OIDC Connection client](xwiki_oidc_link). + provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth. xwiki_oauth: XWiki OAuth xwiki_oauth_description: Allow OpenProject to access XWiki data using an OAuth. - macro: - page_not_found: Linked wiki page no longer available + buttons: + connect_account: Connect %{provider} account + done_continue: Done, continue + open_wiki: Open wiki + save_and_continue: Save and continue + wiki_page: Wiki page + create_new_wiki_page_dialog: + page_title: Title + parent_help_text: Select a parent for this new wiki page. + title: Create new wiki page + delete_relation_page_link_confirmation_dialog: + heading: Delete related wiki page link? + title: Delete related wiki page link + health_checks: + authentication: + existing_token: User token + header: Authentication + user_bound_request: User-based request authentication + base_configuration: + header: Configuration + provider_configured: Configuration complete + errors: + not_configured: The connection could not be validated. Please finish configuration first. + xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. + xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. + xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. + xwiki_oauth_unauthorized: The user token was not recognized by XWiki. + instructions: + xwiki: + integration: XWiki Administration + oauth_application_details_html: The client secret value will not be accessible again after you close this window. Please copy these values into the [XWiki OpenProject Integration settings](xwiki_admin_link). + link_existing_wiki_page_dialog: + title: Add existing wiki page + link_existing_wiki_page_form: + no_results: No wiki pages found + placeholder: Search for a wiki page + oauth_login_component: + connect_button: Connect %{provider} account + description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. + heading: Not connected to %{provider} + page_link_component: + remove: Remove page link + page_links: + errors: + page_access_forbidden: You do not have permission to access this wiki page + page_not_found: Linked wiki page no longer available + unexpected: An unexpected error occurred + provider_types: + xwiki: + name: XWiki + relation_page_links_component: + empty_heading: No related pages + empty_text: Manually add links to other related wiki pages. + link_existing: Existing wiki page + link_new: New wiki page + work_package_wikis_tab_component: + inline_page_links: Inline page links + referencing_pages: Referenced in diff --git a/modules/wikis/config/locales/crowdin/pl.yml b/modules/wikis/config/locales/crowdin/pl.yml index dff2a7b1ee3..a5c52e9826d 100644 --- a/modules/wikis/config/locales/crowdin/pl.yml +++ b/modules/wikis/config/locales/crowdin/pl.yml @@ -3,15 +3,17 @@ pl: activerecord: attributes: wikis/page_link: + identifier: Identyfikator provider: Dostawca wiki + wikis/provider: + name: Nazwa + universal_identifier: Uniwersalny identyfikator wikis/xwiki_provider: authentication_method: Metoda uwierzytelniania authentication_methods: oauth2_sso: Logowanie jednokrotne za pośrednictwem dostawcy tożsamości OpenID Connect two_way_oauth2: Przepływ kodu autoryzacji dwukierunkowego OAuth 2.0 - name: Nazwa token_exchange_scope: Zakres XWiki - universal_identifier: Uniwersalny identyfikator url: Adres URL wystąpienia wiki_audience: Odbiorcy XWiki errors: {} @@ -37,53 +39,30 @@ pl: few: Dostawca XWiki many: Dostawcy XWiki other: Dostawcy XWiki + menus: + admin: + external_wiki_providers: Wiki providers + internal_wiki_provider: Internal wiki + wikis: Wikis permission_manage_wiki_page_links: Zarządzanie linkami do stron Wiki project_module_wiki_platforms: Dostawcy wiki wikis: - buttons: - connect_account: Podłącz konto %{provider} - done_continue: Gotowe, kontynuuj - save_and_continue: Zapisz i kontynuuj - wiki_page: Strona wiki - health_checks: - authentication: - existing_token: Token użytkownika - header: Uwierzytelnianie - user_bound_request: Uwierzytelnianie żądań po stronie użytkownika - base_configuration: - header: Konfiguracja - provider_configured: Ukończono konfigurację - errors: - not_configured: Nie można zweryfikować połączenia. Najpierw zakończ konfigurację. - xwiki_oauth_connection_error: OpenProject nie może połączyć się ze skonfigurowanym wystąpieniem XWiki. - xwiki_oauth_request_error: Podczas próby komunikacji z wystąpieniem XWiki wystąpił nieoczekiwany błąd. - xwiki_oauth_token_missing: Aplikacja OpenProject nie może przetestować komunikacji z XWiki na poziomie użytkownika, ponieważ użytkownik nie powiązał jeszcze swojego konta XWiki. - xwiki_oauth_unauthorized: Token użytkownika nie został rozpoznany przez XWiki. - work_package_wikis_tab_component: - inline_page_links: Wbudowane linki strony - referencing_pages: Wymieniono w - page_link_component: - remove: Usuń link do strony - relation_page_links_component: - empty_heading: Brak powiązanych stron - empty_text: Ręcznie dodaj linki do innych powiązanych stron wiki. - oauth_login_component: - heading: Nie połączono z %{provider} - description: Zaloguj się do %{provider}, aby przeglądać strony wiki powiązane z tym wystąpieniem OpenProject i zarządzać nimi. - connect_button: Podłącz konto %{provider} admin: destroy_confirmation_dialog_component: - title: Usuń dostawcę wiki - heading: Czy trwale usunąć tego dostawcę wiki? description_html: Zostanie usunięty dostawca wiki %{wiki_provider} i wszystkie powiązane linki do stron wiki. Ponadto nie będzie już dostępny żaden link do strony wiki. To działanie jest nieodwracalne. + heading: Czy trwale usunąć tego dostawcę wiki? + title: Usuń dostawcę wiki forms: general_info_form_component: - xwiki_instance_description: Przed wykonaniem konfiguracji upewnij się, że masz uprawnienia administracyjne w swoim wystąpieniu XWiki. + provider_description: Przed wykonaniem konfiguracji upewnij się, że masz uprawnienia administracyjne w swoim wystąpieniu XWiki. oauth_application_form_component: - application_id: Identyfikator aplikacji - application_secret: Klucz tajny aplikacji + application_id: Identyfikator OAuth aplikacji OpenProject + application_secret: Klucz tajny OAuth aplikacji OpenProject oauth_client_form_component: - client_id: Identyfikator klienta + client_id: ID klienta OAuth wiki + client_secret: Klucz tajny klienta OAuth wiki + redirect_uri: Identyfikator URI przekerowania + redirect_uri_caption: Skopiuj tę wartość do pola identyfikatora URI przekierowania rejestracji klienta OIDC XWiki. health_status: show: actions: @@ -94,13 +73,19 @@ pl: no_health_report: Brak dostępnych raportów no_health_report_description: Uruchom kontrole teraz, aby uzyskać pełny raport o stanie tego dostawcy wiki. title: Raport o stanie + internal_provider_form: + checkbox_caption: Allow projects to use the internal OpenProject wiki along with external Wiki providers + checkbox_label: Enable the internal OpenProject wiki + internal_wiki_provider: + show: + description: Choose to enable or disable the internal OpenProject wiki oauth_application_info_component: confirm_replace_oauth_application: To działanie spowoduje zresetowanie bieżących poświadczeń OAuth. Po potwierdzeniu trzeba będzie ponownie wprowadzić poświadczenia w swoim wystąpieniu XWiki, a wszyscy użytkownicy będą musieli dokonać ponownej autoryzacji. Czy na pewno chcesz kontynuować? - label_pending: Oczekiwanie + label_oauth_client_id: Identyfikator klienta OAuth replace_oauth_application: Zastąp aplikację OAuth OpenProject oauth_client_info_component: confirm_replace_oauth_client: To działanie spowoduje zresetowanie bieżących poświadczeń OAuth w XWiki. Wszyscy użytkownicy będą musieli ponownie dokonać autoryzacji w XWiki. Czy na pewno chcesz kontynuować? - label_pending: Oczekiwanie + label_oauth_client_id: Identyfikator klienta OAuth replace_oauth_client: Zastąp aplikację XWiki OAuth side_panel: health_status_component: @@ -118,25 +103,81 @@ pl: index_description: Dodaj zewnętrzną usługę wiki, aby powiązać pakiety robocze z istniejącymi stronami wiki lub utworzyć nowe bezpośrednio z OpenProject. label_add_new: Dodaj nowego dostawcę wiki label_edit: Edytuj dostawcę XWiki - label_new_xwiki_instance: Nowy dostawca XWiki + label_new_provider: Nowy dostawca XWiki label_wiki_platform: Dostawca wiki - name_caption: Nadaj swojemu magazynowi nazwę, aby użytkownicy mogli rozróżniać różne platformy wiki. + name_caption: Give your wiki provider a name so that users can differentiate between multiple wiki platforms. name_placeholder: Baza wiedzy XWiki new_provider_html: Przeczytaj naszą dokumentację na temat [konfiguracja integracji XWiki](docs_url), aby uzyskać więcej informacji. oauth: openproject_oauth: OpenProject OAuth sections: - general_information: Podstawowe szczegóły + general_information: Informacje ogólne oauth_configuration: Konfiguracja OAuth - url_caption: Dodaj adres hosta swojej platformy wiki, w tym prefiks https://. Adres powinien być nie dłuższy niż 255 znaków. - xwiki_instance: Wystąpienie XWiki + url_caption: The host address of your wiki platform including the https://. It should not be longer than 255 characters. xwiki: oauth: - openproject_oauth_description: Zezwól XWiki na dostęp do danych OpenProject za pomocą aplikacji OAuth. Skopiuj dane logowania do swojego wystąpienia XWiki. - provider_oauth: XWiki OAuth - provider_oauth_description: Zezwól OpenProject na dostęp do danych XWiki za pomocą aplikacji OAuth. Identyfikator klienta jest generowany automatycznie w celu identyfikacji OpenProject w XWiki — po stronie XWiki nie jest wymagana ręczna konfiguracja. + openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. + provider_oauth: Wiki OAuth + provider_oauth_configuration: Copy these values to the [XWiki OIDC Connection client](xwiki_oidc_link). + provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. openproject_oauth_description: Zezwalaj XWiki na dostęp do danych OpenProject za pomocą OAuth. xwiki_oauth: XWiki OAuth xwiki_oauth_description: Zezwalaj OpenProject na dostęp do danych XWiki za pomocą OAuth. - macro: - page_not_found: Powiązana linkiem strona wiki nie jest już dostępna + buttons: + connect_account: Podłącz konto %{provider} + done_continue: Gotowe, kontynuuj + open_wiki: Otwórz wiki + save_and_continue: Zapisz i kontynuuj + wiki_page: Strona wiki + create_new_wiki_page_dialog: + page_title: Title + parent_help_text: Select a parent for this new wiki page. + title: Create new wiki page + delete_relation_page_link_confirmation_dialog: + heading: Usunąć powiązany link do strony wiki? + title: Usuń powiązany link do strony wiki + health_checks: + authentication: + existing_token: Token użytkownika + header: Uwierzytelnianie + user_bound_request: Uwierzytelnianie żądań po stronie użytkownika + base_configuration: + header: Konfiguracja + provider_configured: Ukończono konfigurację + errors: + not_configured: Nie można zweryfikować połączenia. Najpierw zakończ konfigurację. + xwiki_oauth_connection_error: OpenProject nie może połączyć się ze skonfigurowanym wystąpieniem XWiki. + xwiki_oauth_request_error: Podczas próby komunikacji z wystąpieniem XWiki wystąpił nieoczekiwany błąd. + xwiki_oauth_token_missing: Aplikacja OpenProject nie może przetestować komunikacji z XWiki na poziomie użytkownika, ponieważ użytkownik nie powiązał jeszcze swojego konta XWiki. + xwiki_oauth_unauthorized: Token użytkownika nie został rozpoznany przez XWiki. + instructions: + xwiki: + integration: Administracja XWiki + oauth_application_details_html: Wartość klucza tajnego klienta nie będzie ponownie dostępna po zamknięciu tego okna. Skopiuj te wartości do [ustawień integracji XWiki z OpenProject](xwiki_admin_link). + link_existing_wiki_page_dialog: + title: Dodaj istniejącą stronę wiki + link_existing_wiki_page_form: + no_results: No wiki pages found + placeholder: Search for a wiki page + oauth_login_component: + connect_button: Podłącz konto %{provider} + description: Zaloguj się do %{provider}, aby przeglądać strony wiki powiązane z tym wystąpieniem OpenProject i zarządzać nimi. + heading: Nie połączono z %{provider} + page_link_component: + remove: Usuń link do strony + page_links: + errors: + page_access_forbidden: Nie masz uprawnień dostępu do tej strony wiki + page_not_found: Powiązana linkiem strona wiki nie jest już dostępna + unexpected: Wystąpił nieoczekiwany błąd + provider_types: + xwiki: + name: XWiki + relation_page_links_component: + empty_heading: Brak powiązanych stron + empty_text: Ręcznie dodaj linki do innych powiązanych stron wiki. + link_existing: Istniejąca strona wiki + link_new: Nowa strona wiki + work_package_wikis_tab_component: + inline_page_links: Wbudowane linki strony + referencing_pages: Wymieniono w diff --git a/modules/wikis/config/locales/crowdin/pt-BR.yml b/modules/wikis/config/locales/crowdin/pt-BR.yml index fe196ae44e1..f1f519a5b4c 100644 --- a/modules/wikis/config/locales/crowdin/pt-BR.yml +++ b/modules/wikis/config/locales/crowdin/pt-BR.yml @@ -3,15 +3,17 @@ pt-BR: activerecord: attributes: wikis/page_link: + identifier: Identificador provider: Provedor do Wiki + wikis/provider: + name: Nome + universal_identifier: Identificador universal wikis/xwiki_provider: authentication_method: Método de autenticação authentication_methods: oauth2_sso: Single-Sign-On por meio de provedor de identidade OpenID Connect two_way_oauth2: Fluxo de código de autorização OAuth 2.0 bidirecional - name: Nome token_exchange_scope: XWiki Scope - universal_identifier: Identificador universal url: URL da Instância wiki_audience: Audiência XWiki errors: {} @@ -29,53 +31,30 @@ pt-BR: wikis/xwiki_provider: one: Provedor de Xwiki other: Provedores de Xwiki + menus: + admin: + external_wiki_providers: Wiki providers + internal_wiki_provider: Internal wiki + wikis: Wikis permission_manage_wiki_page_links: Gerenciar links da página Wiki project_module_wiki_platforms: Provedores de wiki wikis: - buttons: - connect_account: Conectar conta %{provider} - done_continue: Pronto, continuar - save_and_continue: Salvar e continuar - wiki_page: Página wiki - health_checks: - authentication: - existing_token: Token do usuário - header: Autenticação - user_bound_request: Autenticação de solicitação baseada no usuário - base_configuration: - header: Configuração - provider_configured: Configuração concluída - errors: - not_configured: Não foi possível validar a conexão. Primeiro, conclua a configuração. - xwiki_oauth_connection_error: O OpenProject não conseguiu se conectar à instância do XWiki configurada. - xwiki_oauth_request_error: Ocorreu um erro inesperado ao tentar comunicar com a instância do XWiki. - xwiki_oauth_token_missing: O OpenProject não pode testar a comunicação ao nível do utilizador com o XWiki, pois o utilizador ainda não conectou a sua conta XWiki. - xwiki_oauth_unauthorized: O token do utilizador não foi reconhecido pelo XWiki. - work_package_wikis_tab_component: - inline_page_links: Links de página embutidos - referencing_pages: Referenciado em - page_link_component: - remove: Remover link de página - relation_page_links_component: - empty_heading: Nenhuma página relacionada - empty_text: Adicionar manualmente links para outras páginas wiki relacionadas. - oauth_login_component: - heading: Não conectado a %{provider} - description: Faça login em %{provider} para visualizar e gerenciar páginas wiki relacionadas nesta instância do OpenProject. - connect_button: Conectar conta %{provider} admin: destroy_confirmation_dialog_component: - title: Excluir provedor wiki - heading: Excluir este provedor de wiki de forma permanente? description_html: O provedor de wiki %{wiki_provider} e todos os links de páginas wiki relacionados serão excluídos. Além disso, todos os links inline de páginas wiki deixarão de estar acessíveis. Esta ação é irreversível. + heading: Excluir este provedor de wiki de forma permanente? + title: Excluir provedor wiki forms: general_info_form_component: - xwiki_instance_description: Certifique-se de que você tem privilégios de administração na sua instância XWiki antes de realizar a configuração. + provider_description: Certifique-se de que você tem privilégios de administração na sua instância XWiki antes de realizar a configuração. oauth_application_form_component: - application_id: ID da aplicação - application_secret: Segredo da aplicação + application_id: ID da aplicação OAuth do OpenProject + application_secret: Segredo da aplicação OAuth do OpenProject oauth_client_form_component: - client_id: ID do cliente + client_id: ID do cliente OAuth da wiki + client_secret: Segredo do cliente OAuth da wiki + redirect_uri: URI de redirecionamento + redirect_uri_caption: Copie este valor para o campo URI de redirecionamento do registo do cliente OIDC do XWiki. health_status: show: actions: @@ -86,13 +65,19 @@ pt-BR: no_health_report: Nenhum relatório disponível no_health_report_description: Executar as verificações agora para obter um relatório completo de estado de saúde deste provedor de wiki. title: Relatório de integridade + internal_provider_form: + checkbox_caption: Allow projects to use the internal OpenProject wiki along with external Wiki providers + checkbox_label: Enable the internal OpenProject wiki + internal_wiki_provider: + show: + description: Choose to enable or disable the internal OpenProject wiki oauth_application_info_component: confirm_replace_oauth_application: Esta ação irá redefinir as credenciais OAuth atuais. Após confirmar, será necessário inserir novamente as credenciais na sua instância do XWiki e todos os usuários terão de reautorizar. Tem certeza de que deseja continuar? - label_pending: Pendente + label_oauth_client_id: ID do cliente OAuth replace_oauth_application: Substituir aplicação OAuth do OpenProject oauth_client_info_component: confirm_replace_oauth_client: Esta ação irá redefinir as credenciais OAuth atuais do XWiki. Todos os usuários precisarão reautorizar o acesso ao XWiki. Tem certeza de que deseja continuar? - label_pending: Pendente + label_oauth_client_id: ID do cliente OAuth replace_oauth_client: Substituir aplicação OAuth do XWiki side_panel: health_status_component: @@ -110,25 +95,81 @@ pt-BR: index_description: Adicione um serviço de wiki externo para vincular pacotes de trabalho a páginas de wiki existentes ou criar novas diretamente a partir do OpenProject. label_add_new: Adicionar novo provedor de wiki label_edit: Editar provedor XWiki - label_new_xwiki_instance: Novo provedor XWiki + label_new_provider: Novo provedor XWiki label_wiki_platform: Provedor de wiki - name_caption: Dê um nome ao seu armazenamento para que os usuários possam diferenciar entre múltiplas plataformas de wiki. + name_caption: Give your wiki provider a name so that users can differentiate between multiple wiki platforms. name_placeholder: Base de conhecimento XWiki new_provider_html: Leia nossa documentação sobre [configuração de uma integração com o XWiki](docs_url) para mais informações. oauth: openproject_oauth: OAuth do OpenProject sections: - general_information: Detalhes básicos + general_information: Informações gerais oauth_configuration: Configuração de OAuth - url_caption: Informe o endereço do host da sua plataforma de wiki, incluindo o https://. O endereço não deve ter mais de 255 caracteres. - xwiki_instance: Instância XWiki + url_caption: The host address of your wiki platform including the https://. It should not be longer than 255 characters. xwiki: oauth: - openproject_oauth_description: Permitir que o XWiki acesse os dados do OpenProject usando uma aplicação OAuth. Copie as credenciais abaixo para a sua instância do XWiki. - provider_oauth: OAuth do XWiki - provider_oauth_description: Permitir que o OpenProject acesse os dados do XWiki usando OAuth. Um ID de cliente é gerado automaticamente para identificar o OpenProject no XWiki - não é necessária configuração manual no lado do XWiki. + openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. + provider_oauth: OAuth do Wiki + provider_oauth_configuration: Copy these values to the [XWiki OIDC Connection client](xwiki_oidc_link). + provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. openproject_oauth_description: Permitir que o XWiki acesse dados do OpenProject usando OAuth. xwiki_oauth: OAuth do XWiki xwiki_oauth_description: Permitir que o OpenProject acesse dados do XWiki usando OAuth. - macro: - page_not_found: Página wiki vinculada não está mais disponível + buttons: + connect_account: Conectar conta %{provider} + done_continue: Pronto, continuar + open_wiki: Abrir Wiki + save_and_continue: Salvar e continuar + wiki_page: Página wiki + create_new_wiki_page_dialog: + page_title: Title + parent_help_text: Select a parent for this new wiki page. + title: Create new wiki page + delete_relation_page_link_confirmation_dialog: + heading: Excluir link da página wiki relacionada? + title: Excluir link da página wiki relacionada + health_checks: + authentication: + existing_token: Token do usuário + header: Autenticação + user_bound_request: Autenticação de solicitação baseada no usuário + base_configuration: + header: Configuração + provider_configured: Configuração concluída + errors: + not_configured: Não foi possível validar a conexão. Primeiro, conclua a configuração. + xwiki_oauth_connection_error: O OpenProject não conseguiu se conectar à instância do XWiki configurada. + xwiki_oauth_request_error: Ocorreu um erro inesperado ao tentar comunicar com a instância do XWiki. + xwiki_oauth_token_missing: O OpenProject não pode testar a comunicação ao nível do utilizador com o XWiki, pois o utilizador ainda não conectou a sua conta XWiki. + xwiki_oauth_unauthorized: O token do utilizador não foi reconhecido pelo XWiki. + instructions: + xwiki: + integration: Administração do XWiki + oauth_application_details_html: O valor do segredo do cliente não poderá ser acessado novamente depois que você fechar esta janela. Copie esses valores para as [configurações de integração XWiki OpenProject](xwiki_admin_link). + link_existing_wiki_page_dialog: + title: Adicionar página wiki existente + link_existing_wiki_page_form: + no_results: No wiki pages found + placeholder: Search for a wiki page + oauth_login_component: + connect_button: Conectar conta %{provider} + description: Faça login em %{provider} para visualizar e gerenciar páginas wiki relacionadas nesta instância do OpenProject. + heading: Não conectado a %{provider} + page_link_component: + remove: Remover link de página + page_links: + errors: + page_access_forbidden: Você não tem permissão para acessar esta página wiki + page_not_found: Página wiki vinculada não está mais disponível + unexpected: Ocorreu um erro inesperado + provider_types: + xwiki: + name: XWiki + relation_page_links_component: + empty_heading: Nenhuma página relacionada + empty_text: Adicionar manualmente links para outras páginas wiki relacionadas. + link_existing: Página wiki existente + link_new: Nova página da wiki + work_package_wikis_tab_component: + inline_page_links: Links de página embutidos + referencing_pages: Referenciado em diff --git a/modules/wikis/config/locales/crowdin/pt-PT.yml b/modules/wikis/config/locales/crowdin/pt-PT.yml index 4a00b2a0497..c006a227f04 100644 --- a/modules/wikis/config/locales/crowdin/pt-PT.yml +++ b/modules/wikis/config/locales/crowdin/pt-PT.yml @@ -3,15 +3,17 @@ pt-PT: activerecord: attributes: wikis/page_link: + identifier: Identificador provider: Fornecedor Wiki + wikis/provider: + name: Nome + universal_identifier: Identificador universal wikis/xwiki_provider: authentication_method: Método de autenticação authentication_methods: oauth2_sso: Início de sessão único através do fornecedor de identidades OpenID Connect two_way_oauth2: Fluxo de código de autorização bidirecional OAuth 2.0 - name: Nome token_exchange_scope: Âmbito de XWiki - universal_identifier: Identificador universal url: URL da instância wiki_audience: Audiência de XWiki errors: {} @@ -29,53 +31,30 @@ pt-PT: wikis/xwiki_provider: one: Fornecedor XWiki other: Fornecedores XWiki + menus: + admin: + external_wiki_providers: Wiki providers + internal_wiki_provider: Internal wiki + wikis: Wikis permission_manage_wiki_page_links: Gerir ligações de páginas Wiki project_module_wiki_platforms: Fornecedor de wiki wikis: - buttons: - connect_account: Ligar a conta %{provider} - done_continue: Concluído, continuar - save_and_continue: Guardar e continuar - wiki_page: Página wiki - health_checks: - authentication: - existing_token: Token de utilizador - header: Autenticação - user_bound_request: Autenticação da solicitação com base no utilizador - base_configuration: - header: Configuração - provider_configured: Configuração concluída - errors: - not_configured: Não foi possível validar a ligação. Termine primeiro a configuração. - xwiki_oauth_connection_error: O OpenProject não conseguiu ligar-se à instância XWiki configurada. - xwiki_oauth_request_error: Ocorreu um erro inesperado ao tentar comunicar com a instância XWiki. - xwiki_oauth_token_missing: OpenProject não pode testar a comunicação ao nível do utilizador com o XWiki porque o utilizador ainda não ligou a sua conta XWiki. - xwiki_oauth_unauthorized: O token de utilizador não foi reconhecido pelo XWiki. - work_package_wikis_tab_component: - inline_page_links: Ligações diretas de página - referencing_pages: Referenciado em - page_link_component: - remove: Remover ligação da página - relation_page_links_component: - empty_heading: Nenhuma página relacionada - empty_text: Adicionar manualmente ligações a outras páginas wiki relacionadas. - oauth_login_component: - heading: Não ligado a %{provider} - description: Inicie sessão em %{provider} para ver e gerir as páginas wiki relacionadas com esta instância do OpenProject. - connect_button: Ligar a conta %{provider} admin: destroy_confirmation_dialog_component: - title: Eliminar fornecedor de wiki - heading: Eliminar permanentemente este fornecedor de wiki? description_html: O fornecedor de wiki %{wiki_provider} e todas as ligações relacionadas com páginas wiki serão eliminados. Além disso, todas as ligações em linha para páginas wiki deixarão de estar acessíveis. Esta ação é irreversível. + heading: Eliminar permanentemente este fornecedor de wiki? + title: Eliminar fornecedor de wiki forms: general_info_form_component: - xwiki_instance_description: Confirme se tem privilégios de administração na sua instância XWiki antes de fazer a configuração. + provider_description: Confirme se tem privilégios de administração na sua instância XWiki antes de fazer a configuração. oauth_application_form_component: - application_id: ID da aplicação - application_secret: Segredo da aplicação + application_id: ID da aplicação OpenProject OAuth + application_secret: Segredo da aplicação OpenProject OAuth oauth_client_form_component: - client_id: ID do cliente + client_id: ID do cliente Wiki OAuth + client_secret: Segredo do cliente OAuth Wiki + redirect_uri: URI de redirecionamento + redirect_uri_caption: Copie este valor para o campo Redirecionar URI do seu registo de cliente OIDC XWiki. health_status: show: actions: @@ -86,13 +65,19 @@ pt-PT: no_health_report: Nenhum relatório disponível no_health_report_description: Execute agora as verificações para obter um relatório de estado de saúde completo para este fornecedor de wiki. title: Relatório de saúde + internal_provider_form: + checkbox_caption: Allow projects to use the internal OpenProject wiki along with external Wiki providers + checkbox_label: Enable the internal OpenProject wiki + internal_wiki_provider: + show: + description: Choose to enable or disable the internal OpenProject wiki oauth_application_info_component: confirm_replace_oauth_application: Esta ação irá repor as credenciais OAuth atuais. Depois de confirmar, terá de voltar a introduzir as credenciais na sua instância XWiki, e todos os utilizadores terão de voltar a autorizar. Tem a certeza de que quer continuar? - label_pending: Pendente + label_oauth_client_id: ID de Cliente OAuth replace_oauth_application: Substitua a aplicação OpenProject OAuth oauth_client_info_component: confirm_replace_oauth_client: Esta ação irá repor as atuais credenciais OAuth do XWiki. Todos os utilizadores terão de voltar a autorizar o XWiki. Tem a certeza de que quer continuar? - label_pending: Pendente + label_oauth_client_id: ID de Cliente OAuth replace_oauth_client: Substituir a aplicação XWiki OAuth side_panel: health_status_component: @@ -110,25 +95,81 @@ pt-PT: index_description: Adicione um serviço wiki externo para ligar pacotes de trabalho a páginas wiki existentes ou criar novas páginas diretamente a partir do OpenProject. label_add_new: Adicionar novo fornecedor de wiki label_edit: Editar fornecedor de XWiki - label_new_xwiki_instance: Novo fornecedor de XWiki + label_new_provider: Novo fornecedor de XWiki label_wiki_platform: Fornecedor de wiki - name_caption: Dê um nome ao seu armazenamento para que os utilizadores possam diferenciar várias plataformas de wiki. + name_caption: Give your wiki provider a name so that users can differentiate between multiple wiki platforms. name_placeholder: Base de conhecimento XWiki new_provider_html: Leia a nossa documentação sobre [configurar uma integração XWiki](docs_url) para mais informações. oauth: openproject_oauth: OAuth do OpenProject sections: - general_information: Detalhes básicos + general_information: Informação geral oauth_configuration: Configuração OAuth - url_caption: Introduza o endereço do servidor da sua plataforma wiki, incluindo https://. Não deve ter mais de 255 caracteres. - xwiki_instance: Instância de XWiki + url_caption: The host address of your wiki platform including the https://. It should not be longer than 255 characters. xwiki: oauth: - openproject_oauth_description: Permita que o XWiki aceda aos dados do OpenProject com uma aplicação OAuth. Copie as credenciais abaixo para a sua instância XWiki. - provider_oauth: OAuth XWiki - provider_oauth_description: Permita que o OpenProject aceda aos dados do XWiki com o OAuth. Um ID de cliente é gerado automaticamente para identificar o OpenProject para o XWiki - não é necessária nenhuma configuração manual do lado do XWiki. + openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. + provider_oauth: OAuth Wiki + provider_oauth_configuration: Copy these values to the [XWiki OIDC Connection client](xwiki_oidc_link). + provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. openproject_oauth_description: Permitir que XWiki aceda aos dados do OpenProject com um OAuth. xwiki_oauth: OAuth XWiki xwiki_oauth_description: Permita que o OpenProject aceda aos dados do XWiki com um OAuth. - macro: - page_not_found: A página wiki ligada já não está disponível + buttons: + connect_account: Ligar a conta %{provider} + done_continue: Concluído, continuar + open_wiki: Abrir wiki + save_and_continue: Guardar e continuar + wiki_page: Página wiki + create_new_wiki_page_dialog: + page_title: Title + parent_help_text: Select a parent for this new wiki page. + title: Create new wiki page + delete_relation_page_link_confirmation_dialog: + heading: Eliminar a ligação à página wiki relacionada? + title: Eliminar a ligação à página wiki relacionada + health_checks: + authentication: + existing_token: Token de utilizador + header: Autenticação + user_bound_request: Autenticação da solicitação com base no utilizador + base_configuration: + header: Configuração + provider_configured: Configuração concluída + errors: + not_configured: Não foi possível validar a ligação. Termine primeiro a configuração. + xwiki_oauth_connection_error: O OpenProject não conseguiu ligar-se à instância XWiki configurada. + xwiki_oauth_request_error: Ocorreu um erro inesperado ao tentar comunicar com a instância XWiki. + xwiki_oauth_token_missing: OpenProject não pode testar a comunicação ao nível do utilizador com o XWiki porque o utilizador ainda não ligou a sua conta XWiki. + xwiki_oauth_unauthorized: O token de utilizador não foi reconhecido pelo XWiki. + instructions: + xwiki: + integration: Administração de XWiki + oauth_application_details_html: O valor do segredo do cliente deixará de estar acessível depois de fechar esta janela. Copie estes valores para as [Definições de integração do XWiki com o OpenProject](xwiki_admin_link). + link_existing_wiki_page_dialog: + title: Adicionar uma página wiki existente + link_existing_wiki_page_form: + no_results: No wiki pages found + placeholder: Search for a wiki page + oauth_login_component: + connect_button: Ligar a conta %{provider} + description: Inicie sessão em %{provider} para ver e gerir as páginas wiki relacionadas com esta instância do OpenProject. + heading: Não ligado a %{provider} + page_link_component: + remove: Remover ligação da página + page_links: + errors: + page_access_forbidden: Não tem permissão para aceder a esta página wiki + page_not_found: A página wiki ligada já não está disponível + unexpected: Ocorreu um erro inesperado + provider_types: + xwiki: + name: XWiki + relation_page_links_component: + empty_heading: Nenhuma página relacionada + empty_text: Adicionar manualmente ligações a outras páginas wiki relacionadas. + link_existing: Página wiki existente + link_new: Nova página wiki + work_package_wikis_tab_component: + inline_page_links: Ligações diretas de página + referencing_pages: Referenciado em diff --git a/modules/wikis/config/locales/crowdin/ro.yml b/modules/wikis/config/locales/crowdin/ro.yml index d4792729580..74bca6dbb1d 100644 --- a/modules/wikis/config/locales/crowdin/ro.yml +++ b/modules/wikis/config/locales/crowdin/ro.yml @@ -3,15 +3,17 @@ ro: activerecord: attributes: wikis/page_link: + identifier: Identifier provider: Wiki Provider + wikis/provider: + name: Name + universal_identifier: Universal identifier wikis/xwiki_provider: authentication_method: Authentication method authentication_methods: oauth2_sso: Single-Sign-On through OpenID Connect Identity Provider two_way_oauth2: Two-way OAuth 2.0 authorization code flow - name: Name token_exchange_scope: XWiki Scope - universal_identifier: Universal identifier url: Instance URL wiki_audience: XWiki Audience errors: {} @@ -33,53 +35,30 @@ ro: one: XWiki provider few: XWiki providers other: XWiki providers + menus: + admin: + external_wiki_providers: Wiki providers + internal_wiki_provider: Internal wiki + wikis: Wikis permission_manage_wiki_page_links: Manage Wiki Page Links project_module_wiki_platforms: Wiki providers wikis: - buttons: - connect_account: Connect %{provider} account - done_continue: Done, continue - save_and_continue: Save and continue - wiki_page: Wiki page - health_checks: - authentication: - existing_token: User token - header: Authentication - user_bound_request: User-based request authentication - base_configuration: - header: Configuration - provider_configured: Configuration complete - errors: - not_configured: The connection could not be validated. Please finish configuration first. - xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. - xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. - xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. - xwiki_oauth_unauthorized: The user token was not recognized by XWiki. - work_package_wikis_tab_component: - inline_page_links: Inline page links - referencing_pages: Referenced in - page_link_component: - remove: Remove page link - relation_page_links_component: - empty_heading: No related pages - empty_text: Manually add links to other related wiki pages. - oauth_login_component: - heading: Not connected to %{provider} - description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. - connect_button: Connect %{provider} account admin: destroy_confirmation_dialog_component: - title: Delete wiki provider - heading: Permanently delete this wiki provider? description_html: The wiki provider %{wiki_provider} and all the related wiki page links will be deleted. In addition, every inline wiki page link will no longer be accessible. This action is irreversible. + heading: Permanently delete this wiki provider? + title: Delete wiki provider forms: general_info_form_component: - xwiki_instance_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. + provider_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. oauth_application_form_component: - application_id: Application ID - application_secret: Application secret + application_id: OpenProject OAuth Application ID + application_secret: OpenProject OAuth Application secret oauth_client_form_component: - client_id: Client ID + client_id: Wiki OAuth Client ID + client_secret: Wiki OAuth Client secret + redirect_uri: Redirect URI + redirect_uri_caption: Copy this value into the Redirect URI field of your XWiki OIDC client registration. health_status: show: actions: @@ -90,13 +69,19 @@ ro: no_health_report: No report available no_health_report_description: Run the checks now for a full health status report for this wiki provider. title: Health Report + internal_provider_form: + checkbox_caption: Allow projects to use the internal OpenProject wiki along with external Wiki providers + checkbox_label: Enable the internal OpenProject wiki + internal_wiki_provider: + show: + description: Choose to enable or disable the internal OpenProject wiki oauth_application_info_component: confirm_replace_oauth_application: This action will reset the current OAuth credentials. After confirming you will have to reenter the credentials in your XWiki instance and all users will have to reauthorize. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_application: Replace OpenProject OAuth application oauth_client_info_component: confirm_replace_oauth_client: This action will reset the current XWiki OAuth credentials. All users will need to reauthorize against XWiki. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_client: Replace XWiki OAuth application side_panel: health_status_component: @@ -114,25 +99,81 @@ ro: index_description: Add an external wiki service to link work packages to existing wiki pages or create new ones directly from OpenProject. label_add_new: Add new wiki provider label_edit: Edit XWiki provider - label_new_xwiki_instance: New XWiki provider + label_new_provider: New XWiki provider label_wiki_platform: Wiki provider - name_caption: Give your storage a name so that users can differentiate between multiple wiki platforms. + name_caption: Give your wiki provider a name so that users can differentiate between multiple wiki platforms. name_placeholder: XWiki knowledge base new_provider_html: Read our documentation on [setting up an XWiki integration](docs_url) for more information. oauth: openproject_oauth: OpenProject OAuth sections: - general_information: Basic details + general_information: General information oauth_configuration: OAuth configuration - url_caption: Please add the host address of your wiki platform including the https://. It should not be longer than 255 characters. - xwiki_instance: XWiki Instance + url_caption: The host address of your wiki platform including the https://. It should not be longer than 255 characters. xwiki: oauth: - openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. Copy the credentials below into your XWiki instance. - provider_oauth: XWiki OAuth - provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. A client ID is automatically generated to identify OpenProject to XWiki — no manual configuration is needed on the XWiki side. + openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. + provider_oauth: Wiki OAuth + provider_oauth_configuration: Copy these values to the [XWiki OIDC Connection client](xwiki_oidc_link). + provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth. xwiki_oauth: XWiki OAuth xwiki_oauth_description: Allow OpenProject to access XWiki data using an OAuth. - macro: - page_not_found: Linked wiki page no longer available + buttons: + connect_account: Connect %{provider} account + done_continue: Done, continue + open_wiki: Open wiki + save_and_continue: Save and continue + wiki_page: Wiki page + create_new_wiki_page_dialog: + page_title: Title + parent_help_text: Select a parent for this new wiki page. + title: Create new wiki page + delete_relation_page_link_confirmation_dialog: + heading: Delete related wiki page link? + title: Delete related wiki page link + health_checks: + authentication: + existing_token: User token + header: Authentication + user_bound_request: User-based request authentication + base_configuration: + header: Configuration + provider_configured: Configuration complete + errors: + not_configured: The connection could not be validated. Please finish configuration first. + xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. + xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. + xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. + xwiki_oauth_unauthorized: The user token was not recognized by XWiki. + instructions: + xwiki: + integration: XWiki Administration + oauth_application_details_html: The client secret value will not be accessible again after you close this window. Please copy these values into the [XWiki OpenProject Integration settings](xwiki_admin_link). + link_existing_wiki_page_dialog: + title: Add existing wiki page + link_existing_wiki_page_form: + no_results: No wiki pages found + placeholder: Search for a wiki page + oauth_login_component: + connect_button: Connect %{provider} account + description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. + heading: Not connected to %{provider} + page_link_component: + remove: Remove page link + page_links: + errors: + page_access_forbidden: You do not have permission to access this wiki page + page_not_found: Linked wiki page no longer available + unexpected: An unexpected error occurred + provider_types: + xwiki: + name: XWiki + relation_page_links_component: + empty_heading: No related pages + empty_text: Manually add links to other related wiki pages. + link_existing: Existing wiki page + link_new: New wiki page + work_package_wikis_tab_component: + inline_page_links: Inline page links + referencing_pages: Referenced in diff --git a/modules/wikis/config/locales/crowdin/ru.yml b/modules/wikis/config/locales/crowdin/ru.yml index 760f69adfd5..b4390744af9 100644 --- a/modules/wikis/config/locales/crowdin/ru.yml +++ b/modules/wikis/config/locales/crowdin/ru.yml @@ -3,15 +3,17 @@ ru: activerecord: attributes: wikis/page_link: + identifier: Identifier provider: Провайдер Wiki + wikis/provider: + name: Name + universal_identifier: Universal identifier wikis/xwiki_provider: authentication_method: Метод аутентификации authentication_methods: oauth2_sso: Аутентификация Single-Sign-On посредством поставщика OpenID Connect two_way_oauth2: Двусторонняя аутентификация OAuth 2.0 - name: Имя token_exchange_scope: Область XWiki - universal_identifier: Универсальный идентификатор url: Адрес сервера wiki_audience: Аудитория XWiki errors: {} @@ -37,53 +39,30 @@ ru: few: XWiki providers many: XWiki providers other: XWiki providers + menus: + admin: + external_wiki_providers: Wiki providers + internal_wiki_provider: Internal wiki + wikis: Wikis permission_manage_wiki_page_links: Управление ссылками Вики-страницы project_module_wiki_platforms: Провайдеры вики wikis: - buttons: - connect_account: Подключите учетную запись %{provider} - done_continue: Готово, продолжить - save_and_continue: Сохранить и продолжить - wiki_page: Wiki-страница - health_checks: - authentication: - existing_token: User token - header: Authentication - user_bound_request: User-based request authentication - base_configuration: - header: Configuration - provider_configured: Configuration complete - errors: - not_configured: The connection could not be validated. Please finish configuration first. - xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. - xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. - xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. - xwiki_oauth_unauthorized: The user token was not recognized by XWiki. - work_package_wikis_tab_component: - inline_page_links: Ссылки на внутренние страницы - referencing_pages: Ссылается в - page_link_component: - remove: Удалить ссылку на страницу - relation_page_links_component: - empty_heading: Нет связанных страниц - empty_text: Добавьте ссылки вручную на другие связанные вики-страницы. - oauth_login_component: - heading: Не подключен к %{provider} - description: Войдите в %{provider} для просмотра и управления связанными страницами вики из этого экземпляра OpenProject. - connect_button: Подключить учетную запись %{provider} admin: destroy_confirmation_dialog_component: - title: Удалить вики-провайдера - heading: Permanently delete this wiki provider? description_html: The wiki provider %{wiki_provider} and all the related wiki page links will be deleted. In addition, every inline wiki page link will no longer be accessible. This action is irreversible. + heading: Permanently delete this wiki provider? + title: Удалить вики-провайдера forms: general_info_form_component: - xwiki_instance_description: Перед установкой убедитесь, что у вас есть права администрирования на XWiki. + provider_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. oauth_application_form_component: - application_id: Идентификатор приложения - application_secret: Секретный ключ приложения + application_id: OpenProject OAuth Application ID + application_secret: OpenProject OAuth Application secret oauth_client_form_component: - client_id: Идентификатор клиента + client_id: Wiki OAuth Client ID + client_secret: Wiki OAuth Client secret + redirect_uri: Redirect URI + redirect_uri_caption: Copy this value into the Redirect URI field of your XWiki OIDC client registration. health_status: show: actions: @@ -94,13 +73,19 @@ ru: no_health_report: No report available no_health_report_description: Run the checks now for a full health status report for this wiki provider. title: Health Report + internal_provider_form: + checkbox_caption: Allow projects to use the internal OpenProject wiki along with external Wiki providers + checkbox_label: Enable the internal OpenProject wiki + internal_wiki_provider: + show: + description: Choose to enable or disable the internal OpenProject wiki oauth_application_info_component: confirm_replace_oauth_application: Это действие сбросит текущие учетные данные OAuth. После подтверждения Вам придется заново ввести учетные данные в Вашем экземпляре XWiki, а все пользователи должны будут заново авторизоваться. Вы уверены, что хотите продолжить? - label_pending: В ожидании + label_oauth_client_id: OAuth Client ID replace_oauth_application: Заменить приложение OpenProject OAuth oauth_client_info_component: confirm_replace_oauth_client: Это действие сбросит текущие учетные данные XWiki OAuth. Все пользователи должны будут повторно авторизоваться в XWiki. Вы уверены, что хотите продолжить? - label_pending: В ожидании + label_oauth_client_id: OAuth Client ID replace_oauth_client: Заменить приложение XWiki OAuth side_panel: health_status_component: @@ -118,25 +103,81 @@ ru: index_description: Добавить внешний вики-сервис, чтобы связать рабочие пакеты с существующими вики-страницами или создать новые прямо из OpenProject. label_add_new: Добавить нового вики-провайдера label_edit: Редактировать провайдера XWiki - label_new_xwiki_instance: Новый провайдер XWiki + label_new_provider: New XWiki provider label_wiki_platform: Провайдер Wiki - name_caption: Дайте своему хранилищу имя, чтобы пользователи могли различать несколько вики-платформ. + name_caption: Give your wiki provider a name so that users can differentiate between multiple wiki platforms. name_placeholder: База знаний XWiki new_provider_html: Прочитайте нашу документацию по [настройке интеграции XWiki](docs_url) для получения дополнительной информации. oauth: openproject_oauth: OpenProject OAuth sections: - general_information: Основные детали + general_information: General information oauth_configuration: Конфигурация OAuth - url_caption: Пожалуйста, добавьте адрес хоста Вашей вики-платформы, включая https://. Его длина не должна превышать 255 символов. - xwiki_instance: Экземпляр XWiki + url_caption: The host address of your wiki platform including the https://. It should not be longer than 255 characters. xwiki: oauth: - openproject_oauth_description: Разрешите XWiki получить доступ к данным OpenProject с помощью приложения OAuth. Скопируйте приведенные ниже учетные данные в Ваш экземпляр XWiki. - provider_oauth: XWiki OAuth - provider_oauth_description: Разрешите OpenProject получить доступ к данным XWiki с помощью OAuth. Идентификатор клиента генерируется автоматически для идентификации OpenProject в XWiki - ручная настройка на стороне XWiki не требуется. + openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. + provider_oauth: Wiki OAuth + provider_oauth_configuration: Copy these values to the [XWiki OIDC Connection client](xwiki_oidc_link). + provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. openproject_oauth_description: Разрешить XWiki доступ к данным OpenProject с помощью OAuth. xwiki_oauth: XWiki OAuth xwiki_oauth_description: Разрешить OpenProject доступ к данным XWiki с помощью OAuth. - macro: - page_not_found: Связанная вики-страница больше не доступна + buttons: + connect_account: Подключите учетную запись %{provider} + done_continue: Готово, продолжить + open_wiki: Open wiki + save_and_continue: Сохранить и продолжить + wiki_page: Wiki-страница + create_new_wiki_page_dialog: + page_title: Title + parent_help_text: Select a parent for this new wiki page. + title: Create new wiki page + delete_relation_page_link_confirmation_dialog: + heading: Delete related wiki page link? + title: Delete related wiki page link + health_checks: + authentication: + existing_token: User token + header: Authentication + user_bound_request: User-based request authentication + base_configuration: + header: Configuration + provider_configured: Configuration complete + errors: + not_configured: The connection could not be validated. Please finish configuration first. + xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. + xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. + xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. + xwiki_oauth_unauthorized: The user token was not recognized by XWiki. + instructions: + xwiki: + integration: XWiki Administration + oauth_application_details_html: The client secret value will not be accessible again after you close this window. Please copy these values into the [XWiki OpenProject Integration settings](xwiki_admin_link). + link_existing_wiki_page_dialog: + title: Add existing wiki page + link_existing_wiki_page_form: + no_results: No wiki pages found + placeholder: Search for a wiki page + oauth_login_component: + connect_button: Подключить учетную запись %{provider} + description: Войдите в %{provider} для просмотра и управления связанными страницами вики из этого экземпляра OpenProject. + heading: Не подключен к %{provider} + page_link_component: + remove: Удалить ссылку на страницу + page_links: + errors: + page_access_forbidden: You do not have permission to access this wiki page + page_not_found: Linked wiki page no longer available + unexpected: An unexpected error occurred + provider_types: + xwiki: + name: XWiki + relation_page_links_component: + empty_heading: Нет связанных страниц + empty_text: Добавьте ссылки вручную на другие связанные вики-страницы. + link_existing: Existing wiki page + link_new: New wiki page + work_package_wikis_tab_component: + inline_page_links: Ссылки на внутренние страницы + referencing_pages: Ссылается в diff --git a/modules/wikis/config/locales/crowdin/rw.yml b/modules/wikis/config/locales/crowdin/rw.yml index ee27d995af5..efc1d80676f 100644 --- a/modules/wikis/config/locales/crowdin/rw.yml +++ b/modules/wikis/config/locales/crowdin/rw.yml @@ -3,15 +3,17 @@ rw: activerecord: attributes: wikis/page_link: + identifier: Identifier provider: Wiki Provider + wikis/provider: + name: Name + universal_identifier: Universal identifier wikis/xwiki_provider: authentication_method: Authentication method authentication_methods: oauth2_sso: Single-Sign-On through OpenID Connect Identity Provider two_way_oauth2: Two-way OAuth 2.0 authorization code flow - name: Name token_exchange_scope: XWiki Scope - universal_identifier: Universal identifier url: Instance URL wiki_audience: XWiki Audience errors: {} @@ -29,53 +31,30 @@ rw: wikis/xwiki_provider: one: XWiki provider other: XWiki providers + menus: + admin: + external_wiki_providers: Wiki providers + internal_wiki_provider: Internal wiki + wikis: Wikis permission_manage_wiki_page_links: Manage Wiki Page Links project_module_wiki_platforms: Wiki providers wikis: - buttons: - connect_account: Connect %{provider} account - done_continue: Done, continue - save_and_continue: Save and continue - wiki_page: Wiki page - health_checks: - authentication: - existing_token: User token - header: Authentication - user_bound_request: User-based request authentication - base_configuration: - header: Configuration - provider_configured: Configuration complete - errors: - not_configured: The connection could not be validated. Please finish configuration first. - xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. - xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. - xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. - xwiki_oauth_unauthorized: The user token was not recognized by XWiki. - work_package_wikis_tab_component: - inline_page_links: Inline page links - referencing_pages: Referenced in - page_link_component: - remove: Remove page link - relation_page_links_component: - empty_heading: No related pages - empty_text: Manually add links to other related wiki pages. - oauth_login_component: - heading: Not connected to %{provider} - description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. - connect_button: Connect %{provider} account admin: destroy_confirmation_dialog_component: - title: Delete wiki provider - heading: Permanently delete this wiki provider? description_html: The wiki provider %{wiki_provider} and all the related wiki page links will be deleted. In addition, every inline wiki page link will no longer be accessible. This action is irreversible. + heading: Permanently delete this wiki provider? + title: Delete wiki provider forms: general_info_form_component: - xwiki_instance_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. + provider_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. oauth_application_form_component: - application_id: Application ID - application_secret: Application secret + application_id: OpenProject OAuth Application ID + application_secret: OpenProject OAuth Application secret oauth_client_form_component: - client_id: Client ID + client_id: Wiki OAuth Client ID + client_secret: Wiki OAuth Client secret + redirect_uri: Redirect URI + redirect_uri_caption: Copy this value into the Redirect URI field of your XWiki OIDC client registration. health_status: show: actions: @@ -86,13 +65,19 @@ rw: no_health_report: No report available no_health_report_description: Run the checks now for a full health status report for this wiki provider. title: Health Report + internal_provider_form: + checkbox_caption: Allow projects to use the internal OpenProject wiki along with external Wiki providers + checkbox_label: Enable the internal OpenProject wiki + internal_wiki_provider: + show: + description: Choose to enable or disable the internal OpenProject wiki oauth_application_info_component: confirm_replace_oauth_application: This action will reset the current OAuth credentials. After confirming you will have to reenter the credentials in your XWiki instance and all users will have to reauthorize. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_application: Replace OpenProject OAuth application oauth_client_info_component: confirm_replace_oauth_client: This action will reset the current XWiki OAuth credentials. All users will need to reauthorize against XWiki. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_client: Replace XWiki OAuth application side_panel: health_status_component: @@ -110,25 +95,81 @@ rw: index_description: Add an external wiki service to link work packages to existing wiki pages or create new ones directly from OpenProject. label_add_new: Add new wiki provider label_edit: Edit XWiki provider - label_new_xwiki_instance: New XWiki provider + label_new_provider: New XWiki provider label_wiki_platform: Wiki provider - name_caption: Give your storage a name so that users can differentiate between multiple wiki platforms. + name_caption: Give your wiki provider a name so that users can differentiate between multiple wiki platforms. name_placeholder: XWiki knowledge base new_provider_html: Read our documentation on [setting up an XWiki integration](docs_url) for more information. oauth: openproject_oauth: OpenProject OAuth sections: - general_information: Basic details + general_information: General information oauth_configuration: OAuth configuration - url_caption: Please add the host address of your wiki platform including the https://. It should not be longer than 255 characters. - xwiki_instance: XWiki Instance + url_caption: The host address of your wiki platform including the https://. It should not be longer than 255 characters. xwiki: oauth: - openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. Copy the credentials below into your XWiki instance. - provider_oauth: XWiki OAuth - provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. A client ID is automatically generated to identify OpenProject to XWiki — no manual configuration is needed on the XWiki side. + openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. + provider_oauth: Wiki OAuth + provider_oauth_configuration: Copy these values to the [XWiki OIDC Connection client](xwiki_oidc_link). + provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth. xwiki_oauth: XWiki OAuth xwiki_oauth_description: Allow OpenProject to access XWiki data using an OAuth. - macro: - page_not_found: Linked wiki page no longer available + buttons: + connect_account: Connect %{provider} account + done_continue: Done, continue + open_wiki: Open wiki + save_and_continue: Save and continue + wiki_page: Wiki page + create_new_wiki_page_dialog: + page_title: Title + parent_help_text: Select a parent for this new wiki page. + title: Create new wiki page + delete_relation_page_link_confirmation_dialog: + heading: Delete related wiki page link? + title: Delete related wiki page link + health_checks: + authentication: + existing_token: User token + header: Authentication + user_bound_request: User-based request authentication + base_configuration: + header: Configuration + provider_configured: Configuration complete + errors: + not_configured: The connection could not be validated. Please finish configuration first. + xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. + xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. + xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. + xwiki_oauth_unauthorized: The user token was not recognized by XWiki. + instructions: + xwiki: + integration: XWiki Administration + oauth_application_details_html: The client secret value will not be accessible again after you close this window. Please copy these values into the [XWiki OpenProject Integration settings](xwiki_admin_link). + link_existing_wiki_page_dialog: + title: Add existing wiki page + link_existing_wiki_page_form: + no_results: No wiki pages found + placeholder: Search for a wiki page + oauth_login_component: + connect_button: Connect %{provider} account + description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. + heading: Not connected to %{provider} + page_link_component: + remove: Remove page link + page_links: + errors: + page_access_forbidden: You do not have permission to access this wiki page + page_not_found: Linked wiki page no longer available + unexpected: An unexpected error occurred + provider_types: + xwiki: + name: XWiki + relation_page_links_component: + empty_heading: No related pages + empty_text: Manually add links to other related wiki pages. + link_existing: Existing wiki page + link_new: New wiki page + work_package_wikis_tab_component: + inline_page_links: Inline page links + referencing_pages: Referenced in diff --git a/modules/wikis/config/locales/crowdin/si.yml b/modules/wikis/config/locales/crowdin/si.yml index c1af7e44156..f53b1f2b09b 100644 --- a/modules/wikis/config/locales/crowdin/si.yml +++ b/modules/wikis/config/locales/crowdin/si.yml @@ -3,15 +3,17 @@ si: activerecord: attributes: wikis/page_link: + identifier: Identifier provider: Wiki Provider + wikis/provider: + name: Name + universal_identifier: Universal identifier wikis/xwiki_provider: authentication_method: Authentication method authentication_methods: oauth2_sso: Single-Sign-On through OpenID Connect Identity Provider two_way_oauth2: Two-way OAuth 2.0 authorization code flow - name: Name token_exchange_scope: XWiki Scope - universal_identifier: Universal identifier url: Instance URL wiki_audience: XWiki Audience errors: {} @@ -29,53 +31,30 @@ si: wikis/xwiki_provider: one: XWiki provider other: XWiki providers + menus: + admin: + external_wiki_providers: Wiki providers + internal_wiki_provider: Internal wiki + wikis: Wikis permission_manage_wiki_page_links: Manage Wiki Page Links project_module_wiki_platforms: Wiki providers wikis: - buttons: - connect_account: Connect %{provider} account - done_continue: Done, continue - save_and_continue: Save and continue - wiki_page: Wiki page - health_checks: - authentication: - existing_token: User token - header: Authentication - user_bound_request: User-based request authentication - base_configuration: - header: Configuration - provider_configured: Configuration complete - errors: - not_configured: The connection could not be validated. Please finish configuration first. - xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. - xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. - xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. - xwiki_oauth_unauthorized: The user token was not recognized by XWiki. - work_package_wikis_tab_component: - inline_page_links: Inline page links - referencing_pages: Referenced in - page_link_component: - remove: Remove page link - relation_page_links_component: - empty_heading: No related pages - empty_text: Manually add links to other related wiki pages. - oauth_login_component: - heading: Not connected to %{provider} - description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. - connect_button: Connect %{provider} account admin: destroy_confirmation_dialog_component: - title: Delete wiki provider - heading: Permanently delete this wiki provider? description_html: The wiki provider %{wiki_provider} and all the related wiki page links will be deleted. In addition, every inline wiki page link will no longer be accessible. This action is irreversible. + heading: Permanently delete this wiki provider? + title: Delete wiki provider forms: general_info_form_component: - xwiki_instance_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. + provider_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. oauth_application_form_component: - application_id: Application ID - application_secret: Application secret + application_id: OpenProject OAuth Application ID + application_secret: OpenProject OAuth Application secret oauth_client_form_component: - client_id: Client ID + client_id: Wiki OAuth Client ID + client_secret: Wiki OAuth Client secret + redirect_uri: Redirect URI + redirect_uri_caption: Copy this value into the Redirect URI field of your XWiki OIDC client registration. health_status: show: actions: @@ -86,13 +65,19 @@ si: no_health_report: No report available no_health_report_description: Run the checks now for a full health status report for this wiki provider. title: Health Report + internal_provider_form: + checkbox_caption: Allow projects to use the internal OpenProject wiki along with external Wiki providers + checkbox_label: Enable the internal OpenProject wiki + internal_wiki_provider: + show: + description: Choose to enable or disable the internal OpenProject wiki oauth_application_info_component: confirm_replace_oauth_application: This action will reset the current OAuth credentials. After confirming you will have to reenter the credentials in your XWiki instance and all users will have to reauthorize. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_application: Replace OpenProject OAuth application oauth_client_info_component: confirm_replace_oauth_client: This action will reset the current XWiki OAuth credentials. All users will need to reauthorize against XWiki. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_client: Replace XWiki OAuth application side_panel: health_status_component: @@ -110,25 +95,81 @@ si: index_description: Add an external wiki service to link work packages to existing wiki pages or create new ones directly from OpenProject. label_add_new: Add new wiki provider label_edit: Edit XWiki provider - label_new_xwiki_instance: New XWiki provider + label_new_provider: New XWiki provider label_wiki_platform: Wiki provider - name_caption: Give your storage a name so that users can differentiate between multiple wiki platforms. + name_caption: Give your wiki provider a name so that users can differentiate between multiple wiki platforms. name_placeholder: XWiki knowledge base new_provider_html: Read our documentation on [setting up an XWiki integration](docs_url) for more information. oauth: openproject_oauth: OpenProject OAuth sections: - general_information: Basic details + general_information: General information oauth_configuration: OAuth configuration - url_caption: Please add the host address of your wiki platform including the https://. It should not be longer than 255 characters. - xwiki_instance: XWiki Instance + url_caption: The host address of your wiki platform including the https://. It should not be longer than 255 characters. xwiki: oauth: - openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. Copy the credentials below into your XWiki instance. - provider_oauth: XWiki OAuth - provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. A client ID is automatically generated to identify OpenProject to XWiki — no manual configuration is needed on the XWiki side. + openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. + provider_oauth: Wiki OAuth + provider_oauth_configuration: Copy these values to the [XWiki OIDC Connection client](xwiki_oidc_link). + provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth. xwiki_oauth: XWiki OAuth xwiki_oauth_description: Allow OpenProject to access XWiki data using an OAuth. - macro: - page_not_found: Linked wiki page no longer available + buttons: + connect_account: Connect %{provider} account + done_continue: Done, continue + open_wiki: Open wiki + save_and_continue: Save and continue + wiki_page: Wiki page + create_new_wiki_page_dialog: + page_title: Title + parent_help_text: Select a parent for this new wiki page. + title: Create new wiki page + delete_relation_page_link_confirmation_dialog: + heading: Delete related wiki page link? + title: Delete related wiki page link + health_checks: + authentication: + existing_token: User token + header: Authentication + user_bound_request: User-based request authentication + base_configuration: + header: Configuration + provider_configured: Configuration complete + errors: + not_configured: The connection could not be validated. Please finish configuration first. + xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. + xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. + xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. + xwiki_oauth_unauthorized: The user token was not recognized by XWiki. + instructions: + xwiki: + integration: XWiki Administration + oauth_application_details_html: The client secret value will not be accessible again after you close this window. Please copy these values into the [XWiki OpenProject Integration settings](xwiki_admin_link). + link_existing_wiki_page_dialog: + title: Add existing wiki page + link_existing_wiki_page_form: + no_results: No wiki pages found + placeholder: Search for a wiki page + oauth_login_component: + connect_button: Connect %{provider} account + description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. + heading: Not connected to %{provider} + page_link_component: + remove: Remove page link + page_links: + errors: + page_access_forbidden: You do not have permission to access this wiki page + page_not_found: Linked wiki page no longer available + unexpected: An unexpected error occurred + provider_types: + xwiki: + name: XWiki + relation_page_links_component: + empty_heading: No related pages + empty_text: Manually add links to other related wiki pages. + link_existing: Existing wiki page + link_new: New wiki page + work_package_wikis_tab_component: + inline_page_links: Inline page links + referencing_pages: Referenced in diff --git a/modules/wikis/config/locales/crowdin/sk.yml b/modules/wikis/config/locales/crowdin/sk.yml index 1deb2dc7084..1c80e27deb4 100644 --- a/modules/wikis/config/locales/crowdin/sk.yml +++ b/modules/wikis/config/locales/crowdin/sk.yml @@ -3,15 +3,17 @@ sk: activerecord: attributes: wikis/page_link: + identifier: Identifier provider: Wiki Provider + wikis/provider: + name: Name + universal_identifier: Universal identifier wikis/xwiki_provider: authentication_method: Authentication method authentication_methods: oauth2_sso: Single-Sign-On through OpenID Connect Identity Provider two_way_oauth2: Two-way OAuth 2.0 authorization code flow - name: Name token_exchange_scope: XWiki Scope - universal_identifier: Universal identifier url: Instance URL wiki_audience: XWiki Audience errors: {} @@ -37,53 +39,30 @@ sk: few: XWiki providers many: XWiki providers other: XWiki providers + menus: + admin: + external_wiki_providers: Wiki providers + internal_wiki_provider: Internal wiki + wikis: Wikis permission_manage_wiki_page_links: Manage Wiki Page Links project_module_wiki_platforms: Wiki providers wikis: - buttons: - connect_account: Connect %{provider} account - done_continue: Done, continue - save_and_continue: Save and continue - wiki_page: Wiki page - health_checks: - authentication: - existing_token: User token - header: Authentication - user_bound_request: User-based request authentication - base_configuration: - header: Configuration - provider_configured: Configuration complete - errors: - not_configured: The connection could not be validated. Please finish configuration first. - xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. - xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. - xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. - xwiki_oauth_unauthorized: The user token was not recognized by XWiki. - work_package_wikis_tab_component: - inline_page_links: Inline page links - referencing_pages: Referenced in - page_link_component: - remove: Remove page link - relation_page_links_component: - empty_heading: No related pages - empty_text: Manually add links to other related wiki pages. - oauth_login_component: - heading: Not connected to %{provider} - description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. - connect_button: Connect %{provider} account admin: destroy_confirmation_dialog_component: - title: Delete wiki provider - heading: Permanently delete this wiki provider? description_html: The wiki provider %{wiki_provider} and all the related wiki page links will be deleted. In addition, every inline wiki page link will no longer be accessible. This action is irreversible. + heading: Permanently delete this wiki provider? + title: Delete wiki provider forms: general_info_form_component: - xwiki_instance_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. + provider_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. oauth_application_form_component: - application_id: Application ID - application_secret: Application secret + application_id: OpenProject OAuth Application ID + application_secret: OpenProject OAuth Application secret oauth_client_form_component: - client_id: Client ID + client_id: Wiki OAuth Client ID + client_secret: Wiki OAuth Client secret + redirect_uri: Redirect URI + redirect_uri_caption: Copy this value into the Redirect URI field of your XWiki OIDC client registration. health_status: show: actions: @@ -94,13 +73,19 @@ sk: no_health_report: No report available no_health_report_description: Run the checks now for a full health status report for this wiki provider. title: Health Report + internal_provider_form: + checkbox_caption: Allow projects to use the internal OpenProject wiki along with external Wiki providers + checkbox_label: Enable the internal OpenProject wiki + internal_wiki_provider: + show: + description: Choose to enable or disable the internal OpenProject wiki oauth_application_info_component: confirm_replace_oauth_application: This action will reset the current OAuth credentials. After confirming you will have to reenter the credentials in your XWiki instance and all users will have to reauthorize. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_application: Replace OpenProject OAuth application oauth_client_info_component: confirm_replace_oauth_client: This action will reset the current XWiki OAuth credentials. All users will need to reauthorize against XWiki. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_client: Replace XWiki OAuth application side_panel: health_status_component: @@ -118,25 +103,81 @@ sk: index_description: Add an external wiki service to link work packages to existing wiki pages or create new ones directly from OpenProject. label_add_new: Add new wiki provider label_edit: Edit XWiki provider - label_new_xwiki_instance: New XWiki provider + label_new_provider: New XWiki provider label_wiki_platform: Wiki provider - name_caption: Give your storage a name so that users can differentiate between multiple wiki platforms. + name_caption: Give your wiki provider a name so that users can differentiate between multiple wiki platforms. name_placeholder: XWiki knowledge base new_provider_html: Read our documentation on [setting up an XWiki integration](docs_url) for more information. oauth: openproject_oauth: OpenProject OAuth sections: - general_information: Basic details + general_information: General information oauth_configuration: OAuth configuration - url_caption: Please add the host address of your wiki platform including the https://. It should not be longer than 255 characters. - xwiki_instance: XWiki Instance + url_caption: The host address of your wiki platform including the https://. It should not be longer than 255 characters. xwiki: oauth: - openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. Copy the credentials below into your XWiki instance. - provider_oauth: XWiki OAuth - provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. A client ID is automatically generated to identify OpenProject to XWiki — no manual configuration is needed on the XWiki side. + openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. + provider_oauth: Wiki OAuth + provider_oauth_configuration: Copy these values to the [XWiki OIDC Connection client](xwiki_oidc_link). + provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth. xwiki_oauth: XWiki OAuth xwiki_oauth_description: Allow OpenProject to access XWiki data using an OAuth. - macro: - page_not_found: Linked wiki page no longer available + buttons: + connect_account: Connect %{provider} account + done_continue: Done, continue + open_wiki: Open wiki + save_and_continue: Save and continue + wiki_page: Wiki page + create_new_wiki_page_dialog: + page_title: Title + parent_help_text: Select a parent for this new wiki page. + title: Create new wiki page + delete_relation_page_link_confirmation_dialog: + heading: Delete related wiki page link? + title: Delete related wiki page link + health_checks: + authentication: + existing_token: User token + header: Authentication + user_bound_request: User-based request authentication + base_configuration: + header: Configuration + provider_configured: Configuration complete + errors: + not_configured: The connection could not be validated. Please finish configuration first. + xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. + xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. + xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. + xwiki_oauth_unauthorized: The user token was not recognized by XWiki. + instructions: + xwiki: + integration: XWiki Administration + oauth_application_details_html: The client secret value will not be accessible again after you close this window. Please copy these values into the [XWiki OpenProject Integration settings](xwiki_admin_link). + link_existing_wiki_page_dialog: + title: Add existing wiki page + link_existing_wiki_page_form: + no_results: No wiki pages found + placeholder: Search for a wiki page + oauth_login_component: + connect_button: Connect %{provider} account + description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. + heading: Not connected to %{provider} + page_link_component: + remove: Remove page link + page_links: + errors: + page_access_forbidden: You do not have permission to access this wiki page + page_not_found: Linked wiki page no longer available + unexpected: An unexpected error occurred + provider_types: + xwiki: + name: XWiki + relation_page_links_component: + empty_heading: No related pages + empty_text: Manually add links to other related wiki pages. + link_existing: Existing wiki page + link_new: New wiki page + work_package_wikis_tab_component: + inline_page_links: Inline page links + referencing_pages: Referenced in diff --git a/modules/wikis/config/locales/crowdin/sl.yml b/modules/wikis/config/locales/crowdin/sl.yml index 4f507b4443b..7fe7d06e408 100644 --- a/modules/wikis/config/locales/crowdin/sl.yml +++ b/modules/wikis/config/locales/crowdin/sl.yml @@ -3,15 +3,17 @@ sl: activerecord: attributes: wikis/page_link: + identifier: Identifier provider: Wiki Provider + wikis/provider: + name: Name + universal_identifier: Universal identifier wikis/xwiki_provider: authentication_method: Authentication method authentication_methods: oauth2_sso: Single-Sign-On through OpenID Connect Identity Provider two_way_oauth2: Two-way OAuth 2.0 authorization code flow - name: Name token_exchange_scope: XWiki Scope - universal_identifier: Universal identifier url: Instance URL wiki_audience: XWiki Audience errors: {} @@ -37,53 +39,30 @@ sl: two: XWiki providers few: XWiki providers other: XWiki providers + menus: + admin: + external_wiki_providers: Wiki providers + internal_wiki_provider: Internal wiki + wikis: Wikis permission_manage_wiki_page_links: Manage Wiki Page Links project_module_wiki_platforms: Wiki providers wikis: - buttons: - connect_account: Connect %{provider} account - done_continue: Done, continue - save_and_continue: Save and continue - wiki_page: Wiki page - health_checks: - authentication: - existing_token: User token - header: Authentication - user_bound_request: User-based request authentication - base_configuration: - header: Configuration - provider_configured: Configuration complete - errors: - not_configured: The connection could not be validated. Please finish configuration first. - xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. - xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. - xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. - xwiki_oauth_unauthorized: The user token was not recognized by XWiki. - work_package_wikis_tab_component: - inline_page_links: Inline page links - referencing_pages: Referenced in - page_link_component: - remove: Remove page link - relation_page_links_component: - empty_heading: No related pages - empty_text: Manually add links to other related wiki pages. - oauth_login_component: - heading: Not connected to %{provider} - description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. - connect_button: Connect %{provider} account admin: destroy_confirmation_dialog_component: - title: Delete wiki provider - heading: Permanently delete this wiki provider? description_html: The wiki provider %{wiki_provider} and all the related wiki page links will be deleted. In addition, every inline wiki page link will no longer be accessible. This action is irreversible. + heading: Permanently delete this wiki provider? + title: Delete wiki provider forms: general_info_form_component: - xwiki_instance_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. + provider_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. oauth_application_form_component: - application_id: Application ID - application_secret: Application secret + application_id: OpenProject OAuth Application ID + application_secret: OpenProject OAuth Application secret oauth_client_form_component: - client_id: Client ID + client_id: Wiki OAuth Client ID + client_secret: Wiki OAuth Client secret + redirect_uri: Redirect URI + redirect_uri_caption: Copy this value into the Redirect URI field of your XWiki OIDC client registration. health_status: show: actions: @@ -94,13 +73,19 @@ sl: no_health_report: No report available no_health_report_description: Run the checks now for a full health status report for this wiki provider. title: Health Report + internal_provider_form: + checkbox_caption: Allow projects to use the internal OpenProject wiki along with external Wiki providers + checkbox_label: Enable the internal OpenProject wiki + internal_wiki_provider: + show: + description: Choose to enable or disable the internal OpenProject wiki oauth_application_info_component: confirm_replace_oauth_application: This action will reset the current OAuth credentials. After confirming you will have to reenter the credentials in your XWiki instance and all users will have to reauthorize. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_application: Replace OpenProject OAuth application oauth_client_info_component: confirm_replace_oauth_client: This action will reset the current XWiki OAuth credentials. All users will need to reauthorize against XWiki. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_client: Replace XWiki OAuth application side_panel: health_status_component: @@ -118,25 +103,81 @@ sl: index_description: Add an external wiki service to link work packages to existing wiki pages or create new ones directly from OpenProject. label_add_new: Add new wiki provider label_edit: Edit XWiki provider - label_new_xwiki_instance: New XWiki provider + label_new_provider: New XWiki provider label_wiki_platform: Wiki provider - name_caption: Give your storage a name so that users can differentiate between multiple wiki platforms. + name_caption: Give your wiki provider a name so that users can differentiate between multiple wiki platforms. name_placeholder: XWiki knowledge base new_provider_html: Read our documentation on [setting up an XWiki integration](docs_url) for more information. oauth: openproject_oauth: OpenProject OAuth sections: - general_information: Basic details + general_information: General information oauth_configuration: OAuth configuration - url_caption: Please add the host address of your wiki platform including the https://. It should not be longer than 255 characters. - xwiki_instance: XWiki Instance + url_caption: The host address of your wiki platform including the https://. It should not be longer than 255 characters. xwiki: oauth: - openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. Copy the credentials below into your XWiki instance. - provider_oauth: XWiki OAuth - provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. A client ID is automatically generated to identify OpenProject to XWiki — no manual configuration is needed on the XWiki side. + openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. + provider_oauth: Wiki OAuth + provider_oauth_configuration: Copy these values to the [XWiki OIDC Connection client](xwiki_oidc_link). + provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth. xwiki_oauth: XWiki OAuth xwiki_oauth_description: Allow OpenProject to access XWiki data using an OAuth. - macro: - page_not_found: Linked wiki page no longer available + buttons: + connect_account: Connect %{provider} account + done_continue: Done, continue + open_wiki: Open wiki + save_and_continue: Save and continue + wiki_page: Wiki page + create_new_wiki_page_dialog: + page_title: Title + parent_help_text: Select a parent for this new wiki page. + title: Create new wiki page + delete_relation_page_link_confirmation_dialog: + heading: Delete related wiki page link? + title: Delete related wiki page link + health_checks: + authentication: + existing_token: User token + header: Authentication + user_bound_request: User-based request authentication + base_configuration: + header: Configuration + provider_configured: Configuration complete + errors: + not_configured: The connection could not be validated. Please finish configuration first. + xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. + xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. + xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. + xwiki_oauth_unauthorized: The user token was not recognized by XWiki. + instructions: + xwiki: + integration: XWiki Administration + oauth_application_details_html: The client secret value will not be accessible again after you close this window. Please copy these values into the [XWiki OpenProject Integration settings](xwiki_admin_link). + link_existing_wiki_page_dialog: + title: Add existing wiki page + link_existing_wiki_page_form: + no_results: No wiki pages found + placeholder: Search for a wiki page + oauth_login_component: + connect_button: Connect %{provider} account + description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. + heading: Not connected to %{provider} + page_link_component: + remove: Remove page link + page_links: + errors: + page_access_forbidden: You do not have permission to access this wiki page + page_not_found: Linked wiki page no longer available + unexpected: An unexpected error occurred + provider_types: + xwiki: + name: XWiki + relation_page_links_component: + empty_heading: No related pages + empty_text: Manually add links to other related wiki pages. + link_existing: Existing wiki page + link_new: New wiki page + work_package_wikis_tab_component: + inline_page_links: Inline page links + referencing_pages: Referenced in diff --git a/modules/wikis/config/locales/crowdin/sr.yml b/modules/wikis/config/locales/crowdin/sr.yml index eaee12dd42f..bc515265805 100644 --- a/modules/wikis/config/locales/crowdin/sr.yml +++ b/modules/wikis/config/locales/crowdin/sr.yml @@ -3,15 +3,17 @@ sr: activerecord: attributes: wikis/page_link: + identifier: Identifier provider: Wiki Provider + wikis/provider: + name: Name + universal_identifier: Universal identifier wikis/xwiki_provider: authentication_method: Authentication method authentication_methods: oauth2_sso: Single-Sign-On through OpenID Connect Identity Provider two_way_oauth2: Two-way OAuth 2.0 authorization code flow - name: Name token_exchange_scope: XWiki Scope - universal_identifier: Universal identifier url: Instance URL wiki_audience: XWiki Audience errors: {} @@ -33,53 +35,30 @@ sr: one: XWiki provider few: XWiki providers other: XWiki providers + menus: + admin: + external_wiki_providers: Wiki providers + internal_wiki_provider: Internal wiki + wikis: Wikis permission_manage_wiki_page_links: Manage Wiki Page Links project_module_wiki_platforms: Wiki providers wikis: - buttons: - connect_account: Connect %{provider} account - done_continue: Done, continue - save_and_continue: Save and continue - wiki_page: Wiki page - health_checks: - authentication: - existing_token: User token - header: Authentication - user_bound_request: User-based request authentication - base_configuration: - header: Configuration - provider_configured: Configuration complete - errors: - not_configured: The connection could not be validated. Please finish configuration first. - xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. - xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. - xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. - xwiki_oauth_unauthorized: The user token was not recognized by XWiki. - work_package_wikis_tab_component: - inline_page_links: Inline page links - referencing_pages: Referenced in - page_link_component: - remove: Remove page link - relation_page_links_component: - empty_heading: No related pages - empty_text: Manually add links to other related wiki pages. - oauth_login_component: - heading: Not connected to %{provider} - description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. - connect_button: Connect %{provider} account admin: destroy_confirmation_dialog_component: - title: Delete wiki provider - heading: Permanently delete this wiki provider? description_html: The wiki provider %{wiki_provider} and all the related wiki page links will be deleted. In addition, every inline wiki page link will no longer be accessible. This action is irreversible. + heading: Permanently delete this wiki provider? + title: Delete wiki provider forms: general_info_form_component: - xwiki_instance_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. + provider_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. oauth_application_form_component: - application_id: Application ID - application_secret: Application secret + application_id: OpenProject OAuth Application ID + application_secret: OpenProject OAuth Application secret oauth_client_form_component: - client_id: Client ID + client_id: Wiki OAuth Client ID + client_secret: Wiki OAuth Client secret + redirect_uri: Redirect URI + redirect_uri_caption: Copy this value into the Redirect URI field of your XWiki OIDC client registration. health_status: show: actions: @@ -90,13 +69,19 @@ sr: no_health_report: No report available no_health_report_description: Run the checks now for a full health status report for this wiki provider. title: Health Report + internal_provider_form: + checkbox_caption: Allow projects to use the internal OpenProject wiki along with external Wiki providers + checkbox_label: Enable the internal OpenProject wiki + internal_wiki_provider: + show: + description: Choose to enable or disable the internal OpenProject wiki oauth_application_info_component: confirm_replace_oauth_application: This action will reset the current OAuth credentials. After confirming you will have to reenter the credentials in your XWiki instance and all users will have to reauthorize. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_application: Replace OpenProject OAuth application oauth_client_info_component: confirm_replace_oauth_client: This action will reset the current XWiki OAuth credentials. All users will need to reauthorize against XWiki. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_client: Replace XWiki OAuth application side_panel: health_status_component: @@ -114,25 +99,81 @@ sr: index_description: Add an external wiki service to link work packages to existing wiki pages or create new ones directly from OpenProject. label_add_new: Add new wiki provider label_edit: Edit XWiki provider - label_new_xwiki_instance: New XWiki provider + label_new_provider: New XWiki provider label_wiki_platform: Wiki provider - name_caption: Give your storage a name so that users can differentiate between multiple wiki platforms. + name_caption: Give your wiki provider a name so that users can differentiate between multiple wiki platforms. name_placeholder: XWiki knowledge base new_provider_html: Read our documentation on [setting up an XWiki integration](docs_url) for more information. oauth: openproject_oauth: OpenProject OAuth sections: - general_information: Basic details + general_information: General information oauth_configuration: OAuth configuration - url_caption: Please add the host address of your wiki platform including the https://. It should not be longer than 255 characters. - xwiki_instance: XWiki Instance + url_caption: The host address of your wiki platform including the https://. It should not be longer than 255 characters. xwiki: oauth: - openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. Copy the credentials below into your XWiki instance. - provider_oauth: XWiki OAuth - provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. A client ID is automatically generated to identify OpenProject to XWiki — no manual configuration is needed on the XWiki side. + openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. + provider_oauth: Wiki OAuth + provider_oauth_configuration: Copy these values to the [XWiki OIDC Connection client](xwiki_oidc_link). + provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth. xwiki_oauth: XWiki OAuth xwiki_oauth_description: Allow OpenProject to access XWiki data using an OAuth. - macro: - page_not_found: Linked wiki page no longer available + buttons: + connect_account: Connect %{provider} account + done_continue: Done, continue + open_wiki: Open wiki + save_and_continue: Save and continue + wiki_page: Wiki page + create_new_wiki_page_dialog: + page_title: Title + parent_help_text: Select a parent for this new wiki page. + title: Create new wiki page + delete_relation_page_link_confirmation_dialog: + heading: Delete related wiki page link? + title: Delete related wiki page link + health_checks: + authentication: + existing_token: User token + header: Authentication + user_bound_request: User-based request authentication + base_configuration: + header: Configuration + provider_configured: Configuration complete + errors: + not_configured: The connection could not be validated. Please finish configuration first. + xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. + xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. + xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. + xwiki_oauth_unauthorized: The user token was not recognized by XWiki. + instructions: + xwiki: + integration: XWiki Administration + oauth_application_details_html: The client secret value will not be accessible again after you close this window. Please copy these values into the [XWiki OpenProject Integration settings](xwiki_admin_link). + link_existing_wiki_page_dialog: + title: Add existing wiki page + link_existing_wiki_page_form: + no_results: No wiki pages found + placeholder: Search for a wiki page + oauth_login_component: + connect_button: Connect %{provider} account + description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. + heading: Not connected to %{provider} + page_link_component: + remove: Remove page link + page_links: + errors: + page_access_forbidden: You do not have permission to access this wiki page + page_not_found: Linked wiki page no longer available + unexpected: An unexpected error occurred + provider_types: + xwiki: + name: XWiki + relation_page_links_component: + empty_heading: No related pages + empty_text: Manually add links to other related wiki pages. + link_existing: Existing wiki page + link_new: New wiki page + work_package_wikis_tab_component: + inline_page_links: Inline page links + referencing_pages: Referenced in diff --git a/modules/wikis/config/locales/crowdin/sv.yml b/modules/wikis/config/locales/crowdin/sv.yml index b6df0ea0efb..3a7a57526fd 100644 --- a/modules/wikis/config/locales/crowdin/sv.yml +++ b/modules/wikis/config/locales/crowdin/sv.yml @@ -3,15 +3,17 @@ sv: activerecord: attributes: wikis/page_link: + identifier: Identifier provider: Wiki Provider + wikis/provider: + name: Name + universal_identifier: Universal identifier wikis/xwiki_provider: authentication_method: Authentication method authentication_methods: oauth2_sso: Single-Sign-On through OpenID Connect Identity Provider two_way_oauth2: Two-way OAuth 2.0 authorization code flow - name: Name token_exchange_scope: XWiki Scope - universal_identifier: Universal identifier url: Instance URL wiki_audience: XWiki Audience errors: {} @@ -29,53 +31,30 @@ sv: wikis/xwiki_provider: one: XWiki provider other: XWiki providers + menus: + admin: + external_wiki_providers: Wiki providers + internal_wiki_provider: Internal wiki + wikis: Wikis permission_manage_wiki_page_links: Manage Wiki Page Links project_module_wiki_platforms: Wiki providers wikis: - buttons: - connect_account: Connect %{provider} account - done_continue: Done, continue - save_and_continue: Save and continue - wiki_page: Wiki page - health_checks: - authentication: - existing_token: User token - header: Authentication - user_bound_request: User-based request authentication - base_configuration: - header: Configuration - provider_configured: Configuration complete - errors: - not_configured: The connection could not be validated. Please finish configuration first. - xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. - xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. - xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. - xwiki_oauth_unauthorized: The user token was not recognized by XWiki. - work_package_wikis_tab_component: - inline_page_links: Inline page links - referencing_pages: Referenced in - page_link_component: - remove: Remove page link - relation_page_links_component: - empty_heading: No related pages - empty_text: Manually add links to other related wiki pages. - oauth_login_component: - heading: Not connected to %{provider} - description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. - connect_button: Connect %{provider} account admin: destroy_confirmation_dialog_component: - title: Delete wiki provider - heading: Permanently delete this wiki provider? description_html: The wiki provider %{wiki_provider} and all the related wiki page links will be deleted. In addition, every inline wiki page link will no longer be accessible. This action is irreversible. + heading: Permanently delete this wiki provider? + title: Delete wiki provider forms: general_info_form_component: - xwiki_instance_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. + provider_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. oauth_application_form_component: - application_id: Application ID - application_secret: Application secret + application_id: OpenProject OAuth Application ID + application_secret: OpenProject OAuth Application secret oauth_client_form_component: - client_id: Client ID + client_id: Wiki OAuth Client ID + client_secret: Wiki OAuth Client secret + redirect_uri: Redirect URI + redirect_uri_caption: Copy this value into the Redirect URI field of your XWiki OIDC client registration. health_status: show: actions: @@ -86,13 +65,19 @@ sv: no_health_report: No report available no_health_report_description: Run the checks now for a full health status report for this wiki provider. title: Health Report + internal_provider_form: + checkbox_caption: Allow projects to use the internal OpenProject wiki along with external Wiki providers + checkbox_label: Enable the internal OpenProject wiki + internal_wiki_provider: + show: + description: Choose to enable or disable the internal OpenProject wiki oauth_application_info_component: confirm_replace_oauth_application: This action will reset the current OAuth credentials. After confirming you will have to reenter the credentials in your XWiki instance and all users will have to reauthorize. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_application: Replace OpenProject OAuth application oauth_client_info_component: confirm_replace_oauth_client: This action will reset the current XWiki OAuth credentials. All users will need to reauthorize against XWiki. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_client: Replace XWiki OAuth application side_panel: health_status_component: @@ -110,25 +95,81 @@ sv: index_description: Add an external wiki service to link work packages to existing wiki pages or create new ones directly from OpenProject. label_add_new: Add new wiki provider label_edit: Edit XWiki provider - label_new_xwiki_instance: New XWiki provider + label_new_provider: New XWiki provider label_wiki_platform: Wiki provider - name_caption: Give your storage a name so that users can differentiate between multiple wiki platforms. + name_caption: Give your wiki provider a name so that users can differentiate between multiple wiki platforms. name_placeholder: XWiki knowledge base new_provider_html: Read our documentation on [setting up an XWiki integration](docs_url) for more information. oauth: openproject_oauth: OpenProject OAuth sections: - general_information: Basic details + general_information: General information oauth_configuration: OAuth configuration - url_caption: Please add the host address of your wiki platform including the https://. It should not be longer than 255 characters. - xwiki_instance: XWiki Instance + url_caption: The host address of your wiki platform including the https://. It should not be longer than 255 characters. xwiki: oauth: - openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. Copy the credentials below into your XWiki instance. - provider_oauth: XWiki OAuth - provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. A client ID is automatically generated to identify OpenProject to XWiki — no manual configuration is needed on the XWiki side. + openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. + provider_oauth: Wiki OAuth + provider_oauth_configuration: Copy these values to the [XWiki OIDC Connection client](xwiki_oidc_link). + provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth. xwiki_oauth: XWiki OAuth xwiki_oauth_description: Allow OpenProject to access XWiki data using an OAuth. - macro: - page_not_found: Linked wiki page no longer available + buttons: + connect_account: Connect %{provider} account + done_continue: Done, continue + open_wiki: Open wiki + save_and_continue: Save and continue + wiki_page: Wiki page + create_new_wiki_page_dialog: + page_title: Title + parent_help_text: Select a parent for this new wiki page. + title: Create new wiki page + delete_relation_page_link_confirmation_dialog: + heading: Delete related wiki page link? + title: Delete related wiki page link + health_checks: + authentication: + existing_token: User token + header: Authentication + user_bound_request: User-based request authentication + base_configuration: + header: Configuration + provider_configured: Configuration complete + errors: + not_configured: The connection could not be validated. Please finish configuration first. + xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. + xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. + xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. + xwiki_oauth_unauthorized: The user token was not recognized by XWiki. + instructions: + xwiki: + integration: XWiki Administration + oauth_application_details_html: The client secret value will not be accessible again after you close this window. Please copy these values into the [XWiki OpenProject Integration settings](xwiki_admin_link). + link_existing_wiki_page_dialog: + title: Add existing wiki page + link_existing_wiki_page_form: + no_results: No wiki pages found + placeholder: Search for a wiki page + oauth_login_component: + connect_button: Connect %{provider} account + description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. + heading: Not connected to %{provider} + page_link_component: + remove: Remove page link + page_links: + errors: + page_access_forbidden: You do not have permission to access this wiki page + page_not_found: Linked wiki page no longer available + unexpected: An unexpected error occurred + provider_types: + xwiki: + name: XWiki + relation_page_links_component: + empty_heading: No related pages + empty_text: Manually add links to other related wiki pages. + link_existing: Existing wiki page + link_new: New wiki page + work_package_wikis_tab_component: + inline_page_links: Inline page links + referencing_pages: Referenced in diff --git a/modules/wikis/config/locales/crowdin/th.yml b/modules/wikis/config/locales/crowdin/th.yml index e3d47134811..988f9ca749e 100644 --- a/modules/wikis/config/locales/crowdin/th.yml +++ b/modules/wikis/config/locales/crowdin/th.yml @@ -3,15 +3,17 @@ th: activerecord: attributes: wikis/page_link: + identifier: Identifier provider: Wiki Provider + wikis/provider: + name: Name + universal_identifier: Universal identifier wikis/xwiki_provider: authentication_method: Authentication method authentication_methods: oauth2_sso: Single-Sign-On through OpenID Connect Identity Provider two_way_oauth2: Two-way OAuth 2.0 authorization code flow - name: Name token_exchange_scope: XWiki Scope - universal_identifier: Universal identifier url: Instance URL wiki_audience: XWiki Audience errors: {} @@ -25,53 +27,30 @@ th: other: Relation page links wikis/xwiki_provider: other: XWiki providers + menus: + admin: + external_wiki_providers: Wiki providers + internal_wiki_provider: Internal wiki + wikis: Wikis permission_manage_wiki_page_links: Manage Wiki Page Links project_module_wiki_platforms: Wiki providers wikis: - buttons: - connect_account: Connect %{provider} account - done_continue: Done, continue - save_and_continue: Save and continue - wiki_page: Wiki page - health_checks: - authentication: - existing_token: User token - header: Authentication - user_bound_request: User-based request authentication - base_configuration: - header: Configuration - provider_configured: Configuration complete - errors: - not_configured: The connection could not be validated. Please finish configuration first. - xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. - xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. - xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. - xwiki_oauth_unauthorized: The user token was not recognized by XWiki. - work_package_wikis_tab_component: - inline_page_links: Inline page links - referencing_pages: Referenced in - page_link_component: - remove: Remove page link - relation_page_links_component: - empty_heading: No related pages - empty_text: Manually add links to other related wiki pages. - oauth_login_component: - heading: Not connected to %{provider} - description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. - connect_button: Connect %{provider} account admin: destroy_confirmation_dialog_component: - title: Delete wiki provider - heading: Permanently delete this wiki provider? description_html: The wiki provider %{wiki_provider} and all the related wiki page links will be deleted. In addition, every inline wiki page link will no longer be accessible. This action is irreversible. + heading: Permanently delete this wiki provider? + title: Delete wiki provider forms: general_info_form_component: - xwiki_instance_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. + provider_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. oauth_application_form_component: - application_id: Application ID - application_secret: Application secret + application_id: OpenProject OAuth Application ID + application_secret: OpenProject OAuth Application secret oauth_client_form_component: - client_id: Client ID + client_id: Wiki OAuth Client ID + client_secret: Wiki OAuth Client secret + redirect_uri: Redirect URI + redirect_uri_caption: Copy this value into the Redirect URI field of your XWiki OIDC client registration. health_status: show: actions: @@ -82,13 +61,19 @@ th: no_health_report: No report available no_health_report_description: Run the checks now for a full health status report for this wiki provider. title: Health Report + internal_provider_form: + checkbox_caption: Allow projects to use the internal OpenProject wiki along with external Wiki providers + checkbox_label: Enable the internal OpenProject wiki + internal_wiki_provider: + show: + description: Choose to enable or disable the internal OpenProject wiki oauth_application_info_component: confirm_replace_oauth_application: This action will reset the current OAuth credentials. After confirming you will have to reenter the credentials in your XWiki instance and all users will have to reauthorize. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_application: Replace OpenProject OAuth application oauth_client_info_component: confirm_replace_oauth_client: This action will reset the current XWiki OAuth credentials. All users will need to reauthorize against XWiki. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_client: Replace XWiki OAuth application side_panel: health_status_component: @@ -106,25 +91,81 @@ th: index_description: Add an external wiki service to link work packages to existing wiki pages or create new ones directly from OpenProject. label_add_new: Add new wiki provider label_edit: Edit XWiki provider - label_new_xwiki_instance: New XWiki provider + label_new_provider: New XWiki provider label_wiki_platform: Wiki provider - name_caption: Give your storage a name so that users can differentiate between multiple wiki platforms. + name_caption: Give your wiki provider a name so that users can differentiate between multiple wiki platforms. name_placeholder: XWiki knowledge base new_provider_html: Read our documentation on [setting up an XWiki integration](docs_url) for more information. oauth: openproject_oauth: OpenProject OAuth sections: - general_information: Basic details + general_information: General information oauth_configuration: OAuth configuration - url_caption: Please add the host address of your wiki platform including the https://. It should not be longer than 255 characters. - xwiki_instance: XWiki Instance + url_caption: The host address of your wiki platform including the https://. It should not be longer than 255 characters. xwiki: oauth: - openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. Copy the credentials below into your XWiki instance. - provider_oauth: XWiki OAuth - provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. A client ID is automatically generated to identify OpenProject to XWiki — no manual configuration is needed on the XWiki side. + openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. + provider_oauth: Wiki OAuth + provider_oauth_configuration: Copy these values to the [XWiki OIDC Connection client](xwiki_oidc_link). + provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth. xwiki_oauth: XWiki OAuth xwiki_oauth_description: Allow OpenProject to access XWiki data using an OAuth. - macro: - page_not_found: Linked wiki page no longer available + buttons: + connect_account: Connect %{provider} account + done_continue: Done, continue + open_wiki: Open wiki + save_and_continue: Save and continue + wiki_page: Wiki page + create_new_wiki_page_dialog: + page_title: Title + parent_help_text: Select a parent for this new wiki page. + title: Create new wiki page + delete_relation_page_link_confirmation_dialog: + heading: Delete related wiki page link? + title: Delete related wiki page link + health_checks: + authentication: + existing_token: User token + header: Authentication + user_bound_request: User-based request authentication + base_configuration: + header: Configuration + provider_configured: Configuration complete + errors: + not_configured: The connection could not be validated. Please finish configuration first. + xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. + xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. + xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. + xwiki_oauth_unauthorized: The user token was not recognized by XWiki. + instructions: + xwiki: + integration: XWiki Administration + oauth_application_details_html: The client secret value will not be accessible again after you close this window. Please copy these values into the [XWiki OpenProject Integration settings](xwiki_admin_link). + link_existing_wiki_page_dialog: + title: Add existing wiki page + link_existing_wiki_page_form: + no_results: No wiki pages found + placeholder: Search for a wiki page + oauth_login_component: + connect_button: Connect %{provider} account + description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. + heading: Not connected to %{provider} + page_link_component: + remove: Remove page link + page_links: + errors: + page_access_forbidden: You do not have permission to access this wiki page + page_not_found: Linked wiki page no longer available + unexpected: An unexpected error occurred + provider_types: + xwiki: + name: XWiki + relation_page_links_component: + empty_heading: No related pages + empty_text: Manually add links to other related wiki pages. + link_existing: Existing wiki page + link_new: New wiki page + work_package_wikis_tab_component: + inline_page_links: Inline page links + referencing_pages: Referenced in diff --git a/modules/wikis/config/locales/crowdin/tr.yml b/modules/wikis/config/locales/crowdin/tr.yml index 66da24da237..13e9f375f00 100644 --- a/modules/wikis/config/locales/crowdin/tr.yml +++ b/modules/wikis/config/locales/crowdin/tr.yml @@ -3,15 +3,17 @@ tr: activerecord: attributes: wikis/page_link: + identifier: Identifier provider: Wiki Provider + wikis/provider: + name: Name + universal_identifier: Universal identifier wikis/xwiki_provider: authentication_method: Authentication method authentication_methods: oauth2_sso: Single-Sign-On through OpenID Connect Identity Provider two_way_oauth2: Two-way OAuth 2.0 authorization code flow - name: Name token_exchange_scope: XWiki Scope - universal_identifier: Universal identifier url: Instance URL wiki_audience: XWiki Audience errors: {} @@ -29,53 +31,30 @@ tr: wikis/xwiki_provider: one: XWiki provider other: XWiki providers + menus: + admin: + external_wiki_providers: Wiki providers + internal_wiki_provider: Internal wiki + wikis: Wikis permission_manage_wiki_page_links: Manage Wiki Page Links project_module_wiki_platforms: Wiki providers wikis: - buttons: - connect_account: Connect %{provider} account - done_continue: Done, continue - save_and_continue: Save and continue - wiki_page: Wiki page - health_checks: - authentication: - existing_token: User token - header: Authentication - user_bound_request: User-based request authentication - base_configuration: - header: Configuration - provider_configured: Configuration complete - errors: - not_configured: The connection could not be validated. Please finish configuration first. - xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. - xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. - xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. - xwiki_oauth_unauthorized: The user token was not recognized by XWiki. - work_package_wikis_tab_component: - inline_page_links: Inline page links - referencing_pages: Referenced in - page_link_component: - remove: Remove page link - relation_page_links_component: - empty_heading: No related pages - empty_text: Manually add links to other related wiki pages. - oauth_login_component: - heading: Not connected to %{provider} - description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. - connect_button: Connect %{provider} account admin: destroy_confirmation_dialog_component: - title: Delete wiki provider - heading: Permanently delete this wiki provider? description_html: The wiki provider %{wiki_provider} and all the related wiki page links will be deleted. In addition, every inline wiki page link will no longer be accessible. This action is irreversible. + heading: Permanently delete this wiki provider? + title: Delete wiki provider forms: general_info_form_component: - xwiki_instance_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. + provider_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. oauth_application_form_component: - application_id: Application ID - application_secret: Application secret + application_id: OpenProject OAuth Application ID + application_secret: OpenProject OAuth Application secret oauth_client_form_component: - client_id: Client ID + client_id: Wiki OAuth Client ID + client_secret: Wiki OAuth Client secret + redirect_uri: Redirect URI + redirect_uri_caption: Copy this value into the Redirect URI field of your XWiki OIDC client registration. health_status: show: actions: @@ -86,13 +65,19 @@ tr: no_health_report: No report available no_health_report_description: Run the checks now for a full health status report for this wiki provider. title: Health Report + internal_provider_form: + checkbox_caption: Allow projects to use the internal OpenProject wiki along with external Wiki providers + checkbox_label: Enable the internal OpenProject wiki + internal_wiki_provider: + show: + description: Choose to enable or disable the internal OpenProject wiki oauth_application_info_component: confirm_replace_oauth_application: This action will reset the current OAuth credentials. After confirming you will have to reenter the credentials in your XWiki instance and all users will have to reauthorize. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_application: Replace OpenProject OAuth application oauth_client_info_component: confirm_replace_oauth_client: This action will reset the current XWiki OAuth credentials. All users will need to reauthorize against XWiki. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_client: Replace XWiki OAuth application side_panel: health_status_component: @@ -110,25 +95,81 @@ tr: index_description: Add an external wiki service to link work packages to existing wiki pages or create new ones directly from OpenProject. label_add_new: Add new wiki provider label_edit: Edit XWiki provider - label_new_xwiki_instance: New XWiki provider + label_new_provider: New XWiki provider label_wiki_platform: Wiki provider - name_caption: Give your storage a name so that users can differentiate between multiple wiki platforms. + name_caption: Give your wiki provider a name so that users can differentiate between multiple wiki platforms. name_placeholder: XWiki knowledge base new_provider_html: Read our documentation on [setting up an XWiki integration](docs_url) for more information. oauth: openproject_oauth: OpenProject OAuth sections: - general_information: Basic details + general_information: General information oauth_configuration: OAuth configuration - url_caption: Please add the host address of your wiki platform including the https://. It should not be longer than 255 characters. - xwiki_instance: XWiki Instance + url_caption: The host address of your wiki platform including the https://. It should not be longer than 255 characters. xwiki: oauth: - openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. Copy the credentials below into your XWiki instance. - provider_oauth: XWiki OAuth - provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. A client ID is automatically generated to identify OpenProject to XWiki — no manual configuration is needed on the XWiki side. + openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. + provider_oauth: Wiki OAuth + provider_oauth_configuration: Copy these values to the [XWiki OIDC Connection client](xwiki_oidc_link). + provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth. xwiki_oauth: XWiki OAuth xwiki_oauth_description: Allow OpenProject to access XWiki data using an OAuth. - macro: - page_not_found: Linked wiki page no longer available + buttons: + connect_account: Connect %{provider} account + done_continue: Done, continue + open_wiki: Open wiki + save_and_continue: Save and continue + wiki_page: Wiki page + create_new_wiki_page_dialog: + page_title: Title + parent_help_text: Select a parent for this new wiki page. + title: Create new wiki page + delete_relation_page_link_confirmation_dialog: + heading: Delete related wiki page link? + title: Delete related wiki page link + health_checks: + authentication: + existing_token: User token + header: Authentication + user_bound_request: User-based request authentication + base_configuration: + header: Configuration + provider_configured: Configuration complete + errors: + not_configured: The connection could not be validated. Please finish configuration first. + xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. + xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. + xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. + xwiki_oauth_unauthorized: The user token was not recognized by XWiki. + instructions: + xwiki: + integration: XWiki Administration + oauth_application_details_html: The client secret value will not be accessible again after you close this window. Please copy these values into the [XWiki OpenProject Integration settings](xwiki_admin_link). + link_existing_wiki_page_dialog: + title: Add existing wiki page + link_existing_wiki_page_form: + no_results: No wiki pages found + placeholder: Search for a wiki page + oauth_login_component: + connect_button: Connect %{provider} account + description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. + heading: Not connected to %{provider} + page_link_component: + remove: Remove page link + page_links: + errors: + page_access_forbidden: You do not have permission to access this wiki page + page_not_found: Linked wiki page no longer available + unexpected: An unexpected error occurred + provider_types: + xwiki: + name: XWiki + relation_page_links_component: + empty_heading: No related pages + empty_text: Manually add links to other related wiki pages. + link_existing: Existing wiki page + link_new: New wiki page + work_package_wikis_tab_component: + inline_page_links: Inline page links + referencing_pages: Referenced in diff --git a/modules/wikis/config/locales/crowdin/uk.yml b/modules/wikis/config/locales/crowdin/uk.yml index f6dbe995c26..b5ff79efbb6 100644 --- a/modules/wikis/config/locales/crowdin/uk.yml +++ b/modules/wikis/config/locales/crowdin/uk.yml @@ -3,15 +3,17 @@ uk: activerecord: attributes: wikis/page_link: + identifier: Ідентифікатор provider: Постачальник Wiki + wikis/provider: + name: Назва + universal_identifier: Універсальний ідентифікатор wikis/xwiki_provider: authentication_method: Метод автентифікації authentication_methods: oauth2_sso: Єдиний вхід через постачальника ідентифікаційних даних OpenID Connect two_way_oauth2: Потік коду двосторонньої авторизації OAuth 2.0 - name: Назва token_exchange_scope: Область XWiki - universal_identifier: Універсальний ідентифікатор url: URL-адреса екземпляра wiki_audience: Аудиторія XWiki errors: {} @@ -37,53 +39,30 @@ uk: few: Постачальники XWiki many: Постачальники XWiki other: Постачальники XWiki + menus: + admin: + external_wiki_providers: Wiki providers + internal_wiki_provider: Internal wiki + wikis: Wikis permission_manage_wiki_page_links: Керувати посиланнями на сторінки Wiki project_module_wiki_platforms: Постачальники Wiki wikis: - buttons: - connect_account: Підключити обліковий запис %{provider} - done_continue: Виконано, продовжити - save_and_continue: Зберегти та продовжити - wiki_page: Сторінка Wiki - health_checks: - authentication: - existing_token: Маркер користувача - header: Автентифікація - user_bound_request: Автентифікація запиту за користувачем - base_configuration: - header: Конфігурація - provider_configured: Конфігурацію налаштовано - errors: - not_configured: Не вдалося перевірити підключення. Спочатку налаштуйте конфігурацію. - xwiki_oauth_connection_error: OpenProject не вдалося під’єднатися до налаштованого екземпляра XWiki. - xwiki_oauth_request_error: Під час спроби зв’язатися з екземпляром XWiki сталася несподівана помилка. - xwiki_oauth_token_missing: OpenProject не може перевірити з’єднання на рівні користувача з XWiki, оскільки користувач досі не підключив свій обліковий запис XWiki. - xwiki_oauth_unauthorized: Платформа XWiki не розпізнала маркер користувача. - work_package_wikis_tab_component: - inline_page_links: Вставлені посилання на сторінку - referencing_pages: Додано посилання в - page_link_component: - remove: Видалити посилання на сторінку - relation_page_links_component: - empty_heading: Немає пов’язаних сторінок - empty_text: Додайте посилання на інші пов’язані сторінки Wiki вручну. - oauth_login_component: - heading: Немає підключення до сервісу %{provider} - description: Увійдіть у сервіс %{provider}, щоб переглядати пов’язані сторінки Wiki й керувати ними із цього екземпляра OpenProject. - connect_button: Підключити обліковий запис %{provider} admin: destroy_confirmation_dialog_component: - title: Видалити постачальника Wiki - heading: Видалити цього постачальника Wiki остаточно? description_html: Постачальника Wiki %{wiki_provider} і всі посилання на пов’язані сторінки Wiki буде видалено. Крім того, кожне вставлене посилання на сторінку Wiki більше не працюватиме. Ця дія є незворотною. + heading: Видалити цього постачальника Wiki остаточно? + title: Видалити постачальника Wiki forms: general_info_form_component: - xwiki_instance_description: Переконайтеся, що ви маєте права адміністратора у своєму екземплярі XWiki, перш ніж виконувати налаштування. + provider_description: Переконайтеся, що ви маєте права адміністратора у своєму екземплярі XWiki, перш ніж виконувати налаштування. oauth_application_form_component: - application_id: Ідентифікатор застосунку - application_secret: Секрет застосунку + application_id: Ідентифікатор застосунку OpenProject OAuth + application_secret: Секрет застосунку OpenProject OAuth oauth_client_form_component: - client_id: Ідентифікатор клієнта + client_id: Ідентифікатор клієнта Wiki OAuth + client_secret: Секрет клієнта Wiki OAuth + redirect_uri: URI переспрямування + redirect_uri_caption: Скопіюйте це значення в поле Redirect URI (URI переспрямування) під час реєстрації клієнта XWiki OIDC. health_status: show: actions: @@ -94,13 +73,19 @@ uk: no_health_report: Немає доступних звітів no_health_report_description: Запустіть перевірки, щоб отримати комплексний звіт про стан справності цього постачальника Wiki. title: Звіт про справність + internal_provider_form: + checkbox_caption: Allow projects to use the internal OpenProject wiki along with external Wiki providers + checkbox_label: Enable the internal OpenProject wiki + internal_wiki_provider: + show: + description: Choose to enable or disable the internal OpenProject wiki oauth_application_info_component: confirm_replace_oauth_application: Ця дія призведе до скидання поточних облікових даних OAuth. Коли ви підтвердите дію, вам потрібно буде повторно ввести облікові дані у своєму екземплярі XWiki. У такому разі всім користувачам знадобиться знову пройти авторизацію. Продовжити? - label_pending: В обробці + label_oauth_client_id: Ідентифікатор клієнта OAuth replace_oauth_application: Замінити застосунок OpenProject OAuth oauth_client_info_component: confirm_replace_oauth_client: Ця дія призведе до скидання поточних облікових даних XWiki OAuth. Усім користувачам знадобиться знову пройти авторизацію в XWiki. Продовжити? - label_pending: В обробці + label_oauth_client_id: Ідентифікатор клієнта OAuth replace_oauth_client: Замінити застосунок XWiki OAuth side_panel: health_status_component: @@ -118,25 +103,81 @@ uk: index_description: Додайте зовнішній сервіс Wiki, щоб зв’язувати пакети робіт із наявними сторінками Wiki або створювати нові безпосередньо в OpenProject. label_add_new: Додати нового постачальника Wiki label_edit: Редагувати постачальника XWiki - label_new_xwiki_instance: Новий постачальник XWiki + label_new_provider: Новий постачальник XWiki label_wiki_platform: Постачальник Wiki - name_caption: Назвіть своє сховище, щоб користувачі могли відрізняти його від інших платформ Wiki. + name_caption: Назвіть свого постачальника Wiki, щоб користувачі могли відрізняти його від інших платформ Wiki. name_placeholder: База знань XWiki new_provider_html: Щоб дізнатися більше, перегляньте документацію про [налаштування інтеграції з XWiki](docs_url). oauth: openproject_oauth: OpenProject OAuth sections: - general_information: Основна інформація + general_information: Загальна інформація oauth_configuration: Конфігурація OAuth - url_caption: Додайте адресу хосту вашої платформи Wiki, не випускаючи https://. Її довжина не може перевищувати 255 символів. - xwiki_instance: Екземпляр XWiki + url_caption: Адреса хосту вашої платформи Wiki, включно з https://. Довжина не може перевищувати 255 символів. xwiki: oauth: - openproject_oauth_description: Надайте XWiki доступ до даних OpenProject із використанням застосунку OAuth. Скопіюйте наведені нижче облікові дані у свій екземпляр XWiki. - provider_oauth: OAuth для XWiki - provider_oauth_description: Надайте OpenProject доступ до даних XWiki з використанням OAuth. Ідентифікатор клієнта для розпізнавання OpenProject в XWiki генерується автоматично — на стороні XWiki не доведеться вибирати налаштування вручну. + openproject_oauth_description: Надайте XWiki доступ до даних OpenProject за допомогою застосунку OAuth. + provider_oauth: Wiki OAuth + provider_oauth_configuration: Скопіюйте ці значення в [клієнт підключення XWiki OIDC](xwiki_oidc_link). + provider_oauth_description: Надайте OpenProject доступ до даних XWiki за допомогою OAuth. openproject_oauth_description: Надайте XWiki доступ до даних OpenProject за допомогою OAuth. xwiki_oauth: OAuth для XWiki xwiki_oauth_description: Надайте OpenProject доступ до даних XWiki за допомогою OAuth. - macro: - page_not_found: Зв’язана сторінка Wiki більше не доступна + buttons: + connect_account: Підключити обліковий запис %{provider} + done_continue: Виконано, продовжити + open_wiki: Відкрити Wiki + save_and_continue: Зберегти та продовжити + wiki_page: Сторінка Wiki + create_new_wiki_page_dialog: + page_title: Title + parent_help_text: Select a parent for this new wiki page. + title: Create new wiki page + delete_relation_page_link_confirmation_dialog: + heading: Видалити посилання на пов’язану сторінку Wiki? + title: Видалити посилання на пов’язану сторінку Wiki + health_checks: + authentication: + existing_token: Маркер користувача + header: Автентифікація + user_bound_request: Автентифікація запиту за користувачем + base_configuration: + header: Конфігурація + provider_configured: Конфігурацію налаштовано + errors: + not_configured: Не вдалося перевірити підключення. Спочатку налаштуйте конфігурацію. + xwiki_oauth_connection_error: OpenProject не вдалося під’єднатися до налаштованого екземпляра XWiki. + xwiki_oauth_request_error: Під час спроби зв’язатися з екземпляром XWiki сталася несподівана помилка. + xwiki_oauth_token_missing: OpenProject не може перевірити з’єднання на рівні користувача з XWiki, оскільки користувач досі не підключив свій обліковий запис XWiki. + xwiki_oauth_unauthorized: Платформа XWiki не розпізнала маркер користувача. + instructions: + xwiki: + integration: Адміністрування XWiki + oauth_application_details_html: Секретний ключ клієнта знову стане недоступним, коли ви закриєте це вікно. Скопіюйте ці значення в [налаштування інтеграції XWiki з OpenProject](xwiki_admin_link). + link_existing_wiki_page_dialog: + title: Додати наявну сторінку Wiki + link_existing_wiki_page_form: + no_results: Не знайдено сторінок Wiki + placeholder: Шукати сторінку Wiki + oauth_login_component: + connect_button: Підключити обліковий запис %{provider} + description: Увійдіть у сервіс %{provider}, щоб переглядати пов’язані сторінки Wiki й керувати ними із цього екземпляра OpenProject. + heading: Немає підключення до сервісу %{provider} + page_link_component: + remove: Видалити посилання на сторінку + page_links: + errors: + page_access_forbidden: У вас немає дозволу на доступ до цієї сторінки Wiki + page_not_found: Зв’язана сторінка Wiki більше не доступна + unexpected: Сталася неочікувана помилка + provider_types: + xwiki: + name: XWiki + relation_page_links_component: + empty_heading: Немає пов’язаних сторінок + empty_text: Додайте посилання на інші пов’язані сторінки Wiki вручну. + link_existing: Наявна сторінка Wiki + link_new: Нова сторінка Wiki + work_package_wikis_tab_component: + inline_page_links: Вставлені посилання на сторінку + referencing_pages: Додано посилання в diff --git a/modules/wikis/config/locales/crowdin/uz.yml b/modules/wikis/config/locales/crowdin/uz.yml index dc6fcbb4d43..388ced0b3a1 100644 --- a/modules/wikis/config/locales/crowdin/uz.yml +++ b/modules/wikis/config/locales/crowdin/uz.yml @@ -3,15 +3,17 @@ uz: activerecord: attributes: wikis/page_link: + identifier: Identifier provider: Wiki Provider + wikis/provider: + name: Name + universal_identifier: Universal identifier wikis/xwiki_provider: authentication_method: Authentication method authentication_methods: oauth2_sso: Single-Sign-On through OpenID Connect Identity Provider two_way_oauth2: Two-way OAuth 2.0 authorization code flow - name: Name token_exchange_scope: XWiki Scope - universal_identifier: Universal identifier url: Instance URL wiki_audience: XWiki Audience errors: {} @@ -29,53 +31,30 @@ uz: wikis/xwiki_provider: one: XWiki provider other: XWiki providers + menus: + admin: + external_wiki_providers: Wiki providers + internal_wiki_provider: Internal wiki + wikis: Wikis permission_manage_wiki_page_links: Manage Wiki Page Links project_module_wiki_platforms: Wiki providers wikis: - buttons: - connect_account: Connect %{provider} account - done_continue: Done, continue - save_and_continue: Save and continue - wiki_page: Wiki page - health_checks: - authentication: - existing_token: User token - header: Authentication - user_bound_request: User-based request authentication - base_configuration: - header: Configuration - provider_configured: Configuration complete - errors: - not_configured: The connection could not be validated. Please finish configuration first. - xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. - xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. - xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. - xwiki_oauth_unauthorized: The user token was not recognized by XWiki. - work_package_wikis_tab_component: - inline_page_links: Inline page links - referencing_pages: Referenced in - page_link_component: - remove: Remove page link - relation_page_links_component: - empty_heading: No related pages - empty_text: Manually add links to other related wiki pages. - oauth_login_component: - heading: Not connected to %{provider} - description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. - connect_button: Connect %{provider} account admin: destroy_confirmation_dialog_component: - title: Delete wiki provider - heading: Permanently delete this wiki provider? description_html: The wiki provider %{wiki_provider} and all the related wiki page links will be deleted. In addition, every inline wiki page link will no longer be accessible. This action is irreversible. + heading: Permanently delete this wiki provider? + title: Delete wiki provider forms: general_info_form_component: - xwiki_instance_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. + provider_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. oauth_application_form_component: - application_id: Application ID - application_secret: Application secret + application_id: OpenProject OAuth Application ID + application_secret: OpenProject OAuth Application secret oauth_client_form_component: - client_id: Client ID + client_id: Wiki OAuth Client ID + client_secret: Wiki OAuth Client secret + redirect_uri: Redirect URI + redirect_uri_caption: Copy this value into the Redirect URI field of your XWiki OIDC client registration. health_status: show: actions: @@ -86,13 +65,19 @@ uz: no_health_report: No report available no_health_report_description: Run the checks now for a full health status report for this wiki provider. title: Health Report + internal_provider_form: + checkbox_caption: Allow projects to use the internal OpenProject wiki along with external Wiki providers + checkbox_label: Enable the internal OpenProject wiki + internal_wiki_provider: + show: + description: Choose to enable or disable the internal OpenProject wiki oauth_application_info_component: confirm_replace_oauth_application: This action will reset the current OAuth credentials. After confirming you will have to reenter the credentials in your XWiki instance and all users will have to reauthorize. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_application: Replace OpenProject OAuth application oauth_client_info_component: confirm_replace_oauth_client: This action will reset the current XWiki OAuth credentials. All users will need to reauthorize against XWiki. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_client: Replace XWiki OAuth application side_panel: health_status_component: @@ -110,25 +95,81 @@ uz: index_description: Add an external wiki service to link work packages to existing wiki pages or create new ones directly from OpenProject. label_add_new: Add new wiki provider label_edit: Edit XWiki provider - label_new_xwiki_instance: New XWiki provider + label_new_provider: New XWiki provider label_wiki_platform: Wiki provider - name_caption: Give your storage a name so that users can differentiate between multiple wiki platforms. + name_caption: Give your wiki provider a name so that users can differentiate between multiple wiki platforms. name_placeholder: XWiki knowledge base new_provider_html: Read our documentation on [setting up an XWiki integration](docs_url) for more information. oauth: openproject_oauth: OpenProject OAuth sections: - general_information: Basic details + general_information: General information oauth_configuration: OAuth configuration - url_caption: Please add the host address of your wiki platform including the https://. It should not be longer than 255 characters. - xwiki_instance: XWiki Instance + url_caption: The host address of your wiki platform including the https://. It should not be longer than 255 characters. xwiki: oauth: - openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. Copy the credentials below into your XWiki instance. - provider_oauth: XWiki OAuth - provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. A client ID is automatically generated to identify OpenProject to XWiki — no manual configuration is needed on the XWiki side. + openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. + provider_oauth: Wiki OAuth + provider_oauth_configuration: Copy these values to the [XWiki OIDC Connection client](xwiki_oidc_link). + provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth. xwiki_oauth: XWiki OAuth xwiki_oauth_description: Allow OpenProject to access XWiki data using an OAuth. - macro: - page_not_found: Linked wiki page no longer available + buttons: + connect_account: Connect %{provider} account + done_continue: Done, continue + open_wiki: Open wiki + save_and_continue: Save and continue + wiki_page: Wiki page + create_new_wiki_page_dialog: + page_title: Title + parent_help_text: Select a parent for this new wiki page. + title: Create new wiki page + delete_relation_page_link_confirmation_dialog: + heading: Delete related wiki page link? + title: Delete related wiki page link + health_checks: + authentication: + existing_token: User token + header: Authentication + user_bound_request: User-based request authentication + base_configuration: + header: Configuration + provider_configured: Configuration complete + errors: + not_configured: The connection could not be validated. Please finish configuration first. + xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. + xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. + xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. + xwiki_oauth_unauthorized: The user token was not recognized by XWiki. + instructions: + xwiki: + integration: XWiki Administration + oauth_application_details_html: The client secret value will not be accessible again after you close this window. Please copy these values into the [XWiki OpenProject Integration settings](xwiki_admin_link). + link_existing_wiki_page_dialog: + title: Add existing wiki page + link_existing_wiki_page_form: + no_results: No wiki pages found + placeholder: Search for a wiki page + oauth_login_component: + connect_button: Connect %{provider} account + description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. + heading: Not connected to %{provider} + page_link_component: + remove: Remove page link + page_links: + errors: + page_access_forbidden: You do not have permission to access this wiki page + page_not_found: Linked wiki page no longer available + unexpected: An unexpected error occurred + provider_types: + xwiki: + name: XWiki + relation_page_links_component: + empty_heading: No related pages + empty_text: Manually add links to other related wiki pages. + link_existing: Existing wiki page + link_new: New wiki page + work_package_wikis_tab_component: + inline_page_links: Inline page links + referencing_pages: Referenced in diff --git a/modules/wikis/config/locales/crowdin/vi.yml b/modules/wikis/config/locales/crowdin/vi.yml index a11d35ee5f8..a9d144c410a 100644 --- a/modules/wikis/config/locales/crowdin/vi.yml +++ b/modules/wikis/config/locales/crowdin/vi.yml @@ -3,15 +3,17 @@ vi: activerecord: attributes: wikis/page_link: + identifier: Identifier provider: Wiki Provider + wikis/provider: + name: Name + universal_identifier: Universal identifier wikis/xwiki_provider: authentication_method: Authentication method authentication_methods: oauth2_sso: Single-Sign-On through OpenID Connect Identity Provider two_way_oauth2: Two-way OAuth 2.0 authorization code flow - name: Name token_exchange_scope: XWiki Scope - universal_identifier: Universal identifier url: Instance URL wiki_audience: XWiki Audience errors: {} @@ -25,53 +27,30 @@ vi: other: Relation page links wikis/xwiki_provider: other: XWiki providers + menus: + admin: + external_wiki_providers: Wiki providers + internal_wiki_provider: Internal wiki + wikis: Wikis permission_manage_wiki_page_links: Manage Wiki Page Links project_module_wiki_platforms: Wiki providers wikis: - buttons: - connect_account: Connect %{provider} account - done_continue: Done, continue - save_and_continue: Save and continue - wiki_page: Wiki page - health_checks: - authentication: - existing_token: User token - header: Authentication - user_bound_request: User-based request authentication - base_configuration: - header: Cấu hình - provider_configured: Cấu hình complete - errors: - not_configured: The connection could not be validated. Please finish cấu hình first. - xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. - xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. - xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. - xwiki_oauth_unauthorized: The user token was not recognized by XWiki. - work_package_wikis_tab_component: - inline_page_links: Inline page links - referencing_pages: Referenced in - page_link_component: - remove: Remove page link - relation_page_links_component: - empty_heading: No related pages - empty_text: Manually add links to other related wiki pages. - oauth_login_component: - heading: Not connected to %{provider} - description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. - connect_button: Connect %{provider} account admin: destroy_confirmation_dialog_component: - title: Delete wiki provider - heading: Permanently delete this wiki provider? description_html: The wiki provider %{wiki_provider} and all the related wiki page links will be deleted. In addition, every inline wiki page link will no longer be accessible. This action is irreversible. + heading: Permanently delete this wiki provider? + title: Delete wiki provider forms: general_info_form_component: - xwiki_instance_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. + provider_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. oauth_application_form_component: - application_id: Application ID - application_secret: Application secret + application_id: OpenProject OAuth Application ID + application_secret: OpenProject OAuth Application secret oauth_client_form_component: - client_id: Client ID + client_id: Wiki OAuth Client ID + client_secret: Wiki OAuth Client secret + redirect_uri: Redirect URI + redirect_uri_caption: Copy this value into the Redirect URI field of your XWiki OIDC client registration. health_status: show: actions: @@ -82,13 +61,19 @@ vi: no_health_report: No report available no_health_report_description: Run the checks now for a full health status report for this wiki provider. title: Health Report + internal_provider_form: + checkbox_caption: Allow projects to use the internal OpenProject wiki along with external Wiki providers + checkbox_label: Enable the internal OpenProject wiki + internal_wiki_provider: + show: + description: Choose to enable or disable the internal OpenProject wiki oauth_application_info_component: confirm_replace_oauth_application: This action will reset the current OAuth credentials. After confirming you will have to reenter the credentials in your XWiki instance and all users will have to reauthorize. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_application: Replace OpenProject OAuth application oauth_client_info_component: confirm_replace_oauth_client: This action will reset the current XWiki OAuth credentials. All users will need to reauthorize against XWiki. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_client: Replace XWiki OAuth application side_panel: health_status_component: @@ -106,25 +91,81 @@ vi: index_description: Add an external wiki service to link gói công việc (work package)s to existing wiki pages or create new ones directly from OpenProject. label_add_new: Add new wiki provider label_edit: Edit XWiki provider - label_new_xwiki_instance: New XWiki provider + label_new_provider: New XWiki provider label_wiki_platform: Wiki provider - name_caption: Give your storage a name so that users can differentiate between multiple wiki platforms. + name_caption: Give your wiki provider a name so that users can differentiate between multiple wiki platforms. name_placeholder: XWiki knowledge base new_provider_html: Read our documentation on [setting up an XWiki integration](docs_url) for more information. oauth: openproject_oauth: OpenProject OAuth sections: - general_information: Basic details + general_information: General information oauth_configuration: OAuth cấu hình - url_caption: Please add the host address of your wiki platform including the https://. It should not be longer than 255 characters. - xwiki_instance: XWiki Instance + url_caption: The host address of your wiki platform including the https://. It should not be longer than 255 characters. xwiki: oauth: - openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. Copy the credentials below into your XWiki instance. - provider_oauth: XWiki OAuth - provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. A client ID is automatically generated to identify OpenProject to XWiki — no manual cấu hình is needed on the XWiki side. + openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. + provider_oauth: Wiki OAuth + provider_oauth_configuration: Copy these values to the [XWiki OIDC Connection client](xwiki_oidc_link). + provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth. xwiki_oauth: XWiki OAuth xwiki_oauth_description: Allow OpenProject to access XWiki data using an OAuth. - macro: - page_not_found: Linked wiki page no longer available + buttons: + connect_account: Connect %{provider} account + done_continue: Done, continue + open_wiki: Open wiki + save_and_continue: Save and continue + wiki_page: Wiki page + create_new_wiki_page_dialog: + page_title: Title + parent_help_text: Select a parent for this new wiki page. + title: Create new wiki page + delete_relation_page_link_confirmation_dialog: + heading: Delete related wiki page link? + title: Delete related wiki page link + health_checks: + authentication: + existing_token: User token + header: Authentication + user_bound_request: User-based request authentication + base_configuration: + header: Cấu hình + provider_configured: Cấu hình complete + errors: + not_configured: The connection could not be validated. Please finish cấu hình first. + xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. + xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. + xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. + xwiki_oauth_unauthorized: The user token was not recognized by XWiki. + instructions: + xwiki: + integration: XWiki Administration + oauth_application_details_html: The client secret value will not be accessible again after you close this window. Please copy these values into the [XWiki OpenProject Integration settings](xwiki_admin_link). + link_existing_wiki_page_dialog: + title: Add existing wiki page + link_existing_wiki_page_form: + no_results: No wiki pages found + placeholder: Search for a wiki page + oauth_login_component: + connect_button: Connect %{provider} account + description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. + heading: Not connected to %{provider} + page_link_component: + remove: Remove page link + page_links: + errors: + page_access_forbidden: You do not have permission to access this wiki page + page_not_found: Linked wiki page no longer available + unexpected: An unexpected error occurred + provider_types: + xwiki: + name: XWiki + relation_page_links_component: + empty_heading: No related pages + empty_text: Manually add links to other related wiki pages. + link_existing: Existing wiki page + link_new: New wiki page + work_package_wikis_tab_component: + inline_page_links: Inline page links + referencing_pages: Referenced in diff --git a/modules/wikis/config/locales/crowdin/zh-CN.yml b/modules/wikis/config/locales/crowdin/zh-CN.yml index 3ea6eb4f633..96f5b3537e8 100644 --- a/modules/wikis/config/locales/crowdin/zh-CN.yml +++ b/modules/wikis/config/locales/crowdin/zh-CN.yml @@ -3,15 +3,17 @@ zh-CN: activerecord: attributes: wikis/page_link: + identifier: 标识符 provider: Wiki 提供商 + wikis/provider: + name: 名称 + universal_identifier: 通用标识符 wikis/xwiki_provider: authentication_method: 身份验证方式 authentication_methods: oauth2_sso: 通过 OpenID Connect 身份提供商进行单点登录 two_way_oauth2: 双向 OAuth 2.0 授权代码流 - name: 名称 token_exchange_scope: XWiki 范围 - universal_identifier: 通用标识符 url: 实例 URL wiki_audience: XWiki 受众 errors: {} @@ -33,53 +35,30 @@ zh-CN: XWiki 提供商 Other XWiki 提供商 + menus: + admin: + external_wiki_providers: Wiki providers + internal_wiki_provider: Internal wiki + wikis: Wikis permission_manage_wiki_page_links: 管理 Wiki 页面链接 project_module_wiki_platforms: Wiki 提供商 wikis: - buttons: - connect_account: 连接 %{provider} 帐户 - done_continue: 完成, 继续 - save_and_continue: 保存并继续 - wiki_page: Wiki 页面 - health_checks: - authentication: - existing_token: 用户令牌 - header: 身份验证 - user_bound_request: 基于用户的请求身份验证 - base_configuration: - header: 配置 - provider_configured: 配置完成 - errors: - not_configured: 无法验证关联。请先完成配置。 - xwiki_oauth_connection_error: OpenProject 无法关联到已配置的 XWiki 实例。 - xwiki_oauth_request_error: 尝试与 XWiki 实例通信时发生意外错误。 - xwiki_oauth_token_missing: OpenProject 无法测试用户与 XWiki 的用户级通信,因为用户尚未关联他们的 XWiki 帐户。 - xwiki_oauth_unauthorized: XWiki 未识别用户令牌。 - work_package_wikis_tab_component: - inline_page_links: 内联页面链接 - referencing_pages: 引用于 - page_link_component: - remove: 删除页面链接 - relation_page_links_component: - empty_heading: 无相关页面 - empty_text: 手动添加链接到其他相关Wiki页面。 - oauth_login_component: - heading: 未连接至 %{provider} - description: 登录 %{provider} ,查看和管理此 OpenProject 实例的相关Wiki页面。 - connect_button: 连接 %{provider} 账户 admin: destroy_confirmation_dialog_component: - title: 删除 wiki 提供商 - heading: 是否永久删除此 wiki 提供商? description_html: Wiki 提供商 %{wiki_provider} 和所有相关的 wiki 页面链接将被删除。此外,每个内联 wiki 页面链接也将无法再访问。此操作无法撤消。 + heading: 是否永久删除此 wiki 提供商? + title: 删除 wiki 提供商 forms: general_info_form_component: - xwiki_instance_description: 在进行设置之前,请确保您在 XWiki 实例中具有管理权限。 + provider_description: 在进行设置之前,请确保您在 XWiki 实例中具有管理权限。 oauth_application_form_component: - application_id: 应用程序 ID - application_secret: 应用程序密钥 + application_id: OpenProject OAuth 应用程序 ID + application_secret: OpenProject OAuth 应用程序密钥 oauth_client_form_component: - client_id: 客户端 ID + client_id: Wiki OAuth 客户端 ID + client_secret: Wiki OAuth 客户端密钥 + redirect_uri: 重定向 URI + redirect_uri_caption: 将该值复制到 XWiki OIDC 客户端注册的重定向 URI 字段中。 health_status: show: actions: @@ -90,13 +69,19 @@ zh-CN: no_health_report: 无可用报告 no_health_report_description: 立即运行检查,以获取此 wiki 提供商的完整健康状态报告。 title: 健康报告 + internal_provider_form: + checkbox_caption: Allow projects to use the internal OpenProject wiki along with external Wiki providers + checkbox_label: Enable the internal OpenProject wiki + internal_wiki_provider: + show: + description: Choose to enable or disable the internal OpenProject wiki oauth_application_info_component: confirm_replace_oauth_application: 此操作将重置当前的 OAuth 凭据。确认后,您必须在 XWiki 实例中重新输入凭据,所有用户都必须重新授权。确定要继续吗? - label_pending: 待处理 + label_oauth_client_id: OAuth 客户端 ID replace_oauth_application: 替换 OpenProject OAuth 应用程序 oauth_client_info_component: confirm_replace_oauth_client: 此操作将重置当前的 XWiki OAuth 凭据。所有用户都需要针对 XWiki 进行重新授权。确定要继续吗? - label_pending: 待处理 + label_oauth_client_id: OAuth 客户端 ID replace_oauth_client: 替换 XWiki OAuth 应用程序 side_panel: health_status_component: @@ -114,25 +99,81 @@ zh-CN: index_description: 添加外部 Wiki 服务,以将工作包链接到现有 Wiki 页面,或直接从 OpenProject 创建新页面。 label_add_new: 添加新 Wiki 提供商 label_edit: 编辑 XWiki 提供商 - label_new_xwiki_instance: 新建 XWiki 提供商 + label_new_provider: 新建 XWiki 提供商 label_wiki_platform: Wiki 提供商 - name_caption: 为您的存储空间命名,以便用户可以区分多个 Wiki 平台。 + name_caption: Give your wiki provider a name so that users can differentiate between multiple wiki platforms. name_placeholder: XWiki 知识库 new_provider_html: 有关详情,请阅读我们关于[设置 XWiki 集成](docs_url)的文档。 oauth: openproject_oauth: OpenProject OAuth sections: - general_information: 基本信息 + general_information: 常规信息 oauth_configuration: OAuth 配置 - url_caption: 请添加您的 Wiki 平台的主机地址(包含 https://)。地址的长度不应超过 255 个字符。 - xwiki_instance: XWiki 实例 + url_caption: The host address of your wiki platform including the https://. It should not be longer than 255 characters. xwiki: oauth: - openproject_oauth_description: 允许 XWiki 使用 OAuth 应用程序访问 OpenProject 数据。请将以下凭据复制到您的 XWiki 实例。 - provider_oauth: XWiki OAuth - provider_oauth_description: 允许 OpenProject 使用 OAuth 访问 XWiki 数据。将自动生成一个客户端 ID,以向 XWiki 标识 OpenProject — 无需在 XWiki 端进行手动配置。 + openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. + provider_oauth: Wiki OAuth + provider_oauth_configuration: Copy these values to the [XWiki OIDC Connection client](xwiki_oidc_link). + provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. openproject_oauth_description: 允许 XWiki 使用 OAuth 访问 OpenProject 数据。 xwiki_oauth: XWiki OAuth xwiki_oauth_description: 允许 OpenProject 使用 OAuth 访问 XWiki 数据。 - macro: - page_not_found: 关联的 Wiki 页面不再可用 + buttons: + connect_account: 连接 %{provider} 帐户 + done_continue: 完成, 继续 + open_wiki: 打开 wiki + save_and_continue: 保存并继续 + wiki_page: Wiki 页面 + create_new_wiki_page_dialog: + page_title: Title + parent_help_text: Select a parent for this new wiki page. + title: Create new wiki page + delete_relation_page_link_confirmation_dialog: + heading: 是否删除相关 wiki 页面链接? + title: 删除相关 wiki 页面链接 + health_checks: + authentication: + existing_token: 用户令牌 + header: 身份验证 + user_bound_request: 基于用户的请求身份验证 + base_configuration: + header: 配置 + provider_configured: 配置完成 + errors: + not_configured: 无法验证关联。请先完成配置。 + xwiki_oauth_connection_error: OpenProject 无法关联到已配置的 XWiki 实例。 + xwiki_oauth_request_error: 尝试与 XWiki 实例通信时发生意外错误。 + xwiki_oauth_token_missing: OpenProject 无法测试用户与 XWiki 的用户级通信,因为用户尚未关联他们的 XWiki 帐户。 + xwiki_oauth_unauthorized: XWiki 未识别用户令牌。 + instructions: + xwiki: + integration: XWiki 管理 + oauth_application_details_html: 关闭此窗口后,将无法再次访问客户端密钥值。请将这些值复制到 [XWiki OpenProject 集成设置](xwiki_admin_link)中。 + link_existing_wiki_page_dialog: + title: 添加现有 wiki 页面 + link_existing_wiki_page_form: + no_results: No wiki pages found + placeholder: Search for a wiki page + oauth_login_component: + connect_button: 连接 %{provider} 账户 + description: 登录 %{provider} ,查看和管理此 OpenProject 实例的相关Wiki页面。 + heading: 未连接至 %{provider} + page_link_component: + remove: 删除页面链接 + page_links: + errors: + page_access_forbidden: 您无权访问此 wiki 页面 + page_not_found: 关联的 wiki 页面不再可用 + unexpected: 发生意外错误 + provider_types: + xwiki: + name: XWiki + relation_page_links_component: + empty_heading: 无相关页面 + empty_text: 手动添加链接到其他相关Wiki页面。 + link_existing: 现有 wiki 页面 + link_new: 新 wiki 页面 + work_package_wikis_tab_component: + inline_page_links: 内联页面链接 + referencing_pages: 引用于 diff --git a/modules/wikis/config/locales/crowdin/zh-TW.yml b/modules/wikis/config/locales/crowdin/zh-TW.yml index 534a8255f5d..683f27ccd08 100644 --- a/modules/wikis/config/locales/crowdin/zh-TW.yml +++ b/modules/wikis/config/locales/crowdin/zh-TW.yml @@ -3,15 +3,17 @@ zh-TW: activerecord: attributes: wikis/page_link: + identifier: Identifier provider: Wiki Provider + wikis/provider: + name: Name + universal_identifier: Universal identifier wikis/xwiki_provider: authentication_method: Authentication method authentication_methods: oauth2_sso: Single-Sign-On through OpenID Connect Identity Provider two_way_oauth2: Two-way OAuth 2.0 authorization code flow - name: Name token_exchange_scope: XWiki Scope - universal_identifier: Universal identifier url: Instance URL wiki_audience: XWiki Audience errors: {} @@ -25,53 +27,30 @@ zh-TW: other: Relation page links wikis/xwiki_provider: other: XWiki providers + menus: + admin: + external_wiki_providers: Wiki providers + internal_wiki_provider: Internal wiki + wikis: Wikis permission_manage_wiki_page_links: Manage Wiki Page Links project_module_wiki_platforms: Wiki providers wikis: - buttons: - connect_account: Connect %{provider} account - done_continue: Done, continue - save_and_continue: Save and continue - wiki_page: Wiki page - health_checks: - authentication: - existing_token: User token - header: Authentication - user_bound_request: User-based request authentication - base_configuration: - header: Configuration - provider_configured: Configuration complete - errors: - not_configured: The connection could not be validated. Please finish configuration first. - xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. - xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. - xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. - xwiki_oauth_unauthorized: The user token was not recognized by XWiki. - work_package_wikis_tab_component: - inline_page_links: Inline page links - referencing_pages: Referenced in - page_link_component: - remove: Remove page link - relation_page_links_component: - empty_heading: No related pages - empty_text: Manually add links to other related wiki pages. - oauth_login_component: - heading: Not connected to %{provider} - description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. - connect_button: Connect %{provider} account admin: destroy_confirmation_dialog_component: - title: Delete wiki provider - heading: Permanently delete this wiki provider? description_html: The wiki provider %{wiki_provider} and all the related wiki page links will be deleted. In addition, every inline wiki page link will no longer be accessible. This action is irreversible. + heading: Permanently delete this wiki provider? + title: Delete wiki provider forms: general_info_form_component: - xwiki_instance_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. + provider_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. oauth_application_form_component: - application_id: Application ID - application_secret: Application secret + application_id: OpenProject OAuth Application ID + application_secret: OpenProject OAuth Application secret oauth_client_form_component: - client_id: Client ID + client_id: Wiki OAuth Client ID + client_secret: Wiki OAuth Client secret + redirect_uri: Redirect URI + redirect_uri_caption: Copy this value into the Redirect URI field of your XWiki OIDC client registration. health_status: show: actions: @@ -82,13 +61,19 @@ zh-TW: no_health_report: No report available no_health_report_description: Run the checks now for a full health status report for this wiki provider. title: Health Report + internal_provider_form: + checkbox_caption: Allow projects to use the internal OpenProject wiki along with external Wiki providers + checkbox_label: Enable the internal OpenProject wiki + internal_wiki_provider: + show: + description: Choose to enable or disable the internal OpenProject wiki oauth_application_info_component: confirm_replace_oauth_application: This action will reset the current OAuth credentials. After confirming you will have to reenter the credentials in your XWiki instance and all users will have to reauthorize. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_application: Replace OpenProject OAuth application oauth_client_info_component: confirm_replace_oauth_client: This action will reset the current XWiki OAuth credentials. All users will need to reauthorize against XWiki. Are you sure you want to proceed? - label_pending: Pending + label_oauth_client_id: OAuth Client ID replace_oauth_client: Replace XWiki OAuth application side_panel: health_status_component: @@ -106,25 +91,81 @@ zh-TW: index_description: Add an external wiki service to link work packages to existing wiki pages or create new ones directly from OpenProject. label_add_new: Add new wiki provider label_edit: Edit XWiki provider - label_new_xwiki_instance: New XWiki provider + label_new_provider: New XWiki provider label_wiki_platform: Wiki provider - name_caption: Give your storage a name so that users can differentiate between multiple wiki platforms. + name_caption: Give your wiki provider a name so that users can differentiate between multiple wiki platforms. name_placeholder: XWiki knowledge base new_provider_html: Read our documentation on [setting up an XWiki integration](docs_url) for more information. oauth: openproject_oauth: OpenProject OAuth sections: - general_information: Basic details + general_information: General information oauth_configuration: OAuth configuration - url_caption: Please add the host address of your wiki platform including the https://. It should not be longer than 255 characters. - xwiki_instance: XWiki Instance + url_caption: The host address of your wiki platform including the https://. It should not be longer than 255 characters. xwiki: oauth: - openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. Copy the credentials below into your XWiki instance. - provider_oauth: XWiki OAuth - provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. A client ID is automatically generated to identify OpenProject to XWiki — no manual configuration is needed on the XWiki side. + openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth application. + provider_oauth: Wiki OAuth + provider_oauth_configuration: Copy these values to the [XWiki OIDC Connection client](xwiki_oidc_link). + provider_oauth_description: Allow OpenProject to access XWiki data using OAuth. openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth. xwiki_oauth: XWiki OAuth xwiki_oauth_description: Allow OpenProject to access XWiki data using an OAuth. - macro: - page_not_found: Linked wiki page no longer available + buttons: + connect_account: Connect %{provider} account + done_continue: Done, continue + open_wiki: Open wiki + save_and_continue: Save and continue + wiki_page: Wiki page + create_new_wiki_page_dialog: + page_title: Title + parent_help_text: Select a parent for this new wiki page. + title: Create new wiki page + delete_relation_page_link_confirmation_dialog: + heading: Delete related wiki page link? + title: Delete related wiki page link + health_checks: + authentication: + existing_token: User token + header: Authentication + user_bound_request: User-based request authentication + base_configuration: + header: Configuration + provider_configured: Configuration complete + errors: + not_configured: The connection could not be validated. Please finish configuration first. + xwiki_oauth_connection_error: OpenProject could not connect to the configured XWiki instance. + xwiki_oauth_request_error: An unexpected error occured when trying to communicate with the XWiki instance. + xwiki_oauth_token_missing: OpenProject cannot test the user-level communication with XWiki as the user did not yet connect their XWiki account. + xwiki_oauth_unauthorized: The user token was not recognized by XWiki. + instructions: + xwiki: + integration: XWiki Administration + oauth_application_details_html: The client secret value will not be accessible again after you close this window. Please copy these values into the [XWiki OpenProject Integration settings](xwiki_admin_link). + link_existing_wiki_page_dialog: + title: Add existing wiki page + link_existing_wiki_page_form: + no_results: No wiki pages found + placeholder: Search for a wiki page + oauth_login_component: + connect_button: Connect %{provider} account + description: Log in to %{provider} to view and manage related wiki pages from this OpenProject instance. + heading: Not connected to %{provider} + page_link_component: + remove: Remove page link + page_links: + errors: + page_access_forbidden: You do not have permission to access this wiki page + page_not_found: Linked wiki page no longer available + unexpected: An unexpected error occurred + provider_types: + xwiki: + name: XWiki + relation_page_links_component: + empty_heading: No related pages + empty_text: Manually add links to other related wiki pages. + link_existing: Existing wiki page + link_new: New wiki page + work_package_wikis_tab_component: + inline_page_links: Inline page links + referencing_pages: Referenced in diff --git a/modules/xls_export/config/locales/crowdin/zh-CN.yml b/modules/xls_export/config/locales/crowdin/zh-CN.yml index 8048888f698..b6de4f90804 100644 --- a/modules/xls_export/config/locales/crowdin/zh-CN.yml +++ b/modules/xls_export/config/locales/crowdin/zh-CN.yml @@ -14,4 +14,4 @@ zh-CN: xls_with_relations: 带关系的 XLS xls_export: child_of: 此项的子项 - parent_of: 此项的父级 + parent_of: 此项的父项 From 610bfcfa9b231417f258075501a3fa3fda4d7873 Mon Sep 17 00:00:00 2001 From: Ivan Kuchin Date: Tue, 9 Jun 2026 15:05:29 +0200 Subject: [PATCH 097/107] reporter: github-pr-annotations with fail_level: any --- .github/workflows/erb-lint-core.yml | 3 ++- .github/workflows/eslint-core.yml | 3 ++- .github/workflows/rubocop-core.yml | 3 ++- .github/workflows/yamllint-core.yml | 3 ++- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/.github/workflows/erb-lint-core.yml b/.github/workflows/erb-lint-core.yml index bb1d76d1389..5432af20e0c 100644 --- a/.github/workflows/erb-lint-core.yml +++ b/.github/workflows/erb-lint-core.yml @@ -26,5 +26,6 @@ jobs: - name: Run ERB lint uses: opf/action-erblint@49c54b56c60d0c50885065468cf149b61d5c2a60 # main with: - reporter: github-pr-check + reporter: github-pr-annotations + fail_level: any use_bundler: true diff --git a/.github/workflows/eslint-core.yml b/.github/workflows/eslint-core.yml index a159f046ca7..32bb333cb6d 100644 --- a/.github/workflows/eslint-core.yml +++ b/.github/workflows/eslint-core.yml @@ -33,6 +33,7 @@ jobs: - name: Run ESLint uses: reviewdog/action-eslint@556a3fdaf8b4201d4d74d406013386aa4f7dab96 # v1 with: - reporter: github-pr-check + reporter: github-pr-annotations + fail_level: any workdir: 'frontend/' eslint_flags: 'src/' diff --git a/.github/workflows/rubocop-core.yml b/.github/workflows/rubocop-core.yml index ce3e1573adc..8906c1a9dbb 100644 --- a/.github/workflows/rubocop-core.yml +++ b/.github/workflows/rubocop-core.yml @@ -22,7 +22,8 @@ jobs: - name: Run RuboCop uses: reviewdog/action-rubocop@b6d5e953a5fc0bf3ab65254e77730ea2174d6d6d # v2 with: - reporter: github-pr-check + reporter: github-pr-annotations + fail_level: any rubocop_version: gemfile rubocop_extensions: > rubocop-capybara:gemfile diff --git a/.github/workflows/yamllint-core.yml b/.github/workflows/yamllint-core.yml index 47e3b757622..0e756d43eb3 100644 --- a/.github/workflows/yamllint-core.yml +++ b/.github/workflows/yamllint-core.yml @@ -24,7 +24,8 @@ jobs: - name: Run Yamllint uses: reviewdog/action-yamllint@f01d8a48fd8d89f89895499fca2cff09f9e9e8c0 # v1.21.0 with: - reporter: github-pr-check + reporter: github-pr-annotations + fail_level: any yamllint_flags: > .yamllint.yml config/locales/en.yml From 0f9cb250dd8ac80dabd8885dc0699942f12cc837 Mon Sep 17 00:00:00 2001 From: ulferts Date: Tue, 9 Jun 2026 17:57:33 +0200 Subject: [PATCH 098/107] again try to stabilize flickering my page work package table spec --- .../my_page/spec/features/my/work_package_table_spec.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/my_page/spec/features/my/work_package_table_spec.rb b/modules/my_page/spec/features/my/work_package_table_spec.rb index 0921cd72aae..b61c932a5e7 100644 --- a/modules/my_page/spec/features/my/work_package_table_spec.rb +++ b/modules/my_page/spec/features/my/work_package_table_spec.rb @@ -53,7 +53,7 @@ RSpec.describe "Arbitrary WorkPackage query table widget on my page", project:, type: other_type, author: user, - responsible: user) + assigned_to: user) end let(:permissions) { %i[view_work_packages add_work_packages save_queries] } @@ -85,16 +85,16 @@ RSpec.describe "Arbitrary WorkPackage query table widget on my page", expect(created_by_me_area.area) .to have_css(".subject", text: type_work_package.subject) assigned_to_me_area = Components::Grids::GridArea.new(".grid--area.-widgeted:nth-of-type(1)") - + expect(assigned_to_me_area.area) + .to have_css(".subject", text: other_type_work_package.subject) my_page.expect_and_dismiss_toaster message: I18n.t("js.notice_successful_update") my_page.add_widget(1, 3, :column, "Work packages table") - my_page.expect_and_dismiss_toaster message: I18n.t("js.notice_successful_update") created_by_me_area.remove + my_page.expect_and_dismiss_toaster message: I18n.t("js.notice_successful_update") assigned_to_me_area.remove - my_page.expect_and_dismiss_toaster message: I18n.t("js.notice_successful_update") filter_area = Components::Grids::GridArea.new(".grid--area.-widgeted:nth-of-type(1)") From 86f9f2975f15105a5f092d445e9185e8db4b54c3 Mon Sep 17 00:00:00 2001 From: OpenProject Actions CI Date: Tue, 9 Jun 2026 16:08:35 +0000 Subject: [PATCH 099/107] update locales from crowdin [ci skip] --- config/locales/crowdin/af.yml | 3 + config/locales/crowdin/ar.yml | 7 + config/locales/crowdin/az.yml | 3 + config/locales/crowdin/be.yml | 5 + config/locales/crowdin/bg.yml | 3 + config/locales/crowdin/ca.yml | 3 + config/locales/crowdin/ckb-IR.yml | 3 + config/locales/crowdin/cs.yml | 463 +++++++++--------- config/locales/crowdin/da.yml | 3 + config/locales/crowdin/de.yml | 15 +- config/locales/crowdin/el.yml | 3 + config/locales/crowdin/eo.yml | 3 + config/locales/crowdin/es.yml | 3 + config/locales/crowdin/et.yml | 3 + config/locales/crowdin/eu.yml | 3 + config/locales/crowdin/fa.yml | 3 + config/locales/crowdin/fi.yml | 3 + config/locales/crowdin/fil.yml | 3 + config/locales/crowdin/fr.yml | 3 + config/locales/crowdin/he.yml | 5 + config/locales/crowdin/hi.yml | 3 + config/locales/crowdin/hr.yml | 4 + config/locales/crowdin/hu.yml | 3 + config/locales/crowdin/hy.yml | 3 + config/locales/crowdin/id.yml | 2 + config/locales/crowdin/it.yml | 3 + config/locales/crowdin/ja.yml | 2 + config/locales/crowdin/ka.yml | 3 + config/locales/crowdin/kk.yml | 3 + config/locales/crowdin/ko.yml | 2 + config/locales/crowdin/lt.yml | 5 + config/locales/crowdin/lv.yml | 4 + config/locales/crowdin/mn.yml | 3 + config/locales/crowdin/ms.yml | 2 + config/locales/crowdin/ne.yml | 3 + config/locales/crowdin/nl.yml | 3 + config/locales/crowdin/no.yml | 3 + config/locales/crowdin/pl.yml | 5 + config/locales/crowdin/pt-BR.yml | 3 + config/locales/crowdin/pt-PT.yml | 3 + config/locales/crowdin/ro.yml | 4 + config/locales/crowdin/ru.yml | 5 + config/locales/crowdin/rw.yml | 3 + config/locales/crowdin/si.yml | 3 + config/locales/crowdin/sk.yml | 5 + config/locales/crowdin/sl.yml | 5 + config/locales/crowdin/sr.yml | 4 + config/locales/crowdin/sv.yml | 3 + config/locales/crowdin/th.yml | 2 + config/locales/crowdin/tr.yml | 3 + config/locales/crowdin/uk.yml | 5 + config/locales/crowdin/uz.yml | 3 + config/locales/crowdin/vi.yml | 2 + config/locales/crowdin/zh-CN.yml | 2 + config/locales/crowdin/zh-TW.yml | 2 + .../auth_saml/config/locales/crowdin/de.yml | 8 +- .../backlogs/config/locales/crowdin/cs.yml | 112 ++--- modules/costs/config/locales/crowdin/cs.yml | 38 +- .../gantt/config/locales/crowdin/js-cs.yml | 2 +- .../config/locales/crowdin/cs.yml | 6 +- modules/grids/config/locales/crowdin/cs.yml | 8 +- .../ldap_groups/config/locales/crowdin/cs.yml | 2 +- modules/meeting/config/locales/crowdin/cs.yml | 120 ++--- .../config/locales/crowdin/cs.yml | 10 +- modules/wikis/config/locales/crowdin/cs.yml | 10 +- modules/wikis/config/locales/crowdin/de.yml | 16 +- 66 files changed, 584 insertions(+), 401 deletions(-) diff --git a/config/locales/crowdin/af.yml b/config/locales/crowdin/af.yml index cda56e021e8..bb1f96f7cee 100644 --- a/config/locales/crowdin/af.yml +++ b/config/locales/crowdin/af.yml @@ -4532,6 +4532,9 @@ af: label_x_working_days_time_off: one: 'Time off: 1 working day' other: 'Time off: %{count} working days' + label_x_items_selected: + one: One item selected + other: "%{count} items selected" label_yesterday: gister label_zen_mode: Zen mode label_role_type: Soort diff --git a/config/locales/crowdin/ar.yml b/config/locales/crowdin/ar.yml index 5e6f2bcadbd..f672ef62423 100644 --- a/config/locales/crowdin/ar.yml +++ b/config/locales/crowdin/ar.yml @@ -4798,6 +4798,13 @@ ar: few: 'Time off: %{count} working days' many: 'Time off: %{count} working days' other: 'Time off: %{count} working days' + label_x_items_selected: + zero: "%{count} items selected" + one: One item selected + two: "%{count} items selected" + few: "%{count} items selected" + many: "%{count} items selected" + other: "%{count} items selected" label_yesterday: الأمس label_zen_mode: Zen mode label_role_type: النّوع diff --git a/config/locales/crowdin/az.yml b/config/locales/crowdin/az.yml index 417dd50d1cb..282e971eaac 100644 --- a/config/locales/crowdin/az.yml +++ b/config/locales/crowdin/az.yml @@ -4532,6 +4532,9 @@ az: label_x_working_days_time_off: one: 'Time off: 1 working day' other: 'Time off: %{count} working days' + label_x_items_selected: + one: One item selected + other: "%{count} items selected" label_yesterday: yesterday label_zen_mode: Zen mode label_role_type: Type diff --git a/config/locales/crowdin/be.yml b/config/locales/crowdin/be.yml index b90939c5f3e..f41e07f5763 100644 --- a/config/locales/crowdin/be.yml +++ b/config/locales/crowdin/be.yml @@ -4666,6 +4666,11 @@ be: few: 'Time off: %{count} working days' many: 'Time off: %{count} working days' other: 'Time off: %{count} working days' + label_x_items_selected: + one: One item selected + few: "%{count} items selected" + many: "%{count} items selected" + other: "%{count} items selected" label_yesterday: yesterday label_zen_mode: Zen mode label_role_type: Type diff --git a/config/locales/crowdin/bg.yml b/config/locales/crowdin/bg.yml index 393771ba191..aa6eea74dff 100644 --- a/config/locales/crowdin/bg.yml +++ b/config/locales/crowdin/bg.yml @@ -4530,6 +4530,9 @@ bg: label_x_working_days_time_off: one: 'Time off: 1 working day' other: 'Time off: %{count} working days' + label_x_items_selected: + one: One item selected + other: "%{count} items selected" label_yesterday: вчера label_zen_mode: Режим Дзен label_role_type: Тип diff --git a/config/locales/crowdin/ca.yml b/config/locales/crowdin/ca.yml index d456882fef7..c6d06ea2bc5 100644 --- a/config/locales/crowdin/ca.yml +++ b/config/locales/crowdin/ca.yml @@ -4529,6 +4529,9 @@ ca: label_x_working_days_time_off: one: 'Time off: 1 working day' other: 'Time off: %{count} working days' + label_x_items_selected: + one: One item selected + other: "%{count} items selected" label_yesterday: ahir label_zen_mode: Zen mode label_role_type: Classe diff --git a/config/locales/crowdin/ckb-IR.yml b/config/locales/crowdin/ckb-IR.yml index 11cebc2b390..3297bc1cae1 100644 --- a/config/locales/crowdin/ckb-IR.yml +++ b/config/locales/crowdin/ckb-IR.yml @@ -4532,6 +4532,9 @@ ckb-IR: label_x_working_days_time_off: one: 'Time off: 1 working day' other: 'Time off: %{count} working days' + label_x_items_selected: + one: One item selected + other: "%{count} items selected" label_yesterday: yesterday label_zen_mode: Zen mode label_role_type: Type diff --git a/config/locales/crowdin/cs.yml b/config/locales/crowdin/cs.yml index 4b04cf9af72..fea41f1dabb 100644 --- a/config/locales/crowdin/cs.yml +++ b/config/locales/crowdin/cs.yml @@ -56,12 +56,12 @@ cs: lede_html: Při přejmenování identifikátoru projektu zůstane předchozí identifikátor rezervován, aby stávající odkazy a integrace fungovaly i nadále.
Zde můžete rezervované identifikátory uvolnit, aby je mohly využít jiné projekty. col_identifier: Identifikátor col_project: Projekt - col_reserved: Reserved - not_available_in_semantic_mode: Reserved project identifiers are only available in numeric identifier mode. - filter_label: Search identifiers + col_reserved: Rezervován + not_available_in_semantic_mode: Rezervované identifikátory projektu jsou k dispozici pouze v numerickém režimu. + filter_label: Hledat identifikátory btn_release: Uvolnit released_notice: Identifikátor "%{identifier}" byl uvolněn. - identifier_not_found: The reserved identifier could not be found. It may have already been released or the project may have been deleted. Please refresh the page. + identifier_not_found: Rezervovaný identifikátor nebyl nalezen. Možná již byl uvolněn nebo projekt byl odstraněn. Obnovte prosím stránku. dialog: title: Uvolnit identifikátor heading: Uvolnit "%{identifier}"? @@ -69,8 +69,8 @@ cs: checkbox_label: Beru na vědomí, že tento úkon nelze vzít zpět. confirm_button: Uvolnit identifikátor empty_heading: Žádné rezervované identifikátory - reserved_ago: "%{time} ago" - empty_body: When a project's identifier changes, the previous one will appear here so you can release it once it's safe to do so. + reserved_ago: "%{time} nazpět" + empty_body: Když se identifikátor projektu změní, předchozí se objeví zde, abyste jej mohli uvolnit, jakmile je to bezpečné. plugins: no_results_title_text: V současné době nejsou nainstalovány žádné pluginy. no_results_content_text: Pro více informací se podívejte na stránku pro integraci a pluginy. @@ -99,14 +99,14 @@ cs: theme_warning: Změna motivu přepíše váš vlastní styl. Vzhled pak bude ztracen. Jste si jisti, že chcete pokračovat? enterprise: delete_dialog: - title: Delete enterprise token - heading: Delete this enterprise token? - confirmation: Are you sure you want to delete this Enterprise edition support token? + title: Odstranit Enterprise token + heading: Odstranit tento Enterprise token? + confirmation: Jste si jisti, že chcete odstranit tento Enterprise token? create_dialog: - title: Add Enterprise token - type_token_text: Your Enterprise token text - token_placeholder: Paste your Enterprise edition support token here - token_caption: To learn more about how to activate Enterprise edition check our [documentation](docs_url). + title: Přidat Enterprise token + type_token_text: Váš Enterprise token + token_placeholder: Zde vložte svůj Enterprise token + token_caption: Další informace o aktivaci edice Enterprise najdete v naší [dokumentaci](docs_url). add_token: Nahrát podpůrný token Enterprise Edition replace_token: Nahradit aktuální podpůrný token order: Objednat Enterprise Edici @@ -125,7 +125,7 @@ cs: in_grace_period: In grace period invalid_domain: Neplatná doména not_active: Neaktivní - trial: Trial + trial: Zkušební verze jemalloc_allocator: Jemalloc alokátor paměti journal_aggregation: caption: 'User actions on a work package (changing description, status, values, or writing comments) are grouped if performed within this period. It also controls notification and [webhook](webhook_link) delays. @@ -146,7 +146,7 @@ cs: title: No Jira hosts configured yet description: Configure a Jira host to start importing items from Jira to this OpenProject instance. configuration: - title: Jira configuration + title: Konfigurace Jira new: Nová konfigurace banner: title: Beta verze - Vyzkoušejte si ji! @@ -157,7 +157,7 @@ cs: supported_versions: '' form: fields: - name: Name + name: Název url: Jira Server/Data Center URL personal_access_token: Personal Access Token button_add: Přidat konfiguraci @@ -190,12 +190,12 @@ cs: columns: projects: Projekty last_change: Poslední změna - added: Added - label_ago: "%{amount} ago" + added: Přidáno + label_ago: před %{amount} run: - title: Import run + title: Běh importu history: Historie - remove_error: A Jira import run cannot be removed while it is running + remove_error: Běh Jira importu nemůže být odstraněn za běhu import_blocked_error: Another Jira import run is currently in progress or awaiting review. Please complete or revert it before starting a new import. project_identifier_taken: 'You are trying to import a project with an already used identifier: %{taken_identifier}. Please update the project identifier in Jira then click on Retry.' blank: @@ -203,8 +203,8 @@ cs: description: Create an import run to start importing information from this Jira instance index: description: You can import different sets of data with each import run. It is possible to undo an import run immediately after in review mode but not after finalizing. - button_import_run: Import run - button_edit_configuration: Edit configuration + button_import_run: Běh importu + button_edit_configuration: Upravit konfiguraci status: initial: Start instance_meta_fetching: Fetching meta data @@ -212,11 +212,11 @@ cs: instance_meta_done: Meta data fetched import_scope: Zvolte rozsah configuring: Select scope - projects_meta_fetching: Fetching project data - projects_meta_error: Error fetching project data - projects_meta_done: Data gathered + projects_meta_fetching: Načítání dat projektu + projects_meta_error: Chyba při načítání dat projektu + projects_meta_done: Shromážděná data importing: Probíhá - import_error: Error during import + import_error: Chyba při importu imported: Review mode reverting: Reverting revert_error: Error during revert @@ -230,10 +230,10 @@ cs: button_retry: Retry parts: projects: - one: 1 project - few: "%{count} projects" - many: "%{count} projects" - other: "%{count} projects" + one: 1 projekt + few: "%{count} projektů" + many: "%{count} projektů" + other: "%{count} projektů" issues: one: 1 issue few: "%{count} issues" @@ -241,65 +241,65 @@ cs: other: "%{count} issues" work_packages: one: 1 pracovní balíček - few: "%{count} work packages" - many: "%{count} work packages" - other: "%{count} work packages" + few: "%{count} pracovních balíčků" + many: "%{count} pracovních balíčků" + other: "%{count} pracovních balíčků" types: - one: 1 type - few: "%{count} types" - many: "%{count} types" - other: "%{count} types" + one: 1 typ + few: "%{count} typy" + many: "%{count} typy" + other: "%{count} typy" statuses: one: 1 status - few: "%{count} statuses" - many: "%{count} statuses" - other: "%{count} statuses" + few: "%{count} stavů" + many: "%{count} stavů" + other: "%{count} stavů" users: one: 1 uživatel - few: "%{count} users" - many: "%{count} users" - other: "%{count} users" + few: "%{count} uživatelů" + many: "%{count} uživatelů" + other: "%{count} uživatelů" groups: fetch: - title: Get base data + title: Získat základní data groups_and_users: - title: Groups and Users + title: Skupiny a uživatelé configuration: - title: Configure import + title: Nastavit import confirming: - title: Confirm and import + title: Potvrdit a importovat review: title: Review import sections: fetch_data: - title: Fetch instance meta data - caption_done: Completed + title: Načíst metadata instance + caption_done: Dokončeno description: Check what data is available for import in the host Jira instance. button_fetch: Check available data - label_progress: Fetching data from Jira... + label_progress: Načítání dat z Jira... groups_and_users: - title: Groups and Users + title: Skupiny a uživatelé import_scope: - title: Import scope - caption: Choose what you want to import into OpenProject - caption_done: Completed + title: Rozsah importu + caption: Vyberte, co chcete importovat do OpenProjectu + caption_done: Dokončeno label_info: Please note that this import tool is in beta and cannot import all types of data. Here is a summary of what the host Jira instance offers for import and what this tool is able to import right now. description: Select what data you want to import from the available data fetched from the host Jira instance. label_supported_data: Supported data - label_coming_soon: Coming soon (Q2 2026) + label_coming_soon: Již brzy (Q2 2026) label_coming_later: Coming later label_available_server_data: Available data on %{server_info} button_select_projects: Select projects to import - button_continue: Continue + button_continue: Pokračovat label_import: Select which projects you would like to import. - button_select: Select projects - label_selected_data: Selected data for import - label_progress: Fetching data from Jira... + button_select: Vybrat projekty + label_selected_data: Vybraná data pro import + label_progress: Načítání dat z Jira... elements: - relations: Relations between issues + relations: Vztahy mezi issues project_ids: Project identifiers - issue_ids: Issue identifiers - sprints: Sprint assignments + issue_ids: Identifikátory issues + sprints: Přiřazení sprintu workflows: Project-level workflows schemes: Schémata permissions: Permissions @@ -311,27 +311,27 @@ cs: confirm_import: title: Import dat caption: Review your import settings and start the import - caption_done: Completed + caption_done: Dokončeno label_available_data: Data k importu - label_users_import_explanation: Users that are involved in selected projects (group memberships included) - button_start: Start import - description: You are about to start an import run with the following settings. - label_progress: Import in progress... - label_import_data: Currently importing + label_users_import_explanation: Uživatelé, kteří jsou zapojeni do vybraných projektů (včetně členství ve skupinách) + button_start: Spustit import + description: Chystáte se spustit import s následujícím. nastavením. + label_progress: Probíhá import... + label_import_data: Momentálně importováno import_result: - title: Import run results - caption: Review import run or revert import + title: Výsledky importu + caption: Zkontrolovat spuštění importu nebo revertovat import info: Import proběhl úspěšně. label_results: Importováno - label_revert: Revert import - button_revert: Revert import + label_revert: Revert importu + button_revert: Revertovat import button_done: Schválit import preview_description: The imported data is currently in review mode. Click "Approve import" to make the import permanent or "Revert import" to undo all changes made in this import run. label_finalize_import: Approve import label_finalizing: Approving import... label_finalizing_done: Import approved. - label_revert_progress: Reverting import... - label_reverted: Import reverted. + label_revert_progress: Revertování importu... + label_reverted: Import byl revertován. select_dialog: filter_projects: Filtrovat podle textu import_dialog: @@ -342,18 +342,18 @@ cs: ' confirm: I understand and have a backup revert_dialog: - title: Permanently revert this import? + title: Trvale revertovat tento import? description: This will delete all imported objects (including whole projects). - confirm: I understand that this reversion will delete data permanently + confirm: Chápu, že tento revert trvale odstraní data finalize_dialog: title: Approve this import? description: Once approved, this import can no longer be reverted. All imported data will become permanent. confirm: Beru na vědomí, že tento úkon nelze vzít zpět confirm_button: Rozumím select_projects: - title: Select projects + title: Výběr projektů user: - unknown_name: Unknown + unknown_name: Neznámý mcp_configurations: index: description: The model context protocol allows AI agents to provide its users with tools and resources exposed by this OpenProject instance. This feature is still in beta. @@ -440,7 +440,7 @@ cs: settings: new_project: project_creation: Project creation - notification_text_default: "

Hello,

A new project has been created: projectValue:name

Thank you

\n" + notification_text_default: "

Dobrý den,

Byl vytvořen nový projekt: projectValue:name

Děkujeme

\n" work_packages_identifier: page_header: description: Choose between classic numerical work package IDs or semantic project-specific ones that prepend the project identifier to the work package ID. @@ -497,10 +497,10 @@ cs: statuses_removal_dialog: title: Remove statuses heading: - one: Remove 1 status? - few: Remove %{count} statuses? - many: Remove %{count} statuses? - other: Remove %{count} statuses? + one: Odstranit 1 stav? + few: Odstranit %{count} stavy? + many: Odstranit %{count} stavů? + other: Odstranit %{count} stavů? description: Removing these statuses will make them unavailable to this type and delete existing workflows. Are you sure you want to proceed? confirm: Odstranit leave_confirmation: @@ -716,7 +716,7 @@ cs: all: Allows the user to assign multiple values to this custom field. project: Allows the user to assign multiple values to this attribute. searchable: - all: Include the field values when using the global search functionality. + all: Zahrnout hodnoty polí při použití globální funkce vyhledávání. project: Check to make this attribute available as a filter in project lists. editable: all: Allow the field to be editable by users themselves. @@ -754,36 +754,36 @@ cs: confirmation_live_message_checked: The button to proceed is now active. confirmation_live_message_unchecked: The button to proceed is now inactive. You need to tick the checkbox to continue. departments: - edit: Edit department - add_user: Add user - add_department: Add department + edit: Upravit oddělení + add_user: Přidat uživatele + add_department: Přidat oddělení blankslate: - heading: Your organization has no departments - description: 'Start by adding departments or users to the organization. Each department can be used to create a hierarchy below it, to navigate and create sub-department inside a hierarchy click on the created item. + heading: Vaše organizace nemá žádná oddělení + description: 'Začněte přidáním oddělení nebo uživatelů do organizace. Každé oddělení lze použít k vytvoření hierarchie pod ním, pro navigaci a vytvoření pododdělení uvnitř hierarchie klikněte na vytvořenou položku. ' - add_button: Add + add_button: Přidat detail_blankslate: - heading: This department doesn’t have any hierarchy level below + heading: Toto oddělení nemá žádnou úroveň hierarchie pod ním description: Add departments or users to create sub-items inside another one. - add_button: Add + add_button: Přidat add_department_form: - name_label: Department name - name_placeholder: Enter department name + name_label: Název oddělení + name_placeholder: Zadejte název oddělení move_user_dialog: - title: User already in a department - heading: Move user to this department? - description: "%{user} is currently a member of %{from_department}. Moving them will remove them from that department." - confirm: Move user + title: Uživatel je již v oddělení + heading: Přesunout uživatele do tohoto oddělení? + description: "%{user} je v současné době členem %{from_department}. Jejich přesunutím dojde k jejich odstranění z tohoto oddělení." + confirm: Přesunout uživatele context_menu: - add_sub_department: Add sub-department - add_user: Add user + add_sub_department: Přidat dílčí oddělení + add_user: Přidat uživatele flash: - user_added: User was successfully added to the department. - user_removed: User was successfully removed from the department. - department_created: Department was successfully created. + user_added: Uživatel byl úspěšně přidán do oddělení. + user_removed: Uživatel byl úspěšně odstraněn z oddělení. + department_created: Oddělení bylo úspěšně vytvořeno. errors: - move_user_failed: Failed to move user between departments. + move_user_failed: Přesun uživatele mezi odděleními se nezdařil. pagination: label: Stránkování prev: Předchozí @@ -819,9 +819,9 @@ cs: respond_to?: neimplementuje požadovanou metodu. rules: copy_workflow_from: - workflow_missing: has no own workflow. + workflow_missing: nemá vlastní pracovní postup. custom_field: - format_not_supported: format '%{field_format}' is unsupported. + format_not_supported: formát '%{field_format}' není podporován. item: root_item: nemůže být kořenová položka. not_persisted: musí být již existující položka. @@ -857,13 +857,13 @@ cs: wiki_pages: Wiki groups: edit: - synchronized_groups: Synchronized groups + synchronized_groups: Synchronizované skupiny index: description: Seskupováním uživatelů je můžete přidat jako členy do stejných projektů nebo jim přiřadit stejné globální role. table_component: blank_slate: description: You can define named groups of users with specific permissions. - title: No groups set up yet + title: Zatím nebyly vytvořeny žádné skupiny user_count: User count users: no_results_title_text: Momentálně nejsou žádní uživatelé součástí této skupiny. @@ -882,12 +882,12 @@ cs: index: search: label: Filtr názvů portfolia - placeholder: Search portfolios + placeholder: Hledat portfolia sub_items_html: - one: "1 sub-item" - few: "%{count} sub-items" - many: "%{count} sub-items" - other: "%{count} sub-items" + one: "1 dílčí položka" + few: "%{count} dílčích položek" + many: "%{count} dílčích položek" + other: "%{count} dílčích položek" lists: active: Aktivní portfolia my: Moje portfolia @@ -936,7 +936,7 @@ cs: text: Tato akce neodstraní žádný projekt, který seznam obsahuje. Opravdu chcete tento seznam projektů smazat? settings: header_details: Základní údaje - header_identifier: Identifier + header_identifier: Identifikátor header_status: Stav header_relations: Vztahy projektu button_update_details: Aktualizovat podrobnosti @@ -954,14 +954,14 @@ cs: private_confirmation: checkbox: Chápu, že tím se dříve veřejný obsah stane soukromým. title: Nastavit tento projekt jako soukromý? - description: 'The project will only be visible to project members depending on their role and associated permissions. Sub-projects are not affected and have their own settings. + description: 'Projekt bude viditelný pouze pro členy projektu v závislosti na jejich úloze a souvisejících povoleních. Dílčí projekty nejsou ovlivněny a mají vlastní nastavení. ' change_identifier: Změnit identifikátor change_identifier_dialog_title: Změnit identifikátor projektu change_identifier_format_hint_semantic: Pouze velká písmena (A-Z), číslice nebo podtržítka. Maximálně 10 znaků. Musí začínat písmenem. change_identifier_format_hint_legacy: Pouze malá písmena (a-z), číslice, pomlčky nebo podtržítka. - change_identifier_warning: 'This will permanently change identifiers and URLs of all work packages in this project. The previous identifiers and URLs will nevertheless continue to work. + change_identifier_warning: 'Tímto se trvale změní identifikátory a adresy URL všech pracovních balíčků v tomto projektu. Předchozí identifikátory a adresy URL budou nicméně nadále správně přesměrovány. ' subitems: @@ -1877,7 +1877,7 @@ cs: identifier: Identifikátor latest_activity_at: Poslední aktivita parent: Podprojekt - project_creation_wizard_enabled: Project initiation request + project_creation_wizard_enabled: Zahajovatel projektu public_value: title: Viditelnost true: veřejný @@ -2109,7 +2109,7 @@ cs: relatable: Relatable to remaining_hours: Zbývající práce remaining_time: Zbývající práce - sequence_number: Sequence number + sequence_number: Sekvenční číslo shared_with_users: Sdíleno s schedule_manually: Manuální plánování spent_hours: Strávený čas @@ -2120,13 +2120,13 @@ cs: version: Verze watcher: Sledující ordered_persisted_query_entity: - persisted_query: Persisted query - entity: Entity - position: Position + persisted_query: Trvalý dotaz + entity: Entita + position: Pozice persisted_query: - name: Name - views: Views - filters: Filters + name: Název + views: Pohledy + filters: Filtry orders: Orders selects: Selects persisted_view: @@ -2528,7 +2528,7 @@ cs: attribute_unknown_name: 'Použitý neplatný atribut pracovního balíčku: %{attribute}' duplicate_group: Název skupiny '%{group}' je použit více než jednou. Názvy skupin musí být jedinečné. query_invalid: 'Vložený dotaz ''%{group}'' je neplatný: %{details}' - group_without_name: Group name can't be blank. + group_without_name: Název skupiny nesmí být prázdný. patterns: invalid_tokens: One or more attributes inside the field are not valid. Please, fix the attributes before saving. user: @@ -2620,7 +2620,7 @@ cs: other: Priorities meeting_participant: Účastník schůzky member: Člen - message: Message + message: Zpráva news: Novinky notification: one: Oznámení @@ -2646,10 +2646,10 @@ cs: many: Role other: Role scim_client: - one: SCIM client - few: SCIM clients - many: SCIM clients - other: SCIM clients + one: Klient SCIM + few: Klienti SCIM + many: Klienti SCIM + other: Klienti SCIM jira: one: Jira few: Jira @@ -2667,10 +2667,10 @@ cs: many: RSS tokenů other: RSS tokenů type: - one: Type - few: Types - many: Types - other: Types + one: Typ + few: Typy + many: Typy + other: Typy user: Uživatel version: Verze workflow: Pracovní postup @@ -2696,7 +2696,7 @@ cs: unsupported_storage_type: není podporovaným typem úložiště. storage_error: Došlo k chybě při připojení k úložišti. invalid_input: Vstup je neplatný. - invalid_child_for_parent: is not allowed as a parent for this view type. + invalid_child_for_parent: není pro tento typ zobrazení povolen jako nadřazený. activity: item: created_by_on: vytvořil %{user} dne %{datetime} @@ -2743,9 +2743,9 @@ cs: changed_date: změněno z %{from} na %{to} deactivated: Deaktivováno deleted_project_phase: Smazaná fáze projektu - phase_and_both_gates: "%{phase_message}. %{start_gate_message}, and %{finish_gate_message}" + phase_and_both_gates: "%{phase_message}. %{start_gate_message}, a %{finish_gate_message}" phase_and_one_gate: "%{phase_message}. %{gate_message}" - removed_date: date deleted %{date} + removed_date: datum smazání %{date} attributes: active: Aktivní assigned_to: Řešitel @@ -2811,8 +2811,8 @@ cs: priority: Priorita project: Projekt project_ids: ID Projektu - project_phase: Project phase - project_phase_definition: Project phase + project_phase: Fáze projektu + project_phase_definition: Fáze projektu reason: Důvod responsible: Odpovědný required: Požadováno @@ -2975,7 +2975,7 @@ cs: button_revoke_all: Zrušit vše button_revoke_only: Zrušit pouze %{shared_role_name} button_publish: Zveřejnit - button_unpublish: Nastavit jako soukromé + button_unpublish: Nastavit jako soukromý consent: checkbox_label: Zaznamenal(a) jsem a souhlasím s výše uvedeným. failure_message: Souhlas se nezdařil, nelze pokračovat. @@ -3086,9 +3086,9 @@ cs: distance_in_words: about_x_hours: one: přibližně 1 hodinu - few: přibližně %{count} hodin - many: přibližně %{count} hodin - other: přibližně %{count} hodin + few: přibližně %{count} hodinami + many: přibližně %{count} hodinami + other: přibližně %{count} hodinami about_x_months: one: přibližně 1 měsíc few: přibližně %{count} měsíce @@ -3223,7 +3223,7 @@ cs: board_view: Advanced Boards calculated_values: Calculated values capture_external_links: Capture External Links - internal_comments: Internal Comments + internal_comments: Interní komentáře custom_actions: Custom Actions custom_field_hierarchies: Hierarchie customize_life_cycle: Přizpůsobit životní cyklus @@ -3254,14 +3254,14 @@ cs: plans_title: Podnikové plány title: Doplňky podnikových plánů plan_title: Enterprise %{plan} add-on - plan_name: "%{plan} enterprise plan" - trial_text: This feature is included in your active Enterprise trial. + plan_name: Enterprise plán %{plan} + trial_text: Tato funkce je zahrnuta v aktivní zkušební verzi Enterprise. plan_text_html: K dispozici od plánu %{plan_name}. unlimited: Bez omezení - already_have_token: 'Already have a token? Add it using the button below to upgrade to the booked Enterprise plan. + already_have_token: 'Už máte token? Přidejte jej pomocí níže uvedeného tlačítka a přejděte na rezervovaný plán Enterprise. ' - hide_banner: Hide this banner + hide_banner: Skrýt tento banner homescreen_description: 'Plán Enterprise rozšiřuje komunitní edici OpenProject o další [Enterprise doplňky](enterprise_url) a profesionální podporu, což je ideální pro organizace provozující OpenProject v kritickém prostředí. ' @@ -3321,10 +3321,10 @@ cs: title: Jednotné přihlášení (SSO) pro úložiště Nextcloud description: Enable seamless and secure authentication for your Nextcloud storage with Single Sign-On. Simplify access management and enhance user convenience. scim_api: - title: SCIM clients + title: Klienti SCIM description: Automatizujte správu uživatelů v OpenProject pomocí integrace externích služeb identit, jako je Microsoft Entra nebo Keycloak, prostřednictvím našeho SCIM Server API. K dispozici od plánu Enterprise. sso_auth_providers: - title: Single Sign-On (SSO) + title: Jednotné přihlášení (SSO) description: Enable users to log in via external SSO providers using SAML or OpenID Connect for seamless access and integration with existing identity systems. virus_scanning: description: Zajistěte, aby nahrané soubory v OpenProjectu byly před zpřístupněním ostatním uživatelům zkontrolovány na přítomnost virů. @@ -3349,15 +3349,15 @@ cs: few: "%{count} days left of %{trial_plan} trial token" many: "%{count} days left of %{trial_plan} trial token" other: "%{count} days left of %{trial_plan} trial token" - description_html: You have access to all %{trial_plan} features. + description_html: Máte přístup ke všem funkcím %{trial_plan}. trial: - not_found: You have requested a trial token, but that request is no longer available. Please try again. - wait_for_confirmation: We sent you an email to confirm your address in order to retrieve a trial token. - already_retrieved: 'Your trial enterprise token was already retrieved. Please check your emails for the token being attached. Please reach out to our support team if you need a new one. + not_found: Požádali jste o zkušební token, ale tento požadavek již není k dispozici. Zkuste to prosím znovu. + wait_for_confirmation: Poslali jsme vám e-mail s žádostí o potvrzení vaší adresy, abyste mohli získat zkušební token. + already_retrieved: 'Váš zkušební Enterprise token byl již načten. Zkontrolujte prosím své e-maily, zda je token přiložen. Pokud potřebujete nový, obraťte se na náš tým podpory. ' - successfully_saved: Your trial enterprise token has been successfully retrieved. - token_sent: Trial token requested + successfully_saved: Váš zkušební Enterprise token byl úspěšně načten. + token_sent: Enterprise token vyžádán request_again: Znovu požádat resend_action: Znovu odeslat potvrzovací e‑mail welcome_title: Stručný přehled funkcí @@ -3365,7 +3365,7 @@ cs: confirmation_info: 'We sent you an email on %{date} to %{email} with all the information to start the free trial of OpenProject Enterprise. Please check your inbox and click the confirmation link provided to start your 14-day free trial. ' - confirmation_subline: 'Please, check your inbox and follow the steps to start your 14-day free trial. + confirmation_subline: 'Zkontrolujte prosím svou doručenou poštu a postupujte podle kroků, abyste zahájili 14-denní bezplatnou zkušební verzi. ' domain_caption: The token will be valid for your currently configured host name. @@ -3672,7 +3672,7 @@ cs: line_0: Project-based work package identifiers for clearer references. line_1: Jira Migrator support for Jira identifiers, due dates, and more. line_2: Option to exclude work package types from Backlogs. - line_3: Redesigned sprint views. + line_3: Přepracované zobrazení sprintu. line_4: Improved work package linking across Documents and text editors. line_5: More flexible meeting schedules and reduced email notification noise. line_6: Nested groups for organizational structures and inherited permissions. @@ -3709,7 +3709,7 @@ cs: header: změny od %{author} field_changed: "%{field} změněno z %{old_value} na %{new_value}" field_set: "%{field} nastaveno na %{value}" - field_removed: "%{field} removed" + field_removed: "%{field} odstraněno" field_updated: "%{field} aktualizováno" deleted_with_diff: "%{field} deleted (%{link})" changed_with_diff: "%{field} changed (%{link})" @@ -3741,7 +3741,7 @@ cs: progress_calculation_adjusted: Progress calculation automatically
adjusted with version update. scheduling_mode_adjusted: Scheduling mode automatically adjusted with version update. totals_removed_from_childless_work_packages: Work and progress totals automatically removed for non-parent work packages with version update. This is a maintenance task and can be safely ignored. - sprint_migration: Version '%{version_name}' has been copied as a sprint. + sprint_migration: Verze '%{version_name}' byla zkopírována jako sprint. total_percent_complete_mode_changed_to_work_weighted_average: Podřízené pracovní balíčky bez položky Práce jsou ignorovány. total_percent_complete_mode_changed_to_simple_average: Pracovní hodnoty podřízených pracovních balíčků jsou ignorovány. links: @@ -3844,8 +3844,8 @@ cs: title: Receive email reminders on these days submit_button: Update reminder days pause_reminders: - title: Pause email notifications - enabled: Temporarily pause daily email reminders + title: Pozastavit e-mailová oznámení + enabled: Dočasně pozastavit e-mailová oznámení date_range: Pause period email_alerts: title: Email alerts for other items that are not work packages @@ -3854,7 +3854,7 @@ cs: news_commented: Comment on a news item document_added: Document added forum_messages: Forum message posted - wiki_page_added: Wiki page added + wiki_page_added: Přidána wiki stránka wiki_page_updated: Wiki stránka aktualizována membership_added: Membership added membership_updated: Členství bylo aktualizováno @@ -3878,14 +3878,14 @@ cs: overdue: Overdue times: same_day: On the same day - one_day_before: 1 day before - three_days_before: 3 days before - seven_days_before: 7 days before - one_day_after: 1 day after - three_days_after: 3 days after - seven_days_after: 7 days after + one_day_before: 1 den předem + three_days_before: 3 dny předem + seven_days_before: 7 dní předem + one_day_after: 1 den po + three_days_after: 3 dny po + seven_days_after: 7 dní po non_participating: - title: Non-participating + title: Neúčastnící se description: Additional notifications for activities in all projects. submit_button: Update preferences work_package_created: New work packages @@ -3954,7 +3954,7 @@ cs: label_age: Věk label_ago: dnů před label_all: vše - label_all_uppercase: All + label_all_uppercase: Vše label_all_time: celkový čas label_all_words: Všechna slova label_all_open_wps: Všechny otevřené @@ -3972,7 +3972,7 @@ cs: label_ical_access_key_generation_hint: Automaticky vygenerováno při odebírání kalendáře. label_ical_access_key_latest: poslední label_ical_access_key_revoke: Revoke - label_integrations: Integrations + label_integrations: Integrace label_add_column: Přidat sloupec label_applied_status: Přiřazený stav label_archive_project: Archivovat projekt @@ -4056,7 +4056,7 @@ cs: label_commits_per_month: Commitů za měsíc label_confirmation: Potvrzení label_contains: obsahuje - label_starts_with: starts with + label_starts_with: začíná na label_content: Obsah label_color_plural: Barvy label_copied: zkopírováno @@ -4064,8 +4064,8 @@ cs: label_copy_source: Zdroj label_copy_target: Cíl label_copy_workflow_from: Kopírovat pracovní postup z - label_copy_workflow_from_type: Copy to another type - label_copy_workflow_from_role: Copy to other roles + label_copy_workflow_from_type: Kopírovat do jiného typu + label_copy_workflow_from_role: Kopírovat do dalších rolí label_copy_project: Kopírovat projekt label_core_version: Verze jádra label_core_build: Build jádra @@ -4190,7 +4190,7 @@ cs: label_home: Domů label_subject_or_id: Předmět nebo ID label_calendar_subscriptions: Odběr kalendáře - label_identifier: Identifiers + label_identifier: Identifikátory label_project_identifier: Identifikátor projektu label_in: v label_in_less_than: za méně než @@ -4223,11 +4223,11 @@ cs: label_journal_diff: Popis porovnání label_language: Jazyk label_languages: Jazyky - label_export_plural: Exports + label_export_plural: Exporty label_external_links: Externí odkazy label_locale: Jazyk a region label_jump_to_a_project: Přejít na projekt... - label_jira_import: Jira Migrator + label_jira_import: Jira Migrátor label_keyword_plural: Klíčová slova label_language_based: Na základě jazyka uživatele label_last_activity: Poslední aktivita @@ -4256,16 +4256,16 @@ cs: label_custom_export_logo: Vlastní logo exportu label_custom_export_cover: Vlastní exportní obal pozadí label_custom_export_footer: Custom export footer image - label_custom_export_font_regular: Regular - label_custom_export_font_bold: Bold + label_custom_export_font_regular: Běžný + label_custom_export_font_bold: Tučný label_custom_export_font_italic: Kurzíva - label_custom_export_font_bold_italic: Bold Italic + label_custom_export_font_bold_italic: Tučná kurzíva label_custom_export_cover_overlay: Překrytí obalu vlastního exportu label_custom_export_cover_text_color: Barva textu label_custom_pdf_export_settings: Vlastní nastavení exportu PDF label_custom_favicon: Vlastní favicon label_custom_touch_icon: Vlastní ikona dotyku - label_departments: Organization + label_departments: Organizace label_departments_description_html: 'Define your company’s structure by creating departments and sub-departments in a hierarchical way. This allows you to reflect reporting lines and maintain a clear, structured overview of your organization within OpenProject. You can also import an existing organization structure through [LDAP group synchronisation](ldap_docs_article). ' @@ -4275,7 +4275,7 @@ cs: label_manage: Spravovat label_manage_groups: Spravovat skupiny label_managed_repositories_vendor: Spravováno %{vendor} repozitářů - label_mathematical_operators: Mathematical operators + label_mathematical_operators: Matematické operátory label_max_size: Maximální velikost label_me: já label_member_new: Nový člen @@ -4336,7 +4336,7 @@ cs: label_no_due_date: žádné datum dokončení label_no_start_date: žádné datum začátku label_no_parent_page: Žádná nadřazená stránka - label_no_parent_group: "(No parent group)" + label_no_parent_group: "(Žádná nadřazená skupina)" label_notification_center_plural: Notifikace label_nothing_display: Nic k zobrazení label_nobody: nikdo @@ -4398,7 +4398,7 @@ cs: label_preview_not_available: Náhled není k dispozici label_previous: Předchozí label_previous_week: Předchozí týden - label_previous_year: Previous year + label_previous_year: Předchozí rok label_principal_invite_via_email: " nebo pozvat nové uživatele e-mailem" label_principal_search: Přidat existující uživatele nebo skupiny label_privacy_policy: Zásady ochrany soukromí a bezpečnosti údajů @@ -4412,7 +4412,7 @@ cs: label_project_attribute_manage_link: Správa atributů produktu label_project_count: Celkový počet projektů label_project_copy_notifications: Během kopie projektu odeslat oznámení e-mailem - label_project_initiation_export_pdf: Export PDF for %{project_creation_name} + label_project_initiation_export_pdf: Export PDF pro %{project_creation_name} label_project_latest: Nejnovější projekty label_project_default_type: Povolit prázdný typ label_project_hierarchy: Hierarchie projektu @@ -4420,14 +4420,14 @@ cs: label_project_new: Nový projekt label_project_plural: Projekty label_project_list_plural: Seznamy projektů - label_reserved_identifiers: Reserved project identifiers + label_reserved_identifiers: Rezervované identifikátory projektů label_project_life_cycle: Životní cyklus projektu label_project_attributes_plural: Atributy projektu label_project_custom_field_plural: Atributy projektu label_project_settings: Nastavení projektu label_project_attributes_settings: '' label_project_storage_plural: Úložiště souborů - label_project_storage_project_folder: 'File storages: Project folders' + label_project_storage_project_folder: 'Úložiště souborů: Složky projektů' label_projects_disk_usage_information: "%{count} projekty využívající diskový prostor %{used_disk_space}" label_project_view_all: Zobrazit všechny projekty - seznam label_project_show_details: Zobrazit detail projektu @@ -4461,7 +4461,7 @@ cs: label_report: Hlášení label_report_bug: Nahlásit chybu label_report_plural: Hlášení - label_reported_work_packages: Nahlášené pracovní balíčky + label_reported_work_packages: Hlášené pracovní balíčky label_reporting: Hlášení label_reporting_plural: Hlášení label_repository: Repozitář @@ -4484,7 +4484,7 @@ cs: label_role_new: Nová role label_role_grantable: Udělitelná role label_role_plural: Role - label_role_missing_permissions: "%{role} (missing required permissions)" + label_role_missing_permissions: "%{role} (chybí požadovaná oprávnění)" label_role_search: Přiřadit roli novým členům label_scm: SCM label_scroll_left: Rolovat vlevo @@ -4587,7 +4587,7 @@ cs: label_what_is_this: Co to je? label_week: Týden label_widget: Widget - label_widget_new: New widget + label_widget_new: Nový widget label_wiki_content_added: Přidána stránka wiki label_wiki_content_updated: Wiki stránka aktualizována label_wiki_toc: Obsah @@ -4634,9 +4634,9 @@ cs: other: "%{count} komentáře" zero: žádné komentáře label_x_items: - one: 1 item - other: "%{count} items" - zero: no items + one: 1 položka + other: "%{count} položek" + zero: žádné položky label_x_open_work_packages_abbr: one: 1 otevřený other: "%{count} otevřených" @@ -4654,20 +4654,25 @@ cs: other: "%{count} souborů" zero: žádné soubory label_x_days: - one: 1 day - few: "%{count} days" - many: "%{count} days" - other: "%{count} days" + one: 1 den + few: "%{count} dny" + many: "%{count} dní" + other: "%{count} dní" label_x_working_days: - one: 1 working day - few: "%{count} working days" - many: "%{count} working days" - other: "%{count} working days" + one: 1 pracovní den + few: "%{count} pracovních dnů" + many: "%{count} pracovních dnů" + other: "%{count} pracovních dnů" label_x_working_days_time_off: - one: 'Time off: 1 working day' - few: 'Time off: %{count} working days' - many: 'Time off: %{count} working days' - other: 'Time off: %{count} working days' + one: 'Volno: 1 pracovní den' + few: 'Volno: %{count} pracovních dní' + many: 'Volno: %{count} pracovních dní' + other: 'Volno: %{count} pracovních dní' + label_x_items_selected: + one: One item selected + few: "%{count} items selected" + many: "%{count} items selected" + other: "%{count} items selected" label_yesterday: včera label_zen_mode: Zen mód label_role_type: Typ @@ -4675,7 +4680,7 @@ cs: label_global_role: Globální role label_not_changeable: "(neměnitelné)" label_global: Globální - label_seeded_from_env_warning: This record has been created through a setting environment variable. It is not editable through UI. + label_seeded_from_env_warning: Tento záznam byl vytvořen prostřednictvím proměnné prostředí. Nelze jej upravovat prostřednictvím uživatelského rozhraní. label_schedule_and_availability: Rozvrh a dostupnost label_working_hours: Pracovní rozvrh label_non_working_days: Kalendář dostupnosti @@ -4685,8 +4690,8 @@ cs: button_edit_non_working_time: Upravit volno label_continued_from_previous_year: pokračování z předchozího roku label_continues_into_next_year: pokračování do dalšího roku - label_end_date: Finish date - label_working_days: Working days + label_end_date: Datum ukončení + label_working_days: Pracovní dny label_non_working_times_with_count: Volna v roce %{year} (%{count}) label_non_working_times_summary: Souhrn roku %{year} label_total_user_non_working_times: Osobní nepracovní dny @@ -4694,7 +4699,7 @@ cs: label_total_days_off: Celkový počet dnů volna macro_execution_error: Chyba při provádění makra %{macro_name} macro_unavailable: Makro %{macro_name} nelze zobrazit. - macro_unknown: Unknown or unsupported macro. + macro_unknown: Neznámé nebo nepodporované makro. macros: placeholder: "[Placeholder] Macro %{macro_name}" errors: @@ -4762,7 +4767,7 @@ cs: allowed_actions_html: 'You have the following permissions on this work package: %{allowed_actions}. This can change depending on your project role and permissions.' create_account: Pro přístup k tomuto pracovnímu balíčku musíte vytvořit a aktivovat účet na %{instance}. open_work_package: Otevřít pracovní balíček - subject: Work package %{id} was shared with you + subject: Pracovní balíček %{id} byl s vámi sdílen enterprise_text: Sdílejte pracovní balíčky s uživateli, kteří nejsou členy projektu. summary: user: "%{user} s vámi sdílel pracovní balíček s právy %{role_rights}" @@ -4777,12 +4782,12 @@ cs: recommendation: Budeme i nadále monitorovat systém, abychom zajistili, že zůstane v dobrém stavu. V případě jakýchkoli nesrovnalostí vás budeme informovat. details: Pro více podrobností nebo pro provedení nezbytných změn můžete navštívit konfiguraci úložiště unhealthy: - summary: The status of your storage, %{storage_name}, is currently displaying as "Error". We've detected an issue that might require your attention. + summary: Stav vašeho úložiště, %{storage_name}, se aktuálně zobrazuje jako "Chybný". Zjistili jsme problém, který by mohl vyžadovat vaši pozornost. error-details: Podrobnosti o chybě error-message: '' error-occurred-on: Vyskytlo se - recommendation: We recommend heading over to the storage configuration page to address this issue - unsubscribe: If you would no longer like to receive these notifications, you can unsubscribe at any time. To unsubscribe, please follow the instructions on this page + recommendation: Doporučujeme přejít na stránku konfigurace úložiště a tento problém vyřešit + unsubscribe: Pokud si již nepřejete dostávat tato oznámení, můžete se z odběru kdykoli odhlásit. Chcete-li se odhlásit, postupujte podle pokynů na této stránce email_notification_settings: Nastavení e-mailových oznámení o úložišti see_storage_settings: Zobrazit nastavení úložiště healthy: @@ -4978,11 +4983,11 @@ cs: common: work_package_card_component: drag_handle: - label: Drag to reorder + label: Přesuňte tažením menu: - label_actions: Work package actions - parent: Parent - undisclosed: Undisclosed + label_actions: Operace na pracovním balíčku + parent: Nadřazený + undisclosed: Nezveřejněno permission_add_work_package_comments: Přidat komentáře permission_add_work_packages: Přidat pracovní balíčky permission_add_messages: Odesílat zprávy @@ -5018,12 +5023,12 @@ cs: permission_edit_work_package_comments_explanation: 'Caution: Users with this permission are able to edit anyone''s comment.' permission_edit_work_packages: Upravit pracovní balíčky permission_edit_messages: Upravit zprávy - permission_edit_own_internal_comments: Edit own internal comments + permission_edit_own_internal_comments: Úprava vlastních interních komentářů permission_edit_own_work_package_comments: Upravit vlastní komentáře permission_edit_own_messages: Upravit vlastní zprávy permission_edit_own_time_entries: Upravit vlastní časové záznamy - permission_edit_others_internal_comments: Moderate internal comments - permission_edit_others_internal_comments_explanation: 'Caution: Users with this permission are able to edit other users'' internal comments.' + permission_edit_others_internal_comments: Moderování interních komentářů + permission_edit_others_internal_comments_explanation: 'Upozornění: Uživatelé s tímto oprávněním mohou upravovat interní komentáře jiných uživatelů.' permission_edit_project: Upravit projekt permission_edit_project_attributes: Úprava atributů projektu permission_edit_project_phases: Upravit fáze projektu @@ -5145,9 +5150,9 @@ cs: warning_one: Členové projektu budou muset přemístit úložiště projektu. warning_two: Existující odkazy na projekt nebudou nadále fungovat. title: Změnit identifikátor projektu - not_available: Project N/A + not_available: Projekt N/A template: - copying_title: Applying template + copying_title: Aplikování šablony copying: 'Váš projekt se vytváří z vybranéhé šablony. Budete upozorněni e-mailem, jakmile bude projekt k dispozici. ' @@ -5160,7 +5165,7 @@ cs: project_module_news: Novinky project_module_repository: Repozitář project_module_wiki: Wiki - permission_header_for_project_module_work_package_tracking: Pracovní balíčky a Gantt diagramy + permission_header_for_project_module_work_package_tracking: Pracovní balíčky a Ganttovy diagramy query: attribute_and_direction: "%{attribute} (%{direction})" query_fields: @@ -5624,7 +5629,7 @@ cs: label: Boční panel description: Add all the project attributes in a section inside the right side panel in the project overview. project_initiation_request: - header_description: 'OpenProject can generate a step-by-step wizard to help project managers fill out a project initiation request. You can choose which project attributes should be included and create a PDF artifact as a result. + header_description: 'OpenProject umí vygenerovat průvodce krok za krokem, který projektovým manažerům pomůže vyplnit žádost o zahájení projektu. Můžete si vybrat, které atributy projektu se mají zahrnout, a jako výstup vytvořit PDF dokument. ' status: @@ -5706,8 +5711,8 @@ cs: work_package_identifier: Work package identifiers not_allowed_text: You do not have the necessary permissions to view this page. activities: - enable_internal_comments: Enable internal comments - helper_text_html: 'Internal comments allow an internal team to communicate amongst themselves privately. These are only visible to selected roles that have the necessary permissions and will not be visible publicly. [Click here to learn more](docs_url) + enable_internal_comments: Povolit interní komentáře + helper_text_html: 'Interní komentáře umožňují internímu týmu komunikovat mezi sebou soukromě. Jsou viditelné pouze pro vybrané role, které mají potřebná oprávnění, a nejsou viditelné veřejně. [Klikněte zde pro více informací](docs_url) ' text_formatting: @@ -5854,13 +5859,13 @@ cs: text_plugin_assets_writable: Zapisovatelný adresář aktiv pluginu text_powered_by: Běží na %{link} text_project_identifier_info: Jsou povolena pouze malá písmena (a-z), číslice, pomlčky a podtržítka. Musí začínat malým písmenem. - text_project_identifier_description: The project identifier is prepended to all work package IDs. If the identifier is "PROJ" for example, the work package identifier will be "PROJ-12" or "PROJ-246". + text_project_identifier_description: Identifikátor projektu je připojen ke všem ID pracovních balíčků. Např. Pokud je identifikátor "PROJ", bude identifikátor pracovního balíčku "PROJ-12" nebo "PROJ-246". text_project_identifier_url_description: The project identifier is included in the URL of the project. text_project_identifier_handle_format: Must start with a letter and contain only uppercase letters, numbers, and underscores (max 10 characters). text_project_identifier_format: Must start with a lowercase letter. Only lowercase letters (a-z), numbers, dashes and underscores are allowed. text_reassign: 'Přiřadit k pracovnímu balíčku:' text_regexp_multiline: 'regex je použit v režimu více řádků. např.: ^---\s+' - text_rename_wiki_page: Rename wiki page + text_rename_wiki_page: Přejmenovat wiki stránku text_repository_usernames_mapping: |- Vyberte nebo aktualizujte mapovaný uživatel OpenProject ke každému uživatelskému jménu nalezenému v protokolu repozitáře. Uživatelé se stejným OpenProject a repozitářovým jménem nebo e-mailem jsou automaticky mapováni. diff --git a/config/locales/crowdin/da.yml b/config/locales/crowdin/da.yml index a3611dfc43a..b9204856ebe 100644 --- a/config/locales/crowdin/da.yml +++ b/config/locales/crowdin/da.yml @@ -4531,6 +4531,9 @@ da: label_x_working_days_time_off: one: 'Time off: 1 working day' other: 'Time off: %{count} working days' + label_x_items_selected: + one: One item selected + other: "%{count} items selected" label_yesterday: I går label_zen_mode: Zen mode label_role_type: Type diff --git a/config/locales/crowdin/de.yml b/config/locales/crowdin/de.yml index f8259616a61..3070faa9b0b 100644 --- a/config/locales/crowdin/de.yml +++ b/config/locales/crowdin/de.yml @@ -141,7 +141,7 @@ de: custom_field_creation_failed: 'Das nutzerdefinierte Feld ''%{name}'' konnte nicht erstellt werden: %{message}' semantic_identifiers_must_be_enabled: title: Projektspezifische semantische Kennungen müssen aktiviert sein. - description: Jira uses issue identifiers consisting of a project key and a sequence number (PRJ-123). OpenProject also supports it, but it needs to be enabled [here](link). + description: Jira verwendet Ticketkennungen, die aus einem Projektschlüssel und einer Sequenznummer bestehen (PRJ-123). OpenProject unterstützt dies ebenfalls, die Funktion muss aber [hier aktiviert werden](link). blank: title: Noch keine Jira-Hosts konfiguriert description: Konfigurieren Sie einen Jira-Host, um mit dem Import von Elementen aus Jira in diese OpenProject-Instanz zu beginnen. @@ -1396,7 +1396,7 @@ de: untitled_group: Unbenannte Gruppe reset_title: Formularkonfiguration zurücksetzen confirm_reset: Sind Sie sicher, dass Sie die Konfiguration des Formulars zurücksetzen möchten? - builtin_field: Built-in field + builtin_field: Internes Attribut reset_description: 'Dadurch werden die Attribute auf ihre Standardgruppe zurückgesetzt und ALLE benutzerdefinierten Felder deaktiviert. ' @@ -2058,7 +2058,7 @@ de: priority: Priorität progress: "% abgeschlossen" readonly: Nur Lesezugriff - relatable: Relatable to + relatable: Beziehbar auf remaining_hours: Verbleibender Aufwand remaining_time: Verbleibender Aufwand sequence_number: Sequenznummer @@ -2421,7 +2421,7 @@ de: cannot_add_child_because_of_lack_of_permission: Sie können keine Unteraufgabe hinzufügen, weil Sie keine Berechtigung haben, das ausgewählte Arbeitspaket zu bearbeiten. blank: ID darf nicht leer sein. identifier: - semantic_identifier_incomplete: and sequence_number must both be set at the same time. + semantic_identifier_incomplete: und sequence_number müssen beide gleichzeitig gesetzt werden. assigned_to: format: "%{message}" done_ratio: @@ -2610,7 +2610,7 @@ de: unsupported_storage_type: ist kein unterstützter Speichertyp. storage_error: Es ist ein Fehler bei der Speicherverbindung aufgetreten. invalid_input: Die Eingabe ist ungültig. - invalid_child_for_parent: is not allowed as a parent for this view type. + invalid_child_for_parent: ist als übergeordnetes Element für diesen Ansichtstyp nicht zulässig. activity: item: created_by_on: erstellt von %{user} am %{datetime} @@ -4526,6 +4526,9 @@ de: label_x_working_days_time_off: one: 'Freie Zeit: 1 Arbeitstag' other: 'Freie Zeit: %{count} Arbeitstage' + label_x_items_selected: + one: One item selected + other: "%{count} items selected" label_yesterday: gestern label_zen_mode: Zen-Modus label_role_type: Typ @@ -4840,7 +4843,7 @@ de: menu: label_actions: Arbeitspaket-Aktionen parent: Übergeordnetes Arbeitspaket - undisclosed: Undisclosed + undisclosed: Nicht sichtbar permission_add_work_package_comments: Kommentare hinzufügen permission_add_work_packages: Arbeitspakete hinzufügen permission_add_messages: Forenbeiträge hinzufügen diff --git a/config/locales/crowdin/el.yml b/config/locales/crowdin/el.yml index 1c0f2246997..806442f878f 100644 --- a/config/locales/crowdin/el.yml +++ b/config/locales/crowdin/el.yml @@ -4531,6 +4531,9 @@ el: label_x_working_days_time_off: one: 'Time off: 1 working day' other: 'Time off: %{count} working days' + label_x_items_selected: + one: One item selected + other: "%{count} items selected" label_yesterday: χθες label_zen_mode: Zen mode label_role_type: Τύπος diff --git a/config/locales/crowdin/eo.yml b/config/locales/crowdin/eo.yml index 1e46efd3a12..bcefdc493e1 100644 --- a/config/locales/crowdin/eo.yml +++ b/config/locales/crowdin/eo.yml @@ -4532,6 +4532,9 @@ eo: label_x_working_days_time_off: one: 'Time off: 1 working day' other: 'Time off: %{count} working days' + label_x_items_selected: + one: One item selected + other: "%{count} items selected" label_yesterday: hieraŭ label_zen_mode: Zen mode label_role_type: Tipo diff --git a/config/locales/crowdin/es.yml b/config/locales/crowdin/es.yml index 6cded04c7a2..7820966a13e 100644 --- a/config/locales/crowdin/es.yml +++ b/config/locales/crowdin/es.yml @@ -4523,6 +4523,9 @@ es: label_x_working_days_time_off: one: 'Tiempo libre: 1 día laborable' other: 'Tiempo libre: %{count} días laborables' + label_x_items_selected: + one: One item selected + other: "%{count} items selected" label_yesterday: ayer label_zen_mode: Modo zen label_role_type: Tipo diff --git a/config/locales/crowdin/et.yml b/config/locales/crowdin/et.yml index efd4cba0616..dee84228258 100644 --- a/config/locales/crowdin/et.yml +++ b/config/locales/crowdin/et.yml @@ -4532,6 +4532,9 @@ et: label_x_working_days_time_off: one: 'Time off: 1 working day' other: 'Time off: %{count} working days' + label_x_items_selected: + one: One item selected + other: "%{count} items selected" label_yesterday: eile label_zen_mode: Keskendumise režiim label_role_type: Tüüp diff --git a/config/locales/crowdin/eu.yml b/config/locales/crowdin/eu.yml index b846ea5b048..bdf11e4b538 100644 --- a/config/locales/crowdin/eu.yml +++ b/config/locales/crowdin/eu.yml @@ -4532,6 +4532,9 @@ eu: label_x_working_days_time_off: one: 'Time off: 1 working day' other: 'Time off: %{count} working days' + label_x_items_selected: + one: One item selected + other: "%{count} items selected" label_yesterday: yesterday label_zen_mode: Zen mode label_role_type: Type diff --git a/config/locales/crowdin/fa.yml b/config/locales/crowdin/fa.yml index 1d9f750c7df..12a945a67f0 100644 --- a/config/locales/crowdin/fa.yml +++ b/config/locales/crowdin/fa.yml @@ -4532,6 +4532,9 @@ fa: label_x_working_days_time_off: one: 'Time off: 1 working day' other: 'Time off: %{count} working days' + label_x_items_selected: + one: One item selected + other: "%{count} items selected" label_yesterday: yesterday label_zen_mode: Zen mode label_role_type: نوع diff --git a/config/locales/crowdin/fi.yml b/config/locales/crowdin/fi.yml index a487d156940..3fc0bd9ecd6 100644 --- a/config/locales/crowdin/fi.yml +++ b/config/locales/crowdin/fi.yml @@ -4530,6 +4530,9 @@ fi: label_x_working_days_time_off: one: 'Time off: 1 working day' other: 'Time off: %{count} working days' + label_x_items_selected: + one: One item selected + other: "%{count} items selected" label_yesterday: eilen label_zen_mode: Zen mode label_role_type: Tyyppi diff --git a/config/locales/crowdin/fil.yml b/config/locales/crowdin/fil.yml index a38b8591747..5b9ea3711b3 100644 --- a/config/locales/crowdin/fil.yml +++ b/config/locales/crowdin/fil.yml @@ -4532,6 +4532,9 @@ fil: label_x_working_days_time_off: one: 'Time off: 1 working day' other: 'Time off: %{count} working days' + label_x_items_selected: + one: One item selected + other: "%{count} items selected" label_yesterday: kahapon label_zen_mode: Zen mode label_role_type: Uri diff --git a/config/locales/crowdin/fr.yml b/config/locales/crowdin/fr.yml index 43b25093a85..f10cfb47f0e 100644 --- a/config/locales/crowdin/fr.yml +++ b/config/locales/crowdin/fr.yml @@ -4525,6 +4525,9 @@ fr: label_x_working_days_time_off: one: 'Temps libre : 1 jour ouvrable' other: 'Temps libre : %{count} jours ouvrables' + label_x_items_selected: + one: One item selected + other: "%{count} items selected" label_yesterday: hier label_zen_mode: Mode zen label_role_type: Type diff --git a/config/locales/crowdin/he.yml b/config/locales/crowdin/he.yml index 1f42b02ea1f..13e0e6668ba 100644 --- a/config/locales/crowdin/he.yml +++ b/config/locales/crowdin/he.yml @@ -4666,6 +4666,11 @@ he: two: 'Time off: %{count} working days' many: 'Time off: %{count} working days' other: 'Time off: %{count} working days' + label_x_items_selected: + one: One item selected + two: "%{count} items selected" + many: "%{count} items selected" + other: "%{count} items selected" label_yesterday: אתמול label_zen_mode: Zen mode label_role_type: סוג diff --git a/config/locales/crowdin/hi.yml b/config/locales/crowdin/hi.yml index 764069f6ba0..aa4996d1bec 100644 --- a/config/locales/crowdin/hi.yml +++ b/config/locales/crowdin/hi.yml @@ -4532,6 +4532,9 @@ hi: label_x_working_days_time_off: one: 'Time off: 1 working day' other: 'Time off: %{count} working days' + label_x_items_selected: + one: One item selected + other: "%{count} items selected" label_yesterday: yesterday label_zen_mode: Zen mode label_role_type: प्रकार diff --git a/config/locales/crowdin/hr.yml b/config/locales/crowdin/hr.yml index ff401154ed7..2f15df5d5a4 100644 --- a/config/locales/crowdin/hr.yml +++ b/config/locales/crowdin/hr.yml @@ -4597,6 +4597,10 @@ hr: one: 'Time off: 1 working day' few: 'Time off: %{count} working days' other: 'Time off: %{count} working days' + label_x_items_selected: + one: One item selected + few: "%{count} items selected" + other: "%{count} items selected" label_yesterday: jučer label_zen_mode: Zen mode label_role_type: Tip diff --git a/config/locales/crowdin/hu.yml b/config/locales/crowdin/hu.yml index 8d90ae0c7d6..ab2fd39af19 100644 --- a/config/locales/crowdin/hu.yml +++ b/config/locales/crowdin/hu.yml @@ -4596,6 +4596,9 @@ hu: label_x_working_days_time_off: one: 'Time off: 1 working day' other: 'Time off: %{count} working days' + label_x_items_selected: + one: One item selected + other: "%{count} items selected" label_yesterday: tegnap label_zen_mode: Zen mode label_role_type: Típus diff --git a/config/locales/crowdin/hy.yml b/config/locales/crowdin/hy.yml index c1e8dc8b280..7de52b74825 100644 --- a/config/locales/crowdin/hy.yml +++ b/config/locales/crowdin/hy.yml @@ -4532,6 +4532,9 @@ hy: label_x_working_days_time_off: one: 'Time off: 1 working day' other: 'Time off: %{count} working days' + label_x_items_selected: + one: One item selected + other: "%{count} items selected" label_yesterday: yesterday label_zen_mode: Zen mode label_role_type: Type diff --git a/config/locales/crowdin/id.yml b/config/locales/crowdin/id.yml index 4c776529f83..15c5aeacacf 100644 --- a/config/locales/crowdin/id.yml +++ b/config/locales/crowdin/id.yml @@ -4476,6 +4476,8 @@ id: other: "%{count} working days" label_x_working_days_time_off: other: 'Time off: %{count} working days' + label_x_items_selected: + other: "%{count} items selected" label_yesterday: kemarin label_zen_mode: Zen mode label_role_type: Mengetik diff --git a/config/locales/crowdin/it.yml b/config/locales/crowdin/it.yml index 1e2254a0f56..2b63a2a71c0 100644 --- a/config/locales/crowdin/it.yml +++ b/config/locales/crowdin/it.yml @@ -4532,6 +4532,9 @@ it: label_x_working_days_time_off: one: 'Assenza: 1 giorno lavorativo' other: 'Assenza: %{count} giorni lavorativi' + label_x_items_selected: + one: One item selected + other: "%{count} items selected" label_yesterday: ieri label_zen_mode: Modalità Zen label_role_type: Tipo diff --git a/config/locales/crowdin/ja.yml b/config/locales/crowdin/ja.yml index c9c47a89b20..8f26d0e95ff 100644 --- a/config/locales/crowdin/ja.yml +++ b/config/locales/crowdin/ja.yml @@ -4468,6 +4468,8 @@ ja: other: "%{count} working days" label_x_working_days_time_off: other: 'Time off: %{count} working days' + label_x_items_selected: + other: "%{count} items selected" label_yesterday: 昨日 label_zen_mode: 禅モード label_role_type: 種別 diff --git a/config/locales/crowdin/ka.yml b/config/locales/crowdin/ka.yml index 126d28008ec..b6a0f07429d 100644 --- a/config/locales/crowdin/ka.yml +++ b/config/locales/crowdin/ka.yml @@ -4532,6 +4532,9 @@ ka: label_x_working_days_time_off: one: 'Time off: 1 working day' other: 'Time off: %{count} working days' + label_x_items_selected: + one: One item selected + other: "%{count} items selected" label_yesterday: გუშინ label_zen_mode: Zen mode label_role_type: ტიპი diff --git a/config/locales/crowdin/kk.yml b/config/locales/crowdin/kk.yml index fe1d67c3142..321648be5af 100644 --- a/config/locales/crowdin/kk.yml +++ b/config/locales/crowdin/kk.yml @@ -4532,6 +4532,9 @@ kk: label_x_working_days_time_off: one: 'Time off: 1 working day' other: 'Time off: %{count} working days' + label_x_items_selected: + one: One item selected + other: "%{count} items selected" label_yesterday: yesterday label_zen_mode: Zen mode label_role_type: Type diff --git a/config/locales/crowdin/ko.yml b/config/locales/crowdin/ko.yml index 07066540ba9..da27fe2eb38 100644 --- a/config/locales/crowdin/ko.yml +++ b/config/locales/crowdin/ko.yml @@ -4481,6 +4481,8 @@ ko: other: 근무일 %{count}일 label_x_working_days_time_off: other: '휴가: 근무일 %{count}일' + label_x_items_selected: + other: "%{count} items selected" label_yesterday: 어제 label_zen_mode: 젠 모드 label_role_type: 유형 diff --git a/config/locales/crowdin/lt.yml b/config/locales/crowdin/lt.yml index 9d07d113ca8..468d202a4dd 100644 --- a/config/locales/crowdin/lt.yml +++ b/config/locales/crowdin/lt.yml @@ -4665,6 +4665,11 @@ lt: few: 'Time off: %{count} working days' many: 'Time off: %{count} working days' other: 'Time off: %{count} working days' + label_x_items_selected: + one: One item selected + few: "%{count} items selected" + many: "%{count} items selected" + other: "%{count} items selected" label_yesterday: vakar label_zen_mode: "„Zen“ režimas" label_role_type: Tipas diff --git a/config/locales/crowdin/lv.yml b/config/locales/crowdin/lv.yml index c7393ab9520..9e35b5395d0 100644 --- a/config/locales/crowdin/lv.yml +++ b/config/locales/crowdin/lv.yml @@ -4599,6 +4599,10 @@ lv: zero: 'Time off: %{count} working days' one: 'Time off: 1 working day' other: 'Time off: %{count} working days' + label_x_items_selected: + zero: "%{count} items selected" + one: One item selected + other: "%{count} items selected" label_yesterday: yesterday label_zen_mode: Zen mode label_role_type: Veids diff --git a/config/locales/crowdin/mn.yml b/config/locales/crowdin/mn.yml index 48fa0bb8527..482ab1702b2 100644 --- a/config/locales/crowdin/mn.yml +++ b/config/locales/crowdin/mn.yml @@ -4532,6 +4532,9 @@ mn: label_x_working_days_time_off: one: 'Time off: 1 working day' other: 'Time off: %{count} working days' + label_x_items_selected: + one: One item selected + other: "%{count} items selected" label_yesterday: yesterday label_zen_mode: Zen mode label_role_type: Type diff --git a/config/locales/crowdin/ms.yml b/config/locales/crowdin/ms.yml index 097e250325c..07e86a4c443 100644 --- a/config/locales/crowdin/ms.yml +++ b/config/locales/crowdin/ms.yml @@ -4477,6 +4477,8 @@ ms: other: "%{count} working days" label_x_working_days_time_off: other: 'Time off: %{count} working days' + label_x_items_selected: + other: "%{count} items selected" label_yesterday: semalam label_zen_mode: Mod Zen label_role_type: Jenis diff --git a/config/locales/crowdin/ne.yml b/config/locales/crowdin/ne.yml index 68ce0448729..0581ba0c0c8 100644 --- a/config/locales/crowdin/ne.yml +++ b/config/locales/crowdin/ne.yml @@ -4532,6 +4532,9 @@ ne: label_x_working_days_time_off: one: 'Time off: 1 working day' other: 'Time off: %{count} working days' + label_x_items_selected: + one: One item selected + other: "%{count} items selected" label_yesterday: yesterday label_zen_mode: Zen mode label_role_type: Type diff --git a/config/locales/crowdin/nl.yml b/config/locales/crowdin/nl.yml index f357f1b9292..b08b2e13e37 100644 --- a/config/locales/crowdin/nl.yml +++ b/config/locales/crowdin/nl.yml @@ -4528,6 +4528,9 @@ nl: label_x_working_days_time_off: one: 'Time off: 1 working day' other: 'Time off: %{count} working days' + label_x_items_selected: + one: One item selected + other: "%{count} items selected" label_yesterday: gisteren label_zen_mode: Zen mode label_role_type: Type diff --git a/config/locales/crowdin/no.yml b/config/locales/crowdin/no.yml index 1ee30f293ad..df6edeef588 100644 --- a/config/locales/crowdin/no.yml +++ b/config/locales/crowdin/no.yml @@ -4530,6 +4530,9 @@ label_x_working_days_time_off: one: 'Time off: 1 working day' other: 'Time off: %{count} working days' + label_x_items_selected: + one: One item selected + other: "%{count} items selected" label_yesterday: i går label_zen_mode: Zen-modus label_role_type: Type diff --git a/config/locales/crowdin/pl.yml b/config/locales/crowdin/pl.yml index 8477ea1f08b..e84d18623dd 100644 --- a/config/locales/crowdin/pl.yml +++ b/config/locales/crowdin/pl.yml @@ -4658,6 +4658,11 @@ pl: few: 'Czas wolny: %{count} dni robocze' many: 'Czas wolny: %{count} dni roboczych' other: 'Czas wolny: %{count} dnia roboczego' + label_x_items_selected: + one: One item selected + few: "%{count} items selected" + many: "%{count} items selected" + other: "%{count} items selected" label_yesterday: wczoraj label_zen_mode: Tryb Zen label_role_type: Typ diff --git a/config/locales/crowdin/pt-BR.yml b/config/locales/crowdin/pt-BR.yml index 2c80fc14092..9fc6269238b 100644 --- a/config/locales/crowdin/pt-BR.yml +++ b/config/locales/crowdin/pt-BR.yml @@ -4529,6 +4529,9 @@ pt-BR: label_x_working_days_time_off: one: 'Dia de folga: 1 dia útil' other: 'Dia de folga: %{count} dias úteis' + label_x_items_selected: + one: One item selected + other: "%{count} items selected" label_yesterday: ontem label_zen_mode: Modo Zen label_role_type: Tipo diff --git a/config/locales/crowdin/pt-PT.yml b/config/locales/crowdin/pt-PT.yml index 09267170605..262454aebf6 100644 --- a/config/locales/crowdin/pt-PT.yml +++ b/config/locales/crowdin/pt-PT.yml @@ -4530,6 +4530,9 @@ pt-PT: label_x_working_days_time_off: one: 'Ausência: 1 dia útil' other: 'Ausência: %{count} dias úteis' + label_x_items_selected: + one: One item selected + other: "%{count} items selected" label_yesterday: ontem label_zen_mode: Modo Zen label_role_type: Tipo diff --git a/config/locales/crowdin/ro.yml b/config/locales/crowdin/ro.yml index fb23d7d2a71..ef9e713c897 100644 --- a/config/locales/crowdin/ro.yml +++ b/config/locales/crowdin/ro.yml @@ -4599,6 +4599,10 @@ ro: one: 'Time off: 1 working day' few: 'Time off: %{count} working days' other: 'Time off: %{count} working days' + label_x_items_selected: + one: One item selected + few: "%{count} items selected" + other: "%{count} items selected" label_yesterday: ieri label_zen_mode: Zen mode label_role_type: Tip diff --git a/config/locales/crowdin/ru.yml b/config/locales/crowdin/ru.yml index 961654b8a3c..31b4ac19831 100644 --- a/config/locales/crowdin/ru.yml +++ b/config/locales/crowdin/ru.yml @@ -4669,6 +4669,11 @@ ru: few: 'Время отдыха: %{count} рабочих дней' many: 'Время отдыха: %{count} рабочих дней' other: 'Время отдыха: %{count} рабочих дней' + label_x_items_selected: + one: One item selected + few: "%{count} items selected" + many: "%{count} items selected" + other: "%{count} items selected" label_yesterday: вчера label_zen_mode: Режим «Дзен» (только доска и часы) label_role_type: Тип diff --git a/config/locales/crowdin/rw.yml b/config/locales/crowdin/rw.yml index 8b83eeb1088..ee01c1ff03c 100644 --- a/config/locales/crowdin/rw.yml +++ b/config/locales/crowdin/rw.yml @@ -4532,6 +4532,9 @@ rw: label_x_working_days_time_off: one: 'Time off: 1 working day' other: 'Time off: %{count} working days' + label_x_items_selected: + one: One item selected + other: "%{count} items selected" label_yesterday: yesterday label_zen_mode: Zen mode label_role_type: Type diff --git a/config/locales/crowdin/si.yml b/config/locales/crowdin/si.yml index 0c9e165845f..26083e82ace 100644 --- a/config/locales/crowdin/si.yml +++ b/config/locales/crowdin/si.yml @@ -4532,6 +4532,9 @@ si: label_x_working_days_time_off: one: 'Time off: 1 working day' other: 'Time off: %{count} working days' + label_x_items_selected: + one: One item selected + other: "%{count} items selected" label_yesterday: ඊයේ label_zen_mode: Zen mode label_role_type: වර්ගය diff --git a/config/locales/crowdin/sk.yml b/config/locales/crowdin/sk.yml index 31593669c1c..681e361bc94 100644 --- a/config/locales/crowdin/sk.yml +++ b/config/locales/crowdin/sk.yml @@ -4664,6 +4664,11 @@ sk: few: 'Time off: %{count} working days' many: 'Time off: %{count} working days' other: 'Time off: %{count} working days' + label_x_items_selected: + one: One item selected + few: "%{count} items selected" + many: "%{count} items selected" + other: "%{count} items selected" label_yesterday: včera label_zen_mode: Zen mode label_role_type: Typ diff --git a/config/locales/crowdin/sl.yml b/config/locales/crowdin/sl.yml index 57d04cf726a..41c49e64a91 100644 --- a/config/locales/crowdin/sl.yml +++ b/config/locales/crowdin/sl.yml @@ -4679,6 +4679,11 @@ sl: two: 'Time off: %{count} working days' few: 'Time off: %{count} working days' other: 'Time off: %{count} working days' + label_x_items_selected: + one: One item selected + two: "%{count} items selected" + few: "%{count} items selected" + other: "%{count} items selected" label_yesterday: včeraj label_zen_mode: Zen mode label_role_type: Vrsta diff --git a/config/locales/crowdin/sr.yml b/config/locales/crowdin/sr.yml index 62b2f8b1540..0a5245e465d 100644 --- a/config/locales/crowdin/sr.yml +++ b/config/locales/crowdin/sr.yml @@ -4599,6 +4599,10 @@ sr: one: 'Time off: 1 working day' few: 'Time off: %{count} working days' other: 'Time off: %{count} working days' + label_x_items_selected: + one: One item selected + few: "%{count} items selected" + other: "%{count} items selected" label_yesterday: yesterday label_zen_mode: Zen mode label_role_type: Type diff --git a/config/locales/crowdin/sv.yml b/config/locales/crowdin/sv.yml index 8d5ce2c4eea..9c332e91fd5 100644 --- a/config/locales/crowdin/sv.yml +++ b/config/locales/crowdin/sv.yml @@ -4532,6 +4532,9 @@ sv: label_x_working_days_time_off: one: 'Time off: 1 working day' other: 'Time off: %{count} working days' + label_x_items_selected: + one: One item selected + other: "%{count} items selected" label_yesterday: igår label_zen_mode: Zen-läge label_role_type: Typ diff --git a/config/locales/crowdin/th.yml b/config/locales/crowdin/th.yml index c28bd1308f9..86825024eaf 100644 --- a/config/locales/crowdin/th.yml +++ b/config/locales/crowdin/th.yml @@ -4465,6 +4465,8 @@ th: other: "%{count} working days" label_x_working_days_time_off: other: 'Time off: %{count} working days' + label_x_items_selected: + other: "%{count} items selected" label_yesterday: เมื่อวานนี้ label_zen_mode: Zen mode label_role_type: ประเภท diff --git a/config/locales/crowdin/tr.yml b/config/locales/crowdin/tr.yml index 31462578c0d..8a437539355 100644 --- a/config/locales/crowdin/tr.yml +++ b/config/locales/crowdin/tr.yml @@ -4537,6 +4537,9 @@ tr: label_x_working_days_time_off: one: 'Time off: 1 working day' other: 'Time off: %{count} working days' + label_x_items_selected: + one: One item selected + other: "%{count} items selected" label_yesterday: dün label_zen_mode: Zen modu label_role_type: Tür diff --git a/config/locales/crowdin/uk.yml b/config/locales/crowdin/uk.yml index 8aff42d5de0..77e72dab136 100644 --- a/config/locales/crowdin/uk.yml +++ b/config/locales/crowdin/uk.yml @@ -4665,6 +4665,11 @@ uk: few: 'Вільний час: %{count} робочих дні' many: 'Вільний час: %{count} робочих днів' other: 'Вільний час: %{count} робочого дня' + label_x_items_selected: + one: One item selected + few: "%{count} items selected" + many: "%{count} items selected" + other: "%{count} items selected" label_yesterday: вчора label_zen_mode: Режим «Дзен» label_role_type: Тип diff --git a/config/locales/crowdin/uz.yml b/config/locales/crowdin/uz.yml index 614375e0d73..c5a8e864dae 100644 --- a/config/locales/crowdin/uz.yml +++ b/config/locales/crowdin/uz.yml @@ -4532,6 +4532,9 @@ uz: label_x_working_days_time_off: one: 'Time off: 1 working day' other: 'Time off: %{count} working days' + label_x_items_selected: + one: One item selected + other: "%{count} items selected" label_yesterday: yesterday label_zen_mode: Zen mode label_role_type: Type diff --git a/config/locales/crowdin/vi.yml b/config/locales/crowdin/vi.yml index 3e29fa69a75..e996432403b 100644 --- a/config/locales/crowdin/vi.yml +++ b/config/locales/crowdin/vi.yml @@ -4467,6 +4467,8 @@ vi: other: "%{count} working days" label_x_working_days_time_off: other: 'Time off: %{count} working days' + label_x_items_selected: + other: "%{count} items selected" label_yesterday: ngày hôm qua label_zen_mode: Chế độ Zen label_role_type: loại diff --git a/config/locales/crowdin/zh-CN.yml b/config/locales/crowdin/zh-CN.yml index 47a0b272bb5..729f05dab14 100644 --- a/config/locales/crowdin/zh-CN.yml +++ b/config/locales/crowdin/zh-CN.yml @@ -4465,6 +4465,8 @@ zh-CN: other: "%{count} 个工作日" label_x_working_days_time_off: other: 休息时间:%{count} 个工作日 + label_x_items_selected: + other: "%{count} items selected" label_yesterday: 昨天 label_zen_mode: 极简模式 label_role_type: 类型 diff --git a/config/locales/crowdin/zh-TW.yml b/config/locales/crowdin/zh-TW.yml index 18c7f27766d..0907e908cd0 100644 --- a/config/locales/crowdin/zh-TW.yml +++ b/config/locales/crowdin/zh-TW.yml @@ -4459,6 +4459,8 @@ zh-TW: other: "%{count} working days" label_x_working_days_time_off: other: 'Time off: %{count} working days' + label_x_items_selected: + other: "%{count} items selected" label_yesterday: 昨天 label_zen_mode: 禪意模式 label_role_type: 類型 diff --git a/modules/auth_saml/config/locales/crowdin/de.yml b/modules/auth_saml/config/locales/crowdin/de.yml index d9ba5cb1411..da532a7c777 100644 --- a/modules/auth_saml/config/locales/crowdin/de.yml +++ b/modules/auth_saml/config/locales/crowdin/de.yml @@ -12,7 +12,7 @@ de: sp_entity_id: Entity-ID des Services metadata_url: Metadaten-URL des Identitätsanbieters name_identifier_format: Format der Namenskennung - idp_entity_id: Identity provider entity ID + idp_entity_id: Entity-ID des Identitätsanbieters idp_sso_service_url: Endpunkt für die Anmeldung beim Identitätsanbieter idp_slo_service_url: Endpunkt für die Abmeldung beim Identitätsanbieter idp_cert: Öffentliches Zertifikat des Identitätsanbieters @@ -45,10 +45,10 @@ de: success: Die Konfiguration wurde unter Verwendung der Metadaten des Identitätsanbieters erfolgreich aktualisiert. invalid_url: Die angegebene Metadaten-URL ist ungültig. Geben Sie eine HTTP(s)-URL an. error: 'Abrufen der Metadaten des Identitätsanbieters fehlgeschlagen: %{error}' - federation_metadata: 'The metadata URL points to a federation aggregate (many identity providers). Use your institution''s direct metadata URL, or enter your institution''s IdP entity ID in the metadata form and try again. + federation_metadata: 'Die Metadaten-URL verweist auf eine Aggregation vieler Identitätsanbieter. Verwenden Sie die direkte Metadaten-URL Ihrer Einrichtung oder geben Sie die IdP-Entity-ID Ihrer Einrichtung in das Metadatenformular ein und versuchen Sie es erneut. ' - metadata_too_large: The metadata file exceeds the maximum allowed size. + metadata_too_large: Die Metadaten-Datei überschreitet die maximal zulässige Größe. providers: label_empty_title: Noch keine SAML-Anbieter konfiguriert. label_empty_description: Fügen Sie einen Anbieter hinzu, um sie hier zu sehen. @@ -116,7 +116,7 @@ de: metadata_url: 'Ihr Identitätsanbieter stellt eine Metadaten-URL zur Verfügung. ' - idp_entity_id: 'Optional: Useful when the metadata URL points to a federation aggregate with a lot of entries. Enter the entity ID of your institution''s identity provider. Leave blank for single-entity metadata URLs. + idp_entity_id: 'Optional: Nützlich, wenn die Metadaten-URL auf eine Aggregation vieler Identitätsanbieter verweist. Geben Sie die Entity-ID des Identitätsanbieters Ihrer Institution ein. Wenn Sie diese Aggregation nicht verwenden, können Sie dieses Feld freilassen. ' metadata_xml: 'Ihr Identitätsanbieter bietet einen XML-Download für Metadaten an. diff --git a/modules/backlogs/config/locales/crowdin/cs.yml b/modules/backlogs/config/locales/crowdin/cs.yml index 2e366c410c1..b74b2d748de 100644 --- a/modules/backlogs/config/locales/crowdin/cs.yml +++ b/modules/backlogs/config/locales/crowdin/cs.yml @@ -87,7 +87,7 @@ cs: sprint: Sprint backlogs: administration_blankslate: - title: Backlog admin settings are evolving + title: Nastavení backlogu se vyvíjí text: V současné době přepracováváme modul Backlogů. V blízké budoucnosti zde budou viditelná administrátorská nastavení pro sprinty a backlogy. Nastavení na úrovni projektů zůstávají k dispozici. bucket_destroy_modal_component: title: Smazat sekci backlogu? @@ -101,9 +101,9 @@ cs: delete_backlog_bucket: Smazat sekci backlogu burndown_chart: show: - blankslate_title: No burndown data available - blankslate_description: Set start and end date for the sprint to generate a burndown chart. - excluded_work_package_types_caption: 'Choose which work package types to hide from the backlog. Items of the selected types will not appear in the backlog automatically, keeping it focused on the work that matters to your team. For example, types like Epics or Milestones that are managed at a higher level can be hidden to keep the backlog focused on actionable items. + blankslate_title: Nedostupná data pro Burndown + blankslate_description: Nastavte datum začátku a konce sprintu pro vygenerování Burndown grafu. + excluded_work_package_types_caption: 'Zvolte, které typy pracovních balíčků se mají skrýt z backlogu. Položky vybraných typů se v backlogu automaticky nezobrazí, takže zůstane soustředěn na práci, která je pro váš tým důležitá. Například typy jako Epicy nebo Milníky, které jsou řízeny na vyšší úrovni, lze skrýt, aby se backlog soustředil na položky, které lze realizovat. ' finish_sprint_dialog_component: @@ -117,19 +117,19 @@ cs: select_sprint_label: Vyberte sprint button_complete_sprint: Dokončit sprint inbox_component: - title: Inbox - blankslate_title: Backlog inbox is empty + title: Příchozí + blankslate_title: Žádné příchozí položky blankslate_description: Zde se automaticky zobrazí všechny otevřené pracovní balíčky tohoto projektu. show_more: - one: Show 1 more item - few: Show %{count} more items - many: Show %{count} more items - other: Show %{count} more items - label_burndown_chart: Burndown chart + one: Zobrazit ještě 1 položku + few: Zobrazit ještě %{count} položek + many: Zobrazit ještě %{count} položek + other: Zobrazit ještě %{count} položek + label_burndown_chart: Graf Burndown label_is_done_status: Stav %{status_name} znamená hotovo label_sprint_board: Sprint board move_to_bucket_dialog_component: - title: Move to backlog bucket + title: Přesunout do sekce backlogu move_to_sprint_dialog_component: title: Přesunout do sprintu label_sprint: Sprint @@ -144,73 +144,73 @@ cs: rebuild_positions: Znovu sestavit pozice remaining_hours: Zbývající práce sharing: Sdílení - show_burndown_chart: Burndown chart + show_burndown_chart: Graf Burndown sprint_component: blankslate_title: "%{name} je prázdný" blankslate_description: Zatím nejsou naplánovány žádné položky. Přetažením položek sem je přidáte. - label_actions: Sprint actions - label_start_sprint: Start sprint - label_complete_sprint: Complete sprint - start_sprint_disabled_reason_active_sprint: Another sprint is already active. - start_sprint_disabled_reason_missing_dates: Start and finish dates are required in order to start the sprint. + label_actions: Operace sprintu + label_start_sprint: Zahájit sprint + label_complete_sprint: Dokončit sprint + start_sprint_disabled_reason_active_sprint: Jiný sprint je již aktivní. + start_sprint_disabled_reason_missing_dates: Pro zahájení sprintu je nutné datum zahájení a ukončení. action_menu: - edit_sprint: Edit sprint - add_work_package: Add work package + edit_sprint: Upravit sprint + add_work_package: Přidat pracovní balíček sprints_component: blankslate: - title: No sprints present yet - settings_link_text: project settings - receive_and_manage_description_html: This project receives sprints from a different project. Manage this in the %{settings_link}. - receive_description_text: This project receives shared sprints from a different project, but none are available right now. - create_and_manage_description_html: To start planning your sprint, create one here or go to the %{settings_link} to receive sprints from a different project. - create_description_text: To start planning your sprint, create one here. - manage_description_html: To start planning your sprint, go to the %{settings_link} to receive sprints from a different project. - no_actions_description_text: No sprints are available for this project yet. + title: Zatím nejsou přítomny žádné sprinty + settings_link_text: nastavení projektu + receive_and_manage_description_html: Tento projekt přijímá sprinty z jiného projektu. Spravujte je v %{settings_link}. + receive_description_text: Tento projekt přijímá sdílené sprinty z jiného projektu, ale žádný není momentálně k dispozici. + create_and_manage_description_html: Chcete-li začít plánovat svůj sprint, vytvořte si jeden zde, nebo přejděte na %{settings_link}, abyste mohli dostávat sprinty z jiného projektu. + create_description_text: Chcete-li začít plánovat sprint, vytvořte si ho zde. + manage_description_html: Chcete-li začít plánovat sprint, přejděte na stránku %{settings_link} a získejte sprinty z jiného projektu. + no_actions_description_text: Pro tento projekt zatím nejsou k dispozici žádné sprinty. story_points: one: "%{count} story point" - few: "%{count} story points" - many: "%{count} story points" - other: "%{count} story points" - statuses_considered_closed_caption: 'Choose the statuses that represent a closed or finished state in your workflow. These will be treated as the "Closed" state across reporting (e.g. burndown) and sprint planning. For example, statuses like Done, Resolved, or Won''t Fix may all represent a closed work item in your process. + few: "%{count} story pointy" + many: "%{count} story pointy" + other: "%{count} story pointy" + statuses_considered_closed_caption: 'Vyberte stavy, které představují uzavřený nebo dokončený stav vašeho pracovního postupu. Tyto stavy budou považovány za stav "Uzavřeno" v rámci reportingu (např. Burndown) a plánování sprintu. Například stavy jako "Hotovo", "Vyřešeno" nebo "Nebude opraveno" mohou ve vašem procesu představovat uzavřenou pracovní položku. ' - types_and_statuses: Types and statuses + types_and_statuses: Typy a stavy unassigned: Nepřiřazeno user_preference: header_backlogs: Modul backlogů button_update_backlogs: Upravit backlog modul stories: update_service: - missing_target: target_id or direction must be present. - ambiguous_target: target_id and direction cannot both be present. - invalid_target_type: 'target_type must be one of: backlog_bucket:, sprint:, inbox.' - invalid_direction: 'direction must be one of: higher, highest, lower, lowest.' + missing_target: musí být přítomno target_id nebo direction. + ambiguous_target: target_id a direction nemohou být přítomny zároveň. + invalid_target_type: 'target_type musí být jeden z následujících: backlog_bucket:, sprint:, inbox.' + invalid_direction: 'směr musí být jeden z následujících: vyšší, nejvyšší, nižší, nejnižší.' work_package_card_menu_component: action_menu: - copy_url_to_clipboard: Copy URL to clipboard - copy_work_package_id: Copy work package ID - move_menu: Move - move_to_backlog_bucket: Move to backlog bucket - move_to_inbox: Move to inbox - move_to_sprint: Move to sprint + copy_url_to_clipboard: Kopírovst adresu URL + copy_work_package_id: Kopírovat ID pracovního balíčku + move_menu: Přesunout + move_to_backlog_bucket: Přesunout do sekce backlogu + move_to_inbox: Přesunout do Příchozích + move_to_sprint: Přesunout do sprintu work_package_is_closed: Pracovní balíček je hotov, když burndown: - story_points: Story points - story_points_ideal: Story points (ideal) + story_points: Story pointy + story_points_ideal: Story pointy (ideální) ee: features: - sprint_sharing: Sprint sharing + sprint_sharing: Sdílení sprintu upsell: sprint_sharing: - description: Share sprints across projects to align teams and coordinate work in scaled agile setups (SAFe). - label_all_sprints: All sprints + description: Sdílení sprintů napříč projekty za účelem sladění týmů a koordinace práce v rámci škálovaných agilních prostředí (SAFe). + label_all_sprints: Všechny sprinty label_backlog: Backlog label_backlogs: Backlogy label_backlog_and_sprints: Backlogy a sprinty - label_backlog_bucket_edit: Edit backlog bucket - label_backlog_bucket_new: New backlog bucket - label_burndown_chart: Burndown chart - label_inbox: Inbox + label_backlog_bucket_edit: Upravit sekci backlogu + label_backlog_bucket_new: Nová sekce backlogu + label_burndown_chart: Graf Burndown + label_inbox: Příchozí label_sprint_board: Sprint board label_points_burn_down: Dolů label_points_burn_up: Nahoru @@ -223,12 +223,12 @@ cs: notice_unsuccessful_start_with_reason: 'Sprint nebylo možné zahájit: %{reason}' notice_unsuccessful_finish: Sprint nebylo možné dokončit. notice_unsuccessful_finish_with_reason: 'Sprint nebylo možné dokončit: %{reason}' - notice_work_package_invisible_after_move: 'The work package was moved to %{backlog} but is not visible because its type or status is excluded from the backlog. + notice_work_package_invisible_after_move: 'Pracovní balíček byl přesunut do %{backlog}, ale není viditelný, protože jeho typ nebo stav je vyloučen z backlogu. ' permission_create_sprints: Vytváření sprintů permission_manage_sprint_items: Správa položek sprintu - permission_select_backlog_types_and_statuses: Select backlog types and statuses + permission_select_backlog_types_and_statuses: Vyberte typy a stavy backlogu permission_select_backlog_types_and_statuses_explanation: 'Allows choosing which work package types to hide from the backlog. Also allows defining which statuses represent a closed or finished state in the project''s workflow. ' @@ -250,7 +250,7 @@ cs: share_all_projects: label: Všechny projekty caption: Sprinty vytvořené v tomto projektu budou dostupné pro všechny projekty v této instanci. Pokud tuto možnost vyberete, nebudou již dostupná pro ostatní projekty. - disabled_caption: Option not available since project "%{name}" is currently sharing with all projects and only one project can do this. + disabled_caption: Tato možnost není k dispozici, protože projekt ''%{name}" momentálně sdílí se všemi projekty, což může dělat pouze jeden projekt. disabled_caption_anonymous: Tato možnost není k dispozici, protože jiný projekt je v současné době sdílen se všemi projekty a tuto možnost může použít pouze jeden projekt. share_subprojects: label: Podprojekty @@ -260,5 +260,5 @@ cs: backlogs: sharing_form_component: sharing_description: Tento projekt může buď sdílet vlastní sprinty, přijímat sdílené sprinty, nebo sprinty zpracovávat samostatně (bez sdílení). - sharing_fallback_description: Lacking a corporate enterprise plan, the sharing options are limited to the project's own sprints. The currently active setting remains active. + sharing_fallback_description: Vzhledem k tomu, že chybí podnikový plán, jsou možnosti sdílení omezeny na vlastní sprinty projektu. Aktuálně aktivní nastavení zůstává aktivní. remaining_hours: Zbývající práce diff --git a/modules/costs/config/locales/crowdin/cs.yml b/modules/costs/config/locales/crowdin/cs.yml index 31452571fc9..0a3d256ec3c 100644 --- a/modules/costs/config/locales/crowdin/cs.yml +++ b/modules/costs/config/locales/crowdin/cs.yml @@ -40,7 +40,7 @@ cs: unit_plural: Název Pluralizované jednotky default: Typ nákladů ve výchozím nastavení for_all_projects: Pro všechny projekty - rates: Rates + rates: Sazby work_package: costs_by_type: Strávené jednotky labor_costs: Náklady práce @@ -69,32 +69,32 @@ cs: entity_gid: Přihlášen models: time_entry: - one: Vstup času - few: Time entries - many: Time entries - other: Time entries + one: Časová položka + few: Časové položky + many: Časové položky + other: Časové položky cost_entry: one: Nákladová položka - few: Cost entries - many: Cost entries - other: Cost entries + few: Nákladové položky + many: Nákladových položek + other: Nákladových položek cost_type: one: Druh nákladů few: Typy nákladů many: Typy nákladů other: Typy nákladů time_entry_activity: - one: Time tracking activity - few: Sledování času - many: Sledování času - other: Sledování času + one: Položka výkazu + few: Položek výkazu + many: Položek výkazu + other: Položek výkazu rate: Sazba errors: models: time_entry: invalid_time: musí být mezi 00:00 a 23:59. - cannot_log_for_this_work_package: Cannot log time for this work package. - duplicate_ongoing: An ongoing time entry already exists for this user. + cannot_log_for_this_work_package: Nelze zaznamenat čas pro tento pracovní balíček. + duplicate_ongoing: Pro tohoto uživatele již existuje průběžný časový záznam. work_package: is_not_a_valid_target_for_cost_entries: 'Pracovní balíček #%{id} není platný cíl pro přeřazení nákladových položek.' nullify_is_not_valid_for_cost_entries: K projektu nelze přiřadit položky nákladů. @@ -130,8 +130,8 @@ cs: caption_show_locked: Zobrazit uzamčené typy caption_log_time_dialog: Čas logu description_date_for_new_rate: Datum pro nový kurz - description_costs_settings: Define the desired format for the costs in all projects. - description_time_settings: Define which fields are mandatory to fill when logging time in all projects. + description_costs_settings: Definujte požadovaný formát nákladů ve všech projektech. + description_time_settings: Definujte, která pole jsou povinná při zaznamenávání času ve všech projektech. group_by_others: není v žádné skupině label_between: mezi label_cost_filter_add: Přidat filtr nákladového vstupu @@ -157,7 +157,7 @@ cs: label_kind: Typ label_less_or_equal: "<=" label_log_costs: Logovat jednotkové náklady - label_new_time_entry_activity: New time entry activity + label_new_time_entry_activity: Nová časová položka label_time_entry_activity_form_description: Changes to this time entry activity will be reflected in all projects where it is enabled. label_no: Ne label_option_plural: Možnosti @@ -193,7 +193,7 @@ cs: label_day: Den label_today_capitalized: Dnes label_view_mode_switcher: Změnit zobrazení - label_timer_since: Started at %{time} + label_timer_since: Začalo v %{time} placeholder_activity_select_work_package_first: Nejprve je nutné vybrat pracovní balíček notice_something_wrong: Něco se pokazilo. Zkuste to prosím znovu. notice_successful_restore: Úspěšně obnoveno. @@ -259,7 +259,7 @@ cs: rates: title: Rate history settings: - time_and_costs: Time & Costs + time_and_costs: Čas & náklady cost_types: heading: Cost types none_active: No cost types are currently active in this project. diff --git a/modules/gantt/config/locales/crowdin/js-cs.yml b/modules/gantt/config/locales/crowdin/js-cs.yml index 6fd0725be61..7cde463be71 100644 --- a/modules/gantt/config/locales/crowdin/js-cs.yml +++ b/modules/gantt/config/locales/crowdin/js-cs.yml @@ -2,6 +2,6 @@ cs: js: work_packages: - label_gantt_chart_plural: Gantt diagramy + label_gantt_chart_plural: Ganttovy diagramy default_queries: milestones: Milníky diff --git a/modules/gitlab_integration/config/locales/crowdin/cs.yml b/modules/gitlab_integration/config/locales/crowdin/cs.yml index 90860cf3303..6d6153864bb 100644 --- a/modules/gitlab_integration/config/locales/crowdin/cs.yml +++ b/modules/gitlab_integration/config/locales/crowdin/cs.yml @@ -36,7 +36,7 @@ cs: activerecord: attributes: gitlab_pipeline: - ci_details: CI Details + ci_details: Podrobnosti o CI gitlab_merge_request: labels: Štítky errors: @@ -49,8 +49,8 @@ cs: attributes: labels: invalid_schema: 'musí být pole hashů s klíči: barva, název' - label_gitlab_integration: GitLab Integration - label_gitlab_actor: GitLab actor + label_gitlab_integration: Integrace s GitLabem + label_gitlab_actor: Aktér GitLabu label_gitlab_webhook_secret: Webhook secret text_gitlab_actor_info: 'The OpenProject user whose API key must be used to authenticate incoming webhook requests. When set, requests authenticated with any other user''s credentials are rejected. This user also posts automated comments on work packages. Defaults to the system user when not set. diff --git a/modules/grids/config/locales/crowdin/cs.yml b/modules/grids/config/locales/crowdin/cs.yml index 20c0cd19457..70ece0a5e13 100644 --- a/modules/grids/config/locales/crowdin/cs.yml +++ b/modules/grids/config/locales/crowdin/cs.yml @@ -16,10 +16,10 @@ cs: view_all_members: Zobrazit všechny členy show_members_count: Zobrazit všech %{count} členů x_more: - one: and one more member. - few: and %{count} more members. - many: and %{count} more members. - other: and %{count} more members. + one: a ještě jeden člen. + few: a ještě %{count} členů. + many: a ještě %{count} členů. + other: a ještě %{count} členů. news: no_results: Žádné novinky. activerecord: diff --git a/modules/ldap_groups/config/locales/crowdin/cs.yml b/modules/ldap_groups/config/locales/crowdin/cs.yml index f647d870ad7..300983217f6 100644 --- a/modules/ldap_groups/config/locales/crowdin/cs.yml +++ b/modules/ldap_groups/config/locales/crowdin/cs.yml @@ -33,7 +33,7 @@ cs: ldap_groups: label_menu_item: Synchronizace skupiny LDAP label_group_key: LDAP skupinový klíč filtru - label_synchronize: Discover LDAP groups + label_synchronize: Zjištění skupin LDAP settings: name_attribute: Atribut názvu LDAP skupin name_attribute_text: LDAP atribut používaný pro pojmenování skupiny OpenProject při vytváření filtrem diff --git a/modules/meeting/config/locales/crowdin/cs.yml b/modules/meeting/config/locales/crowdin/cs.yml index 0228cefe006..14c041c1abb 100644 --- a/modules/meeting/config/locales/crowdin/cs.yml +++ b/modules/meeting/config/locales/crowdin/cs.yml @@ -32,7 +32,7 @@ cs: location: Místo duration: Doba trvání notes: Poznámky - recurrence_start_time: Scheduled start time + recurrence_start_time: Plánovaný čas zahájení participants: Účastníci participant: one: 1 Účastník @@ -41,14 +41,14 @@ cs: other: "%{count} Účastníků" participants_attended: Účastníci participants_invited: Pozvaní - participants_added: 'Participants added:' - participants_removed: 'Participants removed:' + participants_added: 'Přidaní účastníci:' + participants_removed: 'Odebraní účastníci:' project: Projekt start_date: Datum start_time: Čas zahájení start_time_hour: Čas zahájení - end_time: End time - template: Template + end_time: Čas ukončení + template: Šablona notify: Send notifications sharing: Sdílení meeting_agenda_item: @@ -77,9 +77,9 @@ cs: end_after: Řada schůzek končí end_date: Datum ukončení iterations: Výskyty - time_zone: Time zone - location: Location - duration: Duration + time_zone: Časová zóna + location: Poloha + duration: Doba trvání notify: Send notifications recurring_meeting_interim_response: start_time: Čas zahájení @@ -220,7 +220,7 @@ cs: label_notify: Odeslat k posouzení label_icalendar: Odeslat iCalendar label_icalendar_download: Stáhnout událost iCalendar - label_view_meeting: View meeting + label_view_meeting: Zobrazit schůzku label_view_meeting_series: Zobrazit sérii schůzek label_meeting_series: Řada schůzek label_version: Verze @@ -246,7 +246,7 @@ cs: apply_to_upcoming_meetings: Apply these changes to all upcoming meetings in this series text: template: Tito účastníci budou automaticky pozváni na všechna budoucí zasedání po jejich vytvoření. - manage_participants: Search for and add project members as participants to this meeting. + manage_participants: Vyhledejte a přidejte členy projektu jako účastníky této schůzky. search_for_members: Vyhledávání členů projektu blankslate: heading: Nikdo tu není @@ -303,8 +303,8 @@ cs: new_date_time: Nové datum/čas old_location: Stará lokace new_location: Nová lokace - added_participants: Added - removed_participants: Removed + added_participants: Přidáni + removed_participants: Odebráni label_mail_all_participants: Poslat e-mailovou pozvánku všem účastníkům types: one_time: Jednorázový @@ -440,7 +440,7 @@ cs: ' ended_blankslate: title: Řada schůzek skončila - message: 'This meeting series has come to an end. There are no upcoming meetings. ' + message: 'Tato série schůzek skončila a žádná nadcházející setkání se nekonají. ' action: You can still view past occurrences or edit the meeting series to extend it. occurrence: infoline: Tato schůzka je součástí opakované série schůzek. @@ -466,64 +466,64 @@ cs: frequency: x_daily: one: Každý den - few: Every %{count} days - many: Every %{count} days + few: Každých %{count} dní + many: Každých %{count} dní other: Každých %{count} dní x_weekly: one: Každý týden - few: Every %{count} weeks - many: Every %{count} weeks + few: Každých %{count} týdnů + many: Každých %{count} týdnů other: Každých %{count} týdnů x_monthly: - one: Every month - few: Every %{count} months - many: Every %{count} months - other: Every %{count} months - monthly_day_of_month: Day of month - monthly_nth_weekday: Monthly on a weekday + one: Každý měsíc + few: Každých %{count} měsíců + many: Každých %{count} měsíců + other: Každých %{count} měsíců + monthly_day_of_month: Den v měsíci + monthly_nth_weekday: Měsíčně ve všední den every_weekday: Každý %{day_of_the_week} working_days: Každý pracovní den monthly: inflected_ordinal: - first: first - second: second - third: third - fourth: fourth - last: last + first: první + second: druhý + third: třetí + fourth: čtvrtý + last: poslední ordinal_options: - first: First - second: Second - third: Third - fourth: Fourth - last: Last - actual_first_occurrence_mismatch_html: The first occurrence of this series will be %{first_occurrence} - day_of_month_skipping_info: Months with fewer than %{monthly_day} days will be skipped + first: První + second: Druhý + third: Třetí + fourth: Čtvrtý + last: Poslední + actual_first_occurrence_mismatch_html: První výskyt této série bude %{first_occurrence} + day_of_month_skipping_info: Měsíce s méně než %{monthly_day} dny budou vynechány end_after: - never: Never - specific_date: After a specific date - iterations: After a number of occurrences + never: Nikdy + specific_date: Po určitém datu + iterations: Po několika událostech starts: Začíná in_words: daily_interval: Každé %{interval} dny working_days: Každý pracovní den weekly: Každý týden na %{weekday} weekly_interval: Každý %{interval} týdny v %{weekday} - monthly_day: Every month on the %{day} - monthly_day_interval: Every %{interval} months on the %{day} - monthly_nth_weekday: Every month on the %{ordinal} %{weekday} - monthly_nth_weekday_interval: Every %{interval} months on the %{ordinal} %{weekday} + monthly_day: Každý měsíc na %{day} + monthly_day_interval: Každých %{interval} měsíců na %{day} + monthly_nth_weekday: Každý měsíc na %{ordinal} %{weekday} + monthly_nth_weekday_interval: Každých %{interval} měsíců na %{ordinal} %{weekday} frequency: "%{base} v %{time}" full: "%{base} v %{time}, končí %{end_date}" - full_past: "%{base} at %{time}, ended on %{end_date}" + full_past: "%{base} v %{time}, skončila %{end_date}" never_ending: "%{base} v %{time}" open: title: Program byl otevřen - subtitle: 'Open meetings have agendas that can be edited and show up in individual users’ ‘My meetings’ section. Changes to the meeting series template do not affect already-open meeting occurrences. + subtitle: 'Otevřené schůzky mají programy, které lze upravovat a které se zobrazují v sekci "Moje schůzky" jednotlivých uživatelů. Změny šablony série schůzek nemají vliv na již otevřené schůzky. ' blankslate: title: Momentálně žádné otevřené schůzky - desc: You can manually open a planned meeting by clicking on the 'Open' button below + desc: Plánovanou schůzku můžete otevřít ručně kliknutím na tlačítko "Otevřít" níže planned: title: Plánováno subtitle: 'Následující schůzky jsou plánovány v harmonogramu opakovaných schůzek, ale zatím nejsou otevřeny. Pokaždé, když začne plánovaná schůzka, automaticky se vám otevře další. Naplánované schůzky můžete otevřít také ručně, abyste mohli importovat šablonu a začít upravovat program. @@ -531,7 +531,7 @@ cs: ' blankslate: title: Žádné další plánované schůzky - desc: 'There are no additional meetings planned in this series. To schedule additional meetings or extend the series, go to the template and edit meeting details to change the end date, frequency or interval. + desc: 'V této sérii nejsou plánována žádné další schůzky. Chcete-li naplánovat další schůzky nebo sérii prodloužit, přejděte do šablony a upravte podrobnosti o schůzce, abyste změnili datum ukončení, frekvenci nebo interval. ' delete_dialog: @@ -567,7 +567,7 @@ cs: permission_delete_meetings: Smazat schůzku permission_view_meetings: Zobrazit schůzky permission_manage_agendas: Správa zápisů - permission_manage_agendas_explanation: Allows creating, editing and removing agenda items + permission_manage_agendas_explanation: Umožňuje vytvářet, upravovat a odebírat položky agendy permission_manage_outcomes: Spravovat výsledky permission_send_meeting_invites_and_outcomes: Odeslat pozvánky a výsledky všem účastníkům této schůzky project_module_meetings: Schůzky @@ -613,28 +613,28 @@ cs: label_agenda_item_move: Přesunout label_agenda_item_move_to_next: Přesunout na příští schůzi label_agenda_item_move_to_backlog: Přesunout do backlogu - label_agenda_item_move_to_current_meeting: Move to current meeting - label_agenda_item_move_to_section: Move to section + label_agenda_item_move_to_current_meeting: Přesunout do aktuální schůze + label_agenda_item_move_to_section: Přesun do sekce label_agenda_item_move_to_top: Přesunout nahoru label_agenda_item_move_to_bottom: Přesunout na konec label_agenda_item_move_up: Přesunout výš label_agenda_item_move_down: Přesunout níž - label_agenda_item_duplicate: Duplicate + label_agenda_item_duplicate: Kopírovat label_agenda_item_duplicate_in_next: Duplicate in next meeting label_agenda_item_duplicate_in_next_title: Duplicate in next meeting? label_agenda_item_add_notes: Přidat poznámky label_agenda_item_add_outcome: Přidat výsledek - label_agenda_item_convert_to_work_package: Convert to work package + label_agenda_item_convert_to_work_package: Zkonvertovat na pracovní balíček label_agenda_item_work_package_add: Přidat pracovní balíček label_agenda_item_work_package: Pracovní balíček k bodu programu label_section_rename: Přejmenovat sekci label_agenda_outcome: Výsledek label_agenda_new_outcome: Nový výsledek - label_agenda_outcome_actions: Agenda outcome actions + label_agenda_outcome_actions: Výsledné akce programu label_agenda_outcome_edit: Upravit výsledek label_agenda_outcome_delete: Odstranit výsledek - label_added_as_outcome: Added as outcome - label_write_outcome: Write outcome + label_added_as_outcome: Přidáno jako výsledek + label_write_outcome: Napište výsledek label_existing_work_package: Stávající pracovní balíček text_outcome_not_editable_anymore: Tento výsledek již nelze upravovat. text_outcome_cannot_be_added: Výsledek již nelze přidat. @@ -693,9 +693,9 @@ cs: text_exit_draft_mode_dialog_template_title: Otevřít první výskyt této série schůzek? text_exit_draft_mode_dialog_template_subtitle: Poté se již nelze vrátit do režimu návrhu. label_meeting_template_sharing: Sdílení - label_meeting_template_sharing_none: Only with this project - label_meeting_template_sharing_descendants: With subprojects - label_meeting_template_sharing_system: With all projects + label_meeting_template_sharing_none: Pouze s tímto projektem + label_meeting_template_sharing_descendants: S podprojekty + label_meeting_template_sharing_system: Se všemi projekty text_meeting_template_sharing_description: Tuto šablonu lze sdílet s podprojekty nebo jinými projekty v této instanci. Budou zkopírovány pouze body a přílohy pořadu jednání. text_meeting_not_editable_anymore: Tato schůzka již není upravitelná. text_meeting_not_present_anymore: Tato schůzka byla odstraněna. Vyberte prosím jinou schůzku. @@ -715,7 +715,7 @@ cs: text_agenda_item_duplicated_in_next_meeting: Agenda item duplicated in the next meeting, on %{date} text_work_package_has_no_upcoming_meeting_agenda_items: Tento pracovní balíček ještě není naplánován na nadcházející program schůzky. text_agenda_item_no_available_occurrence: No upcoming occurrences are available. - text_agenda_item_dialog_skipping_note: 'Note: Skipping %{details}.' + text_agenda_item_dialog_skipping_note: 'Poznámka: Přeskočení %{details}.' text_agenda_item_dialog_skipping_cancelled_one: cancelled meeting on %{date} text_agenda_item_dialog_skipping_cancelled_many: "%{count} cancelled meetings" text_agenda_item_dialog_skipping_closed_one: closed meeting on %{date} @@ -738,9 +738,9 @@ cs: access_token: dialog: token/ical_meeting: - dialog_title: New iCal subscription token for meetings + dialog_title: Nový token pro přihlášení k odběru iCal dialog_body: This token will generate an iCal subscription URL that lets you view all your meetings in an external calendar application. - create_button: Create subscription + create_button: Vytvořit odběr name_label: Název tokenu name_caption: You can name it after where you will use it, such as "My phone" or "Work computer". created_dialog: diff --git a/modules/openid_connect/config/locales/crowdin/cs.yml b/modules/openid_connect/config/locales/crowdin/cs.yml index 41af368eb87..2456efaf2cf 100644 --- a/modules/openid_connect/config/locales/crowdin/cs.yml +++ b/modules/openid_connect/config/locales/crowdin/cs.yml @@ -9,15 +9,15 @@ cs: activerecord: attributes: openid_connect/group_link: - oidc_group_name: OpenID group identifier + oidc_group_name: Identifikátor skupiny OpenID openid_connect/provider: name: Název slug: Jedinečný identifikátor display_name: Zobrazovaný název client_id: ID klienta client_secret: Tajný klíč klienta - groups_claim: Groups claim - group_regexes: Patterns (regular expressions) + groups_claim: Atribut skupiny + group_regexes: Vzory (regulární výrazy) secret: Tajné scope: Rozsah sync_groups: Synchronizovat skupiny @@ -45,10 +45,10 @@ cs: response_is_not_successful: " odpovídá s %{status}." response_is_not_json: " nevrací JSON obsah." response_misses_required_attributes: " does not return required attributes. Missing attributes are: %{missing_attributes}." - invalid_claims_essential: does not define a boolean at %{attribute}. + invalid_claims_essential: nedefinuje boolean u %{attribute}. invalid_claims_location: 'contain unsupported locations: %{invalid}. Supported locations are: %{supported}.' invalid_claims_values: does not define an array at %{attribute}. - non_object_attribute: does not define a JSON object at %{attribute}. + non_object_attribute: nedefinuje objekt JSON u %{attribute}. provider: delete_warning: input_delete_confirmation_html: Enter the provider name %{name} to confirm deletion. diff --git a/modules/wikis/config/locales/crowdin/cs.yml b/modules/wikis/config/locales/crowdin/cs.yml index 892187a529b..adbcdb2be66 100644 --- a/modules/wikis/config/locales/crowdin/cs.yml +++ b/modules/wikis/config/locales/crowdin/cs.yml @@ -3,15 +3,15 @@ cs: activerecord: attributes: wikis/page_link: - identifier: Identifier - provider: Wiki Provider + identifier: Identifikátor + provider: Poskytovatel Wiki wikis/provider: - name: Name - universal_identifier: Universal identifier + name: Název + universal_identifier: Univerzální identifikátor wikis/xwiki_provider: authentication_method: Způsob ověření authentication_methods: - oauth2_sso: Single-Sign-On through OpenID Connect Identity Provider + oauth2_sso: Jednotné přihlášení prostřednictvím poskytovatele identit OpenID Connect two_way_oauth2: Two-way OAuth 2.0 authorization code flow token_exchange_scope: XWiki Scope url: Adresa URL instance diff --git a/modules/wikis/config/locales/crowdin/de.yml b/modules/wikis/config/locales/crowdin/de.yml index 0b06fdafee9..9c6c0276f62 100644 --- a/modules/wikis/config/locales/crowdin/de.yml +++ b/modules/wikis/config/locales/crowdin/de.yml @@ -33,8 +33,8 @@ de: other: XWiki-Anbieter menus: admin: - external_wiki_providers: Wiki providers - internal_wiki_provider: Internal wiki + external_wiki_providers: Wiki-Anbieter + internal_wiki_provider: Internes Wiki wikis: Wikis permission_manage_wiki_page_links: Wiki-Seitenlinks verwalten project_module_wiki_platforms: Wiki-Anbieter @@ -66,11 +66,11 @@ de: no_health_report_description: Führen Sie jetzt die Prüfungen für einen vollständigen Statusbericht dieses Dateispeichers durch. title: Systemstatusbericht internal_provider_form: - checkbox_caption: Allow projects to use the internal OpenProject wiki along with external Wiki providers - checkbox_label: Enable the internal OpenProject wiki + checkbox_caption: Erlauben Sie Projekten, das interne OpenProject-Wiki zusammen mit externen Wiki-Anbietern zu verwenden + checkbox_label: Aktivieren Sie das interne OpenProject-Wiki internal_wiki_provider: show: - description: Choose to enable or disable the internal OpenProject wiki + description: Aktivieren oder deaktivieren Sie das interne OpenProject-Wiki oauth_application_info_component: confirm_replace_oauth_application: Diese Aktion setzt die aktuellen OAuth-Anmeldedaten zurück. Nach der Bestätigung müssen Sie die Anmeldedaten erneut in Ihre XWiki-Instanz eingeben und alle Konten müssen sich erneut autorisieren. Sind Sie sicher, dass Sie fortfahren möchten? label_oauth_client_id: OAuth-Client-ID @@ -122,9 +122,9 @@ de: save_and_continue: Speichern und fortsetzen wiki_page: Wiki-Seite create_new_wiki_page_dialog: - page_title: Title - parent_help_text: Select a parent for this new wiki page. - title: Create new wiki page + page_title: Titel + parent_help_text: Wählen Sie eine übergeordnete Seite für diese neue Wikiseite. + title: Neue Wikiseite anlegen delete_relation_page_link_confirmation_dialog: heading: Link zur verknüpften Wikiseite löschen? title: Link zur verknüpften Wikiseite löschen From 94e8490855241a488e37481bd6e3af7012596fac Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Jun 2026 17:48:22 +0100 Subject: [PATCH 100/107] Bump shell-quote from 1.8.3 to 1.8.4 in /frontend (#23642) Bumps [shell-quote](https://github.com/ljharb/shell-quote) from 1.8.3 to 1.8.4. - [Changelog](https://github.com/ljharb/shell-quote/blob/main/CHANGELOG.md) - [Commits](https://github.com/ljharb/shell-quote/compare/v1.8.3...v1.8.4) --- updated-dependencies: - dependency-name: shell-quote dependency-version: 1.8.4 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frontend/package-lock.json | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 7934d1c8e53..a8aa2dbf224 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -19917,10 +19917,11 @@ } }, "node_modules/shell-quote": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", - "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.4.tgz", + "integrity": "sha512-VsC6n6vz1ihYYyZZwX7YZSF5l5x36ca17OC+a69h94YqB7X6XLwf+5MOgynYir2SLFUbl8gIYvBo8K8RoNQ6bQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, From 82404592af712ee20d4203415729670738ec7a3c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Jun 2026 18:47:44 +0000 Subject: [PATCH 101/107] Bump net-imap from 0.6.4 to 0.6.4.1 Bumps [net-imap](https://github.com/ruby/net-imap) from 0.6.4 to 0.6.4.1. - [Release notes](https://github.com/ruby/net-imap/releases) - [Commits](https://github.com/ruby/net-imap/compare/v0.6.4...v0.6.4.1) --- updated-dependencies: - dependency-name: net-imap dependency-version: 0.6.4.1 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index cdc2202db82..0f07be56724 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -853,7 +853,7 @@ GEM mustermann (>= 1.0.0) net-http (0.9.1) uri (>= 0.11.1) - net-imap (0.6.4) + net-imap (0.6.4.1) date net-protocol net-ldap (0.20.0) @@ -2030,7 +2030,7 @@ CHECKSUMS mustermann-grape (1.1.0) sha256=8d258a986004c8f01ce4c023c0b037c168a9ed889cf5778068ad54398fa458c5 my_page (1.0.0) net-http (0.9.1) sha256=25ba0b67c63e89df626ed8fac771d0ad24ad151a858af2cc8e6a716ca4336996 - net-imap (0.6.4) sha256=9a5598c67a3022c284d98430ef1d4948e7dbdb62596f61081ea8ca933270a02b + net-imap (0.6.4.1) sha256=29f0360d75a7efd3539f16ac1957dea5c0a51ddeceb348db4553c3120914ea0d net-ldap (0.20.0) sha256=b2080b350753a9ac4930869ded8e61a1d2151c01e03b0bf07b4675cbd9ce5372 net-pop (0.1.2) sha256=848b4e982013c15b2f0382792268763b748cce91c9e91e36b0f27ed26420dff3 net-protocol (0.2.2) sha256=aa73e0cba6a125369de9837b8d8ef82a61849360eba0521900e2c3713aa162a8 From 9f7af52eff0c0c7e61496e976576cdcf9a99a5bd Mon Sep 17 00:00:00 2001 From: OpenProject Actions CI Date: Wed, 10 Jun 2026 04:33:09 +0000 Subject: [PATCH 102/107] update locales from crowdin [ci skip] --- config/locales/crowdin/de.yml | 4 ++-- modules/costs/config/locales/crowdin/cs.yml | 2 +- modules/meeting/config/locales/crowdin/cs.yml | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/config/locales/crowdin/de.yml b/config/locales/crowdin/de.yml index 3070faa9b0b..ae5aa7ccef6 100644 --- a/config/locales/crowdin/de.yml +++ b/config/locales/crowdin/de.yml @@ -4527,8 +4527,8 @@ de: one: 'Freie Zeit: 1 Arbeitstag' other: 'Freie Zeit: %{count} Arbeitstage' label_x_items_selected: - one: One item selected - other: "%{count} items selected" + one: Ein Element ausgewählt + other: "%{count} Elemente ausgewählt" label_yesterday: gestern label_zen_mode: Zen-Modus label_role_type: Typ diff --git a/modules/costs/config/locales/crowdin/cs.yml b/modules/costs/config/locales/crowdin/cs.yml index 0a3d256ec3c..55ca95b8c08 100644 --- a/modules/costs/config/locales/crowdin/cs.yml +++ b/modules/costs/config/locales/crowdin/cs.yml @@ -248,7 +248,7 @@ cs: no_cost_types_available: No cost types are available in this project. Please contact an administrator. admin: columns: - active_projects: Active projects + active_projects: Aktivní projekty cost_type_projects: for_all_projects_blank_slate: heading: This cost type is enabled in all projects diff --git a/modules/meeting/config/locales/crowdin/cs.yml b/modules/meeting/config/locales/crowdin/cs.yml index 14c041c1abb..a844a59b353 100644 --- a/modules/meeting/config/locales/crowdin/cs.yml +++ b/modules/meeting/config/locales/crowdin/cs.yml @@ -68,9 +68,9 @@ cs: title: Title frequency: Frekvence interval: Interval - monthly_day: Day of month - monthly_ordinal: Position - monthly_weekday: Weekday + monthly_day: Den v měsíci + monthly_ordinal: Pozice + monthly_weekday: Pracovní den start_date: Začíná v start_time: Čas zahájení start_time_hour: Čas zahájení @@ -80,7 +80,7 @@ cs: time_zone: Časová zóna location: Poloha duration: Doba trvání - notify: Send notifications + notify: Posílat oznámení recurring_meeting_interim_response: start_time: Čas zahájení meeting_participant: From 3ed42c1c25ba8cfc5869e6ad186f0d04705ee71a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Jun 2026 05:35:12 +0000 Subject: [PATCH 103/107] Bump good_job from 4.18.2 to 4.19.0 Bumps [good_job](https://github.com/bensheldon/good_job) from 4.18.2 to 4.19.0. - [Release notes](https://github.com/bensheldon/good_job/releases) - [Changelog](https://github.com/bensheldon/good_job/blob/main/CHANGELOG.md) - [Commits](https://github.com/bensheldon/good_job/compare/v4.18.2...v4.19.0) --- updated-dependencies: - dependency-name: good_job dependency-version: 4.19.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- Gemfile | 2 +- Gemfile.lock | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Gemfile b/Gemfile index 601b5043d53..c40ef8e11d8 100644 --- a/Gemfile +++ b/Gemfile @@ -128,7 +128,7 @@ gem "multi_json", "~> 1.20.0" gem "oj", "~> 3.17.0" gem "daemons" -gem "good_job", "~> 4.18.2" # update should be done manually in sync with saas-openproject version. +gem "good_job", "~> 4.19.0" # update should be done manually in sync with saas-openproject version. gem "rack-protection", "~> 3.2.0" diff --git a/Gemfile.lock b/Gemfile.lock index cdc2202db82..3c705627116 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -634,7 +634,7 @@ GEM glob (0.5.0) globalid (1.3.0) activesupport (>= 6.1) - good_job (4.18.2) + good_job (4.19.0) activejob (>= 6.1.0) activerecord (>= 6.1.0) concurrent-ruby (>= 1.3.1) @@ -755,7 +755,7 @@ GEM jmespath (1.6.2) job-iteration (1.14.0) activejob (>= 7.1) - json (2.19.7) + json (2.19.8) json-jwt (1.17.1) activesupport (>= 4.2) aes_key_wrap @@ -1184,7 +1184,7 @@ GEM pry-rescue (1.6.0) interception (>= 0.5) pry (>= 0.12.0) - psych (5.3.1) + psych (5.4.0) date stringio public_suffix (7.0.5) @@ -1630,7 +1630,7 @@ DEPENDENCIES friendly_id (~> 5.7.0) fuubar (~> 2.5.0) globalid (~> 1.3) - good_job (~> 4.18.2) + good_job (~> 4.19.0) google-apis-gmail_v1 googleauth grape (~> 3.2.0) @@ -1948,7 +1948,7 @@ CHECKSUMS fuubar (2.5.1) sha256=b272a7804b282661c7fab583a3764f92543cb482c365ae39c685cd218fdd4880 glob (0.5.0) sha256=6397ae620b2f71b00424ec6c880c92d5ddcf6c44e6035c0b610a59efe16418fd globalid (1.3.0) sha256=05c639ad6eb4594522a0b07983022f04aa7254626ab69445a0e493aa3786ff11 - good_job (4.18.2) sha256=7e557a15865fc7b7ad4ab71644cf1d4189a2a1869d3b381e5e88741c540beca6 + good_job (4.19.0) sha256=7fad3ce174d2c1b4bfde4e84056076b00ac81719b5d679900c53671a721284b9 google-apis-core (1.0.2) sha256=ba4579aaadc902d6cc7bc8db88f566ab00f5e31ea87ab41e9f9a032c470f2629 google-apis-gmail_v1 (0.51.0) sha256=cec89406ee645e71697a0eb0237e972df213d4dde86a772b05979175c48a6d11 google-cloud-env (2.3.1) sha256=0faac01eb27be78c2591d64433663b1a114f8f7af55a4f819755426cac9178e7 @@ -1992,7 +1992,7 @@ CHECKSUMS iso8601 (0.13.0) sha256=298c2b15b7be5fa95a1372813d36a2257656cd8e906dfbc1f5cb409851425aa2 jmespath (1.6.2) sha256=238d774a58723d6c090494c8879b5e9918c19485f7e840f2c1c7532cf84ebcb1 job-iteration (1.14.0) sha256=f154f978109acc838c0359ecde2fdd4dccc3382f95a22e03a58ac561a3615224 - json (2.19.7) sha256=fe432c8639f6efff69f9d73b518a3705d9581ab93156f981ea72806e1e5bcc3e + json (2.19.8) sha256=6354310fd76ef69b87d5bd1f38b40d730613baf90b6803d2d0a48f618d32dfaa json-jwt (1.17.1) sha256=5e1ced0f7b206b4c567efee19e6503c1426a819749132926cda579ec013d1f46 json-schema (6.2.0) sha256=e8bff46ed845a22c1ab2bd0d7eccf831c01fe23bb3920caa4c74db4306813666 json_schemer (2.5.0) sha256=2f01fb4cce721a4e08dd068fc2030cffd0702a7f333f1ea2be6e8991f00ae396 @@ -2175,7 +2175,7 @@ CHECKSUMS pry-byebug (3.12.0) sha256=594e094ae8a8390a7ad4c7b36ae36e13304ed02664c67417d108dc5f7213d1b7 pry-rails (0.3.11) sha256=a69e28e24a34d75d1f60bcf241192a54253f8f7ef8a62cba1e75750a9653593d pry-rescue (1.6.0) sha256=985bfd506d9866b587fd86790cf8445266a41b7f92c627fc5b21ec7d92aba6db - psych (5.3.1) sha256=eb7a57cef10c9d70173ff74e739d843ac3b2c019a003de48447b2963d81b1974 + psych (5.4.0) sha256=14f72d69a611af663d7d70e4a7b67d9eb1f3ae9f8d916b478961d5a0075ba5b7 public_suffix (7.0.5) sha256=1a8bb08f1bbea19228d3bed6e5ed908d1cb4f7c2726d18bd9cadf60bc676f623 puffing-billy (4.0.4) sha256=87015b0c41e0722b2171a0c5aa8130fd3f58aa1c016a1dc6dc569b2028aa846f puma (8.0.2) sha256=c8ed871dfbbe66448ea9ffd46692342d9804d4071522b52b5331b7b6e7b686fb From 39047595c5118595ab84697c224a2b5023f55b27 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Jun 2026 05:36:01 +0000 Subject: [PATCH 104/107] Bump oj from 3.17.1 to 3.17.3 Bumps [oj](https://github.com/ohler55/oj) from 3.17.1 to 3.17.3. - [Release notes](https://github.com/ohler55/oj/releases) - [Changelog](https://github.com/ohler55/oj/blob/develop/CHANGELOG.md) - [Commits](https://github.com/ohler55/oj/compare/v3.17.1...v3.17.3) --- updated-dependencies: - dependency-name: oj dependency-version: 3.17.3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Gemfile | 2 +- Gemfile.lock | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Gemfile b/Gemfile index 601b5043d53..e87fc2bffc1 100644 --- a/Gemfile +++ b/Gemfile @@ -125,7 +125,7 @@ gem "sys-filesystem", "~> 1.5.0", require: false gem "bcrypt", "~> 3.1.22" gem "multi_json", "~> 1.20.0" -gem "oj", "~> 3.17.0" +gem "oj", "~> 3.17.3" gem "daemons" gem "good_job", "~> 4.18.2" # update should be done manually in sync with saas-openproject version. diff --git a/Gemfile.lock b/Gemfile.lock index cdc2202db82..67f7acff215 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -882,7 +882,7 @@ GEM racc (~> 1.4) nokogiri (1.19.3-x86_64-linux-musl) racc (~> 1.4) - oj (3.17.1) + oj (3.17.3) bigdecimal (>= 3.0) ostruct (>= 0.2) okcomputer (1.19.2) @@ -1665,7 +1665,7 @@ DEPENDENCIES my_page! net-ldap (~> 0.20.0) nokogiri (~> 1.19.2) - oj (~> 3.17.0) + oj (~> 3.17.3) okcomputer (~> 1.19.1) omniauth! omniauth-openid-connect! @@ -2044,7 +2044,7 @@ CHECKSUMS nokogiri (1.19.3-x86_64-darwin) sha256=77f3fba57d46c53ab31e62fc6c28f705109d1bf6264356c76f132b2be5728d4d nokogiri (1.19.3-x86_64-linux-gnu) sha256=2f5078620fe12e83669b5b17311b32532a8153d02eee7ad06948b926d6080976 nokogiri (1.19.3-x86_64-linux-musl) sha256=248c906d2166eca5efb56d52fdee5f9a1f51d69a72e2b64fdac647b4ce39ea3f - oj (3.17.1) sha256=b00687f10bf68a32bfb633b87624174faf0989a5c96aff2f3f96f992717ce782 + oj (3.17.3) sha256=ebe3967b0bb7ac4f206561d0d9ac8875b9973f778600d7b61b5c355662a707ed okcomputer (1.19.2) sha256=d069aedf1e31b8ebe7e1fdf9e327dee158ea49b9fbdebebc2f1bed4690cb7a6d omniauth (1.9.2) omniauth-openid-connect (0.5.0) From f922881bff90fa8c38af118bb3a71da9c14b2ac6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Jun 2026 05:41:03 +0000 Subject: [PATCH 105/107] Bump retriable from 3.5.1 to 3.8.0 Bumps [retriable](https://github.com/kamui/retriable) from 3.5.1 to 3.8.0. - [Release notes](https://github.com/kamui/retriable/releases) - [Changelog](https://github.com/kamui/retriable/blob/main/CHANGELOG.md) - [Commits](https://github.com/kamui/retriable/compare/v3.5.1...v3.8.0) --- updated-dependencies: - dependency-name: retriable dependency-version: 3.8.0 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- Gemfile | 2 +- Gemfile.lock | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Gemfile b/Gemfile index 601b5043d53..61b8fc72f52 100644 --- a/Gemfile +++ b/Gemfile @@ -276,7 +276,7 @@ group :test do gem "rspec-rails", "~> 8.0.4", group: :development # Retry failures within the same environment - gem "retriable", "~> 3.5.1" + gem "retriable", "~> 3.8.0" gem "rspec-retry", "~> 0.6.1" # Accessibility tests diff --git a/Gemfile.lock b/Gemfile.lock index cdc2202db82..f8064fdfce2 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1303,7 +1303,7 @@ GEM responders (3.2.0) actionpack (>= 7.0) railties (>= 7.0) - retriable (3.5.1) + retriable (3.8.0) rexml (3.4.4) rinku (2.0.6) roar (1.2.0) @@ -1733,7 +1733,7 @@ DEPENDENCIES redis (~> 5.4.0) request_store (~> 1.7.0) responders (~> 3.2) - retriable (~> 3.5.1) + retriable (~> 3.8.0) rinku (~> 2.0.4) roar (~> 1.2.0) rouge (~> 4.7.0) @@ -2217,7 +2217,7 @@ CHECKSUMS representable (3.2.0) sha256=cc29bf7eebc31653586849371a43ffe36c60b54b0a6365b5f7d95ec34d1ebace request_store (1.7.0) sha256=e1b75d5346a315f452242a68c937ef8e48b215b9453a77a6c0acdca2934c88cb responders (3.2.0) sha256=89c2d6ac0ae16f6458a11524cae4a8efdceba1a3baea164d28ee9046bd3df55a - retriable (3.5.1) sha256=446b751cf3a8576e2e9cf2702bced920d1af645f5477e8a7699ea3f1e4c12fff + retriable (3.8.0) sha256=9f2f1b0207594c7817f17f671587b8ec7587387ac6cebda6c941a802bb98a8e5 rexml (3.4.4) sha256=19e0a2c3425dfbf2d4fc1189747bdb2f849b6c5e74180401b15734bc97b5d142 rinku (2.0.6) sha256=8b60670e3143f3db2b37efa262971ce3619ec23092045498ef9f077d82828d7d roar (1.2.0) sha256=8db4d1ca79c57a5fb746c16c0d5661d7c3e0de3d9553dc016a88d2dba2929d08 From f7f1e7ab8761a26b75e7c5f9cc11c910a5148b44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20G=C3=BCnther?= Date: Wed, 10 Jun 2026 07:53:18 +0200 Subject: [PATCH 106/107] Create release notes draft for 17.6.0 --- docs/release-notes/17-6-0/README.md | 191 ++++++++++++++++++---------- 1 file changed, 125 insertions(+), 66 deletions(-) diff --git a/docs/release-notes/17-6-0/README.md b/docs/release-notes/17-6-0/README.md index 2e7c49049c9..f1e43f576e6 100644 --- a/docs/release-notes/17-6-0/README.md +++ b/docs/release-notes/17-6-0/README.md @@ -3,12 +3,12 @@ title: OpenProject 17.6.0 sidebar_navigation: title: 17.6.0 release_version: 17.6.0 -release_date: 2026-06-08 +release_date: 2026-06-10 --- # OpenProject 17.6.0 -Release date: 2026-06-08 +Release date: 2026-06-10 We released [OpenProject 17.6.0](https://community.openproject.org/versions/2298). The release contains several bug fixes and we recommend updating to the newest version. @@ -56,70 +56,129 @@ This follows the APIv3 standards, and also fixes a bug related to the self link. -- Feature: Sprint goals \[[#71059](https://community.openproject.org/wp/71059)\] -- Feature: Add possibility to order backlog buckets and sprints manually \[[#73610](https://community.openproject.org/wp/73610)\] -- Feature: Add multi-select drop-down for sprint and backlog buckets \[[#73611](https://community.openproject.org/wp/73611)\] -- Feature: Multi-select cards within backlog and sprints \[[#73729](https://community.openproject.org/wp/73729)\] -- Feature: Display backlog bucket in work package page \[[#73887](https://community.openproject.org/wp/73887)\] -- Feature: "Move to backlog bucket" and "move to backlog inbox" menu option for work packages within the backlog module \[[#73925](https://community.openproject.org/wp/73925)\] -- Feature: Add existing work packages within sprint and backlog containers menu \[[#74386](https://community.openproject.org/wp/74386)\] -- Feature: "All sprints" view - simple list \[[#74594](https://community.openproject.org/wp/74594)\] -- Feature: Column, ordering and grouping by backlog bucket in work package list \[[#74653](https://community.openproject.org/wp/74653)\] -- Feature: Show message when work package with excluded type/status is moved to backlog and disappears \[[#74845](https://community.openproject.org/wp/74845)\] -- Feature: Check the accessibility on Flash messages \[[#63276](https://community.openproject.org/wp/63276)\] -- Feature: Remove newest projects in project widget on homepage \[[#74198](https://community.openproject.org/wp/74198)\] -- Feature: Make project hierarchy collapsable in the global project selector \[[#74625](https://community.openproject.org/wp/74625)\] -- Feature: Create work package out of Meeting Agenda Item \[[#57053](https://community.openproject.org/wp/57053)\] -- Feature: API for Meeting outcomes \[[#75393](https://community.openproject.org/wp/75393)\] -- Feature: Group synchronization through attributes of the group, not member/memberOf \[[#32812](https://community.openproject.org/wp/32812)\] -- Feature: Track working hours and availabilities for each user in the system \[[#34911](https://community.openproject.org/wp/34911)\] -- Feature: Allow cost types to be enabled/disabled per project \[[#42037](https://community.openproject.org/wp/42037)\] -- Feature: All open view with default sort order to show the latest on top (ID descending) \[[#57962](https://community.openproject.org/wp/57962)\] -- Feature: New Administration for User Custom Fields and Custom Field Sections \[[#72005](https://community.openproject.org/wp/72005)\] -- Feature: Primerize advanced filters component \[[#74380](https://community.openproject.org/wp/74380)\] -- Feature: Build Primer quickfilter \[[#74577](https://community.openproject.org/wp/74577)\] -- Feature: Enforce order of subheader slots/quickfilters \[[#75013](https://community.openproject.org/wp/75013)\] -- Feature: Escape possible control characters in CSV export \[[#75486](https://community.openproject.org/wp/75486)\] -- Feature: Filter project by portfolio and programm \[[#74718](https://community.openproject.org/wp/74718)\] -- Feature: Adapt Excel and CSV exports for semantic identifiers \[[#74361](https://community.openproject.org/wp/74361)\] -- Feature: Adapt BCF Export and Import for semantic identifiers \[[#74362](https://community.openproject.org/wp/74362)\] -- Feature: Adapt other PDF exports for semantic identifiers \[[#75229](https://community.openproject.org/wp/75229)\] -- Feature: /wp on an empty line should create a block work-package link, not an inline one \[[#75310](https://community.openproject.org/wp/75310)\] -- Feature: Expose installation UUID via API \[[#75442](https://community.openproject.org/wp/75442)\] -- Feature: Configure internal wiki provider \[[#75594](https://community.openproject.org/wp/75594)\] -- Feature: Show total sprint capacity (in days or story points) \[[#71060](https://community.openproject.org/wp/71060)\] -- Feature: "All Sprints" view \[[#71260](https://community.openproject.org/wp/71260)\] -- Feature: Allow multiple active sprints within a single project \[[#73232](https://community.openproject.org/wp/73232)\] -- Feature: XWiki integration \[[#53738](https://community.openproject.org/wp/53738)\] -- Feature: Extend CKEditor with Wiki interactions and macros \[[#70554](https://community.openproject.org/wp/70554)\] -- Feature: Wiki tab in work package detail view \[[#70555](https://community.openproject.org/wp/70555)\] -- Feature: Wiki integration setup on OpenProject \[[#70556](https://community.openproject.org/wp/70556)\] -- Bugfix: Page loads twice after sprint creation \[[#73316](https://community.openproject.org/wp/73316)\] -- Bugfix: A missing full stop at the end of confirmation message of danger dialog \[[#73899](https://community.openproject.org/wp/73899)\] -- Bugfix: Impossible to open work packages list from the sidebar after visiting team planner \[[#74331](https://community.openproject.org/wp/74331)\] -- Bugfix: Input group with trailing action clipboard copy button + validation error = style broken \[[#75395](https://community.openproject.org/wp/75395)\] -- Bugfix: FilterableTreeView does not keep default filter arguments \[[#75617](https://community.openproject.org/wp/75617)\] -- Bugfix: Tree view selection based on path identity breaks use cases where similar paths are allowed \[[#75618](https://community.openproject.org/wp/75618)\] -- Bugfix: Fix tracking expression browser warnings \[[#75676](https://community.openproject.org/wp/75676)\] -- Bugfix: GET /api/v3/meetings/{id} — \_links.participants count does not match \_embedded.participants count \[[#75696](https://community.openproject.org/wp/75696)\] -- Bugfix: PATCH /api/v3/meetings/{id} — adding an already existing participant via \_links.participants creates a duplicate entry \[[#75697](https://community.openproject.org/wp/75697)\] -- Bugfix: PATCH /api/v3/meetings/{id} - participants cannot be removed via \_links.participants \[[#75701](https://community.openproject.org/wp/75701)\] -- Bugfix: WP table configuration: overflow due to the very long CF label \[[#46005](https://community.openproject.org/wp/46005)\] -- Bugfix: Tooltip on Team planner not entirely visible \[[#48223](https://community.openproject.org/wp/48223)\] -- Bugfix: Problems with GitLab and GitHub integration snippets \[[#56847](https://community.openproject.org/wp/56847)\] -- Bugfix: Misalignment of fields in Work estimates and progress when language=DE \[[#65738](https://community.openproject.org/wp/65738)\] -- Bugfix: Custom text widget pagination bug \[[#66419](https://community.openproject.org/wp/66419)\] -- Bugfix: Arrow for switching years barely visible in dark mode on the calendar \[[#68517](https://community.openproject.org/wp/68517)\] -- Bugfix: Login right side panel dark mode: login form has ugly/unnecessary gray background \[[#69328](https://community.openproject.org/wp/69328)\] -- Bugfix: User sees a success banner if they save a letter/word as integer \[[#71650](https://community.openproject.org/wp/71650)\] -- Bugfix: Closed, duplicated meeting disappears from synced calendar \[[#72219](https://community.openproject.org/wp/72219)\] -- Bugfix: Wrong icon used when changing non working days \[[#73372](https://community.openproject.org/wp/73372)\] -- Bugfix: User facing work package link from GitLab tab is not the shortened version \[[#73718](https://community.openproject.org/wp/73718)\] -- Bugfix: Inline text attachments lose UTF-8 charset \[[#75402](https://community.openproject.org/wp/75402)\] -- Bugfix: BCF import permission scope not clear \[[#75457](https://community.openproject.org/wp/75457)\] -- Bugfix: Hide "my meetings" and "favourited projects" widgets for anonymous users \[[#75477](https://community.openproject.org/wp/75477)\] -- Bugfix: Setting mail header via OPENPROJECT\_EMAILS\_\_HEADER\_EN interprets colon as hash \[[#75570](https://community.openproject.org/wp/75570)\] -- Bugfix: Date custom field filter "is empty" does not return all work packages with empty values \[[#75185](https://community.openproject.org/wp/75185)\] +- Feature: Exclude certain work package types from automated backlog (per project) \[[#71305](https://community.openproject.org/wp/71305)\] +- Feature: Container header (Sprint/Bucket/Inbox) restyling \[[#72945](https://community.openproject.org/wp/72945)\] +- Feature: Restyled work package card in "Backlogs and sprints" view \[[#73089](https://community.openproject.org/wp/73089)\] +- Feature: Bring sprint sharing (SAFe) to corporate plan \[[#74147](https://community.openproject.org/wp/74147)\] +- Feature: Create work package links through # notation in documents / BlockNote \[[#73664](https://community.openproject.org/wp/73664)\] +- Feature: Create a WorkPackageCard component \[[#73968](https://community.openproject.org/wp/73968)\] +- Feature: Extend the SubHeader component to support quick filter components \[[#73972](https://community.openproject.org/wp/73972)\] +- Feature: Jira Migrator imports project-based semantic issue identifiers \[[#72427](https://community.openproject.org/wp/72427)\] +- Feature: Jira Migrator supports due date, estimated hours and remaining hours. \[[#74807](https://community.openproject.org/wp/74807)\] +- Feature: Meeting series: Add monthly scheduling options \[[#61522](https://community.openproject.org/wp/61522)\] +- Feature: Debounce emails for meetings \[[#66645](https://community.openproject.org/wp/66645)\] +- Feature: Primerize Types form configuration page \[[#69524](https://community.openproject.org/wp/69524)\] +- Feature: Expand work package mentions (##, ###) macros inside CKEditor \[[#74641](https://community.openproject.org/wp/74641)\] +- Feature: Allow Custom Fields on UserQuery \[[#74758](https://community.openproject.org/wp/74758)\] +- Feature: Primerize users administration to allow all filters \[[#74763](https://community.openproject.org/wp/74763)\] +- Feature: Workflows UX improvement: Allow multi-selection of roles in workflow \[[#72242](https://community.openproject.org/wp/72242)\] +- Feature: Administration setting for project-based work package identifiers \[[#71633](https://community.openproject.org/wp/71633)\] +- Feature: Background job for converting project-based semantic work package identifiers \[[#71645](https://community.openproject.org/wp/71645)\] +- Feature: Allow inline Work Package links within text paragraphs in the Documents module \[[#72817](https://community.openproject.org/wp/72817)\] +- Feature: Adapt creation of projects through the API for semantic identifiers \[[#73175](https://community.openproject.org/wp/73175)\] +- Feature: Define database model for project-based work package identifiers \[[#73315](https://community.openproject.org/wp/73315)\] +- Feature: Adapt work package show view for project-based semantic work package identifiers \[[#73716](https://community.openproject.org/wp/73716)\] +- Feature: Adapt work package lists for project-based semantic work package identifiers \[[#73717](https://community.openproject.org/wp/73717)\] +- Feature: Adapt routes for project-based semantic work package identifiers \[[#73756](https://community.openproject.org/wp/73756)\] +- Feature: Search work packages by their identifier \[[#73761](https://community.openproject.org/wp/73761)\] +- Feature: Adapt email notifications for project-based work package identifiers \[[#73827](https://community.openproject.org/wp/73827)\] +- Feature: Adapt work package link blocks in BlockNote for project-based semantic work package identifiers \[[#74115](https://community.openproject.org/wp/74115)\] +- Feature: Adapt work package links in CKEditor for project-based semantic work package identifiers \[[#74116](https://community.openproject.org/wp/74116)\] +- Feature: Adapt GitHub and GitLab modules for semantic identifiers \[[#74364](https://community.openproject.org/wp/74364)\] +- Feature: Adapt work package PDF exports for semantic identifiers \[[#74366](https://community.openproject.org/wp/74366)\] +- Feature: Add better progress indicator to identifier conversion page \[[#74903](https://community.openproject.org/wp/74903)\] +- Feature: Put "Beta" label on the setting for enabling semantic identifiers \[[#74975](https://community.openproject.org/wp/74975)\] +- Feature: Admin panel for releasing old classic project aliases \[[#74992](https://community.openproject.org/wp/74992)\] +- Bugfix: Closed work packages are still considered to be part of the bucket. \[[#74773](https://community.openproject.org/wp/74773)\] +- Bugfix: Inconsistent handling of "Definition of Done" \[[#74796](https://community.openproject.org/wp/74796)\] +- Bugfix: Backlogs: Missing space on mobile \[[#75188](https://community.openproject.org/wp/75188)\] +- Bugfix: Sprint field is sometimes not visible on the wp page \[[#75194](https://community.openproject.org/wp/75194)\] +- Bugfix: Backlog settings tab switching doesn't persist in url \[[#75239](https://community.openproject.org/wp/75239)\] +- Bugfix: No "Undisclosed" mention for the parent work package on the wp card for a user without permissions to see the parent \[[#75241](https://community.openproject.org/wp/75241)\] +- Bugfix: Incorrect resize behavior for pasted inline-links \[[#74190](https://community.openproject.org/wp/74190)\] +- Bugfix: Inserting "#" inside text removes content after cursor \[[#74325](https://community.openproject.org/wp/74325)\] +- Bugfix: Сards converting to hash links on copy-paste and DnD \[[#74327](https://community.openproject.org/wp/74327)\] +- Bugfix: Type colors are not applied correctly at the beginning \[[#74330](https://community.openproject.org/wp/74330)\] +- Bugfix: Inconsistent contrast for type colors when switching themes \[[#74332](https://community.openproject.org/wp/74332)\] +- Bugfix: Dropdown option order changes depending on selected item \[[#74333](https://community.openproject.org/wp/74333)\] +- Bugfix: Inconsistent inline-link heights in text flow \[[#74341](https://community.openproject.org/wp/74341)\] +- Bugfix: Inline work package chip has no visual highlight when selected \[[#74385](https://community.openproject.org/wp/74385)\] +- Bugfix: Arrow-down selection for link work package block prevented by tooltip \[[#74393](https://community.openproject.org/wp/74393)\] +- Bugfix: Wrong cursor placement after inserting links to Work Packages in BlockNote \[[#74397](https://community.openproject.org/wp/74397)\] +- Bugfix: Improve size menu and remove L+XL blocks \[[#74651](https://community.openproject.org/wp/74651)\] +- Bugfix: Click position is lost when activating an inline edit field \[[#72837](https://community.openproject.org/wp/72837)\] +- Bugfix: Doubled scrollbar on a Board \[[#73714](https://community.openproject.org/wp/73714)\] +- Bugfix: Quick filters don't react good to medium screen sizes \[[#74832](https://community.openproject.org/wp/74832)\] +- Bugfix: Hide pagination buttons when they are disabled \[[#75258](https://community.openproject.org/wp/75258)\] +- Bugfix: Horizontal ellipsis button misaligned when text expanded on Permissions Report/Workflows pages \[[#75275](https://community.openproject.org/wp/75275)\] +- Bugfix: Jira Migrator: misalignement between the status badge and the import name \[[#72840](https://community.openproject.org/wp/72840)\] +- Bugfix: Imprecise error for unallowed IP when testing Jira connection \[[#75031](https://community.openproject.org/wp/75031)\] +- Bugfix: Imprecise error for SSL errors when testing Jira connection \[[#75032](https://community.openproject.org/wp/75032)\] +- Bugfix: Jira Migrator cannot import a user with non-alphanumeric characters in their name \[[#75238](https://community.openproject.org/wp/75238)\] +- Bugfix: Jira Migrator stops the import for non-existing user in user mention \[[#75248](https://community.openproject.org/wp/75248)\] +- Bugfix: Remove extra space in Jira Migrator backup warning dialog \[[#75353](https://community.openproject.org/wp/75353)\] +- Bugfix: Jira Migrator does not scope issues between import runs. \[[#75355](https://community.openproject.org/wp/75355)\] +- Bugfix: Jira Migrator shows 0 issues info if server does not include the data in serverInfo endpoint \[[#75380](https://community.openproject.org/wp/75380)\] +- Bugfix: Jira Migrator gives unhelpful error message if user email is blank \[[#75381](https://community.openproject.org/wp/75381)\] +- Bugfix: No way to find jira import run history page \[[#75382](https://community.openproject.org/wp/75382)\] +- Bugfix: Enabled rate limiting on Jira instance breaks projects selector. \[[#75391](https://community.openproject.org/wp/75391)\] +- Bugfix: Wrong wording on import page in admin \[[#75422](https://community.openproject.org/wp/75422)\] +- Bugfix: Jira Migrator: Do not disable the new configuration button if the instance is not switched to semantic identifiers \[[#75674](https://community.openproject.org/wp/75674)\] +- Bugfix: Cancel occurence action item is called 'Delete' on My Meetings page and Meeting index page 'Past' tab \[[#74303](https://community.openproject.org/wp/74303)\] +- Bugfix: User cannot restore a cancelled occurrence if series has a deleted WP on the agenda \[[#74304](https://community.openproject.org/wp/74304)\] +- Bugfix: Show default section more clearly when using the section selector for a meeting with no sections \[[#74321](https://community.openproject.org/wp/74321)\] +- Bugfix: Meetings endpoint /api/v3/recurring\_meetings/:id/occurrences/:start\_time/init is not properly authorized \[[#75449](https://community.openproject.org/wp/75449)\] +- Bugfix: ActiveRecord::InvalidForeignKey on RecurringMeetingsController#end\_series \[[#75463](https://community.openproject.org/wp/75463)\] +- Bugfix: Work package configuration dialog's highlighting tab has no space between radio buttons and labels \[[#64359](https://community.openproject.org/wp/64359)\] +- Bugfix: Log time modal dropdown's bottom border is indistignuishable from the modal's bottom border \[[#65523](https://community.openproject.org/wp/65523)\] +- Bugfix: Wrong calendar week in My time tracking \[[#68272](https://community.openproject.org/wp/68272)\] +- Bugfix: Asterisks on Project attributes displaced \[[#68633](https://community.openproject.org/wp/68633)\] +- Bugfix: \[Meetings\] Exception raised while trying to update Stale Object \[[#68703](https://community.openproject.org/wp/68703)\] +- Bugfix: Clicking work package tabs triggers page reload and flickering \[[#69210](https://community.openproject.org/wp/69210)\] +- Bugfix: Mobile - Include project on WP list is missing spacing \[[#69451](https://community.openproject.org/wp/69451)\] +- Bugfix: Roles selectable as "Role given to a non-admin user who creates a project" that lack essential permissions \[[#69496](https://community.openproject.org/wp/69496)\] +- Bugfix: Text overflow in Baseline modal banner \[[#69526](https://community.openproject.org/wp/69526)\] +- Bugfix: Fix accessibility errors found by ERB Lint \[[#70166](https://community.openproject.org/wp/70166)\] +- Bugfix: Role not created properly when unselecting all permissions \[[#73494](https://community.openproject.org/wp/73494)\] +- Bugfix: POST/PATCH/DELETE requests to APIv3 return unauthorized \[[#73499](https://community.openproject.org/wp/73499)\] +- Bugfix: "Upgrade" button label should not be underlined \[[#73570](https://community.openproject.org/wp/73570)\] +- Bugfix: Not possible to filter for blocked users in time and cost report \[[#73660](https://community.openproject.org/wp/73660)\] +- Bugfix: Not possible to follow link custom field from work package list view \[[#73673](https://community.openproject.org/wp/73673)\] +- Bugfix: Black font in dark mode on wp description \[[#74697](https://community.openproject.org/wp/74697)\] +- Bugfix: Add upcoming/past filter to meetings index page filters \[[#74743](https://community.openproject.org/wp/74743)\] +- Bugfix: Redirect to /login is missing the URL query params \[[#74778](https://community.openproject.org/wp/74778)\] +- Bugfix: Missing space between user avatar and name \[[#74853](https://community.openproject.org/wp/74853)\] +- Bugfix: LDAP seeding via OPENPROJECT\_SEED\_LDAP\_\* uses a different (and self-contradictory) key convention than the rest of the env-var settings \[[#75361](https://community.openproject.org/wp/75361)\] +- Bugfix: Incorrect confirmation message when deleting a OAuth token \[[#72958](https://community.openproject.org/wp/72958)\] +- Bugfix: Roles select panel button should be "Apply" \[[#74560](https://community.openproject.org/wp/74560)\] +- Bugfix: Nextcloud integration shows "No connection to Nextcloud" for folders that have "&" in the name \[[#73855](https://community.openproject.org/wp/73855)\] +- Bugfix: Shared work package not showing images of comments \[[#69056](https://community.openproject.org/wp/69056)\] +- Bugfix: Lists of work packages should sort correctly by semantic id \[[#74156](https://community.openproject.org/wp/74156)\] +- Bugfix: Automatically converting project identifiers should not lead to usage of reserved keywords \[[#74161](https://community.openproject.org/wp/74161)\] +- Bugfix: Moving work packages after switching to semantic and back should not lead to errors \[[#74192](https://community.openproject.org/wp/74192)\] +- Bugfix: After migration job is complete save button is visible and clicking it triggers a 404 \[[#74623](https://community.openproject.org/wp/74623)\] +- Bugfix: Admin page for semantic IDs: grammatical issue \[[#74681](https://community.openproject.org/wp/74681)\] +- Bugfix: Admin page for semantic IDs: long ids cause overflow \[[#74730](https://community.openproject.org/wp/74730)\] +- Bugfix: Numeric ID still in the URL of the link opened from the email notification \[[#74760](https://community.openproject.org/wp/74760)\] +- Bugfix: Numeric ID in the email notification after adding watchers \[[#74762](https://community.openproject.org/wp/74762)\] +- Bugfix: Numeric ID copied instead of semantic ID in "Copy work package ID" on Backlogs page \[[#74826](https://community.openproject.org/wp/74826)\] +- Bugfix: Numeric ID in URL of the wp link when opened from search results \[[#74834](https://community.openproject.org/wp/74834)\] +- Bugfix: Semantic ID is not shown in search results in different places \[[#74844](https://community.openproject.org/wp/74844)\] +- Bugfix: Numeric ID instead of semantic one in the spent time calendar \[[#74900](https://community.openproject.org/wp/74900)\] +- Bugfix: Numeric ID instead of semantic one on the Activity page \[[#74912](https://community.openproject.org/wp/74912)\] +- Bugfix: Numeric ID instead of semantic one in Roadmap \[[#74913](https://community.openproject.org/wp/74913)\] +- Bugfix: Numeric ID instead of semantic one in bulk edit work packages \[[#74926](https://community.openproject.org/wp/74926)\] +- Bugfix: Unable to change a parent on bulk edit of work packages with semantic ID \[[#74927](https://community.openproject.org/wp/74927)\] +- Bugfix: Numeric ID instead of semantic one on the error message on bulk edit \[[#74928](https://community.openproject.org/wp/74928)\] +- Bugfix: Numeric ID instead of semantic one on the table of related work packages \[[#74942](https://community.openproject.org/wp/74942)\] +- Bugfix: Numeric ID instead of semantic one on the Time and costs report \[[#74943](https://community.openproject.org/wp/74943)\] +- Bugfix: Numeric ID instead of semantic one on the wp delete confirmation dialogue \[[#74944](https://community.openproject.org/wp/74944)\] +- Bugfix: All-numeric project identifiers are not properly handled in classic mode \[[#74993](https://community.openproject.org/wp/74993)\] +- Bugfix: Numeric ID visible in edit mode in links with # \[[#75180](https://community.openproject.org/wp/75180)\] +- Bugfix: Inconsistent naming on admin page \[[#75362](https://community.openproject.org/wp/75362)\] +- Bugfix: Reserved project identifiers: UI fails silently with 404 console error when acting on a deleted project \[[#75483](https://community.openproject.org/wp/75483)\] +- Bugfix: workPackageValue:ID:attribute macros failing with semantic IDs \[[#75574](https://community.openproject.org/wp/75574)\] +- Bugfix: Numeric ID showing in Github tab on work packages without links to PRs \[[#75636](https://community.openproject.org/wp/75636)\] From f102eecdc3e46640810f12a3bf137c199422a68b Mon Sep 17 00:00:00 2001 From: Jan Sandbrink Date: Wed, 10 Jun 2026 08:37:26 +0200 Subject: [PATCH 107/107] Adapt to latest OpenProject plugin for XWiki This now allows to fetch canonical page infos using GET and should return a 404 if a page with the given name does not exist. --- .../queries/internal/canonical_page_info.rb | 8 +---- .../internal/canonical_page_info_spec.rb | 18 +++++------ .../xwiki/queries/stable_page_info_spec.rb | 2 +- .../xwiki/canonical_page_info.yml | 20 ++++++------ .../vcr_cassettes/xwiki/query_exact_match.yml | 30 ++++++++--------- .../vcr_cassettes/xwiki/query_no_match.yml | 8 ++--- .../xwiki/query_partial_match.yml | 30 ++++++++--------- .../xwiki/query_quoted_match.yml | 32 +++++++++---------- .../xwiki/query_unquoted_match.yml | 32 +++++++++---------- .../vcr_cassettes/xwiki/stable_page_info.yml | 8 ++--- 10 files changed, 86 insertions(+), 102 deletions(-) diff --git a/modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/internal/canonical_page_info.rb b/modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/internal/canonical_page_info.rb index 4513f8eede9..831d97623ff 100644 --- a/modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/internal/canonical_page_info.rb +++ b/modules/wikis/app/services/wikis/adapters/providers/xwiki/queries/internal/canonical_page_info.rb @@ -57,14 +57,8 @@ module Wikis def perform_request(reference, auth_strategy:, &) authenticated(auth_strategy) do |http| handle_response( - # This query is implemented as a PUT on the XWiki side, because it dynamically creates the - # stable identifier that it returns. Passing an empty JSON body is also required for the - # endpoint to not raise an error 🤷 http.with(headers: { "Content-Type": "application/json" }) - .put( - rest_url("openproject/documents", query: { docRef: reference.to_s }), - body: "{}" - ), + .get(rest_url("openproject/documents", query: { docRef: reference.to_s })), & ) end diff --git a/modules/wikis/spec/services/wikis/adapters/providers/xwiki/queries/internal/canonical_page_info_spec.rb b/modules/wikis/spec/services/wikis/adapters/providers/xwiki/queries/internal/canonical_page_info_spec.rb index d8052d555aa..bd32a8cb265 100644 --- a/modules/wikis/spec/services/wikis/adapters/providers/xwiki/queries/internal/canonical_page_info_spec.rb +++ b/modules/wikis/spec/services/wikis/adapters/providers/xwiki/queries/internal/canonical_page_info_spec.rb @@ -31,7 +31,7 @@ require "spec_helper" require_module_spec_helper -RSpec.describe Wikis::Adapters::Providers::XWiki::Queries::Internal::CanonicalPageInfo, :webmock do +RSpec.describe Wikis::Adapters::Providers::XWiki::Queries::Internal::CanonicalPageInfo, :disable_ssrf_filter, :webmock do it "is not registered" do expect(Wikis::Adapters::Registry.resolve("xwiki.queries.page_info")).not_to eq(described_class) end @@ -69,7 +69,7 @@ RSpec.describe Wikis::Adapters::Providers::XWiki::Queries::Internal::CanonicalPa let(:absolute_url) { "https://xwiki.local/bin/view/MySpace/SubSpace/PageName" } before do - stub_request(:put, page_url) + stub_request(:get, page_url) .to_return(status: 200, body: { id: "foo", title: "Nested Page", xwikiAbsoluteUrl: absolute_url }.to_json, headers: { "Content-Type" => "application/json" }) end @@ -93,38 +93,38 @@ RSpec.describe Wikis::Adapters::Providers::XWiki::Queries::Internal::CanonicalPa end context "when the page is not found" do - before { stub_request(:put, page_url).to_return(status: 404, body: "") } + before { stub_request(:get, page_url).to_return(status: 404, body: "") } it { is_expected.to be_failure.and have_attributes(failure: have_attributes(code: :not_found)) } end context "when access is unauthorized" do - before { stub_request(:put, page_url).to_return(status: 401, body: "") } + before { stub_request(:get, page_url).to_return(status: 401, body: "") } it { is_expected.to be_failure.and have_attributes(failure: have_attributes(code: :unauthorized)) } end context "when access is forbidden" do - before { stub_request(:put, page_url).to_return(status: 403, body: "") } + before { stub_request(:get, page_url).to_return(status: 403, body: "") } it { is_expected.to be_failure.and have_attributes(failure: have_attributes(code: :unauthorized)) } end context "when XWiki returns a non-2xx status" do - before { stub_request(:put, page_url).to_return(status: 500, body: "Internal Server Error") } + before { stub_request(:get, page_url).to_return(status: 500, body: "Internal Server Error") } it { is_expected.to be_failure.and have_attributes(failure: have_attributes(code: :request_failed)) } end context "when a network error occurs" do - before { stub_request(:put, page_url).to_timeout } + before { stub_request(:get, page_url).to_timeout } it { is_expected.to be_failure.and have_attributes(failure: have_attributes(code: :connection_error)) } end context "when the response body is not valid JSON" do before do - stub_request(:put, page_url) + stub_request(:get, page_url) .to_return(status: 200, body: "not json", headers: { "Content-Type" => "application/json" }) end @@ -133,7 +133,7 @@ RSpec.describe Wikis::Adapters::Providers::XWiki::Queries::Internal::CanonicalPa context "when the response body is unexpected JSON" do before do - stub_request(:put, page_url) + stub_request(:get, page_url) .to_return(status: 200, body: { error: "An error occured" }.to_json, headers: { "Content-Type" => "application/json" }) end diff --git a/modules/wikis/spec/services/wikis/adapters/providers/xwiki/queries/stable_page_info_spec.rb b/modules/wikis/spec/services/wikis/adapters/providers/xwiki/queries/stable_page_info_spec.rb index 99791e8071f..eb726207d40 100644 --- a/modules/wikis/spec/services/wikis/adapters/providers/xwiki/queries/stable_page_info_spec.rb +++ b/modules/wikis/spec/services/wikis/adapters/providers/xwiki/queries/stable_page_info_spec.rb @@ -31,7 +31,7 @@ require "spec_helper" require_module_spec_helper -RSpec.describe Wikis::Adapters::Providers::XWiki::Queries::StablePageInfo, :webmock do +RSpec.describe Wikis::Adapters::Providers::XWiki::Queries::StablePageInfo, :disable_ssrf_filter, :webmock do it "is registered" do expect(Wikis::Adapters::Registry.resolve("xwiki.queries.page_info")).to eq(described_class) end diff --git a/spec/support/fixtures/vcr_cassettes/xwiki/canonical_page_info.yml b/spec/support/fixtures/vcr_cassettes/xwiki/canonical_page_info.yml index 85549582438..71ec256a5b8 100644 --- a/spec/support/fixtures/vcr_cassettes/xwiki/canonical_page_info.yml +++ b/spec/support/fixtures/vcr_cassettes/xwiki/canonical_page_info.yml @@ -1,11 +1,11 @@ --- http_interactions: - request: - method: put + method: get uri: https://xwiki.local/rest/openproject/documents?docRef=xwiki:Main.WebHome body: - encoding: UTF-8 - string: "{}" + encoding: US-ASCII + string: '' headers: User-Agent: - OpenProject 17.6.0 HTTPX Client @@ -15,14 +15,12 @@ http_interactions: - gzip, deflate Content-Type: - application/json - Content-Length: - - '2' Authorization: - Bearer response: status: - code: 202 - message: Accepted + code: 200 + message: OK headers: Content-Language: - en @@ -31,11 +29,11 @@ http_interactions: Content-Type: - application/json;charset=UTF-8 Date: - - Fri, 05 Jun 2026 06:30:56 GMT + - Wed, 10 Jun 2026 06:33:47 GMT Set-Cookie: - - JSESSIONID=E1711FFA64B3AFE5CBB3FA5881A7138D; Path=/; HttpOnly + - JSESSIONID=CF23A6F34156F21FFE50CB86F0F6138C; Path=/; HttpOnly Xwiki-Form-Token: - - ON8xsHlEpixyujzpUPNupg + - L5DY6HB46AhTFvPuxIu0Cg Xwiki-User: - xwiki:XWiki.admin Xwiki-Version: @@ -69,5 +67,5 @@ http_interactions: creating //your// own applications with [[App Within Minutes>>AppWithinMinutes]] (AWM). \n\nAWM will take care of making it easy for you and your users to create and manage the data.\n)))\n)))","clazz":null,"objects":null,"attachments":null,"hierarchy":{"items":[{"label":"xwiki","name":"xwiki","type":"wiki","url":"https://xwiki.local/bin/view/Main/"},{"label":"Main","name":"Main","type":"space","url":"https://xwiki.local/bin/view/Main/"},{"label":"WebHome","name":"WebHome","type":"document","url":"https://xwiki.local/bin/view/Main/"}]},"rights":[],"renderedContent":null}' - recorded_at: Fri, 05 Jun 2026 06:30:56 GMT + recorded_at: Wed, 10 Jun 2026 06:33:47 GMT recorded_with: VCR 6.4.0 diff --git a/spec/support/fixtures/vcr_cassettes/xwiki/query_exact_match.yml b/spec/support/fixtures/vcr_cassettes/xwiki/query_exact_match.yml index 782f6749212..028e7a262d5 100644 --- a/spec/support/fixtures/vcr_cassettes/xwiki/query_exact_match.yml +++ b/spec/support/fixtures/vcr_cassettes/xwiki/query_exact_match.yml @@ -27,11 +27,11 @@ http_interactions: Content-Type: - application/json;charset=UTF-8 Date: - - Fri, 05 Jun 2026 08:53:32 GMT + - Wed, 10 Jun 2026 06:23:07 GMT Set-Cookie: - - JSESSIONID=86BECC608B1C5FD09A32A74836CAEA4E; Path=/; HttpOnly + - JSESSIONID=3CFCEFF117A41EAA3750970A7F16701F; Path=/; HttpOnly Xwiki-Form-Token: - - ON8xsHlEpixyujzpUPNupg + - L5DY6HB46AhTFvPuxIu0Cg Xwiki-User: - xwiki:XWiki.admin Xwiki-Version: @@ -42,14 +42,14 @@ http_interactions: encoding: UTF-8 string: '{"links":[],"searchResults":[{"links":[{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/Test%20Page/pages/WebHome","rel":"http://www.xwiki.org/rel/page","type":null,"hrefLang":null}],"type":"page","id":"xwiki:Test Page.WebHome","pageFullName":"Test Page.WebHome","title":"Test Page for RSpec","wiki":"xwiki","space":"Test - Page","pageName":"WebHome","modified":1780386902000,"author":"xwiki:XWiki.admin","authorName":null,"version":"4.1","language":null,"className":null,"objectNumber":null,"filename":null,"score":36.06842,"object":null,"hierarchy":null}],"template":"https://xwiki.local/rest/?q={solrquery}(&number={number})(&start={start})(&orderField={fieldname}(&order={asc|desc}))(&distinct=1)(&prettyNames={false|true})(&wikis={wikis})(&className={classname})"}' - recorded_at: Fri, 05 Jun 2026 08:53:32 GMT + Page","pageName":"WebHome","modified":1780386902000,"author":"xwiki:XWiki.admin","authorName":null,"version":"4.1","language":null,"className":null,"objectNumber":null,"filename":null,"score":33.28312,"object":null,"hierarchy":null}],"template":"https://xwiki.local/rest/?q={solrquery}(&number={number})(&start={start})(&orderField={fieldname}(&order={asc|desc}))(&distinct=1)(&prettyNames={false|true})(&wikis={wikis})(&className={classname})"}' + recorded_at: Wed, 10 Jun 2026 06:23:07 GMT - request: - method: put + method: get uri: https://xwiki.local/rest/openproject/documents?docRef=xwiki:Test%20Page.WebHome body: - encoding: UTF-8 - string: "{}" + encoding: US-ASCII + string: '' headers: User-Agent: - OpenProject 17.6.0 HTTPX Client @@ -59,14 +59,12 @@ http_interactions: - gzip, deflate Content-Type: - application/json - Content-Length: - - '2' Authorization: - Bearer response: status: - code: 202 - message: Accepted + code: 200 + message: OK headers: Content-Language: - en @@ -75,11 +73,11 @@ http_interactions: Content-Type: - application/json;charset=UTF-8 Date: - - Fri, 05 Jun 2026 08:53:32 GMT + - Wed, 10 Jun 2026 06:23:07 GMT Set-Cookie: - - JSESSIONID=D0C7401B4A9ADC6FF35E556801B050B3; Path=/; HttpOnly + - JSESSIONID=09FC7BC444F1E3C1FD3FBCF984C38AC7; Path=/; HttpOnly Xwiki-Form-Token: - - ON8xsHlEpixyujzpUPNupg + - L5DY6HB46AhTFvPuxIu0Cg Xwiki-User: - xwiki:XWiki.admin Xwiki-Version: @@ -94,5 +92,5 @@ http_interactions: URL Shortener.","content":"This is a test page that I created with my own hands.","clazz":null,"objects":null,"attachments":null,"hierarchy":{"items":[{"label":"xwiki","name":"xwiki","type":"wiki","url":"https://xwiki.local/bin/view/Main/"},{"label":"Test Page","name":"Test Page","type":"space","url":"https://xwiki.local/bin/view/Test%20Page/"},{"label":"WebHome","name":"WebHome","type":"document","url":"https://xwiki.local/bin/view/Test%20Page/"}]},"rights":[],"renderedContent":null}' - recorded_at: Fri, 05 Jun 2026 08:53:32 GMT + recorded_at: Wed, 10 Jun 2026 06:23:07 GMT recorded_with: VCR 6.4.0 diff --git a/spec/support/fixtures/vcr_cassettes/xwiki/query_no_match.yml b/spec/support/fixtures/vcr_cassettes/xwiki/query_no_match.yml index 1f75478d02f..cccf4cf18a8 100644 --- a/spec/support/fixtures/vcr_cassettes/xwiki/query_no_match.yml +++ b/spec/support/fixtures/vcr_cassettes/xwiki/query_no_match.yml @@ -27,11 +27,11 @@ http_interactions: Content-Type: - application/json;charset=UTF-8 Date: - - Fri, 05 Jun 2026 08:53:31 GMT + - Wed, 10 Jun 2026 06:23:07 GMT Set-Cookie: - - JSESSIONID=732467DE0A76FD79B8958EC80B2E9BB2; Path=/; HttpOnly + - JSESSIONID=6653CAF1A1F9B748F41B143F534D9C38; Path=/; HttpOnly Xwiki-Form-Token: - - ON8xsHlEpixyujzpUPNupg + - L5DY6HB46AhTFvPuxIu0Cg Xwiki-User: - xwiki:XWiki.admin Xwiki-Version: @@ -41,5 +41,5 @@ http_interactions: body: encoding: UTF-8 string: '{"links":[],"searchResults":[],"template":"https://xwiki.local/rest/?q={solrquery}(&number={number})(&start={start})(&orderField={fieldname}(&order={asc|desc}))(&distinct=1)(&prettyNames={false|true})(&wikis={wikis})(&className={classname})"}' - recorded_at: Fri, 05 Jun 2026 08:53:31 GMT + recorded_at: Wed, 10 Jun 2026 06:23:07 GMT recorded_with: VCR 6.4.0 diff --git a/spec/support/fixtures/vcr_cassettes/xwiki/query_partial_match.yml b/spec/support/fixtures/vcr_cassettes/xwiki/query_partial_match.yml index 0419190f295..669115f44c2 100644 --- a/spec/support/fixtures/vcr_cassettes/xwiki/query_partial_match.yml +++ b/spec/support/fixtures/vcr_cassettes/xwiki/query_partial_match.yml @@ -27,11 +27,11 @@ http_interactions: Content-Type: - application/json;charset=UTF-8 Date: - - Fri, 05 Jun 2026 08:53:31 GMT + - Wed, 10 Jun 2026 06:23:07 GMT Set-Cookie: - - JSESSIONID=61B575D9D2898F806A6569BC6F465501; Path=/; HttpOnly + - JSESSIONID=948F6FD6FE46127D21A904F5B4B572C4; Path=/; HttpOnly Xwiki-Form-Token: - - ON8xsHlEpixyujzpUPNupg + - L5DY6HB46AhTFvPuxIu0Cg Xwiki-User: - xwiki:XWiki.admin Xwiki-Version: @@ -42,14 +42,14 @@ http_interactions: encoding: UTF-8 string: '{"links":[],"searchResults":[{"links":[{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/Test%20Page/pages/WebHome","rel":"http://www.xwiki.org/rel/page","type":null,"hrefLang":null}],"type":"page","id":"xwiki:Test Page.WebHome","pageFullName":"Test Page.WebHome","title":"Test Page for RSpec","wiki":"xwiki","space":"Test - Page","pageName":"WebHome","modified":1780386902000,"author":"xwiki:XWiki.admin","authorName":null,"version":"4.1","language":null,"className":null,"objectNumber":null,"filename":null,"score":15.390617,"object":null,"hierarchy":null}],"template":"https://xwiki.local/rest/?q={solrquery}(&number={number})(&start={start})(&orderField={fieldname}(&order={asc|desc}))(&distinct=1)(&prettyNames={false|true})(&wikis={wikis})(&className={classname})"}' - recorded_at: Fri, 05 Jun 2026 08:53:31 GMT + Page","pageName":"WebHome","modified":1780386902000,"author":"xwiki:XWiki.admin","authorName":null,"version":"4.1","language":null,"className":null,"objectNumber":null,"filename":null,"score":16.572105,"object":null,"hierarchy":null}],"template":"https://xwiki.local/rest/?q={solrquery}(&number={number})(&start={start})(&orderField={fieldname}(&order={asc|desc}))(&distinct=1)(&prettyNames={false|true})(&wikis={wikis})(&className={classname})"}' + recorded_at: Wed, 10 Jun 2026 06:23:07 GMT - request: - method: put + method: get uri: https://xwiki.local/rest/openproject/documents?docRef=xwiki:Test%20Page.WebHome body: - encoding: UTF-8 - string: "{}" + encoding: US-ASCII + string: '' headers: User-Agent: - OpenProject 17.6.0 HTTPX Client @@ -59,14 +59,12 @@ http_interactions: - gzip, deflate Content-Type: - application/json - Content-Length: - - '2' Authorization: - Bearer response: status: - code: 202 - message: Accepted + code: 200 + message: OK headers: Content-Language: - en @@ -75,11 +73,11 @@ http_interactions: Content-Type: - application/json;charset=UTF-8 Date: - - Fri, 05 Jun 2026 08:53:32 GMT + - Wed, 10 Jun 2026 06:23:07 GMT Set-Cookie: - - JSESSIONID=753A9D110C6DC9393E3350EA056BBC05; Path=/; HttpOnly + - JSESSIONID=53060762864FA5DFC002D5F089BD0319; Path=/; HttpOnly Xwiki-Form-Token: - - ON8xsHlEpixyujzpUPNupg + - L5DY6HB46AhTFvPuxIu0Cg Xwiki-User: - xwiki:XWiki.admin Xwiki-Version: @@ -94,5 +92,5 @@ http_interactions: URL Shortener.","content":"This is a test page that I created with my own hands.","clazz":null,"objects":null,"attachments":null,"hierarchy":{"items":[{"label":"xwiki","name":"xwiki","type":"wiki","url":"https://xwiki.local/bin/view/Main/"},{"label":"Test Page","name":"Test Page","type":"space","url":"https://xwiki.local/bin/view/Test%20Page/"},{"label":"WebHome","name":"WebHome","type":"document","url":"https://xwiki.local/bin/view/Test%20Page/"}]},"rights":[],"renderedContent":null}' - recorded_at: Fri, 05 Jun 2026 08:53:32 GMT + recorded_at: Wed, 10 Jun 2026 06:23:07 GMT recorded_with: VCR 6.4.0 diff --git a/spec/support/fixtures/vcr_cassettes/xwiki/query_quoted_match.yml b/spec/support/fixtures/vcr_cassettes/xwiki/query_quoted_match.yml index b2f28f954e0..5bf2ed65a1d 100644 --- a/spec/support/fixtures/vcr_cassettes/xwiki/query_quoted_match.yml +++ b/spec/support/fixtures/vcr_cassettes/xwiki/query_quoted_match.yml @@ -27,29 +27,29 @@ http_interactions: Content-Type: - application/json;charset=UTF-8 Date: - - Fri, 05 Jun 2026 08:53:32 GMT + - Wed, 10 Jun 2026 06:23:06 GMT Set-Cookie: - - JSESSIONID=0A832E95AF62319A728E2D94FF402FD2; Path=/; HttpOnly + - JSESSIONID=53DEB144D1160E37FDBE016C6783652A; Path=/; HttpOnly Xwiki-Form-Token: - - ON8xsHlEpixyujzpUPNupg + - L5DY6HB46AhTFvPuxIu0Cg Xwiki-User: - xwiki:XWiki.admin Xwiki-Version: - 18.3.0 Content-Length: - - '891' + - '892' body: encoding: UTF-8 string: '{"links":[],"searchResults":[{"links":[{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/%22Quoted%22%20pages%20can%20be%20tricky/pages/WebHome","rel":"http://www.xwiki.org/rel/page","type":null,"hrefLang":null}],"type":"page","id":"xwiki:\"Quoted\" pages can be tricky.WebHome","pageFullName":"\"Quoted\" pages can be tricky.WebHome","title":"\"Quoted\" - pages can be tricky","wiki":"xwiki","space":"\"Quoted\" pages can be tricky","pageName":"WebHome","modified":1780387197000,"author":"xwiki:XWiki.admin","authorName":null,"version":"1.1","language":null,"className":null,"objectNumber":null,"filename":null,"score":46.0744,"object":null,"hierarchy":null}],"template":"https://xwiki.local/rest/?q={solrquery}(&number={number})(&start={start})(&orderField={fieldname}(&order={asc|desc}))(&distinct=1)(&prettyNames={false|true})(&wikis={wikis})(&className={classname})"}' - recorded_at: Fri, 05 Jun 2026 08:53:32 GMT + pages can be tricky","wiki":"xwiki","space":"\"Quoted\" pages can be tricky","pageName":"WebHome","modified":1780387197000,"author":"xwiki:XWiki.admin","authorName":null,"version":"1.1","language":null,"className":null,"objectNumber":null,"filename":null,"score":47.94951,"object":null,"hierarchy":null}],"template":"https://xwiki.local/rest/?q={solrquery}(&number={number})(&start={start})(&orderField={fieldname}(&order={asc|desc}))(&distinct=1)(&prettyNames={false|true})(&wikis={wikis})(&className={classname})"}' + recorded_at: Wed, 10 Jun 2026 06:23:06 GMT - request: - method: put + method: get uri: https://xwiki.local/rest/openproject/documents?docRef=xwiki:%22Quoted%22%20pages%20can%20be%20tricky.WebHome body: - encoding: UTF-8 - string: "{}" + encoding: US-ASCII + string: '' headers: User-Agent: - OpenProject 17.6.0 HTTPX Client @@ -59,14 +59,12 @@ http_interactions: - gzip, deflate Content-Type: - application/json - Content-Length: - - '2' Authorization: - Bearer response: status: - code: 202 - message: Accepted + code: 200 + message: OK headers: Content-Language: - en @@ -75,11 +73,11 @@ http_interactions: Content-Type: - application/json;charset=UTF-8 Date: - - Fri, 05 Jun 2026 08:53:32 GMT + - Wed, 10 Jun 2026 06:23:06 GMT Set-Cookie: - - JSESSIONID=8074F7A06BEFB236927D7E9858A4D266; Path=/; HttpOnly + - JSESSIONID=F53BDBC8DBB650A2E09E519DDCFF22D9; Path=/; HttpOnly Xwiki-Form-Token: - - ON8xsHlEpixyujzpUPNupg + - L5DY6HB46AhTFvPuxIu0Cg Xwiki-User: - xwiki:XWiki.admin Xwiki-Version: @@ -95,5 +93,5 @@ http_interactions: URL Shortener.","content":"When the page title contains quotes, it''s harder to exactly match their page title.","clazz":null,"objects":null,"attachments":null,"hierarchy":{"items":[{"label":"xwiki","name":"xwiki","type":"wiki","url":"https://xwiki.local/bin/view/Main/"},{"label":"\"Quoted\" pages can be tricky","name":"\"Quoted\" pages can be tricky","type":"space","url":"https://xwiki.local/bin/view/%22Quoted%22%20pages%20can%20be%20tricky/"},{"label":"WebHome","name":"WebHome","type":"document","url":"https://xwiki.local/bin/view/%22Quoted%22%20pages%20can%20be%20tricky/"}]},"rights":[],"renderedContent":null}' - recorded_at: Fri, 05 Jun 2026 08:53:32 GMT + recorded_at: Wed, 10 Jun 2026 06:23:06 GMT recorded_with: VCR 6.4.0 diff --git a/spec/support/fixtures/vcr_cassettes/xwiki/query_unquoted_match.yml b/spec/support/fixtures/vcr_cassettes/xwiki/query_unquoted_match.yml index 9e9fbe26be3..732e4de2196 100644 --- a/spec/support/fixtures/vcr_cassettes/xwiki/query_unquoted_match.yml +++ b/spec/support/fixtures/vcr_cassettes/xwiki/query_unquoted_match.yml @@ -27,29 +27,29 @@ http_interactions: Content-Type: - application/json;charset=UTF-8 Date: - - Fri, 05 Jun 2026 08:53:32 GMT + - Wed, 10 Jun 2026 06:23:06 GMT Set-Cookie: - - JSESSIONID=85EDC4821BCF449B0D29798F3AD7D750; Path=/; HttpOnly + - JSESSIONID=E76D665AE92EA9DECFE756E8101CE2BD; Path=/; HttpOnly Xwiki-Form-Token: - - ON8xsHlEpixyujzpUPNupg + - L5DY6HB46AhTFvPuxIu0Cg Xwiki-User: - xwiki:XWiki.admin Xwiki-Version: - 18.3.0 Content-Length: - - '891' + - '892' body: encoding: UTF-8 string: '{"links":[],"searchResults":[{"links":[{"href":"https://xwiki.local/rest/wikis/xwiki/spaces/%22Quoted%22%20pages%20can%20be%20tricky/pages/WebHome","rel":"http://www.xwiki.org/rel/page","type":null,"hrefLang":null}],"type":"page","id":"xwiki:\"Quoted\" pages can be tricky.WebHome","pageFullName":"\"Quoted\" pages can be tricky.WebHome","title":"\"Quoted\" - pages can be tricky","wiki":"xwiki","space":"\"Quoted\" pages can be tricky","pageName":"WebHome","modified":1780387197000,"author":"xwiki:XWiki.admin","authorName":null,"version":"1.1","language":null,"className":null,"objectNumber":null,"filename":null,"score":46.0744,"object":null,"hierarchy":null}],"template":"https://xwiki.local/rest/?q={solrquery}(&number={number})(&start={start})(&orderField={fieldname}(&order={asc|desc}))(&distinct=1)(&prettyNames={false|true})(&wikis={wikis})(&className={classname})"}' - recorded_at: Fri, 05 Jun 2026 08:53:32 GMT + pages can be tricky","wiki":"xwiki","space":"\"Quoted\" pages can be tricky","pageName":"WebHome","modified":1780387197000,"author":"xwiki:XWiki.admin","authorName":null,"version":"1.1","language":null,"className":null,"objectNumber":null,"filename":null,"score":47.94951,"object":null,"hierarchy":null}],"template":"https://xwiki.local/rest/?q={solrquery}(&number={number})(&start={start})(&orderField={fieldname}(&order={asc|desc}))(&distinct=1)(&prettyNames={false|true})(&wikis={wikis})(&className={classname})"}' + recorded_at: Wed, 10 Jun 2026 06:23:06 GMT - request: - method: put + method: get uri: https://xwiki.local/rest/openproject/documents?docRef=xwiki:%22Quoted%22%20pages%20can%20be%20tricky.WebHome body: - encoding: UTF-8 - string: "{}" + encoding: US-ASCII + string: '' headers: User-Agent: - OpenProject 17.6.0 HTTPX Client @@ -59,14 +59,12 @@ http_interactions: - gzip, deflate Content-Type: - application/json - Content-Length: - - '2' Authorization: - Bearer response: status: - code: 202 - message: Accepted + code: 200 + message: OK headers: Content-Language: - en @@ -75,11 +73,11 @@ http_interactions: Content-Type: - application/json;charset=UTF-8 Date: - - Fri, 05 Jun 2026 08:53:32 GMT + - Wed, 10 Jun 2026 06:23:06 GMT Set-Cookie: - - JSESSIONID=6C4E5F9B0CF3BAD764856C1C7DD0F8DD; Path=/; HttpOnly + - JSESSIONID=ABB17E4169B041D4223B7F1C381AD0BE; Path=/; HttpOnly Xwiki-Form-Token: - - ON8xsHlEpixyujzpUPNupg + - L5DY6HB46AhTFvPuxIu0Cg Xwiki-User: - xwiki:XWiki.admin Xwiki-Version: @@ -95,5 +93,5 @@ http_interactions: URL Shortener.","content":"When the page title contains quotes, it''s harder to exactly match their page title.","clazz":null,"objects":null,"attachments":null,"hierarchy":{"items":[{"label":"xwiki","name":"xwiki","type":"wiki","url":"https://xwiki.local/bin/view/Main/"},{"label":"\"Quoted\" pages can be tricky","name":"\"Quoted\" pages can be tricky","type":"space","url":"https://xwiki.local/bin/view/%22Quoted%22%20pages%20can%20be%20tricky/"},{"label":"WebHome","name":"WebHome","type":"document","url":"https://xwiki.local/bin/view/%22Quoted%22%20pages%20can%20be%20tricky/"}]},"rights":[],"renderedContent":null}' - recorded_at: Fri, 05 Jun 2026 08:53:32 GMT + recorded_at: Wed, 10 Jun 2026 06:23:06 GMT recorded_with: VCR 6.4.0 diff --git a/spec/support/fixtures/vcr_cassettes/xwiki/stable_page_info.yml b/spec/support/fixtures/vcr_cassettes/xwiki/stable_page_info.yml index 0d7cd62208a..891225a1652 100644 --- a/spec/support/fixtures/vcr_cassettes/xwiki/stable_page_info.yml +++ b/spec/support/fixtures/vcr_cassettes/xwiki/stable_page_info.yml @@ -27,11 +27,11 @@ http_interactions: Content-Type: - application/json;charset=UTF-8 Date: - - Fri, 05 Jun 2026 06:33:33 GMT + - Wed, 10 Jun 2026 06:31:21 GMT Set-Cookie: - - JSESSIONID=20FFAE29A62BFE6CEC0152BB7FC0ADB6; Path=/; HttpOnly + - JSESSIONID=39C7519D8EAC0C8BA141B8F2519873C0; Path=/; HttpOnly Xwiki-Form-Token: - - ON8xsHlEpixyujzpUPNupg + - L5DY6HB46AhTFvPuxIu0Cg Xwiki-User: - xwiki:XWiki.admin Xwiki-Version: @@ -46,5 +46,5 @@ http_interactions: URL Shortener.","content":"This is a test page that I created with my own hands.","clazz":null,"objects":null,"attachments":null,"hierarchy":{"items":[{"label":"xwiki","name":"xwiki","type":"wiki","url":"https://xwiki.local/bin/view/Main/"},{"label":"Test Page","name":"Test Page","type":"space","url":"https://xwiki.local/bin/view/Test%20Page/"},{"label":"WebHome","name":"WebHome","type":"document","url":"https://xwiki.local/bin/view/Test%20Page/"}]},"rights":[],"renderedContent":null}' - recorded_at: Fri, 05 Jun 2026 06:33:33 GMT + recorded_at: Wed, 10 Jun 2026 06:31:21 GMT recorded_with: VCR 6.4.0